public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* Re: c++/1772
@ 2001-04-01  0:00 gdr
  0 siblings, 0 replies; 2+ messages in thread
From: gdr @ 2001-04-01  0:00 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c++/1772; it has been noted by GNATS.

From: gdr@gcc.gnu.org
To: Jens.Maurer@gmx.net, gcc-gnats@gcc.gnu.org, nobody@gcc.gnu.org
Cc:  
Subject: Re: c++/1772
Date: 25 Jan 2001 19:41:25 -0000

 Synopsis: ICE when instantiating templates with "long long" values
 
 State-Changed-From-To: open->analyzed
 State-Changed-By: gdr
 State-Changed-When: Thu Jan 25 11:41:25 2001
 State-Changed-Why:
     Confirmed as bug in both gcc-2.92.x and current CVS g++.
     
     Note however that `long long' extension support in g++ is
     not well documented.  At any rate, this is a blatant compiler
     deficiency.
     
     -- Gaby
 
 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=1772&database=gcc
>From bmrevet@igr.fr Sun Apr 01 00:00:00 2001
From: bmrevet@igr.fr
To: gcc-gnats@gcc.gnu.org
Subject: c/1820: GToolKit.m:2213: Internal error: Segmentation faul
Date: Sun, 01 Apr 2001 00:00:00 -0000
Message-id: <20010131162845.15110.qmail@sourceware.cygnus.com>
X-SW-Source: 2001-q1/msg00844.html
Content-length: 258379

>Number:         1820
>Category:       c
>Synopsis:       GToolKit.m:2213: Internal error: Segmentation faul
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Jan 31 08:36:07 PST 2001
>Closed-Date:
>Last-Modified:
>Originator:     Bernard Revet
>Release:        gcc version 2.96 20000731 (Red Hat Linux 7.0)
>Organization:
>Environment:
dell latitude c600 running under RH 7
>Description:
GToolKit]$ make
/bin/sh ../libtool  --mode compile gcc -c -pipe -Wall -O2 -mcpu=pentium -pthread -DHAVE_CONFIG_H -I.. -I/usr/include/gnome-xml -I/usr/lib/glib/include -I/usr/X11R6/include -D_REENTRANT     GToolKit.m
rm -f .libs/GToolKit.lo
gcc -c -pipe -Wall -O2 -mcpu=pentium -pthread -DHAVE_CONFIG_H -I.. -I/usr/include/gnome-xml -I/usr/lib/glib/include -I/usr/X11R6/include -D_REENTRANT GToolKit.m  -fPIC -DPIC -o .libs/GToolKit.lo
GToolKit.m:2213: Internal error: Segmentation fault.


While compiling gtoolkit-0.9.4
>How-To-Repeat:

>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: application/octet-stream; name="GToolKit.m"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="GToolKit.m"

LyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtp
dAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBH
ZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2FjY2VsZ3JvdXAuaCBieSBndGtnZW4uCiAq
CiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChh
dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQv
R1RLQWNjZWxHcm91cC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0FjY2VsR3JvdXAKKyAoaWQpIGFj
Y2VsR3JvdXAKewogICAgcmV0dXJuIFtbKEdUS0FjY2VsR3JvdXAgKilbc2VsZiBhbGxvY10gaW5p
dF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0
aEd0azpndGtfYWNjZWxfZ3JvdXBfbmV3KCldOwp9CisgKEdUS0FjY2VsR3JvdXAqKSBnZXREZWZh
dWx0CnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX2FjY2VsX2dyb3VwX2dldF9kZWZh
dWx0KCksICJHVEtBY2NlbEdyb3VwIik7Cn0KLSAoR1RLQWNjZWxHcm91cCopIHJlZgp7CiAgICBy
ZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19hY2NlbF9ncm91cF9yZWYoZ3RrKSwgIkdUS0FjY2Vs
R3JvdXAiKTsKfQotICh2b2lkKSB1bnJlZgp7CiAgICBndGtfYWNjZWxfZ3JvdXBfdW5yZWYoZ3Rr
KTsKfQotICh2b2lkKSBsb2NrCnsKICAgIGd0a19hY2NlbF9ncm91cF9sb2NrKGd0ayk7Cn0KLSAo
dm9pZCkgdW5sb2NrCnsKICAgIGd0a19hY2NlbF9ncm91cF91bmxvY2soZ3RrKTsKfQojZGVmaW5l
IGd0awkoKEd0a0FjY2VsR3JvdXAgKikgZ3RrKQogLSAob25ld2F5IHZvaWQpIHJlbGVhc2UKewog
ICAgdW5zaWduZWQgcmVmX2NvdW50ID0gZ3RrID8gZ3RrLT5yZWZfY291bnQgOiAxOwoKI2lmZGVm
IERFQlVHCiAgICBpZiAocmVmX2NvdW50ID09IDApIGdfZXJyb3IoInJlZl9jb3VudCA9PSAwIGlu
ICIgX19GSUxFX18gIiAocmVsZWFzZSkiKTsKI2VuZGlmCiAgICBpZiAoZ3RrKSBbc2VsZiB1bnJl
Zl07CiAgICBpZiAocmVmX2NvdW50ID09IDEpIFtzZWxmIGRlYWxsb2NdOwp9CgogLSAoaWQpIHJl
dGFpbgp7CiAgICBpZiAoZ3RrKSBbc2VsZiByZWZdOwogICAgcmV0dXJuIHNlbGY7Cn0KCiAtICh1
bnNpZ25lZCkgcmV0YWluQ291bnQKewogICAgcmV0dXJuIGd0ayA/IGd0ay0+cmVmX2NvdW50IDog
MTsKfQojdW5kZWYgZ3RrCkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZh
Y2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAg
IEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2FjY2Vs
bGFiZWwuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAq
LwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQWNjZWxMYWJlbC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQv
R1RLV2lkZ2V0Lmg+CgpAaW1wbGVtZW50YXRpb24gR1RLQWNjZWxMYWJlbAorIChHdGtUeXBlKSBn
ZXRUeXBlCnsKICAgIHJldHVybiBndGtfYWNjZWxfbGFiZWxfZ2V0X3R5cGUoKTsKfQorIChpZCkg
YWNjZWxMYWJlbFdpdGhTdHJpbmc6KE5TU3RyaW5nICopIHN0cmluZwp7CiAgICByZXR1cm4gW1so
R1RLQWNjZWxMYWJlbCAqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFN0cmluZzpzdHJpbmddIGF1dG9y
ZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhTdHJpbmc6KE5TU3RyaW5nICopIHN0cmluZwp7CiAg
ICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2FjY2VsX2xhYmVsX25ldyhndG9vbGtpdF91
dGY4X3N0cmluZyggc3RyaW5nKSldOwp9Ci0gKGd1aW50KSBnZXRBY2NlbFdpZHRoCnsKICAgIHJl
dHVybiBndGtfYWNjZWxfbGFiZWxfZ2V0X2FjY2VsX3dpZHRoKGd0ayk7Cn0KLSAodm9pZCkgc2V0
QWNjZWxXaWRnZXQ6KEdUS1dpZGdldCAqKSBhY2NlbF93aWRnZXQKewogICAgZ3RrX2FjY2VsX2xh
YmVsX3NldF9hY2NlbF93aWRnZXQoZ3RrLCBhY2NlbF93aWRnZXQgPyBhY2NlbF93aWRnZXQtPmd0
ayA6IDApOwp9Ci0gKGdib29sZWFuKSByZWZldGNoCnsKICAgIHJldHVybiBndGtfYWNjZWxfbGFi
ZWxfcmVmZXRjaChndGspOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRl
cmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIw
MDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2Fk
anVzdG1lbnQuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAy
LjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
CiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQWRqdXN0bWVudC5oPgoKQGltcGxlbWVudGF0aW9u
IEdUS0FkanVzdG1lbnQKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2FkanVz
dG1lbnRfZ2V0X3R5cGUoKTsKfQorIChpZCkgYWRqdXN0bWVudFdpdGhWYWx1ZTooZ2Zsb2F0KSB2
YWx1ZSBsb3dlcjooZ2Zsb2F0KSBsb3dlciB1cHBlcjooZ2Zsb2F0KSB1cHBlciBzdGVwSW5jcmVt
ZW50OihnZmxvYXQpIHN0ZXBfaW5jcmVtZW50IHBhZ2VJbmNyZW1lbnQ6KGdmbG9hdCkgcGFnZV9p
bmNyZW1lbnQgcGFnZVNpemU6KGdmbG9hdCkgcGFnZV9zaXplCnsKICAgIHJldHVybiBbWyhHVEtB
ZGp1c3RtZW50ICopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWU6dmFsdWUgbG93ZXI6bG93ZXIg
dXBwZXI6dXBwZXIgc3RlcEluY3JlbWVudDpzdGVwX2luY3JlbWVudCBwYWdlSW5jcmVtZW50OnBh
Z2VfaW5jcmVtZW50IHBhZ2VTaXplOnBhZ2Vfc2l6ZV0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBp
bml0V2l0aFZhbHVlOihnZmxvYXQpIHZhbHVlIGxvd2VyOihnZmxvYXQpIGxvd2VyIHVwcGVyOihn
ZmxvYXQpIHVwcGVyIHN0ZXBJbmNyZW1lbnQ6KGdmbG9hdCkgc3RlcF9pbmNyZW1lbnQgcGFnZUlu
Y3JlbWVudDooZ2Zsb2F0KSBwYWdlX2luY3JlbWVudCBwYWdlU2l6ZTooZ2Zsb2F0KSBwYWdlX3Np
emUKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19hZGp1c3RtZW50X25ldyggdmFs
dWUgLCBsb3dlciAsIHVwcGVyICwgc3RlcF9pbmNyZW1lbnQgLCBwYWdlX2luY3JlbWVudCAsIHBh
Z2Vfc2l6ZSldOwp9Ci0gKHZvaWQpIGNoYW5nZWQKewogICAgZ3RrX2FkanVzdG1lbnRfY2hhbmdl
ZChndGspOwp9Ci0gKHZvaWQpIHZhbHVlQ2hhbmdlZAp7CiAgICBndGtfYWRqdXN0bWVudF92YWx1
ZV9jaGFuZ2VkKGd0ayk7Cn0KLSAodm9pZCkgY2xhbXBQYWdlOihnZmxvYXQpIGxvd2VyIHVwcGVy
OihnZmxvYXQpIHVwcGVyCnsKICAgIGd0a19hZGp1c3RtZW50X2NsYW1wX3BhZ2UoZ3RrLCBsb3dl
ciAsIHVwcGVyKTsKfQotICh2b2lkKSBzZXRWYWx1ZTooZ2Zsb2F0KSB2YWx1ZQp7CiAgICBndGtf
YWRqdXN0bWVudF9zZXRfdmFsdWUoZ3RrLCB2YWx1ZSk7Cn0KI2RlZmluZSBndGsJKChHdGtBZGp1
c3RtZW50ICopIGd0aykKLSAoZ2Zsb2F0KSBnZXRWYWx1ZQp7CiAgICByZXR1cm4gZ3RrLT52YWx1
ZTsKfQoKLSAodm9pZCkgc2V0TG93ZXI6KGdmbG9hdCkgbG93ZXIgdXBwZXI6KGdmbG9hdCkgdXBw
ZXIKCSBzdGVwSW5jcmVtZW50OihnZmxvYXQpIHN0ZXBfaW5jcmVtZW50CgkgcGFnZUluY3JlbWVu
dDooZ2Zsb2F0KSBwYWdlX2luY3JlbWVudCBwYWdlU2l6ZTooZ2Zsb2F0KSBwYWdlX3NpemUKewog
ICAgZ3RrLT5sb3dlciA9IGxvd2VyOwogICAgZ3RrLT51cHBlciA9IHVwcGVyOwogICAgZ3RrLT5z
dGVwX2luY3JlbWVudCA9IHN0ZXBfaW5jcmVtZW50OwogICAgZ3RrLT5wYWdlX2luY3JlbWVudCA9
IHBhZ2VfaW5jcmVtZW50OwogICAgZ3RrLT5wYWdlX3NpemUgPSBwYWdlX3NpemU7Cn0KCi0gKHZv
aWQpIGdldExvd2VyOihnZmxvYXQgKikgbG93ZXIgdXBwZXI6KGdmbG9hdCAqKSB1cHBlcgoJIHN0
ZXBJbmNyZW1lbnQ6KGdmbG9hdCAqKSBzdGVwX2luY3JlbWVudAoJIHBhZ2VJbmNyZW1lbnQ6KGdm
bG9hdCAqKSBwYWdlX2luY3JlbWVudCBwYWdlU2l6ZTooZ2Zsb2F0ICopIHBhZ2Vfc2l6ZQp7CiAg
ICAqbG93ZXIgPSBndGstPmxvd2VyOwogICAgKnVwcGVyID0gZ3RrLT51cHBlcjsKICAgICpzdGVw
X2luY3JlbWVudCA9IGd0ay0+c3RlcF9pbmNyZW1lbnQ7CiAgICAqcGFnZV9pbmNyZW1lbnQgPSBn
dGstPnBhZ2VfaW5jcmVtZW50OwogICAgKnBhZ2Vfc2l6ZSA9IGd0ay0+cGFnZV9zaXplOwp9CiN1
bmRlZiBndGsKQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0
aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIg
THVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrYWxpZ25tZW50Lmgg
YnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1
ZGUgPEdUb29sS2l0L0dUS0FsaWdubWVudC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0FsaWdubWVu
dAorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfYWxpZ25tZW50X2dldF90eXBl
KCk7Cn0KKyAoaWQpIGFsaWdubWVudFdpdGhYYWxpZ246KGdmbG9hdCkgeGFsaWduIHlhbGlnbjoo
Z2Zsb2F0KSB5YWxpZ24geHNjYWxlOihnZmxvYXQpIHhzY2FsZSB5c2NhbGU6KGdmbG9hdCkgeXNj
YWxlCnsKICAgIHJldHVybiBbWyhHVEtBbGlnbm1lbnQgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhY
YWxpZ246eGFsaWduIHlhbGlnbjp5YWxpZ24geHNjYWxlOnhzY2FsZSB5c2NhbGU6eXNjYWxlXSBh
dXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoWGFsaWduOihnZmxvYXQpIHhhbGlnbiB5YWxp
Z246KGdmbG9hdCkgeWFsaWduIHhzY2FsZTooZ2Zsb2F0KSB4c2NhbGUgeXNjYWxlOihnZmxvYXQp
IHlzY2FsZQp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2FsaWdubWVudF9uZXco
IHhhbGlnbiAsIHlhbGlnbiAsIHhzY2FsZSAsIHlzY2FsZSldOwp9Ci0gKHZvaWQpIHNldDooZ2Zs
b2F0KSB4YWxpZ24geWFsaWduOihnZmxvYXQpIHlhbGlnbiB4c2NhbGU6KGdmbG9hdCkgeHNjYWxl
IHlzY2FsZTooZ2Zsb2F0KSB5c2NhbGUKewogICAgZ3RrX2FsaWdubWVudF9zZXQoZ3RrLCB4YWxp
Z24gLCB5YWxpZ24gLCB4c2NhbGUgLCB5c2NhbGUpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBP
YmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMp
IDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGlj
YWxseSBmcm9tIGd0a2Fycm93LmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAq
IHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0Fycm93Lmg+CgpAaW1wbGVtZW50
YXRpb24gR1RLQXJyb3cKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2Fycm93
X2dldF90eXBlKCk7Cn0KKyAoaWQpIGFycm93V2l0aFR5cGU6KEd0a0Fycm93VHlwZSkgYXJyb3df
dHlwZSBzaGFkb3dUeXBlOihHdGtTaGFkb3dUeXBlKSBzaGFkb3dfdHlwZQp7CiAgICByZXR1cm4g
W1soR1RLQXJyb3cgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhUeXBlOmFycm93X3R5cGUgc2hhZG93
VHlwZTpzaGFkb3dfdHlwZV0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aFR5cGU6KEd0
a0Fycm93VHlwZSkgYXJyb3dfdHlwZSBzaGFkb3dUeXBlOihHdGtTaGFkb3dUeXBlKSBzaGFkb3df
dHlwZQp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2Fycm93X25ldyggYXJyb3df
dHlwZSAsIHNoYWRvd190eXBlKV07Cn0KLSAodm9pZCkgc2V0OihHdGtBcnJvd1R5cGUpIGFycm93
X3R5cGUgc2hhZG93VHlwZTooR3RrU2hhZG93VHlwZSkgc2hhZG93X3R5cGUKewogICAgZ3RrX2Fy
cm93X3NldChndGssIGFycm93X3R5cGUgLCBzaGFkb3dfdHlwZSk7Cn0KQGVuZAovKgogKiBHVG9v
bEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHly
aWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBh
dXRvbWF0aWNhbGx5IGZyb20gZ3RrYXNwZWN0ZnJhbWUuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQXNwZWN0
RnJhbWUuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtBc3BlY3RGcmFtZQorIChHdGtUeXBlKSBnZXRU
eXBlCnsKICAgIHJldHVybiBndGtfYXNwZWN0X2ZyYW1lX2dldF90eXBlKCk7Cn0KKyAoaWQpIGFz
cGVjdEZyYW1lV2l0aExhYmVsOihOU1N0cmluZyAqKSBsYWJlbCB4YWxpZ246KGdmbG9hdCkgeGFs
aWduIHlhbGlnbjooZ2Zsb2F0KSB5YWxpZ24gcmF0aW86KGdmbG9hdCkgcmF0aW8gb2JleUNoaWxk
OihnYm9vbGVhbikgb2JleV9jaGlsZAp7CiAgICByZXR1cm4gW1soR1RLQXNwZWN0RnJhbWUgKilb
c2VsZiBhbGxvY10gaW5pdFdpdGhMYWJlbDpsYWJlbCB4YWxpZ246eGFsaWduIHlhbGlnbjp5YWxp
Z24gcmF0aW86cmF0aW8gb2JleUNoaWxkOm9iZXlfY2hpbGRdIGF1dG9yZWxlYXNlXTsKfQotIChp
ZCkgaW5pdFdpdGhMYWJlbDooTlNTdHJpbmcgKikgbGFiZWwgeGFsaWduOihnZmxvYXQpIHhhbGln
biB5YWxpZ246KGdmbG9hdCkgeWFsaWduIHJhdGlvOihnZmxvYXQpIHJhdGlvIG9iZXlDaGlsZDoo
Z2Jvb2xlYW4pIG9iZXlfY2hpbGQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19h
c3BlY3RfZnJhbWVfbmV3KGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBsYWJlbCApLCB4YWxpZ24gLCB5
YWxpZ24gLCByYXRpbyAsIG9iZXlfY2hpbGQpXTsKfQotICh2b2lkKSBzZXQ6KGdmbG9hdCkgeGFs
aWduIHlhbGlnbjooZ2Zsb2F0KSB5YWxpZ24gcmF0aW86KGdmbG9hdCkgcmF0aW8gb2JleUNoaWxk
OihnYm9vbGVhbikgb2JleV9jaGlsZAp7CiAgICBndGtfYXNwZWN0X2ZyYW1lX3NldChndGssIHhh
bGlnbiAsIHlhbGlnbiAsIHJhdGlvICwgb2JleV9jaGlsZCk7Cn0KQGVuZAovKgogKiBHVG9vbEtp
dCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdo
dCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRv
bWF0aWNhbGx5IGZyb20gZ3RrYmJveC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtCdXR0b25Cb3guaD4KCkBp
bXBsZW1lbnRhdGlvbiBHVEtCdXR0b25Cb3gKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1
cm4gZ3RrX2J1dHRvbl9ib3hfZ2V0X3R5cGUoKTsKfQorICh2b2lkKSBnZXRDaGlsZFNpemVEZWZh
dWx0OihnaW50ICopIG1pbl93aWR0aCBtaW5IZWlnaHQ6KGdpbnQgKikgbWluX2hlaWdodAp7CiAg
ICBndGtfYnV0dG9uX2JveF9nZXRfY2hpbGRfc2l6ZV9kZWZhdWx0KCBtaW5fd2lkdGggLCBtaW5f
aGVpZ2h0KTsKfQorICh2b2lkKSBnZXRDaGlsZElwYWRkaW5nRGVmYXVsdDooZ2ludCAqKSBpcGFk
X3ggaXBhZFk6KGdpbnQgKikgaXBhZF95CnsKICAgIGd0a19idXR0b25fYm94X2dldF9jaGlsZF9p
cGFkZGluZ19kZWZhdWx0KCBpcGFkX3ggLCBpcGFkX3kpOwp9CisgKHZvaWQpIHNldENoaWxkU2l6
ZURlZmF1bHQ6KGdpbnQpIG1pbl93aWR0aCBtaW5IZWlnaHQ6KGdpbnQpIG1pbl9oZWlnaHQKewog
ICAgZ3RrX2J1dHRvbl9ib3hfc2V0X2NoaWxkX3NpemVfZGVmYXVsdCggbWluX3dpZHRoICwgbWlu
X2hlaWdodCk7Cn0KKyAodm9pZCkgc2V0Q2hpbGRJcGFkZGluZ0RlZmF1bHQ6KGdpbnQpIGlwYWRf
eCBpcGFkWTooZ2ludCkgaXBhZF95CnsKICAgIGd0a19idXR0b25fYm94X3NldF9jaGlsZF9pcGFk
ZGluZ19kZWZhdWx0KCBpcGFkX3ggLCBpcGFkX3kpOwp9Ci0gKGdpbnQpIGdldFNwYWNpbmcKewog
ICAgcmV0dXJuIGd0a19idXR0b25fYm94X2dldF9zcGFjaW5nKGd0ayk7Cn0KLSAoR3RrQnV0dG9u
Qm94U3R5bGUpIGdldExheW91dAp7CiAgICByZXR1cm4gZ3RrX2J1dHRvbl9ib3hfZ2V0X2xheW91
dChndGspOwp9Ci0gKHZvaWQpIGdldENoaWxkU2l6ZTooZ2ludCAqKSBtaW5fd2lkdGggbWluSGVp
Z2h0OihnaW50ICopIG1pbl9oZWlnaHQKewogICAgZ3RrX2J1dHRvbl9ib3hfZ2V0X2NoaWxkX3Np
emUoZ3RrLCBtaW5fd2lkdGggLCBtaW5faGVpZ2h0KTsKfQotICh2b2lkKSBnZXRDaGlsZElwYWRk
aW5nOihnaW50ICopIGlwYWRfeCBpcGFkWTooZ2ludCAqKSBpcGFkX3kKewogICAgZ3RrX2J1dHRv
bl9ib3hfZ2V0X2NoaWxkX2lwYWRkaW5nKGd0aywgaXBhZF94ICwgaXBhZF95KTsKfQotICh2b2lk
KSBzZXRTcGFjaW5nOihnaW50KSBzcGFjaW5nCnsKICAgIGd0a19idXR0b25fYm94X3NldF9zcGFj
aW5nKGd0aywgc3BhY2luZyk7Cn0KLSAodm9pZCkgc2V0TGF5b3V0OihHdGtCdXR0b25Cb3hTdHls
ZSkgbGF5b3V0X3N0eWxlCnsKICAgIGd0a19idXR0b25fYm94X3NldF9sYXlvdXQoZ3RrLCBsYXlv
dXRfc3R5bGUpOwp9Ci0gKHZvaWQpIHNldENoaWxkU2l6ZTooZ2ludCkgbWluX3dpZHRoIG1pbkhl
aWdodDooZ2ludCkgbWluX2hlaWdodAp7CiAgICBndGtfYnV0dG9uX2JveF9zZXRfY2hpbGRfc2l6
ZShndGssIG1pbl93aWR0aCAsIG1pbl9oZWlnaHQpOwp9Ci0gKHZvaWQpIHNldENoaWxkSXBhZGRp
bmc6KGdpbnQpIGlwYWRfeCBpcGFkWTooZ2ludCkgaXBhZF95CnsKICAgIGd0a19idXR0b25fYm94
X3NldF9jaGlsZF9pcGFkZGluZyhndGssIGlwYWRfeCAsIGlwYWRfeSk7Cn0KQGVuZAovKgogKiBH
VG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENv
cHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRl
ZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrYmluLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0Jpbi5oPgoKQGlt
cGxlbWVudGF0aW9uIEdUS0JpbgorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtf
YmluX2dldF90eXBlKCk7Cn0KI2RlZmluZSBndGsJKChHdGtCaW4gKikgZ3RrKQotIChpZCkgY2hp
bGQKewogICAgcmV0dXJuIEdUT09MS0lUX09CSkVDVChndGstPmNoaWxkKTsKfQojdW5kZWYgZ3Rr
CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAg
VG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwog
KgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2JveC5oIGJ5IGd0a2dlbi4KICoK
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl
bmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9H
VEtCb3guaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1dpZGdldC5oPgoKQGltcGxlbWVudGF0aW9u
IEdUS0JveAorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfYm94X2dldF90eXBl
KCk7Cn0KLSAodm9pZCkgcGFja1N0YXJ0OihHVEtXaWRnZXQgKikgY2hpbGQgZXhwYW5kOihnYm9v
bGVhbikgZXhwYW5kIGZpbGw6KGdib29sZWFuKSBmaWxsIHBhZGRpbmc6KGd1aW50KSBwYWRkaW5n
CnsKICAgIGd0a19ib3hfcGFja19zdGFydChndGssIGNoaWxkICA/IGNoaWxkIC0+Z3RrIDogMCwg
ZXhwYW5kICwgZmlsbCAsIHBhZGRpbmcpOwp9Ci0gKHZvaWQpIHBhY2tFbmQ6KEdUS1dpZGdldCAq
KSBjaGlsZCBleHBhbmQ6KGdib29sZWFuKSBleHBhbmQgZmlsbDooZ2Jvb2xlYW4pIGZpbGwgcGFk
ZGluZzooZ3VpbnQpIHBhZGRpbmcKewogICAgZ3RrX2JveF9wYWNrX2VuZChndGssIGNoaWxkICA/
IGNoaWxkIC0+Z3RrIDogMCwgZXhwYW5kICwgZmlsbCAsIHBhZGRpbmcpOwp9Ci0gKHZvaWQpIHBh
Y2tTdGFydERlZmF1bHRzOihHVEtXaWRnZXQgKikgd2lkZ2V0CnsKICAgIGd0a19ib3hfcGFja19z
dGFydF9kZWZhdWx0cyhndGssIHdpZGdldCA/IHdpZGdldC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkg
cGFja0VuZERlZmF1bHRzOihHVEtXaWRnZXQgKikgd2lkZ2V0CnsKICAgIGd0a19ib3hfcGFja19l
bmRfZGVmYXVsdHMoZ3RrLCB3aWRnZXQgPyB3aWRnZXQtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHNl
dEhvbW9nZW5lb3VzOihnYm9vbGVhbikgaG9tb2dlbmVvdXMKewogICAgZ3RrX2JveF9zZXRfaG9t
b2dlbmVvdXMoZ3RrLCBob21vZ2VuZW91cyk7Cn0KLSAodm9pZCkgc2V0U3BhY2luZzooZ2ludCkg
c3BhY2luZwp7CiAgICBndGtfYm94X3NldF9zcGFjaW5nKGd0aywgc3BhY2luZyk7Cn0KLSAodm9p
ZCkgcmVvcmRlckNoaWxkOihHVEtXaWRnZXQgKikgY2hpbGQgcG9zaXRpb246KGdpbnQpIHBvc2l0
aW9uCnsKICAgIGd0a19ib3hfcmVvcmRlcl9jaGlsZChndGssIGNoaWxkICA/IGNoaWxkIC0+Z3Rr
IDogMCwgcG9zaXRpb24pOwp9Ci0gKHZvaWQpIHF1ZXJ5Q2hpbGRQYWNraW5nOihHVEtXaWRnZXQg
KikgY2hpbGQgZXhwYW5kOihnYm9vbGVhbiAqKSBleHBhbmQgZmlsbDooZ2Jvb2xlYW4gKikgZmls
bCBwYWRkaW5nOihndWludCAqKSBwYWRkaW5nIHBhY2tUeXBlOihHdGtQYWNrVHlwZSAqKSBwYWNr
X3R5cGUKewogICAgZ3RrX2JveF9xdWVyeV9jaGlsZF9wYWNraW5nKGd0aywgY2hpbGQgID8gY2hp
bGQgLT5ndGsgOiAwLCBleHBhbmQgLCBmaWxsICwgcGFkZGluZyAsIHBhY2tfdHlwZSk7Cn0KLSAo
dm9pZCkgc2V0Q2hpbGRQYWNraW5nOihHVEtXaWRnZXQgKikgY2hpbGQgZXhwYW5kOihnYm9vbGVh
bikgZXhwYW5kIGZpbGw6KGdib29sZWFuKSBmaWxsIHBhZGRpbmc6KGd1aW50KSBwYWRkaW5nIHBh
Y2tUeXBlOihHdGtQYWNrVHlwZSkgcGFja190eXBlCnsKICAgIGd0a19ib3hfc2V0X2NoaWxkX3Bh
Y2tpbmcoZ3RrLCBjaGlsZCAgPyBjaGlsZCAtPmd0ayA6IDAsIGV4cGFuZCAsIGZpbGwgLCBwYWRk
aW5nICwgcGFja190eXBlKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50
ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAy
MDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGti
dXR0b24uaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAq
LwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQnV0dG9uLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLQnV0
dG9uCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19idXR0b25fZ2V0X3R5cGUo
KTsKfQorIChpZCkgYnV0dG9uCnsKICAgIHJldHVybiBbWyhHVEtCdXR0b24gKilbc2VsZiBhbGxv
Y10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBp
bml0V2l0aEd0azpndGtfYnV0dG9uX25ldygpXTsKfQorIChpZCkgYnV0dG9uV2l0aExhYmVsOihO
U1N0cmluZyAqKSBsYWJlbAp7CiAgICByZXR1cm4gW1soR1RLQnV0dG9uICopW3NlbGYgYWxsb2Nd
IGluaXRXaXRoTGFiZWw6bGFiZWxdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhMYWJl
bDooTlNTdHJpbmcgKikgbGFiZWwKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19i
dXR0b25fbmV3X3dpdGhfbGFiZWwoZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGxhYmVsKSldOwp9Ci0g
KHZvaWQpIHByZXNzZWQKewogICAgZ3RrX2J1dHRvbl9wcmVzc2VkKGd0ayk7Cn0KLSAodm9pZCkg
cmVsZWFzZWQKewogICAgZ3RrX2J1dHRvbl9yZWxlYXNlZChndGspOwp9Ci0gKHZvaWQpIGNsaWNr
ZWQKewogICAgZ3RrX2J1dHRvbl9jbGlja2VkKGd0ayk7Cn0KLSAodm9pZCkgZW50ZXIKewogICAg
Z3RrX2J1dHRvbl9lbnRlcihndGspOwp9Ci0gKHZvaWQpIGxlYXZlCnsKICAgIGd0a19idXR0b25f
bGVhdmUoZ3RrKTsKfQotICh2b2lkKSBzZXRSZWxpZWY6KEd0a1JlbGllZlN0eWxlKSBuZXdzdHls
ZQp7CiAgICBndGtfYnV0dG9uX3NldF9yZWxpZWYoZ3RrLCBuZXdzdHlsZSk7Cn0KLSAoR3RrUmVs
aWVmU3R5bGUpIGdldFJlbGllZgp7CiAgICByZXR1cm4gZ3RrX2J1dHRvbl9nZXRfcmVsaWVmKGd0
ayk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUg
R0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVk
d2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrY2FsZW5kYXIuaCBieSBn
dGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8
R1Rvb2xLaXQvR1RLQ2FsZW5kYXIuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtDYWxlbmRhcgorIChH
dGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfY2FsZW5kYXJfZ2V0X3R5cGUoKTsKfQor
IChpZCkgY2FsZW5kYXIKewogICAgcmV0dXJuIFtbKEdUS0NhbGVuZGFyICopW3NlbGYgYWxsb2Nd
IGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYgaW5p
dFdpdGhHdGs6Z3RrX2NhbGVuZGFyX25ldygpXTsKfQotIChnaW50KSBzZWxlY3RNb250aDooZ3Vp
bnQpIG1vbnRoIHllYXI6KGd1aW50KSB5ZWFyCnsKICAgIHJldHVybiBndGtfY2FsZW5kYXJfc2Vs
ZWN0X21vbnRoKGd0aywgbW9udGggLCB5ZWFyKTsKfQotICh2b2lkKSBzZWxlY3REYXk6KGd1aW50
KSBkYXkKewogICAgZ3RrX2NhbGVuZGFyX3NlbGVjdF9kYXkoZ3RrLCBkYXkpOwp9Ci0gKGdpbnQp
IG1hcmtEYXk6KGd1aW50KSBkYXkKewogICAgcmV0dXJuIGd0a19jYWxlbmRhcl9tYXJrX2RheShn
dGssIGRheSk7Cn0KLSAoZ2ludCkgdW5tYXJrRGF5OihndWludCkgZGF5CnsKICAgIHJldHVybiBn
dGtfY2FsZW5kYXJfdW5tYXJrX2RheShndGssIGRheSk7Cn0KLSAodm9pZCkgY2xlYXJNYXJrcwp7
CiAgICBndGtfY2FsZW5kYXJfY2xlYXJfbWFya3MoZ3RrKTsKfQotICh2b2lkKSBkaXNwbGF5T3B0
aW9uczooR3RrQ2FsZW5kYXJEaXNwbGF5T3B0aW9ucykgZmxhZ3MKewogICAgZ3RrX2NhbGVuZGFy
X2Rpc3BsYXlfb3B0aW9ucyhndGssIGZsYWdzKTsKfQotICh2b2lkKSBnZXREYXRlOihndWludCAq
KSB5ZWFyIG1vbnRoOihndWludCAqKSBtb250aCBkYXk6KGd1aW50ICopIGRheQp7CiAgICBndGtf
Y2FsZW5kYXJfZ2V0X2RhdGUoZ3RrLCB5ZWFyICwgbW9udGggLCBkYXkpOwp9Ci0gKHZvaWQpIGZy
ZWV6ZQp7CiAgICBndGtfY2FsZW5kYXJfZnJlZXplKGd0ayk7Cn0KLSAodm9pZCkgdGhhdwp7CiAg
ICBndGtfY2FsZW5kYXJfdGhhdyhndGspOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3Rp
dmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgs
IDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBm
cm9tIGd0a2NoZWNrYnV0dG9uLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAq
IHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0NoZWNrQnV0dG9uLmg+CgpAaW1w
bGVtZW50YXRpb24gR1RLQ2hlY2tCdXR0b24KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1
cm4gZ3RrX2NoZWNrX2J1dHRvbl9nZXRfdHlwZSgpOwp9CisgKGlkKSBjaGVja0J1dHRvbgp7CiAg
ICByZXR1cm4gW1soR1RLQ2hlY2tCdXR0b24gKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVh
c2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfY2hl
Y2tfYnV0dG9uX25ldygpXTsKfQorIChpZCkgY2hlY2tCdXR0b25XaXRoTGFiZWw6KE5TU3RyaW5n
ICopIGxhYmVsCnsKICAgIHJldHVybiBbWyhHVEtDaGVja0J1dHRvbiAqKVtzZWxmIGFsbG9jXSBp
bml0V2l0aExhYmVsOmxhYmVsXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoTGFiZWw6
KE5TU3RyaW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfY2hl
Y2tfYnV0dG9uX25ld193aXRoX2xhYmVsKGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBsYWJlbCkpXTsK
fQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1Q
IFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcK
ICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtjaGVja21lbnVpdGVtLmggYnkg
Z3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUg
PEdUb29sS2l0L0dUS0NoZWNrTWVudUl0ZW0uaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtDaGVja01l
bnVJdGVtCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19jaGVja19tZW51X2l0
ZW1fZ2V0X3R5cGUoKTsKfQorIChpZCkgY2hlY2tNZW51SXRlbQp7CiAgICByZXR1cm4gW1soR1RL
Q2hlY2tNZW51SXRlbSAqKVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQp
IGluaXQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19jaGVja19tZW51X2l0ZW1f
bmV3KCldOwp9CisgKGlkKSBjaGVja01lbnVJdGVtV2l0aExhYmVsOihOU1N0cmluZyAqKSBsYWJl
bAp7CiAgICByZXR1cm4gW1soR1RLQ2hlY2tNZW51SXRlbSAqKVtzZWxmIGFsbG9jXSBpbml0V2l0
aExhYmVsOmxhYmVsXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoTGFiZWw6KE5TU3Ry
aW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfY2hlY2tfbWVu
dV9pdGVtX25ld193aXRoX2xhYmVsKGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBsYWJlbCkpXTsKfQot
ICh2b2lkKSBzZXRBY3RpdmU6KGdib29sZWFuKSBpc19hY3RpdmUKewogICAgZ3RrX2NoZWNrX21l
bnVfaXRlbV9zZXRfYWN0aXZlKGd0aywgaXNfYWN0aXZlKTsKfQotICh2b2lkKSBzZXRTaG93VG9n
Z2xlOihnYm9vbGVhbikgYWx3YXlzCnsKICAgIGd0a19jaGVja19tZW51X2l0ZW1fc2V0X3Nob3df
dG9nZ2xlKGd0aywgYWx3YXlzKTsKfQotICh2b2lkKSB0b2dnbGVkCnsKICAgIGd0a19jaGVja19t
ZW51X2l0ZW1fdG9nZ2xlZChndGspOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUt
QyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5
OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9t
IGd0a2NsaXN0LmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24g
Mi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0NMaXN0Lmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9H
VEtXaWRnZXQuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0FkanVzdG1lbnQuaD4KI2luY2x1ZGUg
PEdUb29sS2l0L0dUS1N0eWxlLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLQ0xpc3QKKyAoR3RrVHlw
ZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X2dldF90eXBlKCk7Cn0KKyAoaWQpIGNM
aXN0V2l0aENvbHVtbnM6KGdpbnQpIGNvbHVtbnMKewogICAgcmV0dXJuIFtbKEdUS0NMaXN0ICop
W3NlbGYgYWxsb2NdIGluaXRXaXRoQ29sdW1uczpjb2x1bW5zXSBhdXRvcmVsZWFzZV07Cn0KLSAo
aWQpIGluaXRXaXRoQ29sdW1uczooZ2ludCkgY29sdW1ucwp7CiAgICByZXR1cm4gW3NlbGYgaW5p
dFdpdGhHdGs6Z3RrX2NsaXN0X25ldyggY29sdW1ucyldOwp9CisgKGlkKSBjTGlzdFdpdGhUaXRs
ZXM6KGdpbnQpIGNvbHVtbnMgdGl0bGVzOihOU0FycmF5ICAqKSB0aXRsZXMKewogICAgcmV0dXJu
IFtbKEdUS0NMaXN0ICopW3NlbGYgYWxsb2NdIGluaXRXaXRoVGl0bGVzOmNvbHVtbnMgdGl0bGVz
OnRpdGxlc10gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aFRpdGxlczooZ2ludCkgY29s
dW1ucyB0aXRsZXM6KE5TQXJyYXkgICopIHRpdGxlcwp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdp
dGhHdGs6Z3RrX2NsaXN0X25ld193aXRoX3RpdGxlcyggY29sdW1ucyAsKGNoYXIgKiopZ3Rvb2xr
aXRfYXJyYXlfdG9fc3RydmVjKCB0aXRsZXMpKV07Cn0KLSAodm9pZCkgc2V0SGFkanVzdG1lbnQ6
KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudAp7CiAgICBndGtfY2xpc3Rfc2V0X2hhZGp1c3Rt
ZW50KGd0aywgYWRqdXN0bWVudCA/IGFkanVzdG1lbnQtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHNl
dFZhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGFkanVzdG1lbnQKewogICAgZ3RrX2NsaXN0
X3NldF92YWRqdXN0bWVudChndGssIGFkanVzdG1lbnQgPyBhZGp1c3RtZW50LT5ndGsgOiAwKTsK
fQotIChHVEtBZGp1c3RtZW50KikgZ2V0SGFkanVzdG1lbnQKewogICAgcmV0dXJuIGd0b29sa2l0
X29iamVjdChndGtfY2xpc3RfZ2V0X2hhZGp1c3RtZW50KGd0ayksIDApOwp9Ci0gKEdUS0FkanVz
dG1lbnQqKSBnZXRWYWRqdXN0bWVudAp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19j
bGlzdF9nZXRfdmFkanVzdG1lbnQoZ3RrKSwgMCk7Cn0KLSAodm9pZCkgc2V0U2hhZG93VHlwZToo
R3RrU2hhZG93VHlwZSkgdHlwZQp7CiAgICBndGtfY2xpc3Rfc2V0X3NoYWRvd190eXBlKGd0aywg
dHlwZSk7Cn0KLSAodm9pZCkgc2V0U2VsZWN0aW9uTW9kZTooR3RrU2VsZWN0aW9uTW9kZSkgbW9k
ZQp7CiAgICBndGtfY2xpc3Rfc2V0X3NlbGVjdGlvbl9tb2RlKGd0aywgbW9kZSk7Cn0KLSAodm9p
ZCkgc2V0UmVvcmRlcmFibGU6KGdib29sZWFuKSByZW9yZGVyYWJsZQp7CiAgICBndGtfY2xpc3Rf
c2V0X3Jlb3JkZXJhYmxlKGd0aywgcmVvcmRlcmFibGUpOwp9Ci0gKHZvaWQpIHNldFVzZURyYWdJ
Y29uczooZ2Jvb2xlYW4pIHVzZV9pY29ucwp7CiAgICBndGtfY2xpc3Rfc2V0X3VzZV9kcmFnX2lj
b25zKGd0aywgdXNlX2ljb25zKTsKfQotICh2b2lkKSBzZXRCdXR0b25BY3Rpb25zOihndWludCkg
YnV0dG9uIGJ1dHRvbkFjdGlvbnM6KGd1aW50OCkgYnV0dG9uX2FjdGlvbnMKewogICAgZ3RrX2Ns
aXN0X3NldF9idXR0b25fYWN0aW9ucyhndGssIGJ1dHRvbiAsIGJ1dHRvbl9hY3Rpb25zKTsKfQot
ICh2b2lkKSBmcmVlemUKewogICAgZ3RrX2NsaXN0X2ZyZWV6ZShndGspOwp9Ci0gKHZvaWQpIHRo
YXcKewogICAgZ3RrX2NsaXN0X3RoYXcoZ3RrKTsKfQotICh2b2lkKSBjb2x1bW5UaXRsZXNTaG93
CnsKICAgIGd0a19jbGlzdF9jb2x1bW5fdGl0bGVzX3Nob3coZ3RrKTsKfQotICh2b2lkKSBjb2x1
bW5UaXRsZXNIaWRlCnsKICAgIGd0a19jbGlzdF9jb2x1bW5fdGl0bGVzX2hpZGUoZ3RrKTsKfQot
ICh2b2lkKSBjb2x1bW5UaXRsZUFjdGl2ZTooZ2ludCkgY29sdW1uCnsKICAgIGd0a19jbGlzdF9j
b2x1bW5fdGl0bGVfYWN0aXZlKGd0aywgY29sdW1uKTsKfQotICh2b2lkKSBjb2x1bW5UaXRsZVBh
c3NpdmU6KGdpbnQpIGNvbHVtbgp7CiAgICBndGtfY2xpc3RfY29sdW1uX3RpdGxlX3Bhc3NpdmUo
Z3RrLCBjb2x1bW4pOwp9Ci0gKHZvaWQpIGNvbHVtblRpdGxlc0FjdGl2ZQp7CiAgICBndGtfY2xp
c3RfY29sdW1uX3RpdGxlc19hY3RpdmUoZ3RrKTsKfQotICh2b2lkKSBjb2x1bW5UaXRsZXNQYXNz
aXZlCnsKICAgIGd0a19jbGlzdF9jb2x1bW5fdGl0bGVzX3Bhc3NpdmUoZ3RrKTsKfQotICh2b2lk
KSBzZXRDb2x1bW46KGdpbnQpIGNvbHVtbiB0aXRsZTooTlNTdHJpbmcgKikgdGl0bGUKewogICAg
Z3RrX2NsaXN0X3NldF9jb2x1bW5fdGl0bGUoZ3RrLCBjb2x1bW4gLGd0b29sa2l0X3V0Zjhfc3Ry
aW5nKCB0aXRsZSkpOwp9Ci0gKE5TU3RyaW5nICopIGdldENvbHVtblRpdGxlOihnaW50KSBjb2x1
bW4KewogICAgcmV0dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0a19jbGlzdF9nZXRfY29sdW1u
X3RpdGxlKGd0aywgY29sdW1uKSk7Cn0KLSAodm9pZCkgc2V0Q29sdW1uOihnaW50KSBjb2x1bW4g
d2lkZ2V0OihHVEtXaWRnZXQgKikgd2lkZ2V0CnsKICAgIGd0a19jbGlzdF9zZXRfY29sdW1uX3dp
ZGdldChndGssIGNvbHVtbiAsIHdpZGdldCA/IHdpZGdldC0+Z3RrIDogMCk7Cn0KLSAoR1RLV2lk
Z2V0ICopIGdldENvbHVtbldpZGdldDooZ2ludCkgY29sdW1uCnsKICAgIHJldHVybiBndG9vbGtp
dF9vYmplY3QoZ3RrX2NsaXN0X2dldF9jb2x1bW5fd2lkZ2V0KGd0aywgY29sdW1uKSwgMCk7Cn0K
LSAodm9pZCkgc2V0Q29sdW1uOihnaW50KSBjb2x1bW4ganVzdGlmaWNhdGlvbjooR3RrSnVzdGlm
aWNhdGlvbikganVzdGlmaWNhdGlvbgp7CiAgICBndGtfY2xpc3Rfc2V0X2NvbHVtbl9qdXN0aWZp
Y2F0aW9uKGd0aywgY29sdW1uICwganVzdGlmaWNhdGlvbik7Cn0KLSAodm9pZCkgc2V0Q29sdW1u
VmlzaWJpbGl0eTooZ2ludCkgY29sdW1uIHZpc2libGU6KGdib29sZWFuKSB2aXNpYmxlCnsKICAg
IGd0a19jbGlzdF9zZXRfY29sdW1uX3Zpc2liaWxpdHkoZ3RrLCBjb2x1bW4gLCB2aXNpYmxlKTsK
fQotICh2b2lkKSBzZXRDb2x1bW46KGdpbnQpIGNvbHVtbiByZXNpemVhYmxlOihnYm9vbGVhbikg
cmVzaXplYWJsZQp7CiAgICBndGtfY2xpc3Rfc2V0X2NvbHVtbl9yZXNpemVhYmxlKGd0aywgY29s
dW1uICwgcmVzaXplYWJsZSk7Cn0KLSAodm9pZCkgc2V0Q29sdW1uOihnaW50KSBjb2x1bW4gYXV0
b1Jlc2l6ZTooZ2Jvb2xlYW4pIGF1dG9fcmVzaXplCnsKICAgIGd0a19jbGlzdF9zZXRfY29sdW1u
X2F1dG9fcmVzaXplKGd0aywgY29sdW1uICwgYXV0b19yZXNpemUpOwp9Ci0gKGdpbnQpIGNvbHVt
bnNBdXRvc2l6ZQp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X2NvbHVtbnNfYXV0b3NpemUoZ3RrKTsK
fQotIChnaW50KSBvcHRpbWFsQ29sdW1uV2lkdGg6KGdpbnQpIGNvbHVtbgp7CiAgICByZXR1cm4g
Z3RrX2NsaXN0X29wdGltYWxfY29sdW1uX3dpZHRoKGd0aywgY29sdW1uKTsKfQotICh2b2lkKSBz
ZXRDb2x1bW46KGdpbnQpIGNvbHVtbiB3aWR0aDooZ2ludCkgd2lkdGgKewogICAgZ3RrX2NsaXN0
X3NldF9jb2x1bW5fd2lkdGgoZ3RrLCBjb2x1bW4gLCB3aWR0aCk7Cn0KLSAodm9pZCkgc2V0Q29s
dW1uOihnaW50KSBjb2x1bW4gbWluV2lkdGg6KGdpbnQpIG1pbl93aWR0aAp7CiAgICBndGtfY2xp
c3Rfc2V0X2NvbHVtbl9taW5fd2lkdGgoZ3RrLCBjb2x1bW4gLCBtaW5fd2lkdGgpOwp9Ci0gKHZv
aWQpIHNldENvbHVtbjooZ2ludCkgY29sdW1uIG1heFdpZHRoOihnaW50KSBtYXhfd2lkdGgKewog
ICAgZ3RrX2NsaXN0X3NldF9jb2x1bW5fbWF4X3dpZHRoKGd0aywgY29sdW1uICwgbWF4X3dpZHRo
KTsKfQotICh2b2lkKSBzZXRSb3dIZWlnaHQ6KGd1aW50KSBoZWlnaHQKewogICAgZ3RrX2NsaXN0
X3NldF9yb3dfaGVpZ2h0KGd0aywgaGVpZ2h0KTsKfQotICh2b2lkKSBtb3ZldG86KGdpbnQpIHJv
dyBjb2x1bW46KGdpbnQpIGNvbHVtbiByb3dBbGlnbjooZ2Zsb2F0KSByb3dfYWxpZ24gY29sQWxp
Z246KGdmbG9hdCkgY29sX2FsaWduCnsKICAgIGd0a19jbGlzdF9tb3ZldG8oZ3RrLCByb3cgLCBj
b2x1bW4gLCByb3dfYWxpZ24gLCBjb2xfYWxpZ24pOwp9Ci0gKEd0a1Zpc2liaWxpdHkpIHJvd0lz
VmlzaWJsZTooZ2ludCkgcm93CnsKICAgIHJldHVybiBndGtfY2xpc3Rfcm93X2lzX3Zpc2libGUo
Z3RrLCByb3cpOwp9Ci0gKEd0a0NlbGxUeXBlKSBnZXRDZWxsVHlwZTooZ2ludCkgcm93IGNvbHVt
bjooZ2ludCkgY29sdW1uCnsKICAgIHJldHVybiBndGtfY2xpc3RfZ2V0X2NlbGxfdHlwZShndGss
IHJvdyAsIGNvbHVtbik7Cn0KLSAodm9pZCkgc2V0VGV4dDooZ2ludCkgcm93IGNvbHVtbjooZ2lu
dCkgY29sdW1uIHRleHQ6KE5TU3RyaW5nICopIHRleHQKewogICAgZ3RrX2NsaXN0X3NldF90ZXh0
KGd0aywgcm93ICwgY29sdW1uICxndG9vbGtpdF91dGY4X3N0cmluZyggdGV4dCkpOwp9Ci0gKGdp
bnQpIGdldFRleHQ6KGdpbnQpIHJvdyBjb2x1bW46KGdpbnQpIGNvbHVtbiB0ZXh0OihOU1N0cmlu
ZyAqKikgdGV4dAp7CiAgICBjaGFyICpfb3V0dmFsXzE7CiAgICBnaW50IF9yZXR2YWxfMTsKICAg
IF9yZXR2YWxfMSA9IGd0a19jbGlzdF9nZXRfdGV4dChndGssIHJvdyAsIGNvbHVtbiAsJl9vdXR2
YWxfMSk7CiAgICAqIHRleHQgPSBndG9vbGtpdF9vYmpjX3N0cmluZyhfb3V0dmFsXzEpOwogICAg
cmV0dXJuIF9yZXR2YWxfMTsKfQotICh2b2lkKSBzZXRQaXhtYXA6KGdpbnQpIHJvdyBjb2x1bW46
KGdpbnQpIGNvbHVtbiBwaXhtYXA6KEdka1BpeG1hcCAqKSBwaXhtYXAgbWFzazooR2RrQml0bWFw
ICopIG1hc2sKewogICAgZ3RrX2NsaXN0X3NldF9waXhtYXAoZ3RrLCByb3cgLCBjb2x1bW4gLCBw
aXhtYXAgLCBtYXNrKTsKfQotIChnaW50KSBnZXRQaXhtYXA6KGdpbnQpIHJvdyBjb2x1bW46KGdp
bnQpIGNvbHVtbiBwaXhtYXA6KEdka1BpeG1hcCAqKikgcGl4bWFwIG1hc2s6KEdka0JpdG1hcCAq
KikgbWFzawp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X2dldF9waXhtYXAoZ3RrLCByb3cgLCBjb2x1
bW4gLCBwaXhtYXAgLCBtYXNrKTsKfQotICh2b2lkKSBzZXRQaXh0ZXh0OihnaW50KSByb3cgY29s
dW1uOihnaW50KSBjb2x1bW4gdGV4dDooTlNTdHJpbmcgKikgdGV4dCBzcGFjaW5nOihndWludDgp
IHNwYWNpbmcgcGl4bWFwOihHZGtQaXhtYXAgKikgcGl4bWFwIG1hc2s6KEdka0JpdG1hcCAqKSBt
YXNrCnsKICAgIGd0a19jbGlzdF9zZXRfcGl4dGV4dChndGssIHJvdyAsIGNvbHVtbiAsZ3Rvb2xr
aXRfdXRmOF9zdHJpbmcoIHRleHQgKSwgc3BhY2luZyAsIHBpeG1hcCAsIG1hc2spOwp9Ci0gKGdp
bnQpIGdldFBpeHRleHQ6KGdpbnQpIHJvdyBjb2x1bW46KGdpbnQpIGNvbHVtbiB0ZXh0OihOU1N0
cmluZyAqKikgdGV4dCBzcGFjaW5nOihndWludDggKikgc3BhY2luZyBwaXhtYXA6KEdka1BpeG1h
cCAqKikgcGl4bWFwIG1hc2s6KEdka0JpdG1hcCAqKikgbWFzawp7CiAgICBjaGFyICpfb3V0dmFs
XzE7CiAgICBnaW50IF9yZXR2YWxfMTsKICAgIF9yZXR2YWxfMSA9IGd0a19jbGlzdF9nZXRfcGl4
dGV4dChndGssIHJvdyAsIGNvbHVtbiAsJl9vdXR2YWxfMSwgc3BhY2luZyAsIHBpeG1hcCAsIG1h
c2spOwogICAgKiB0ZXh0ICA9IGd0b29sa2l0X29iamNfc3RyaW5nKF9vdXR2YWxfMSk7CiAgICBy
ZXR1cm4gX3JldHZhbF8xOwp9Ci0gKHZvaWQpIHNldEZvcmVncm91bmQ6KGdpbnQpIHJvdyBjb2xv
cjooR2RrQ29sb3IgKikgY29sb3IKewogICAgZ3RrX2NsaXN0X3NldF9mb3JlZ3JvdW5kKGd0aywg
cm93ICwgY29sb3IpOwp9Ci0gKHZvaWQpIHNldEJhY2tncm91bmQ6KGdpbnQpIHJvdyBjb2xvcjoo
R2RrQ29sb3IgKikgY29sb3IKewogICAgZ3RrX2NsaXN0X3NldF9iYWNrZ3JvdW5kKGd0aywgcm93
ICwgY29sb3IpOwp9Ci0gKHZvaWQpIHNldENlbGxTdHlsZTooZ2ludCkgcm93IGNvbHVtbjooZ2lu
dCkgY29sdW1uIHN0eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfY2xpc3Rfc2V0X2Nl
bGxfc3R5bGUoZ3RrLCByb3cgLCBjb2x1bW4gLCBzdHlsZSA/IHN0eWxlLT5ndGsgOiAwKTsKfQot
IChHVEtTdHlsZSAqKSBnZXRDZWxsU3R5bGU6KGdpbnQpIHJvdyBjb2x1bW46KGdpbnQpIGNvbHVt
bgp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19jbGlzdF9nZXRfY2VsbF9zdHlsZShn
dGssIHJvdyAsIGNvbHVtbiksICJHVEtTdHlsZSIpOwp9Ci0gKHZvaWQpIHNldFJvdzooZ2ludCkg
cm93IHN0eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfY2xpc3Rfc2V0X3Jvd19zdHls
ZShndGssIHJvdyAsIHN0eWxlID8gc3R5bGUtPmd0ayA6IDApOwp9Ci0gKEdUS1N0eWxlICopIGdl
dFJvd1N0eWxlOihnaW50KSByb3cKewogICAgcmV0dXJuIGd0b29sa2l0X29iamVjdChndGtfY2xp
c3RfZ2V0X3Jvd19zdHlsZShndGssIHJvdyksICJHVEtTdHlsZSIpOwp9Ci0gKHZvaWQpIHNldFNo
aWZ0OihnaW50KSByb3cgY29sdW1uOihnaW50KSBjb2x1bW4gdmVydGljYWw6KGdpbnQpIHZlcnRp
Y2FsIGhvcml6b250YWw6KGdpbnQpIGhvcml6b250YWwKewogICAgZ3RrX2NsaXN0X3NldF9zaGlm
dChndGssIHJvdyAsIGNvbHVtbiAsIHZlcnRpY2FsICwgaG9yaXpvbnRhbCk7Cn0KLSAodm9pZCkg
c2V0U2VsZWN0YWJsZTooZ2ludCkgcm93IHNlbGVjdGFibGU6KGdib29sZWFuKSBzZWxlY3RhYmxl
CnsKICAgIGd0a19jbGlzdF9zZXRfc2VsZWN0YWJsZShndGssIHJvdyAsIHNlbGVjdGFibGUpOwp9
Ci0gKGdib29sZWFuKSBnZXRTZWxlY3RhYmxlOihnaW50KSByb3cKewogICAgcmV0dXJuIGd0a19j
bGlzdF9nZXRfc2VsZWN0YWJsZShndGssIHJvdyk7Cn0KLSAoZ2ludCkgcHJlcGVuZDooTlNBcnJh
eSAgKikgdGV4dAp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X3ByZXBlbmQoZ3RrLChjaGFyICoqKWd0
b29sa2l0X2FycmF5X3RvX3N0cnZlYyggdGV4dCkpOwp9Ci0gKGdpbnQpIGFwcGVuZDooTlNBcnJh
eSAgKikgdGV4dAp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X2FwcGVuZChndGssKGNoYXIgKiopZ3Rv
b2xraXRfYXJyYXlfdG9fc3RydmVjKCB0ZXh0KSk7Cn0KLSAoZ2ludCkgaW5zZXJ0OihnaW50KSBy
b3cgdGV4dDooTlNBcnJheSAgKikgdGV4dAp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X2luc2VydChn
dGssIHJvdyAsKGNoYXIgKiopZ3Rvb2xraXRfYXJyYXlfdG9fc3RydmVjKCB0ZXh0KSk7Cn0KLSAo
dm9pZCkgcmVtb3ZlOihnaW50KSByb3cKewogICAgZ3RrX2NsaXN0X3JlbW92ZShndGssIHJvdyk7
Cn0KLSAodm9pZCkgc2V0Um93OihnaW50KSByb3cgZGF0YTooZ3BvaW50ZXIpIGRhdGEKewogICAg
Z3RrX2NsaXN0X3NldF9yb3dfZGF0YShndGssIHJvdyAsIGRhdGEpOwp9Ci0gKHZvaWQpIHNldFJv
d0RhdGFGdWxsOihnaW50KSByb3cgZGF0YTooZ3BvaW50ZXIpIGRhdGEgZGVzdHJveTooR3RrRGVz
dHJveU5vdGlmeSkgZGVzdHJveQp7CiAgICBndGtfY2xpc3Rfc2V0X3Jvd19kYXRhX2Z1bGwoZ3Rr
LCByb3cgLCBkYXRhICwgZGVzdHJveSk7Cn0KLSAoZ3BvaW50ZXIpIGdldFJvd0RhdGE6KGdpbnQp
IHJvdwp7CiAgICByZXR1cm4gZ3RrX2NsaXN0X2dldF9yb3dfZGF0YShndGssIHJvdyk7Cn0KLSAo
Z2ludCkgZmluZFJvd0Zyb21EYXRhOihncG9pbnRlcikgZGF0YQp7CiAgICByZXR1cm4gZ3RrX2Ns
aXN0X2ZpbmRfcm93X2Zyb21fZGF0YShndGssIGRhdGEpOwp9Ci0gKHZvaWQpIHNlbGVjdFJvdzoo
Z2ludCkgcm93IGNvbHVtbjooZ2ludCkgY29sdW1uCnsKICAgIGd0a19jbGlzdF9zZWxlY3Rfcm93
KGd0aywgcm93ICwgY29sdW1uKTsKfQotICh2b2lkKSB1bnNlbGVjdFJvdzooZ2ludCkgcm93IGNv
bHVtbjooZ2ludCkgY29sdW1uCnsKICAgIGd0a19jbGlzdF91bnNlbGVjdF9yb3coZ3RrLCByb3cg
LCBjb2x1bW4pOwp9Ci0gKHZvaWQpIHVuZG9TZWxlY3Rpb24KewogICAgZ3RrX2NsaXN0X3VuZG9f
c2VsZWN0aW9uKGd0ayk7Cn0KLSAodm9pZCkgY2xlYXIKewogICAgZ3RrX2NsaXN0X2NsZWFyKGd0
ayk7Cn0KLSAoZ2ludCkgZ2V0U2VsZWN0aW9uSW5mbzooZ2ludCkgeCB5OihnaW50KSB5IHJvdzoo
Z2ludCAqKSByb3cgY29sdW1uOihnaW50ICopIGNvbHVtbgp7CiAgICByZXR1cm4gZ3RrX2NsaXN0
X2dldF9zZWxlY3Rpb25faW5mbyhndGssIHggLCB5ICwgcm93ICwgY29sdW1uKTsKfQotICh2b2lk
KSBzZWxlY3RBbGwKewogICAgZ3RrX2NsaXN0X3NlbGVjdF9hbGwoZ3RrKTsKfQotICh2b2lkKSB1
bnNlbGVjdEFsbAp7CiAgICBndGtfY2xpc3RfdW5zZWxlY3RfYWxsKGd0ayk7Cn0KLSAodm9pZCkg
c3dhcFJvd3M6KGdpbnQpIHJvdzEgcm93MjooZ2ludCkgcm93Mgp7CiAgICBndGtfY2xpc3Rfc3dh
cF9yb3dzKGd0aywgcm93MSAsIHJvdzIpOwp9Ci0gKHZvaWQpIHJvd01vdmU6KGdpbnQpIHNvdXJj
ZV9yb3cgZGVzdFJvdzooZ2ludCkgZGVzdF9yb3cKewogICAgZ3RrX2NsaXN0X3Jvd19tb3ZlKGd0
aywgc291cmNlX3JvdyAsIGRlc3Rfcm93KTsKfQotICh2b2lkKSBzZXRDb21wYXJlRnVuYzooR3Rr
Q0xpc3RDb21wYXJlRnVuYykgY21wX2Z1bmMKewogICAgZ3RrX2NsaXN0X3NldF9jb21wYXJlX2Z1
bmMoZ3RrLCBjbXBfZnVuYyk7Cn0KLSAodm9pZCkgc2V0U29ydENvbHVtbjooZ2ludCkgY29sdW1u
CnsKICAgIGd0a19jbGlzdF9zZXRfc29ydF9jb2x1bW4oZ3RrLCBjb2x1bW4pOwp9Ci0gKHZvaWQp
IHNldFNvcnRUeXBlOihHdGtTb3J0VHlwZSkgc29ydF90eXBlCnsKICAgIGd0a19jbGlzdF9zZXRf
c29ydF90eXBlKGd0aywgc29ydF90eXBlKTsKfQotICh2b2lkKSBzb3J0CnsKICAgIGd0a19jbGlz
dF9zb3J0KGd0ayk7Cn0KLSAodm9pZCkgc2V0QXV0b1NvcnQ6KGdib29sZWFuKSBhdXRvX3NvcnQK
ewogICAgZ3RrX2NsaXN0X3NldF9hdXRvX3NvcnQoZ3RrLCBhdXRvX3NvcnQpOwp9CkBlbmQKLyoK
ICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAog
KiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5l
cmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2NvbG9yc2VsLmggYnkgZ3RrZ2VuLgogKgogKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0Nv
bG9yU2VsZWN0aW9uLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLQ29sb3JTZWxlY3Rpb24KKyAoR3Rr
VHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2NvbG9yX3NlbGVjdGlvbl9nZXRfdHlwZSgp
Owp9CisgKGlkKSBjb2xvclNlbGVjdGlvbgp7CiAgICByZXR1cm4gW1soR1RLQ29sb3JTZWxlY3Rp
b24gKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAg
IHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfY29sb3Jfc2VsZWN0aW9uX25ldygpXTsKfQot
ICh2b2lkKSBzZXRVcGRhdGVQb2xpY3k6KEd0a1VwZGF0ZVR5cGUpIHBvbGljeQp7CiAgICBndGtf
Y29sb3Jfc2VsZWN0aW9uX3NldF91cGRhdGVfcG9saWN5KGd0aywgcG9saWN5KTsKfQotICh2b2lk
KSBzZXRPcGFjaXR5OihnaW50KSB1c2Vfb3BhY2l0eQp7CiAgICBndGtfY29sb3Jfc2VsZWN0aW9u
X3NldF9vcGFjaXR5KGd0aywgdXNlX29wYWNpdHkpOwp9Ci0gKHZvaWQpIHNldENvbG9yOihnZG91
YmxlICopIGNvbG9yCnsKICAgIGd0a19jb2xvcl9zZWxlY3Rpb25fc2V0X2NvbG9yKGd0aywgY29s
b3IpOwp9Ci0gKHZvaWQpIGdldENvbG9yOihnZG91YmxlICopIGNvbG9yCnsKICAgIGd0a19jb2xv
cl9zZWxlY3Rpb25fZ2V0X2NvbG9yKGd0aywgY29sb3IpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQg
LSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQg
KGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21h
dGljYWxseSBmcm9tIGd0a2NvbG9yc2VsLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0NvbG9yU2VsZWN0aW9u
RGlhbG9nLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLQ29sb3JTZWxlY3Rpb25EaWFsb2cKKyAoR3Rr
VHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2NvbG9yX3NlbGVjdGlvbl9kaWFsb2dfZ2V0
X3R5cGUoKTsKfQorIChpZCkgY29sb3JTZWxlY3Rpb25EaWFsb2dXaXRoVGl0bGU6KE5TU3RyaW5n
ICopIHRpdGxlCnsKICAgIHJldHVybiBbWyhHVEtDb2xvclNlbGVjdGlvbkRpYWxvZyAqKVtzZWxm
IGFsbG9jXSBpbml0V2l0aFRpdGxlOnRpdGxlXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRX
aXRoVGl0bGU6KE5TU3RyaW5nICopIHRpdGxlCnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0
azpndGtfY29sb3Jfc2VsZWN0aW9uX2RpYWxvZ19uZXcoZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRp
dGxlKSldOwp9CiNkZWZpbmUgZ3RrCSgoR3RrQ29sb3JTZWxlY3Rpb25EaWFsb2cgKikgZ3RrKQot
IChHVEtDb2xvclNlbGVjdGlvbiAqKSBjb2xvclNlbGVjdGlvbgp7CiAgICByZXR1cm4gR1RPT0xL
SVRfT0JKRUNUKGd0ay0+Y29sb3JzZWwpOwp9Ci0gKEdUS1dpZGdldCAqKSBva0J1dHRvbgp7CiAg
ICByZXR1cm4gR1RPT0xLSVRfT0JKRUNUKGd0ay0+b2tfYnV0dG9uKTsKfQotIChHVEtXaWRnZXQg
KikgcmVzZXRCdXR0b24KewogICAgcmV0dXJuIEdUT09MS0lUX09CSkVDVChndGstPnJlc2V0X2J1
dHRvbik7Cn0KLSAoR1RLV2lkZ2V0ICopIGNhbmNlbEJ1dHRvbgp7CiAgICByZXR1cm4gR1RPT0xL
SVRfT0JKRUNUKGd0ay0+Y2FuY2VsX2J1dHRvbik7Cn0KLSAoR1RLV2lkZ2V0ICopIGhlbHBCdXR0
b24KewogICAgcmV0dXJuIEdUT09MS0lUX09CSkVDVChndGstPmhlbHBfYnV0dG9uKTsKfQojdW5k
ZWYgZ3RrCkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhl
IEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1
ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2NvbWJvLmggYnkgZ3Rr
Z2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdU
b29sS2l0L0dUS0NvbWJvLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtJdGVtLmg+CgpAaW1wbGVt
ZW50YXRpb24gR1RLQ29tYm8KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2Nv
bWJvX2dldF90eXBlKCk7Cn0KKyAoaWQpIGNvbWJvCnsKICAgIHJldHVybiBbWyhHVEtDb21ibyAq
KVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0
dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19jb21ib19uZXcoKV07Cn0KLSAodm9pZCkgc2V0VmFs
dWVJbkxpc3Q6KGdpbnQpIHZhbCBva0lmRW1wdHk6KGdpbnQpIG9rX2lmX2VtcHR5CnsKICAgIGd0
a19jb21ib19zZXRfdmFsdWVfaW5fbGlzdChndGssIHZhbCAsIG9rX2lmX2VtcHR5KTsKfQotICh2
b2lkKSBzZXRVc2VBcnJvd3M6KGdpbnQpIHZhbAp7CiAgICBndGtfY29tYm9fc2V0X3VzZV9hcnJv
d3MoZ3RrLCB2YWwpOwp9Ci0gKHZvaWQpIHNldFVzZUFycm93c0Fsd2F5czooZ2ludCkgdmFsCnsK
ICAgIGd0a19jb21ib19zZXRfdXNlX2Fycm93c19hbHdheXMoZ3RrLCB2YWwpOwp9Ci0gKHZvaWQp
IHNldENhc2VTZW5zaXRpdmU6KGdpbnQpIHZhbAp7CiAgICBndGtfY29tYm9fc2V0X2Nhc2Vfc2Vu
c2l0aXZlKGd0aywgdmFsKTsKfQotICh2b2lkKSBzZXRJdGVtU3RyaW5nOihHVEtJdGVtKikgaXRl
bSBpdGVtVmFsdWU6KE5TU3RyaW5nICopIGl0ZW1fdmFsdWUKewogICAgZ3RrX2NvbWJvX3NldF9p
dGVtX3N0cmluZyhndGssIGl0ZW0gID8gaXRlbSAtPmd0ayA6IDAsZ3Rvb2xraXRfdXRmOF9zdHJp
bmcoIGl0ZW1fdmFsdWUpKTsKfQotICh2b2lkKSBzZXRQb3Bkb3duU3RyaW5nczooTlNBcnJheSAq
KSBzdHJpbmdzCnsKICAgIGd0a19jb21ib19zZXRfcG9wZG93bl9zdHJpbmdzKGd0ayxndG9vbGtp
dF9hcnJheV90b19saXN0KCBzdHJpbmdzKSk7Cn0KLSAodm9pZCkgZGlzYWJsZUFjdGl2YXRlCnsK
ICAgIGd0a19jb21ib19kaXNhYmxlX2FjdGl2YXRlKGd0ayk7Cn0KI2RlZmluZSBndGsJKChHdGtD
b21ibyAqKSBndGspCi0gKGlkKSBlbnRyeQp7CiAgICByZXR1cm4gR1RPT0xLSVRfT0JKRUNUKGd0
ay0+ZW50cnkpOwp9Ci0gKEdUS1dpZGdldCAqKSBsaXN0CnsKICAgIHJldHVybiBHVE9PTEtJVF9P
QkpFQ1QoZ3RrLT5saXN0KTsKfQojdW5kZWYgZ3RrCkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmpl
Y3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5
OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxs
eSBmcm9tIGd0a2NvbnRhaW5lci5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgog
KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtDb250YWluZXIuaD4KI2luY2x1
ZGUgPEdUb29sS2l0L0dUS1dpZGdldC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQWRqdXN0bWVu
dC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0NvbnRhaW5lcgorIChHdGtUeXBlKSBnZXRUeXBlCnsK
ICAgIHJldHVybiBndGtfY29udGFpbmVyX2dldF90eXBlKCk7Cn0KLSAodm9pZCkgc2V0Qm9yZGVy
V2lkdGg6KGd1aW50KSBib3JkZXJfd2lkdGgKewogICAgZ3RrX2NvbnRhaW5lcl9zZXRfYm9yZGVy
X3dpZHRoKGd0aywgYm9yZGVyX3dpZHRoKTsKfQotICh2b2lkKSBhZGQ6KEdUS1dpZGdldCAqKSB3
aWRnZXQKewogICAgZ3RrX2NvbnRhaW5lcl9hZGQoZ3RrLCB3aWRnZXQgPyB3aWRnZXQtPmd0ayA6
IDApOwp9Ci0gKHZvaWQpIHJlbW92ZTooR1RLV2lkZ2V0ICopIHdpZGdldAp7CiAgICBndGtfY29u
dGFpbmVyX3JlbW92ZShndGssIHdpZGdldCA/IHdpZGdldC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkg
c2V0UmVzaXplTW9kZTooR3RrUmVzaXplTW9kZSkgcmVzaXplX21vZGUKewogICAgZ3RrX2NvbnRh
aW5lcl9zZXRfcmVzaXplX21vZGUoZ3RrLCByZXNpemVfbW9kZSk7Cn0KLSAodm9pZCkgY2hlY2tS
ZXNpemUKewogICAgZ3RrX2NvbnRhaW5lcl9jaGVja19yZXNpemUoZ3RrKTsKfQotICh2b2lkKSBm
b3JlYWNoOihHdGtDYWxsYmFjaykgY2FsbGJhY2sgY2FsbGJhY2tEYXRhOihncG9pbnRlcikgY2Fs
bGJhY2tfZGF0YQp7CiAgICBndGtfY29udGFpbmVyX2ZvcmVhY2goZ3RrLCBjYWxsYmFjayAsIGNh
bGxiYWNrX2RhdGEpOwp9Ci0gKHZvaWQpIGZvcmVhY2hGdWxsOihHdGtDYWxsYmFjaykgY2FsbGJh
Y2sgbWFyc2hhbDooR3RrQ2FsbGJhY2tNYXJzaGFsKSBtYXJzaGFsIGNhbGxiYWNrRGF0YTooZ3Bv
aW50ZXIpIGNhbGxiYWNrX2RhdGEgbm90aWZ5OihHdGtEZXN0cm95Tm90aWZ5KSBub3RpZnkKewog
ICAgZ3RrX2NvbnRhaW5lcl9mb3JlYWNoX2Z1bGwoZ3RrLCBjYWxsYmFjayAsIG1hcnNoYWwgLCBj
YWxsYmFja19kYXRhICwgbm90aWZ5KTsKfQotIChOU0FycmF5ICopIGNoaWxkcmVuCnsKICAgIHJl
dHVybiBndG9vbGtpdF9saXN0X3RvX2FycmF5KGd0a19jb250YWluZXJfY2hpbGRyZW4oZ3RrKSk7
Cn0KLSAoZ2ludCkgZm9jdXM6KEd0a0RpcmVjdGlvblR5cGUpIGRpcmVjdGlvbgp7CiAgICByZXR1
cm4gZ3RrX2NvbnRhaW5lcl9mb2N1cyhndGssIGRpcmVjdGlvbik7Cn0KLSAodm9pZCkgc2V0UmVh
bGxvY2F0ZVJlZHJhd3M6KGdib29sZWFuKSBuZWVkc19yZWRyYXdzCnsKICAgIGd0a19jb250YWlu
ZXJfc2V0X3JlYWxsb2NhdGVfcmVkcmF3cyhndGssIG5lZWRzX3JlZHJhd3MpOwp9Ci0gKHZvaWQp
IHNldEZvY3VzQ2hpbGQ6KEdUS1dpZGdldCAqKSBjaGlsZAp7CiAgICBndGtfY29udGFpbmVyX3Nl
dF9mb2N1c19jaGlsZChndGssIGNoaWxkID8gY2hpbGQtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHNl
dEZvY3VzVmFkanVzdG1lbnQ6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudAp7CiAgICBndGtf
Y29udGFpbmVyX3NldF9mb2N1c192YWRqdXN0bWVudChndGssIGFkanVzdG1lbnQgPyBhZGp1c3Rt
ZW50LT5ndGsgOiAwKTsKfQotICh2b2lkKSBzZXRGb2N1c0hhZGp1c3RtZW50OihHVEtBZGp1c3Rt
ZW50ICopIGFkanVzdG1lbnQKewogICAgZ3RrX2NvbnRhaW5lcl9zZXRfZm9jdXNfaGFkanVzdG1l
bnQoZ3RrLCBhZGp1c3RtZW50ID8gYWRqdXN0bWVudC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgcmVn
aXN0ZXJUb3BsZXZlbAp7CiAgICBndGtfY29udGFpbmVyX3JlZ2lzdGVyX3RvcGxldmVsKGd0ayk7
Cn0KLSAodm9pZCkgdW5yZWdpc3RlclRvcGxldmVsCnsKICAgIGd0a19jb250YWluZXJfdW5yZWdp
c3Rlcl90b3BsZXZlbChndGspOwp9CisgKE5TQXJyYXkgKikgZ2V0VG9wbGV2ZWxzCnsKICAgIHJl
dHVybiBndG9vbGtpdF9saXN0X3RvX2FycmF5KGd0a19jb250YWluZXJfZ2V0X3RvcGxldmVscygp
KTsKfQotICh2b2lkKSByZXNpemVDaGlsZHJlbgp7CiAgICBndGtfY29udGFpbmVyX3Jlc2l6ZV9j
aGlsZHJlbihndGspOwp9Ci0gKEd0a1R5cGUpIGNoaWxkVHlwZQp7CiAgICByZXR1cm4gZ3RrX2Nv
bnRhaW5lcl9jaGlsZF90eXBlKGd0ayk7Cn0KKyAodm9pZCkgYWRkQ2hpbGRBcmdUeXBlOihOU1N0
cmluZyAqKSBhcmdfbmFtZSBhcmdUeXBlOihHdGtUeXBlKSBhcmdfdHlwZSBhcmdGbGFnczooZ3Vp
bnQpIGFyZ19mbGFncyBhcmdJZDooZ3VpbnQpIGFyZ19pZAp7CiAgICBndGtfY29udGFpbmVyX2Fk
ZF9jaGlsZF9hcmdfdHlwZShndG9vbGtpdF91dGY4X3N0cmluZyggYXJnX25hbWUgKSwgYXJnX3R5
cGUgLCBhcmdfZmxhZ3MgLCBhcmdfaWQpOwp9CisgKEd0a0FyZyopIHF1ZXJ5Q2hpbGRBcmdzOihH
dGtUeXBlKSBjbGFzc190eXBlIGFyZ0ZsYWdzOihndWludDMyICoqKSBhcmdfZmxhZ3MgbkFyZ3M6
KGd1aW50ICopIG5hcmdzCnsKICAgIHJldHVybiBndGtfY29udGFpbmVyX3F1ZXJ5X2NoaWxkX2Fy
Z3MoIGNsYXNzX3R5cGUgLCBhcmdfZmxhZ3MgLCBuYXJncyk7Cn0KLSAodm9pZCkgY2hpbGRHZXR2
OihHVEtXaWRnZXQgKikgY2hpbGQgbkFyZ3M6KGd1aW50KSBuX2FyZ3MgYXJnczooR3RrQXJnICop
IGFyZ3MKewogICAgZ3RrX2NvbnRhaW5lcl9jaGlsZF9nZXR2KGd0aywgY2hpbGQgID8gY2hpbGQg
LT5ndGsgOiAwLCBuX2FyZ3MgLCBhcmdzKTsKfQotICh2b2lkKSBjaGlsZFNldHY6KEdUS1dpZGdl
dCAqKSBjaGlsZCBuQXJnczooZ3VpbnQpIG5fYXJncyBhcmdzOihHdGtBcmcgKikgYXJncwp7CiAg
ICBndGtfY29udGFpbmVyX2NoaWxkX3NldHYoZ3RrLCBjaGlsZCAgPyBjaGlsZCAtPmd0ayA6IDAs
IG5fYXJncyAsIGFyZ3MpOwp9Ci0gKHZvaWQpIGFkZHY6KEdUS1dpZGdldCAqKSB3aWRnZXQgbkFy
Z3M6KGd1aW50KSBuX2FyZ3MgYXJnczooR3RrQXJnICopIGFyZ3MKewogICAgZ3RrX2NvbnRhaW5l
cl9hZGR2KGd0aywgd2lkZ2V0ICA/IHdpZGdldCAtPmd0ayA6IDAsIG5fYXJncyAsIGFyZ3MpOwp9
CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAg
VG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwog
KgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2N0cmVlLmggYnkgZ3RrZ2VuLgog
KgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0
L0dUS0NUcmVlLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtTdHlsZS5oPgoKQGltcGxlbWVudGF0
aW9uIEdUS0NUcmVlCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19jdHJlZV9n
ZXRfdHlwZSgpOwp9CisgKGlkKSBjVHJlZVdpdGhUaXRsZXM6KGdpbnQpIGNvbHVtbnMgdHJlZUNv
bHVtbjooZ2ludCkgdHJlZV9jb2x1bW4gdGl0bGVzOihOU0FycmF5ICAqKSB0aXRsZXMKewogICAg
cmV0dXJuIFtbKEdUS0NUcmVlICopW3NlbGYgYWxsb2NdIGluaXRXaXRoVGl0bGVzOmNvbHVtbnMg
dHJlZUNvbHVtbjp0cmVlX2NvbHVtbiB0aXRsZXM6dGl0bGVzXSBhdXRvcmVsZWFzZV07Cn0KLSAo
aWQpIGluaXRXaXRoVGl0bGVzOihnaW50KSBjb2x1bW5zIHRyZWVDb2x1bW46KGdpbnQpIHRyZWVf
Y29sdW1uIHRpdGxlczooTlNBcnJheSAgKikgdGl0bGVzCnsKICAgIHJldHVybiBbc2VsZiBpbml0
V2l0aEd0azpndGtfY3RyZWVfbmV3X3dpdGhfdGl0bGVzKCBjb2x1bW5zICwgdHJlZV9jb2x1bW4g
LChjaGFyICoqKWd0b29sa2l0X2FycmF5X3RvX3N0cnZlYyggdGl0bGVzKSldOwp9CisgKGlkKSBj
VHJlZVdpdGhDb2x1bW5zOihnaW50KSBjb2x1bW5zIHRyZWVDb2x1bW46KGdpbnQpIHRyZWVfY29s
dW1uCnsKICAgIHJldHVybiBbWyhHVEtDVHJlZSAqKVtzZWxmIGFsbG9jXSBpbml0V2l0aENvbHVt
bnM6Y29sdW1ucyB0cmVlQ29sdW1uOnRyZWVfY29sdW1uXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQp
IGluaXRXaXRoQ29sdW1uczooZ2ludCkgY29sdW1ucyB0cmVlQ29sdW1uOihnaW50KSB0cmVlX2Nv
bHVtbgp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2N0cmVlX25ldyggY29sdW1u
cyAsIHRyZWVfY29sdW1uKV07Cn0KLSAoR3RrQ1RyZWVOb2RlICopIGluc2VydE5vZGU6KEd0a0NU
cmVlTm9kZSAqKSBwYXJlbnQgc2libGluZzooR3RrQ1RyZWVOb2RlICopIHNpYmxpbmcgdGV4dDoo
TlNBcnJheSAgKikgdGV4dCBzcGFjaW5nOihndWludDgpIHNwYWNpbmcgcGl4bWFwQ2xvc2VkOihH
ZGtQaXhtYXAgKikgcGl4bWFwX2Nsb3NlZCBtYXNrQ2xvc2VkOihHZGtCaXRtYXAgKikgbWFza19j
bG9zZWQgcGl4bWFwT3BlbmVkOihHZGtQaXhtYXAgKikgcGl4bWFwX29wZW5lZCBtYXNrT3BlbmVk
OihHZGtCaXRtYXAgKikgbWFza19vcGVuZWQgaXNMZWFmOihnYm9vbGVhbikgaXNfbGVhZiBleHBh
bmRlZDooZ2Jvb2xlYW4pIGV4cGFuZGVkCnsKICAgIHJldHVybiBndGtfY3RyZWVfaW5zZXJ0X25v
ZGUoZ3RrLCBwYXJlbnQgLCBzaWJsaW5nICwoY2hhciAqKilndG9vbGtpdF9hcnJheV90b19zdHJ2
ZWMoIHRleHQgKSwgc3BhY2luZyAsIHBpeG1hcF9jbG9zZWQgLCBtYXNrX2Nsb3NlZCAsIHBpeG1h
cF9vcGVuZWQgLCBtYXNrX29wZW5lZCAsIGlzX2xlYWYgLCBleHBhbmRlZCk7Cn0KLSAodm9pZCkg
cmVtb3ZlTm9kZTooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVlX3JlbW92ZV9u
b2RlKGd0aywgbm9kZSk7Cn0KLSAoR3RrQ1RyZWVOb2RlICopIGluc2VydEdub2RlOihHdGtDVHJl
ZU5vZGUgKikgcGFyZW50IHNpYmxpbmc6KEd0a0NUcmVlTm9kZSAqKSBzaWJsaW5nIGdub2RlOihH
Tm9kZSAqKSBnbm9kZSBmdW5jOihHdGtDVHJlZUdOb2RlRnVuYykgZnVuYyBkYXRhOihncG9pbnRl
cikgZGF0YQp7CiAgICByZXR1cm4gZ3RrX2N0cmVlX2luc2VydF9nbm9kZShndGssIHBhcmVudCAs
IHNpYmxpbmcgLCBnbm9kZSAsIGZ1bmMgLCBkYXRhKTsKfQotIChHTm9kZSAqKSBleHBvcnRUb0du
b2RlOihHTm9kZSAqKSBwYXJlbnQgc2libGluZzooR05vZGUgKikgc2libGluZyBub2RlOihHdGtD
VHJlZU5vZGUgKikgbm9kZSBmdW5jOihHdGtDVHJlZUdOb2RlRnVuYykgZnVuYyBkYXRhOihncG9p
bnRlcikgZGF0YQp7CiAgICByZXR1cm4gZ3RrX2N0cmVlX2V4cG9ydF90b19nbm9kZShndGssIHBh
cmVudCAsIHNpYmxpbmcgLCBub2RlICwgZnVuYyAsIGRhdGEpOwp9Ci0gKHZvaWQpIHBvc3RSZWN1
cnNpdmU6KEd0a0NUcmVlTm9kZSAqKSBub2RlIGZ1bmM6KEd0a0NUcmVlRnVuYykgZnVuYyBkYXRh
OihncG9pbnRlcikgZGF0YQp7CiAgICBndGtfY3RyZWVfcG9zdF9yZWN1cnNpdmUoZ3RrLCBub2Rl
ICwgZnVuYyAsIGRhdGEpOwp9Ci0gKHZvaWQpIHBvc3RSZWN1cnNpdmU6KEd0a0NUcmVlTm9kZSAq
KSBub2RlIHRvRGVwdGg6KGdpbnQpIGRlcHRoIGZ1bmM6KEd0a0NUcmVlRnVuYykgZnVuYyBkYXRh
OihncG9pbnRlcikgZGF0YQp7CiAgICBndGtfY3RyZWVfcG9zdF9yZWN1cnNpdmVfdG9fZGVwdGgo
Z3RrLCBub2RlICwgZGVwdGggLCBmdW5jICwgZGF0YSk7Cn0KLSAodm9pZCkgcHJlUmVjdXJzaXZl
OihHdGtDVHJlZU5vZGUgKikgbm9kZSBmdW5jOihHdGtDVHJlZUZ1bmMpIGZ1bmMgZGF0YTooZ3Bv
aW50ZXIpIGRhdGEKewogICAgZ3RrX2N0cmVlX3ByZV9yZWN1cnNpdmUoZ3RrLCBub2RlICwgZnVu
YyAsIGRhdGEpOwp9Ci0gKHZvaWQpIHByZVJlY3Vyc2l2ZTooR3RrQ1RyZWVOb2RlICopIG5vZGUg
dG9EZXB0aDooZ2ludCkgZGVwdGggZnVuYzooR3RrQ1RyZWVGdW5jKSBmdW5jIGRhdGE6KGdwb2lu
dGVyKSBkYXRhCnsKICAgIGd0a19jdHJlZV9wcmVfcmVjdXJzaXZlX3RvX2RlcHRoKGd0aywgbm9k
ZSAsIGRlcHRoICwgZnVuYyAsIGRhdGEpOwp9Ci0gKGdib29sZWFuKSBpc1ZpZXdhYmxlOihHdGtD
VHJlZU5vZGUgKikgbm9kZQp7CiAgICByZXR1cm4gZ3RrX2N0cmVlX2lzX3ZpZXdhYmxlKGd0aywg
bm9kZSk7Cn0KLSAoR3RrQ1RyZWVOb2RlICopIGxhc3Q6KEd0a0NUcmVlTm9kZSAqKSBub2RlCnsK
ICAgIHJldHVybiBndGtfY3RyZWVfbGFzdChndGssIG5vZGUpOwp9Ci0gKEd0a0NUcmVlTm9kZSAq
KSBmaW5kTm9kZVB0cjooR3RrQ1RyZWVSb3cgKikgY3RyZWVfcm93CnsKICAgIHJldHVybiBndGtf
Y3RyZWVfZmluZF9ub2RlX3B0cihndGssIGN0cmVlX3Jvdyk7Cn0KLSAoR3RrQ1RyZWVOb2RlICop
IG5vZGVOdGg6KGd1aW50KSByb3cKewogICAgcmV0dXJuIGd0a19jdHJlZV9ub2RlX250aChndGss
IHJvdyk7Cn0KLSAoZ2Jvb2xlYW4pIGZpbmQ6KEd0a0NUcmVlTm9kZSAqKSBub2RlIGNoaWxkOihH
dGtDVHJlZU5vZGUgKikgY2hpbGQKewogICAgcmV0dXJuIGd0a19jdHJlZV9maW5kKGd0aywgbm9k
ZSAsIGNoaWxkKTsKfQotIChnYm9vbGVhbikgaXNBbmNlc3RvcjooR3RrQ1RyZWVOb2RlICopIG5v
ZGUgY2hpbGQ6KEd0a0NUcmVlTm9kZSAqKSBjaGlsZAp7CiAgICByZXR1cm4gZ3RrX2N0cmVlX2lz
X2FuY2VzdG9yKGd0aywgbm9kZSAsIGNoaWxkKTsKfQotIChHdGtDVHJlZU5vZGUgKikgZmluZEJ5
Um93OihHdGtDVHJlZU5vZGUgKikgbm9kZSBkYXRhOihncG9pbnRlcikgZGF0YQp7CiAgICByZXR1
cm4gZ3RrX2N0cmVlX2ZpbmRfYnlfcm93X2RhdGEoZ3RrLCBub2RlICwgZGF0YSk7Cn0KLSAoR0xp
c3QgKikgZmluZEFsbEJ5Um93OihHdGtDVHJlZU5vZGUgKikgbm9kZSBkYXRhOihncG9pbnRlcikg
ZGF0YQp7CiAgICByZXR1cm4gZ3RrX2N0cmVlX2ZpbmRfYWxsX2J5X3Jvd19kYXRhKGd0aywgbm9k
ZSAsIGRhdGEpOwp9Ci0gKEd0a0NUcmVlTm9kZSAqKSBmaW5kQnlSb3dEYXRhQ3VzdG9tOihHdGtD
VHJlZU5vZGUgKikgbm9kZSBkYXRhOihncG9pbnRlcikgZGF0YSBmdW5jOihHQ29tcGFyZUZ1bmMp
IGZ1bmMKewogICAgcmV0dXJuIGd0a19jdHJlZV9maW5kX2J5X3Jvd19kYXRhX2N1c3RvbShndGss
IG5vZGUgLCBkYXRhICwgZnVuYyk7Cn0KLSAoR0xpc3QgKikgZmluZEFsbEJ5Um93RGF0YUN1c3Rv
bTooR3RrQ1RyZWVOb2RlICopIG5vZGUgZGF0YTooZ3BvaW50ZXIpIGRhdGEgZnVuYzooR0NvbXBh
cmVGdW5jKSBmdW5jCnsKICAgIHJldHVybiBndGtfY3RyZWVfZmluZF9hbGxfYnlfcm93X2RhdGFf
Y3VzdG9tKGd0aywgbm9kZSAsIGRhdGEgLCBmdW5jKTsKfQotIChnYm9vbGVhbikgaXNIb3RTcG90
OihnaW50KSB4IHk6KGdpbnQpIHkKewogICAgcmV0dXJuIGd0a19jdHJlZV9pc19ob3Rfc3BvdChn
dGssIHggLCB5KTsKfQotICh2b2lkKSBtb3ZlOihHdGtDVHJlZU5vZGUgKikgbm9kZSBuZXdQYXJl
bnQ6KEd0a0NUcmVlTm9kZSAqKSBuZXdfcGFyZW50IG5ld1NpYmxpbmc6KEd0a0NUcmVlTm9kZSAq
KSBuZXdfc2libGluZwp7CiAgICBndGtfY3RyZWVfbW92ZShndGssIG5vZGUgLCBuZXdfcGFyZW50
ICwgbmV3X3NpYmxpbmcpOwp9Ci0gKHZvaWQpIGV4cGFuZDooR3RrQ1RyZWVOb2RlICopIG5vZGUK
ewogICAgZ3RrX2N0cmVlX2V4cGFuZChndGssIG5vZGUpOwp9Ci0gKHZvaWQpIGV4cGFuZFJlY3Vy
c2l2ZTooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVlX2V4cGFuZF9yZWN1cnNp
dmUoZ3RrLCBub2RlKTsKfQotICh2b2lkKSBleHBhbmQ6KEd0a0NUcmVlTm9kZSAqKSBub2RlIHRv
RGVwdGg6KGdpbnQpIGRlcHRoCnsKICAgIGd0a19jdHJlZV9leHBhbmRfdG9fZGVwdGgoZ3RrLCBu
b2RlICwgZGVwdGgpOwp9Ci0gKHZvaWQpIGNvbGxhcHNlOihHdGtDVHJlZU5vZGUgKikgbm9kZQp7
CiAgICBndGtfY3RyZWVfY29sbGFwc2UoZ3RrLCBub2RlKTsKfQotICh2b2lkKSBjb2xsYXBzZVJl
Y3Vyc2l2ZTooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVlX2NvbGxhcHNlX3Jl
Y3Vyc2l2ZShndGssIG5vZGUpOwp9Ci0gKHZvaWQpIGNvbGxhcHNlOihHdGtDVHJlZU5vZGUgKikg
bm9kZSB0b0RlcHRoOihnaW50KSBkZXB0aAp7CiAgICBndGtfY3RyZWVfY29sbGFwc2VfdG9fZGVw
dGgoZ3RrLCBub2RlICwgZGVwdGgpOwp9Ci0gKHZvaWQpIHRvZ2dsZUV4cGFuc2lvbjooR3RrQ1Ry
ZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVlX3RvZ2dsZV9leHBhbnNpb24oZ3RrLCBub2Rl
KTsKfQotICh2b2lkKSB0b2dnbGVFeHBhbnNpb25SZWN1cnNpdmU6KEd0a0NUcmVlTm9kZSAqKSBu
b2RlCnsKICAgIGd0a19jdHJlZV90b2dnbGVfZXhwYW5zaW9uX3JlY3Vyc2l2ZShndGssIG5vZGUp
Owp9Ci0gKHZvaWQpIHNlbGVjdDooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVl
X3NlbGVjdChndGssIG5vZGUpOwp9Ci0gKHZvaWQpIHNlbGVjdFJlY3Vyc2l2ZTooR3RrQ1RyZWVO
b2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVlX3NlbGVjdF9yZWN1cnNpdmUoZ3RrLCBub2RlKTsK
fQotICh2b2lkKSB1bnNlbGVjdDooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVl
X3Vuc2VsZWN0KGd0aywgbm9kZSk7Cn0KLSAodm9pZCkgdW5zZWxlY3RSZWN1cnNpdmU6KEd0a0NU
cmVlTm9kZSAqKSBub2RlCnsKICAgIGd0a19jdHJlZV91bnNlbGVjdF9yZWN1cnNpdmUoZ3RrLCBu
b2RlKTsKfQotICh2b2lkKSByZWFsU2VsZWN0UmVjdXJzaXZlOihHdGtDVHJlZU5vZGUgKikgbm9k
ZSBzdGF0ZTooZ2ludCkgc3RhdGUKewogICAgZ3RrX2N0cmVlX3JlYWxfc2VsZWN0X3JlY3Vyc2l2
ZShndGssIG5vZGUgLCBzdGF0ZSk7Cn0KLSAodm9pZCkgbm9kZVNldFRleHQ6KEd0a0NUcmVlTm9k
ZSAqKSBub2RlIGNvbHVtbjooZ2ludCkgY29sdW1uIHRleHQ6KE5TU3RyaW5nICopIHRleHQKewog
ICAgZ3RrX2N0cmVlX25vZGVfc2V0X3RleHQoZ3RrLCBub2RlICwgY29sdW1uICxndG9vbGtpdF91
dGY4X3N0cmluZyggdGV4dCkpOwp9Ci0gKHZvaWQpIG5vZGVTZXRQaXhtYXA6KEd0a0NUcmVlTm9k
ZSAqKSBub2RlIGNvbHVtbjooZ2ludCkgY29sdW1uIHBpeG1hcDooR2RrUGl4bWFwICopIHBpeG1h
cCBtYXNrOihHZGtCaXRtYXAgKikgbWFzawp7CiAgICBndGtfY3RyZWVfbm9kZV9zZXRfcGl4bWFw
KGd0aywgbm9kZSAsIGNvbHVtbiAsIHBpeG1hcCAsIG1hc2spOwp9Ci0gKHZvaWQpIG5vZGVTZXRQ
aXh0ZXh0OihHdGtDVHJlZU5vZGUgKikgbm9kZSBjb2x1bW46KGdpbnQpIGNvbHVtbiB0ZXh0OihO
U1N0cmluZyAqKSB0ZXh0IHNwYWNpbmc6KGd1aW50OCkgc3BhY2luZyBwaXhtYXA6KEdka1BpeG1h
cCAqKSBwaXhtYXAgbWFzazooR2RrQml0bWFwICopIG1hc2sKewogICAgZ3RrX2N0cmVlX25vZGVf
c2V0X3BpeHRleHQoZ3RrLCBub2RlICwgY29sdW1uICxndG9vbGtpdF91dGY4X3N0cmluZyggdGV4
dCApLCBzcGFjaW5nICwgcGl4bWFwICwgbWFzayk7Cn0KLSAodm9pZCkgc2V0Tm9kZUluZm86KEd0
a0NUcmVlTm9kZSAqKSBub2RlIHRleHQ6KE5TU3RyaW5nICopIHRleHQgc3BhY2luZzooZ3VpbnQ4
KSBzcGFjaW5nIHBpeG1hcENsb3NlZDooR2RrUGl4bWFwICopIHBpeG1hcF9jbG9zZWQgbWFza0Ns
b3NlZDooR2RrQml0bWFwICopIG1hc2tfY2xvc2VkIHBpeG1hcE9wZW5lZDooR2RrUGl4bWFwICop
IHBpeG1hcF9vcGVuZWQgbWFza09wZW5lZDooR2RrQml0bWFwICopIG1hc2tfb3BlbmVkIGlzTGVh
ZjooZ2Jvb2xlYW4pIGlzX2xlYWYgZXhwYW5kZWQ6KGdib29sZWFuKSBleHBhbmRlZAp7CiAgICBn
dGtfY3RyZWVfc2V0X25vZGVfaW5mbyhndGssIG5vZGUgLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0
ZXh0ICksIHNwYWNpbmcgLCBwaXhtYXBfY2xvc2VkICwgbWFza19jbG9zZWQgLCBwaXhtYXBfb3Bl
bmVkICwgbWFza19vcGVuZWQgLCBpc19sZWFmICwgZXhwYW5kZWQpOwp9Ci0gKHZvaWQpIG5vZGVT
ZXRTaGlmdDooR3RrQ1RyZWVOb2RlICopIG5vZGUgY29sdW1uOihnaW50KSBjb2x1bW4gdmVydGlj
YWw6KGdpbnQpIHZlcnRpY2FsIGhvcml6b250YWw6KGdpbnQpIGhvcml6b250YWwKewogICAgZ3Rr
X2N0cmVlX25vZGVfc2V0X3NoaWZ0KGd0aywgbm9kZSAsIGNvbHVtbiAsIHZlcnRpY2FsICwgaG9y
aXpvbnRhbCk7Cn0KLSAodm9pZCkgbm9kZVNldDooR3RrQ1RyZWVOb2RlICopIG5vZGUgc2VsZWN0
YWJsZTooZ2Jvb2xlYW4pIHNlbGVjdGFibGUKewogICAgZ3RrX2N0cmVlX25vZGVfc2V0X3NlbGVj
dGFibGUoZ3RrLCBub2RlICwgc2VsZWN0YWJsZSk7Cn0KLSAoZ2Jvb2xlYW4pIG5vZGVHZXRTZWxl
Y3RhYmxlOihHdGtDVHJlZU5vZGUgKikgbm9kZQp7CiAgICByZXR1cm4gZ3RrX2N0cmVlX25vZGVf
Z2V0X3NlbGVjdGFibGUoZ3RrLCBub2RlKTsKfQotIChHdGtDZWxsVHlwZSkgbm9kZUdldENlbGxU
eXBlOihHdGtDVHJlZU5vZGUgKikgbm9kZSBjb2x1bW46KGdpbnQpIGNvbHVtbgp7CiAgICByZXR1
cm4gZ3RrX2N0cmVlX25vZGVfZ2V0X2NlbGxfdHlwZShndGssIG5vZGUgLCBjb2x1bW4pOwp9Ci0g
KGdpbnQpIG5vZGVHZXRUZXh0OihHdGtDVHJlZU5vZGUgKikgbm9kZSBjb2x1bW46KGdpbnQpIGNv
bHVtbiB0ZXh0OihOU1N0cmluZyAqKikgdGV4dAp7CiAgICBjaGFyICpfb3V0dmFsXzE7CiAgICBn
aW50IF9yZXR2YWxfMTsKICAgIF9yZXR2YWxfMSA9IGd0a19jdHJlZV9ub2RlX2dldF90ZXh0KGd0
aywgbm9kZSAsIGNvbHVtbiAsJl9vdXR2YWxfMSk7CiAgICAqIHRleHQgPSBndG9vbGtpdF9vYmpj
X3N0cmluZyhfb3V0dmFsXzEpOwogICAgcmV0dXJuIF9yZXR2YWxfMTsKfQotIChnaW50KSBub2Rl
R2V0UGl4bWFwOihHdGtDVHJlZU5vZGUgKikgbm9kZSBjb2x1bW46KGdpbnQpIGNvbHVtbiBwaXht
YXA6KEdka1BpeG1hcCAqKikgcGl4bWFwIG1hc2s6KEdka0JpdG1hcCAqKikgbWFzawp7CiAgICBy
ZXR1cm4gZ3RrX2N0cmVlX25vZGVfZ2V0X3BpeG1hcChndGssIG5vZGUgLCBjb2x1bW4gLCBwaXht
YXAgLCBtYXNrKTsKfQotIChnaW50KSBub2RlR2V0UGl4dGV4dDooR3RrQ1RyZWVOb2RlICopIG5v
ZGUgY29sdW1uOihnaW50KSBjb2x1bW4gdGV4dDooTlNTdHJpbmcgKiopIHRleHQgc3BhY2luZzoo
Z3VpbnQ4ICopIHNwYWNpbmcgcGl4bWFwOihHZGtQaXhtYXAgKiopIHBpeG1hcCBtYXNrOihHZGtC
aXRtYXAgKiopIG1hc2sKewogICAgY2hhciAqX291dHZhbF8xOwogICAgZ2ludCBfcmV0dmFsXzE7
CiAgICBfcmV0dmFsXzEgPSBndGtfY3RyZWVfbm9kZV9nZXRfcGl4dGV4dChndGssIG5vZGUgLCBj
b2x1bW4gLCZfb3V0dmFsXzEsIHNwYWNpbmcgLCBwaXhtYXAgLCBtYXNrKTsKICAgICogdGV4dCAg
PSBndG9vbGtpdF9vYmpjX3N0cmluZyhfb3V0dmFsXzEpOwogICAgcmV0dXJuIF9yZXR2YWxfMTsK
fQotIChnaW50KSBnZXROb2RlSW5mbzooR3RrQ1RyZWVOb2RlICopIG5vZGUgdGV4dDooTlNTdHJp
bmcgKiopIHRleHQgc3BhY2luZzooZ3VpbnQ4ICopIHNwYWNpbmcgcGl4bWFwQ2xvc2VkOihHZGtQ
aXhtYXAgKiopIHBpeG1hcF9jbG9zZWQgbWFza0Nsb3NlZDooR2RrQml0bWFwICoqKSBtYXNrX2Ns
b3NlZCBwaXhtYXBPcGVuZWQ6KEdka1BpeG1hcCAqKikgcGl4bWFwX29wZW5lZCBtYXNrT3BlbmVk
OihHZGtCaXRtYXAgKiopIG1hc2tfb3BlbmVkIGlzTGVhZjooZ2Jvb2xlYW4gKikgaXNfbGVhZiBl
eHBhbmRlZDooZ2Jvb2xlYW4gKikgZXhwYW5kZWQKewogICAgY2hhciAqX291dHZhbF8xOwogICAg
Z2ludCBfcmV0dmFsXzE7CiAgICBfcmV0dmFsXzEgPSBndGtfY3RyZWVfZ2V0X25vZGVfaW5mbyhn
dGssIG5vZGUgLCZfb3V0dmFsXzEsIHNwYWNpbmcgLCBwaXhtYXBfY2xvc2VkICwgbWFza19jbG9z
ZWQgLCBwaXhtYXBfb3BlbmVkICwgbWFza19vcGVuZWQgLCBpc19sZWFmICwgZXhwYW5kZWQpOwog
ICAgKiB0ZXh0ICA9IGd0b29sa2l0X29iamNfc3RyaW5nKF9vdXR2YWxfMSk7CiAgICByZXR1cm4g
X3JldHZhbF8xOwp9Ci0gKHZvaWQpIG5vZGVTZXRSb3c6KEd0a0NUcmVlTm9kZSAqKSBub2RlIHN0
eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfY3RyZWVfbm9kZV9zZXRfcm93X3N0eWxl
KGd0aywgbm9kZSAsIHN0eWxlID8gc3R5bGUtPmd0ayA6IDApOwp9Ci0gKEdUS1N0eWxlICopIG5v
ZGVHZXRSb3dTdHlsZTooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAgcmV0dXJuIGd0b29sa2l0
X29iamVjdChndGtfY3RyZWVfbm9kZV9nZXRfcm93X3N0eWxlKGd0aywgbm9kZSksICJHVEtTdHls
ZSIpOwp9Ci0gKHZvaWQpIG5vZGVTZXRDZWxsU3R5bGU6KEd0a0NUcmVlTm9kZSAqKSBub2RlIGNv
bHVtbjooZ2ludCkgY29sdW1uIHN0eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfY3Ry
ZWVfbm9kZV9zZXRfY2VsbF9zdHlsZShndGssIG5vZGUgLCBjb2x1bW4gLCBzdHlsZSA/IHN0eWxl
LT5ndGsgOiAwKTsKfQotIChHVEtTdHlsZSAqKSBub2RlR2V0Q2VsbFN0eWxlOihHdGtDVHJlZU5v
ZGUgKikgbm9kZSBjb2x1bW46KGdpbnQpIGNvbHVtbgp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2Jq
ZWN0KGd0a19jdHJlZV9ub2RlX2dldF9jZWxsX3N0eWxlKGd0aywgbm9kZSAsIGNvbHVtbiksICJH
VEtTdHlsZSIpOwp9Ci0gKHZvaWQpIG5vZGVTZXRGb3JlZ3JvdW5kOihHdGtDVHJlZU5vZGUgKikg
bm9kZSBjb2xvcjooR2RrQ29sb3IgKikgY29sb3IKewogICAgZ3RrX2N0cmVlX25vZGVfc2V0X2Zv
cmVncm91bmQoZ3RrLCBub2RlICwgY29sb3IpOwp9Ci0gKHZvaWQpIG5vZGVTZXRCYWNrZ3JvdW5k
OihHdGtDVHJlZU5vZGUgKikgbm9kZSBjb2xvcjooR2RrQ29sb3IgKikgY29sb3IKewogICAgZ3Rr
X2N0cmVlX25vZGVfc2V0X2JhY2tncm91bmQoZ3RrLCBub2RlICwgY29sb3IpOwp9Ci0gKHZvaWQp
IG5vZGVTZXRSb3c6KEd0a0NUcmVlTm9kZSAqKSBub2RlIGRhdGE6KGdwb2ludGVyKSBkYXRhCnsK
ICAgIGd0a19jdHJlZV9ub2RlX3NldF9yb3dfZGF0YShndGssIG5vZGUgLCBkYXRhKTsKfQotICh2
b2lkKSBub2RlU2V0Um93RGF0YUZ1bGw6KEd0a0NUcmVlTm9kZSAqKSBub2RlIGRhdGE6KGdwb2lu
dGVyKSBkYXRhIGRlc3Ryb3k6KEd0a0Rlc3Ryb3lOb3RpZnkpIGRlc3Ryb3kKewogICAgZ3RrX2N0
cmVlX25vZGVfc2V0X3Jvd19kYXRhX2Z1bGwoZ3RrLCBub2RlICwgZGF0YSAsIGRlc3Ryb3kpOwp9
Ci0gKGdwb2ludGVyKSBub2RlR2V0Um93RGF0YTooR3RrQ1RyZWVOb2RlICopIG5vZGUKewogICAg
cmV0dXJuIGd0a19jdHJlZV9ub2RlX2dldF9yb3dfZGF0YShndGssIG5vZGUpOwp9Ci0gKHZvaWQp
IG5vZGVNb3ZldG86KEd0a0NUcmVlTm9kZSAqKSBub2RlIGNvbHVtbjooZ2ludCkgY29sdW1uIHJv
d0FsaWduOihnZmxvYXQpIHJvd19hbGlnbiBjb2xBbGlnbjooZ2Zsb2F0KSBjb2xfYWxpZ24Kewog
ICAgZ3RrX2N0cmVlX25vZGVfbW92ZXRvKGd0aywgbm9kZSAsIGNvbHVtbiAsIHJvd19hbGlnbiAs
IGNvbF9hbGlnbik7Cn0KLSAoR3RrVmlzaWJpbGl0eSkgbm9kZUlzVmlzaWJsZTooR3RrQ1RyZWVO
b2RlICopIG5vZGUKewogICAgcmV0dXJuIGd0a19jdHJlZV9ub2RlX2lzX3Zpc2libGUoZ3RrLCBu
b2RlKTsKfQotICh2b2lkKSBzZXRJbmRlbnQ6KGdpbnQpIGluZGVudAp7CiAgICBndGtfY3RyZWVf
c2V0X2luZGVudChndGssIGluZGVudCk7Cn0KLSAodm9pZCkgc2V0U3BhY2luZzooZ2ludCkgc3Bh
Y2luZwp7CiAgICBndGtfY3RyZWVfc2V0X3NwYWNpbmcoZ3RrLCBzcGFjaW5nKTsKfQotICh2b2lk
KSBzZXRTaG93U3R1YjooZ2Jvb2xlYW4pIHNob3dfc3R1Ygp7CiAgICBndGtfY3RyZWVfc2V0X3No
b3dfc3R1YihndGssIHNob3dfc3R1Yik7Cn0KLSAodm9pZCkgc2V0TGluZVN0eWxlOihHdGtDVHJl
ZUxpbmVTdHlsZSkgbGluZV9zdHlsZQp7CiAgICBndGtfY3RyZWVfc2V0X2xpbmVfc3R5bGUoZ3Rr
LCBsaW5lX3N0eWxlKTsKfQotICh2b2lkKSBzZXRFeHBhbmRlclN0eWxlOihHdGtDVHJlZUV4cGFu
ZGVyU3R5bGUpIGV4cGFuZGVyX3N0eWxlCnsKICAgIGd0a19jdHJlZV9zZXRfZXhwYW5kZXJfc3R5
bGUoZ3RrLCBleHBhbmRlcl9zdHlsZSk7Cn0KLSAodm9pZCkgc2V0RHJhZ0NvbXBhcmVGdW5jOihH
dGtDVHJlZUNvbXBhcmVEcmFnRnVuYykgY21wX2Z1bmMKewogICAgZ3RrX2N0cmVlX3NldF9kcmFn
X2NvbXBhcmVfZnVuYyhndGssIGNtcF9mdW5jKTsKfQotICh2b2lkKSBzb3J0Tm9kZTooR3RrQ1Ry
ZWVOb2RlICopIG5vZGUKewogICAgZ3RrX2N0cmVlX3NvcnRfbm9kZShndGssIG5vZGUpOwp9Ci0g
KHZvaWQpIHNvcnRSZWN1cnNpdmU6KEd0a0NUcmVlTm9kZSAqKSBub2RlCnsKICAgIGd0a19jdHJl
ZV9zb3J0X3JlY3Vyc2l2ZShndGssIG5vZGUpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmpl
Y3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5
OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxs
eSBmcm9tIGd0a2N1cnZlLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZl
cnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0N1cnZlLmg+CgpAaW1wbGVtZW50YXRp
b24gR1RLQ3VydmUKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2N1cnZlX2dl
dF90eXBlKCk7Cn0KKyAoaWQpIGN1cnZlCnsKICAgIHJldHVybiBbWyhHVEtDdXJ2ZSAqKVtzZWxm
IGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtz
ZWxmIGluaXRXaXRoR3RrOmd0a19jdXJ2ZV9uZXcoKV07Cn0KLSAodm9pZCkgcmVzZXQKewogICAg
Z3RrX2N1cnZlX3Jlc2V0KGd0ayk7Cn0KLSAodm9pZCkgc2V0R2FtbWE6KGdmbG9hdCkgZ2FtbWEK
ewogICAgZ3RrX2N1cnZlX3NldF9nYW1tYShndGssIGdhbW1hKTsKfQotICh2b2lkKSBzZXRSYW5n
ZTooZ2Zsb2F0KSBtaW5feCBtYXhYOihnZmxvYXQpIG1heF94IG1pblk6KGdmbG9hdCkgbWluX3kg
bWF4WTooZ2Zsb2F0KSBtYXhfeQp7CiAgICBndGtfY3VydmVfc2V0X3JhbmdlKGd0aywgbWluX3gg
LCBtYXhfeCAsIG1pbl95ICwgbWF4X3kpOwp9Ci0gKHZvaWQpIGdldFZlY3RvcjooaW50KSB2ZWNs
ZW4gdmVjdG9yOihnZmxvYXQgKikgdmVjdG9yCnsKICAgIGd0a19jdXJ2ZV9nZXRfdmVjdG9yKGd0
aywgdmVjbGVuICwgdmVjdG9yKTsKfQotICh2b2lkKSBzZXRWZWN0b3I6KGludCkgdmVjbGVuIHZl
Y3RvcjooZ2Zsb2F0ICopIHZlY3Rvcgp7CiAgICBndGtfY3VydmVfc2V0X3ZlY3RvcihndGssIHZl
Y2xlbiAsIHZlY3Rvcik7Cn0KLSAodm9pZCkgc2V0Q3VydmVUeXBlOihHdGtDdXJ2ZVR5cGUpIHR5
cGUKewogICAgZ3RrX2N1cnZlX3NldF9jdXJ2ZV90eXBlKGd0aywgdHlwZSk7Cn0KQGVuZAovKgog
KiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAq
IENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVy
YXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrZGF0YS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgog
KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVi
bGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtEYXRhLmg+
CgpAaW1wbGVtZW50YXRpb24gR1RLRGF0YQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVy
biBndGtfZGF0YV9nZXRfdHlwZSgpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUt
QyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5
OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9t
IGd0a2RpYWxvZy5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9u
IDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtEaWFsb2cuaD4KCkBpbXBsZW1lbnRhdGlvbiBH
VEtEaWFsb2cKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2RpYWxvZ19nZXRf
dHlwZSgpOwp9CisgKGlkKSBkaWFsb2cKewogICAgcmV0dXJuIFtbKEdUS0RpYWxvZyAqKVtzZWxm
IGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtz
ZWxmIGluaXRXaXRoR3RrOmd0a19kaWFsb2dfbmV3KCldOwp9CiNkZWZpbmUgZ3RrCSgoR3RrRGlh
bG9nICopIGd0aykKLSAoR1RLV2lkZ2V0ICopIHZib3gKewogICAgcmV0dXJuIEdUT09MS0lUX09C
SkVDVChndGstPnZib3gpOwp9Ci0gKEdUS1dpZGdldCAqKSBhY3Rpb25BcmVhCnsKICAgIHJldHVy
biBHVE9PTEtJVF9PQkpFQ1QoZ3RrLT5hY3Rpb25fYXJlYSk7Cn0KI3VuZGVmIGd0awpAZW5kCi8q
CiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQK
ICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2Vu
ZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtkcmF3aW5nYXJlYS5oIGJ5IGd0a2dlbi4KICoK
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl
bmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9H
VEtEcmF3aW5nQXJlYS5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0RyYXdpbmdBcmVhCisgKEd0a1R5
cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19kcmF3aW5nX2FyZWFfZ2V0X3R5cGUoKTsKfQor
IChpZCkgZHJhd2luZ0FyZWEKewogICAgcmV0dXJuIFtbKEdUS0RyYXdpbmdBcmVhICopW3NlbGYg
YWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3Nl
bGYgaW5pdFdpdGhHdGs6Z3RrX2RyYXdpbmdfYXJlYV9uZXcoKV07Cn0KLSAodm9pZCkgc2l6ZToo
Z2ludCkgd2lkdGggaGVpZ2h0OihnaW50KSBoZWlnaHQKewogICAgZ3RrX2RyYXdpbmdfYXJlYV9z
aXplKGd0aywgd2lkdGggLCBoZWlnaHQpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3Rp
dmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgs
IDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBm
cm9tIGd0a2VkaXRhYmxlLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZl
cnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0VkaXRhYmxlLmg+CgpAaW1wbGVtZW50
YXRpb24gR1RLRWRpdGFibGUKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2Vk
aXRhYmxlX2dldF90eXBlKCk7Cn0KLSAodm9pZCkgc2VsZWN0UmVnaW9uOihnaW50KSBzdGFydCBl
bmQ6KGdpbnQpIGVuZAp7CiAgICBndGtfZWRpdGFibGVfc2VsZWN0X3JlZ2lvbihndGssIHN0YXJ0
ICwgZW5kKTsKfQotICh2b2lkKSBpbnNlcnRUZXh0OihOU1N0cmluZyAqKSBuZXdfdGV4dCBuZXdU
ZXh0TGVuZ3RoOihnaW50KSBuZXdfdGV4dF9sZW5ndGggcG9zaXRpb246KGdpbnQgKikgcG9zaXRp
b24KewogICAgZ3RrX2VkaXRhYmxlX2luc2VydF90ZXh0KGd0ayxndG9vbGtpdF91dGY4X3N0cmlu
ZyggbmV3X3RleHQgKSwgbmV3X3RleHRfbGVuZ3RoICwgcG9zaXRpb24pOwp9Ci0gKHZvaWQpIGRl
bGV0ZVRleHQ6KGdpbnQpIHN0YXJ0X3BvcyBlbmRQb3M6KGdpbnQpIGVuZF9wb3MKewogICAgZ3Rr
X2VkaXRhYmxlX2RlbGV0ZV90ZXh0KGd0aywgc3RhcnRfcG9zICwgZW5kX3Bvcyk7Cn0KLSAoTlNT
dHJpbmcgKikgZ2V0Q2hhcnM6KGdpbnQpIHN0YXJ0X3BvcyBlbmRQb3M6KGdpbnQpIGVuZF9wb3MK
ewogICAgcmV0dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0a19lZGl0YWJsZV9nZXRfY2hhcnMo
Z3RrLCBzdGFydF9wb3MgLCBlbmRfcG9zKSk7Cn0KLSAodm9pZCkgY3V0Q2xpcGJvYXJkCnsKICAg
IGd0a19lZGl0YWJsZV9jdXRfY2xpcGJvYXJkKGd0ayk7Cn0KLSAodm9pZCkgY29weUNsaXBib2Fy
ZAp7CiAgICBndGtfZWRpdGFibGVfY29weV9jbGlwYm9hcmQoZ3RrKTsKfQotICh2b2lkKSBwYXN0
ZUNsaXBib2FyZAp7CiAgICBndGtfZWRpdGFibGVfcGFzdGVfY2xpcGJvYXJkKGd0ayk7Cn0KLSAo
dm9pZCkgY2xhaW1TZWxlY3Rpb246KGdib29sZWFuKSBjbGFpbSB0aW1lOihndWludDMyKSB0aW1l
CnsKICAgIGd0a19lZGl0YWJsZV9jbGFpbV9zZWxlY3Rpb24oZ3RrLCBjbGFpbSAsIHRpbWUpOwp9
Ci0gKHZvaWQpIGRlbGV0ZVNlbGVjdGlvbgp7CiAgICBndGtfZWRpdGFibGVfZGVsZXRlX3NlbGVj
dGlvbihndGspOwp9Ci0gKHZvaWQpIGNoYW5nZWQKewogICAgZ3RrX2VkaXRhYmxlX2NoYW5nZWQo
Z3RrKTsKfQotICh2b2lkKSBzZXRQb3NpdGlvbjooZ2ludCkgcG9zaXRpb24KewogICAgZ3RrX2Vk
aXRhYmxlX3NldF9wb3NpdGlvbihndGssIHBvc2l0aW9uKTsKfQotIChnaW50KSBnZXRQb3NpdGlv
bgp7CiAgICByZXR1cm4gZ3RrX2VkaXRhYmxlX2dldF9wb3NpdGlvbihndGspOwp9Ci0gKHZvaWQp
IHNldEVkaXRhYmxlOihnYm9vbGVhbikgaXNfZWRpdGFibGUKewogICAgZ3RrX2VkaXRhYmxlX3Nl
dF9lZGl0YWJsZShndGssIGlzX2VkaXRhYmxlKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2Jq
ZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAx
OTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2Fs
bHkgZnJvbSBndGtlbnRyeS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2
ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtFbnRyeS5oPgoKQGltcGxlbWVudGF0
aW9uIEdUS0VudHJ5CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19lbnRyeV9n
ZXRfdHlwZSgpOwp9CisgKGlkKSBlbnRyeQp7CiAgICByZXR1cm4gW1soR1RLRW50cnkgKilbc2Vs
ZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBb
c2VsZiBpbml0V2l0aEd0azpndGtfZW50cnlfbmV3KCldOwp9CisgKGlkKSBlbnRyeVdpdGhNYXhM
ZW5ndGg6KGd1aW50MTYpIG1heAp7CiAgICByZXR1cm4gW1soR1RLRW50cnkgKilbc2VsZiBhbGxv
Y10gaW5pdFdpdGhNYXhMZW5ndGg6bWF4XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRo
TWF4TGVuZ3RoOihndWludDE2KSBtYXgKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0
a19lbnRyeV9uZXdfd2l0aF9tYXhfbGVuZ3RoKCBtYXgpXTsKfQotICh2b2lkKSBzZXRUZXh0OihO
U1N0cmluZyAqKSB0ZXh0CnsKICAgIGd0a19lbnRyeV9zZXRfdGV4dChndGssZ3Rvb2xraXRfdXRm
OF9zdHJpbmcoIHRleHQpKTsKfQotICh2b2lkKSBhcHBlbmRUZXh0OihOU1N0cmluZyAqKSB0ZXh0
CnsKICAgIGd0a19lbnRyeV9hcHBlbmRfdGV4dChndGssZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRl
eHQpKTsKfQotICh2b2lkKSBwcmVwZW5kVGV4dDooTlNTdHJpbmcgKikgdGV4dAp7CiAgICBndGtf
ZW50cnlfcHJlcGVuZF90ZXh0KGd0ayxndG9vbGtpdF91dGY4X3N0cmluZyggdGV4dCkpOwp9Ci0g
KHZvaWQpIHNldFBvc2l0aW9uOihnaW50KSBwb3NpdGlvbgp7CiAgICBndGtfZW50cnlfc2V0X3Bv
c2l0aW9uKGd0aywgcG9zaXRpb24pOwp9Ci0gKE5TU3RyaW5nICopIGdldFRleHQKewogICAgcmV0
dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0a19lbnRyeV9nZXRfdGV4dChndGspKTsKfQotICh2
b2lkKSBzZWxlY3RSZWdpb246KGdpbnQpIHN0YXJ0IGVuZDooZ2ludCkgZW5kCnsKICAgIGd0a19l
bnRyeV9zZWxlY3RfcmVnaW9uKGd0aywgc3RhcnQgLCBlbmQpOwp9Ci0gKHZvaWQpIHNldFZpc2li
aWxpdHk6KGdib29sZWFuKSB2aXNpYmxlCnsKICAgIGd0a19lbnRyeV9zZXRfdmlzaWJpbGl0eShn
dGssIHZpc2libGUpOwp9Ci0gKHZvaWQpIHNldEVkaXRhYmxlOihnYm9vbGVhbikgZWRpdGFibGUK
ewogICAgZ3RrX2VudHJ5X3NldF9lZGl0YWJsZShndGssIGVkaXRhYmxlKTsKfQotICh2b2lkKSBz
ZXRNYXhMZW5ndGg6KGd1aW50MTYpIG1heAp7CiAgICBndGtfZW50cnlfc2V0X21heF9sZW5ndGgo
Z3RrLCBtYXgpOwp9CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgotICh2
b2lkKSBzZXREb3VibGVWYWx1ZTooZG91YmxlKSB2YWx1ZQp7CiAgICBjaGFyIHN0cmluZ1s2NF07
CgogICAgc3ByaW50ZihzdHJpbmcsICIlZyIsIHZhbHVlKTsKICAgIGd0a19lbnRyeV9zZXRfdGV4
dChndGssIHN0cmluZyk7Cn0KCi0gKHZvaWQpIHNldEludFZhbHVlOihpbnQpIHZhbHVlCnsKICAg
IGNoYXIgc3RyaW5nWzY0XTsKCiAgICBzcHJpbnRmKHN0cmluZywgIiVkIiwgdmFsdWUpOwogICAg
Z3RrX2VudHJ5X3NldF90ZXh0KGd0aywgc3RyaW5nKTsKfQoKLSAodm9pZCkgc2V0U3RyaW5nVmFs
dWU6KE5TU3RyaW5nICopIHZhbHVlCnsKICAgIGd0a19lbnRyeV9zZXRfdGV4dChndGssIGd0b29s
a2l0X3V0Zjhfc3RyaW5nKHZhbHVlKSk7Cn0KCi0gKGRvdWJsZSkgZG91YmxlVmFsdWUKewogICAg
cmV0dXJuIGF0b2YoZ3RrX2VudHJ5X2dldF90ZXh0KGd0aykpOwp9CgotIChpbnQpIGludFZhbHVl
CnsKICAgIHJldHVybiBhdG9pKGd0a19lbnRyeV9nZXRfdGV4dChndGspKTsKfQoKLSAoTlNTdHJp
bmcgKikgc3RyaW5nVmFsdWUKewogICAgcmV0dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0a19l
bnRyeV9nZXRfdGV4dChndGspKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMg
aW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5
LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBn
dGtldmVudGJveC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9u
IDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtFdmVudEJveC5oPgoKQGltcGxlbWVudGF0aW9u
IEdUS0V2ZW50Qm94CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19ldmVudF9i
b3hfZ2V0X3R5cGUoKTsKfQorIChpZCkgZXZlbnRCb3gKewogICAgcmV0dXJuIFtbKEdUS0V2ZW50
Qm94ICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAg
ICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2V2ZW50X2JveF9uZXcoKV07Cn0KQGVuZAov
KgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0
CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdl
bmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrZmlsZXNlbC5oIGJ5IGd0a2dlbi4KICoKICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy
YWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtG
aWxlU2VsZWN0aW9uLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLRmlsZVNlbGVjdGlvbgorIChHdGtU
eXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfZmlsZV9zZWxlY3Rpb25fZ2V0X3R5cGUoKTsK
fQorIChpZCkgZmlsZVNlbGVjdGlvbldpdGhUaXRsZTooTlNTdHJpbmcgKikgdGl0bGUKewogICAg
cmV0dXJuIFtbKEdUS0ZpbGVTZWxlY3Rpb24gKilbc2VsZiBhbGxvY10gaW5pdFdpdGhUaXRsZTp0
aXRsZV0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aFRpdGxlOihOU1N0cmluZyAqKSB0
aXRsZQp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2ZpbGVfc2VsZWN0aW9uX25l
dyhndG9vbGtpdF91dGY4X3N0cmluZyggdGl0bGUpKV07Cn0KLSAodm9pZCkgc2V0RmlsZW5hbWU6
KE5TU3RyaW5nICopIGZpbGVuYW1lCnsKICAgIGd0a19maWxlX3NlbGVjdGlvbl9zZXRfZmlsZW5h
bWUoZ3RrLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBmaWxlbmFtZSkpOwp9Ci0gKE5TU3RyaW5nICop
IGdldEZpbGVuYW1lCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmpjX3N0cmluZyhndGtfZmlsZV9z
ZWxlY3Rpb25fZ2V0X2ZpbGVuYW1lKGd0aykpOwp9Ci0gKHZvaWQpIGNvbXBsZXRlOihOU1N0cmlu
ZyAqKSBwYXR0ZXJuCnsKICAgIGd0a19maWxlX3NlbGVjdGlvbl9jb21wbGV0ZShndGssZ3Rvb2xr
aXRfdXRmOF9zdHJpbmcoIHBhdHRlcm4pKTsKfQotICh2b2lkKSBzaG93RmlsZW9wQnV0dG9ucwp7
CiAgICBndGtfZmlsZV9zZWxlY3Rpb25fc2hvd19maWxlb3BfYnV0dG9ucyhndGspOwp9Ci0gKHZv
aWQpIGhpZGVGaWxlb3BCdXR0b25zCnsKICAgIGd0a19maWxlX3NlbGVjdGlvbl9oaWRlX2ZpbGVv
cF9idXR0b25zKGd0ayk7Cn0KI2RlZmluZSBndGsJKChHdGtGaWxlU2VsZWN0aW9uICopIGd0aykK
LSAoR1RLV2lkZ2V0ICopIG9rQnV0dG9uCnsKICAgIHJldHVybiBHVE9PTEtJVF9PQkpFQ1QoZ3Rr
LT5va19idXR0b24pOwp9Ci0gKEdUS1dpZGdldCAqKSBjYW5jZWxCdXR0b24KewogICAgcmV0dXJu
IEdUT09MS0lUX09CSkVDVChndGstPmNhbmNlbF9idXR0b24pOwp9Ci0gKEdUS1dpZGdldCAqKSBo
ZWxwQnV0dG9uCnsKICAgIHJldHVybiBHVE9PTEtJVF9PQkpFQ1QoZ3RrLT5oZWxwX2J1dHRvbik7
Cn0KI3VuZGVmIGd0awpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNl
IHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBF
bG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtmaXhlZC5o
IGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNs
dWRlIDxHVG9vbEtpdC9HVEtGaXhlZC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+
CgpAaW1wbGVtZW50YXRpb24gR1RLRml4ZWQKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1
cm4gZ3RrX2ZpeGVkX2dldF90eXBlKCk7Cn0KKyAoaWQpIGZpeGVkCnsKICAgIHJldHVybiBbWyhH
VEtGaXhlZCAqKVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQK
ewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19maXhlZF9uZXcoKV07Cn0KLSAodm9p
ZCkgcHV0OihHVEtXaWRnZXQgKikgd2lkZ2V0IHg6KGdpbnQxNikgeCB5OihnaW50MTYpIHkKewog
ICAgZ3RrX2ZpeGVkX3B1dChndGssIHdpZGdldCAgPyB3aWRnZXQgLT5ndGsgOiAwLCB4ICwgeSk7
Cn0KLSAodm9pZCkgbW92ZTooR1RLV2lkZ2V0ICopIHdpZGdldCB4OihnaW50MTYpIHggeTooZ2lu
dDE2KSB5CnsKICAgIGd0a19maXhlZF9tb3ZlKGd0aywgd2lkZ2V0ICA/IHdpZGdldCAtPmd0ayA6
IDAsIHggLCB5KTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNl
IHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBF
bG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtmb250c2Vs
LmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2lu
Y2x1ZGUgPEdUb29sS2l0L0dUS0ZvbnRTZWxlY3Rpb24uaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtG
b250U2VsZWN0aW9uCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19mb250X3Nl
bGVjdGlvbl9nZXRfdHlwZSgpOwp9CisgKGlkKSBmb250U2VsZWN0aW9uCnsKICAgIHJldHVybiBb
WyhHVEtGb250U2VsZWN0aW9uICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQot
IChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2ZvbnRfc2VsZWN0
aW9uX25ldygpXTsKfQotIChOU1N0cmluZyAqKSBnZXRGb250TmFtZQp7CiAgICByZXR1cm4gZ3Rv
b2xraXRfb2JqY19zdHJpbmcoZ3RrX2ZvbnRfc2VsZWN0aW9uX2dldF9mb250X25hbWUoZ3RrKSk7
Cn0KLSAoR2RrRm9udCopIGdldEZvbnQKewogICAgcmV0dXJuIGd0a19mb250X3NlbGVjdGlvbl9n
ZXRfZm9udChndGspOwp9Ci0gKGdib29sZWFuKSBzZXRGb250TmFtZTooTlNTdHJpbmcgKikgZm9u
dG5hbWUKewogICAgcmV0dXJuIGd0a19mb250X3NlbGVjdGlvbl9zZXRfZm9udF9uYW1lKGd0ayxn
dG9vbGtpdF91dGY4X3N0cmluZyggZm9udG5hbWUpKTsKfQotICh2b2lkKSBzZXRGaWx0ZXI6KEd0
a0ZvbnRGaWx0ZXJUeXBlKSBmaWx0ZXJfdHlwZSBmb250VHlwZTooR3RrRm9udFR5cGUpIGZvbnRf
dHlwZSBmb3VuZHJpZXM6KE5TQXJyYXkgICopIGZvdW5kcmllcyB3ZWlnaHRzOihOU0FycmF5ICAq
KSB3ZWlnaHRzIHNsYW50czooTlNBcnJheSAgKikgc2xhbnRzIHNldHdpZHRoczooTlNBcnJheSAg
Kikgc2V0d2lkdGhzIHNwYWNpbmdzOihOU0FycmF5ICAqKSBzcGFjaW5ncyBjaGFyc2V0czooTlNB
cnJheSAgKikgY2hhcnNldHMKewogICAgZ3RrX2ZvbnRfc2VsZWN0aW9uX3NldF9maWx0ZXIoZ3Rr
LCBmaWx0ZXJfdHlwZSAsIGZvbnRfdHlwZSAsKGNoYXIgKiopZ3Rvb2xraXRfYXJyYXlfdG9fc3Ry
dmVjKCBmb3VuZHJpZXMgKSwoY2hhciAqKilndG9vbGtpdF9hcnJheV90b19zdHJ2ZWMoIHdlaWdo
dHMgKSwoY2hhciAqKilndG9vbGtpdF9hcnJheV90b19zdHJ2ZWMoIHNsYW50cyApLChjaGFyICoq
KWd0b29sa2l0X2FycmF5X3RvX3N0cnZlYyggc2V0d2lkdGhzICksKGNoYXIgKiopZ3Rvb2xraXRf
YXJyYXlfdG9fc3RydmVjKCBzcGFjaW5ncyApLChjaGFyICoqKWd0b29sa2l0X2FycmF5X3RvX3N0
cnZlYyggY2hhcnNldHMpKTsKfQotIChOU1N0cmluZyAqKSBnZXRQcmV2aWV3VGV4dAp7CiAgICBy
ZXR1cm4gZ3Rvb2xraXRfb2JqY19zdHJpbmcoZ3RrX2ZvbnRfc2VsZWN0aW9uX2dldF9wcmV2aWV3
X3RleHQoZ3RrKSk7Cn0KLSAodm9pZCkgc2V0UHJldmlld1RleHQ6KE5TU3RyaW5nICopIHRleHQK
ewogICAgZ3RrX2ZvbnRfc2VsZWN0aW9uX3NldF9wcmV2aWV3X3RleHQoZ3RrLGd0b29sa2l0X3V0
Zjhfc3RyaW5nKCB0ZXh0KSk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGlu
dGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwg
MjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3Rr
Zm9udHNlbC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIu
MSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
ICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtGb250U2VsZWN0aW9uRGlhbG9nLmg+CgpAaW1wbGVt
ZW50YXRpb24gR1RLRm9udFNlbGVjdGlvbkRpYWxvZworIChHdGtUeXBlKSBnZXRUeXBlCnsKICAg
IHJldHVybiBndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX2dldF90eXBlKCk7Cn0KKyAoaWQpIGZv
bnRTZWxlY3Rpb25EaWFsb2dXaXRoVGl0bGU6KE5TU3RyaW5nICopIHRpdGxlCnsKICAgIHJldHVy
biBbWyhHVEtGb250U2VsZWN0aW9uRGlhbG9nICopW3NlbGYgYWxsb2NdIGluaXRXaXRoVGl0bGU6
dGl0bGVdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhUaXRsZTooTlNTdHJpbmcgKikg
dGl0bGUKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19mb250X3NlbGVjdGlvbl9k
aWFsb2dfbmV3KGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0aXRsZSkpXTsKfQotIChOU1N0cmluZyAq
KSBnZXRGb250TmFtZQp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqY19zdHJpbmcoZ3RrX2ZvbnRf
c2VsZWN0aW9uX2RpYWxvZ19nZXRfZm9udF9uYW1lKGd0aykpOwp9Ci0gKEdka0ZvbnQqKSBnZXRG
b250CnsKICAgIHJldHVybiBndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX2dldF9mb250KGd0ayk7
Cn0KLSAoZ2Jvb2xlYW4pIHNldEZvbnROYW1lOihOU1N0cmluZyAqKSBmb250bmFtZQp7CiAgICBy
ZXR1cm4gZ3RrX2ZvbnRfc2VsZWN0aW9uX2RpYWxvZ19zZXRfZm9udF9uYW1lKGd0ayxndG9vbGtp
dF91dGY4X3N0cmluZyggZm9udG5hbWUpKTsKfQotICh2b2lkKSBzZXRGaWx0ZXI6KEd0a0ZvbnRG
aWx0ZXJUeXBlKSBmaWx0ZXJfdHlwZSBmb250VHlwZTooR3RrRm9udFR5cGUpIGZvbnRfdHlwZSBm
b3VuZHJpZXM6KE5TQXJyYXkgICopIGZvdW5kcmllcyB3ZWlnaHRzOihOU0FycmF5ICAqKSB3ZWln
aHRzIHNsYW50czooTlNBcnJheSAgKikgc2xhbnRzIHNldHdpZHRoczooTlNBcnJheSAgKikgc2V0
d2lkdGhzIHNwYWNpbmdzOihOU0FycmF5ICAqKSBzcGFjaW5ncyBjaGFyc2V0czooTlNBcnJheSAg
KikgY2hhcnNldHMKewogICAgZ3RrX2ZvbnRfc2VsZWN0aW9uX2RpYWxvZ19zZXRfZmlsdGVyKGd0
aywgZmlsdGVyX3R5cGUgLCBmb250X3R5cGUgLChjaGFyICoqKWd0b29sa2l0X2FycmF5X3RvX3N0
cnZlYyggZm91bmRyaWVzICksKGNoYXIgKiopZ3Rvb2xraXRfYXJyYXlfdG9fc3RydmVjKCB3ZWln
aHRzICksKGNoYXIgKiopZ3Rvb2xraXRfYXJyYXlfdG9fc3RydmVjKCBzbGFudHMgKSwoY2hhciAq
KilndG9vbGtpdF9hcnJheV90b19zdHJ2ZWMoIHNldHdpZHRocyApLChjaGFyICoqKWd0b29sa2l0
X2FycmF5X3RvX3N0cnZlYyggc3BhY2luZ3MgKSwoY2hhciAqKilndG9vbGtpdF9hcnJheV90b19z
dHJ2ZWMoIGNoYXJzZXRzKSk7Cn0KLSAoTlNTdHJpbmcgKikgZ2V0UHJldmlld1RleHQKewogICAg
cmV0dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0a19mb250X3NlbGVjdGlvbl9kaWFsb2dfZ2V0
X3ByZXZpZXdfdGV4dChndGspKTsKfQotICh2b2lkKSBzZXRQcmV2aWV3VGV4dDooTlNTdHJpbmcg
KikgdGV4dAp7CiAgICBndGtfZm9udF9zZWxlY3Rpb25fZGlhbG9nX3NldF9wcmV2aWV3X3RleHQo
Z3RrLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0ZXh0KSk7Cn0KI2RlZmluZSBndGsJKChHdGtGb250
U2VsZWN0aW9uRGlhbG9nICopIGd0aykKLSAoR1RLRm9udFNlbGVjdGlvbiAqKSBmb250U2VsZWN0
aW9uCnsKICAgIHJldHVybiBHVE9PTEtJVF9PQkpFQ1QoZ3RrLT5mb250c2VsKTsKfQotIChHVEtX
aWRnZXQgKikgb2tCdXR0b24KewogICAgcmV0dXJuIEdUT09MS0lUX09CSkVDVChndGstPm9rX2J1
dHRvbik7Cn0KLSAoR1RLV2lkZ2V0ICopIGFwcGx5QnV0dG9uCnsKICAgIHJldHVybiBHVE9PTEtJ
VF9PQkpFQ1QoZ3RrLT5hcHBseV9idXR0b24pOwp9Ci0gKEdUS1dpZGdldCAqKSBjYW5jZWxCdXR0
b24KewogICAgcmV0dXJuIEdUT09MS0lUX09CSkVDVChndGstPmNhbmNlbF9idXR0b24pOwp9CiN1
bmRlZiBndGsKQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0
aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIg
THVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrZnJhbWUuaCBieSBn
dGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8
R1Rvb2xLaXQvR1RLRnJhbWUuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtGcmFtZQorIChHdGtUeXBl
KSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfZnJhbWVfZ2V0X3R5cGUoKTsKfQorIChpZCkgZnJh
bWVXaXRoTGFiZWw6KE5TU3RyaW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbWyhHVEtGcmFtZSAq
KVtzZWxmIGFsbG9jXSBpbml0V2l0aExhYmVsOmxhYmVsXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQp
IGluaXRXaXRoTGFiZWw6KE5TU3RyaW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbc2VsZiBpbml0
V2l0aEd0azpndGtfZnJhbWVfbmV3KGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBsYWJlbCkpXTsKfQot
ICh2b2lkKSBzZXRMYWJlbDooTlNTdHJpbmcgKikgbGFiZWwKewogICAgZ3RrX2ZyYW1lX3NldF9s
YWJlbChndGssZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGxhYmVsKSk7Cn0KLSAodm9pZCkgc2V0TGFi
ZWxBbGlnbjooZ2Zsb2F0KSB4YWxpZ24geWFsaWduOihnZmxvYXQpIHlhbGlnbgp7CiAgICBndGtf
ZnJhbWVfc2V0X2xhYmVsX2FsaWduKGd0aywgeGFsaWduICwgeWFsaWduKTsKfQotICh2b2lkKSBz
ZXRTaGFkb3dUeXBlOihHdGtTaGFkb3dUeXBlKSB0eXBlCnsKICAgIGd0a19mcmFtZV9zZXRfc2hh
ZG93X3R5cGUoZ3RrLCB0eXBlKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMg
aW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5
LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBn
dGtnYW1tYS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIu
MSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
ICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtHYW1tYUN1cnZlLmg+CgpAaW1wbGVtZW50YXRpb24g
R1RLR2FtbWFDdXJ2ZQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfZ2FtbWFf
Y3VydmVfZ2V0X3R5cGUoKTsKfQorIChpZCkgZ2FtbWFDdXJ2ZQp7CiAgICByZXR1cm4gW1soR1RL
R2FtbWFDdXJ2ZSAqKVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGlu
aXQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19nYW1tYV9jdXJ2ZV9uZXcoKV07
Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lN
UCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2ln
CiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RraGFuZGxlYm94LmggYnkgZ3Rr
Z2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdU
b29sS2l0L0dUS0hhbmRsZUJveC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0hhbmRsZUJveAorIChH
dGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfaGFuZGxlX2JveF9nZXRfdHlwZSgpOwp9
CisgKGlkKSBoYW5kbGVCb3gKewogICAgcmV0dXJuIFtbKEdUS0hhbmRsZUJveCAqKVtzZWxmIGFs
bG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtzZWxm
IGluaXRXaXRoR3RrOmd0a19oYW5kbGVfYm94X25ldygpXTsKfQotICh2b2lkKSBzZXRTaGFkb3dU
eXBlOihHdGtTaGFkb3dUeXBlKSB0eXBlCnsKICAgIGd0a19oYW5kbGVfYm94X3NldF9zaGFkb3df
dHlwZShndGssIHR5cGUpOwp9Ci0gKHZvaWQpIHNldEhhbmRsZVBvc2l0aW9uOihHdGtQb3NpdGlv
blR5cGUpIHBvc2l0aW9uCnsKICAgIGd0a19oYW5kbGVfYm94X3NldF9oYW5kbGVfcG9zaXRpb24o
Z3RrLCBwb3NpdGlvbik7Cn0KLSAodm9pZCkgc2V0U25hcEVkZ2U6KEd0a1Bvc2l0aW9uVHlwZSkg
ZWRnZQp7CiAgICBndGtfaGFuZGxlX2JveF9zZXRfc25hcF9lZGdlKGd0aywgZWRnZSk7Cn0KQGVu
ZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29s
a2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAq
IEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RraGJib3guaCBieSBndGtnZW4uCiAqCiAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RL
SEJ1dHRvbkJveC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0hCdXR0b25Cb3gKKyAoR3RrVHlwZSkg
Z2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2hidXR0b25fYm94X2dldF90eXBlKCk7Cn0KKyAoaWQp
IGhCdXR0b25Cb3gKewogICAgcmV0dXJuIFtbKEdUS0hCdXR0b25Cb3ggKilbc2VsZiBhbGxvY10g
aW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0
V2l0aEd0azpndGtfaGJ1dHRvbl9ib3hfbmV3KCldOwp9CisgKGdpbnQpIGdldFNwYWNpbmdEZWZh
dWx0CnsKICAgIHJldHVybiBndGtfaGJ1dHRvbl9ib3hfZ2V0X3NwYWNpbmdfZGVmYXVsdCgpOwp9
CisgKEd0a0J1dHRvbkJveFN0eWxlKSBnZXRMYXlvdXREZWZhdWx0CnsKICAgIHJldHVybiBndGtf
aGJ1dHRvbl9ib3hfZ2V0X2xheW91dF9kZWZhdWx0KCk7Cn0KKyAodm9pZCkgc2V0U3BhY2luZ0Rl
ZmF1bHQ6KGdpbnQpIHNwYWNpbmcKewogICAgZ3RrX2hidXR0b25fYm94X3NldF9zcGFjaW5nX2Rl
ZmF1bHQoIHNwYWNpbmcpOwp9CisgKHZvaWQpIHNldExheW91dERlZmF1bHQ6KEd0a0J1dHRvbkJv
eFN0eWxlKSBsYXlvdXQKewogICAgZ3RrX2hidXR0b25fYm94X3NldF9sYXlvdXRfZGVmYXVsdCgg
bGF5b3V0KTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRv
IHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1h
ciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtoYm94LmggYnkg
Z3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUg
PEdUb29sS2l0L0dUS0hCb3guaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtIQm94CisgKEd0a1R5cGUp
IGdldFR5cGUKewogICAgcmV0dXJuIGd0a19oYm94X2dldF90eXBlKCk7Cn0KKyAoaWQpIGhCb3hX
aXRoSG9tb2dlbmVvdXM6KGdib29sZWFuKSBob21vZ2VuZW91cyBzcGFjaW5nOihnaW50KSBzcGFj
aW5nCnsKICAgIHJldHVybiBbWyhHVEtIQm94ICopW3NlbGYgYWxsb2NdIGluaXRXaXRoSG9tb2dl
bmVvdXM6aG9tb2dlbmVvdXMgc3BhY2luZzpzcGFjaW5nXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQp
IGluaXRXaXRoSG9tb2dlbmVvdXM6KGdib29sZWFuKSBob21vZ2VuZW91cyBzcGFjaW5nOihnaW50
KSBzcGFjaW5nCnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfaGJveF9uZXcoIGhv
bW9nZW5lb3VzICwgc3BhY2luZyldOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUt
QyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5
OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9t
IGd0a2hwYW5lZC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9u
IDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtIUGFuZWQuaD4KCkBpbXBsZW1lbnRhdGlvbiBH
VEtIUGFuZWQKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2hwYW5lZF9nZXRf
dHlwZSgpOwp9CisgKGlkKSBoUGFuZWQKewogICAgcmV0dXJuIFtbKEdUS0hQYW5lZCAqKVtzZWxm
IGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtz
ZWxmIGluaXRXaXRoR3RrOmd0a19ocGFuZWRfbmV3KCldOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQg
LSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQg
KGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21h
dGljYWxseSBmcm9tIGd0a2hydWxlci5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtIUnVsZXIuaD4KCkBpbXBs
ZW1lbnRhdGlvbiBHVEtIUnVsZXIKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3Rr
X2hydWxlcl9nZXRfdHlwZSgpOwp9CisgKGlkKSBoUnVsZXIKewogICAgcmV0dXJuIFtbKEdUS0hS
dWxlciAqKVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewog
ICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19ocnVsZXJfbmV3KCldOwp9CkBlbmQKLyoK
ICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAog
KiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5l
cmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2hzY2FsZS5oIGJ5IGd0a2dlbi4KICoKICogVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg
UHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtIU2Nh
bGUuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0FkanVzdG1lbnQuaD4KCkBpbXBsZW1lbnRhdGlv
biBHVEtIU2NhbGUKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2hzY2FsZV9n
ZXRfdHlwZSgpOwp9CisgKGlkKSBoU2NhbGVXaXRoQWRqdXN0bWVudDooR1RLQWRqdXN0bWVudCAq
KSBhZGp1c3RtZW50CnsKICAgIHJldHVybiBbWyhHVEtIU2NhbGUgKilbc2VsZiBhbGxvY10gaW5p
dFdpdGhBZGp1c3RtZW50OmFkanVzdG1lbnRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdp
dGhBZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGFkanVzdG1lbnQKewogICAgcmV0dXJuIFtz
ZWxmIGluaXRXaXRoR3RrOmd0a19oc2NhbGVfbmV3KCBhZGp1c3RtZW50ID8gYWRqdXN0bWVudC0+
Z3RrIDogMCldOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2Ug
dG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVs
bWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a2hzY3JvbGxi
YXIuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwoj
aW5jbHVkZSA8R1Rvb2xLaXQvR1RLSFNjcm9sbGJhci5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RL
QWRqdXN0bWVudC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0hTY3JvbGxiYXIKKyAoR3RrVHlwZSkg
Z2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX2hzY3JvbGxiYXJfZ2V0X3R5cGUoKTsKfQorIChpZCkg
aFNjcm9sbGJhcldpdGhBZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGFkanVzdG1lbnQKewog
ICAgcmV0dXJuIFtbKEdUS0hTY3JvbGxiYXIgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhBZGp1c3Rt
ZW50OmFkanVzdG1lbnRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhBZGp1c3RtZW50
OihHVEtBZGp1c3RtZW50ICopIGFkanVzdG1lbnQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRo
R3RrOmd0a19oc2Nyb2xsYmFyX25ldyggYWRqdXN0bWVudCA/IGFkanVzdG1lbnQtPmd0ayA6IDAp
XTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBH
SU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3
aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtoc2VwYXJhdG9yLmggYnkg
Z3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUg
PEdUb29sS2l0L0dUS0hTZXBhcmF0b3IuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtIU2VwYXJhdG9y
CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19oc2VwYXJhdG9yX2dldF90eXBl
KCk7Cn0KKyAoaWQpIGhTZXBhcmF0b3IKewogICAgcmV0dXJuIFtbKEdUS0hTZXBhcmF0b3IgKilb
c2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVy
biBbc2VsZiBpbml0V2l0aEd0azpndGtfaHNlcGFyYXRvcl9uZXcoKV07Cn0KQGVuZAovKgogKiBH
VG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENv
cHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRl
ZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RraW1hZ2UuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGli
cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLSW1hZ2UuaD4K
CkBpbXBsZW1lbnRhdGlvbiBHVEtJbWFnZQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVy
biBndGtfaW1hZ2VfZ2V0X3R5cGUoKTsKfQorIChpZCkgaW1hZ2VXaXRoVmFsOihHZGtJbWFnZSAq
KSB2YWwgbWFzazooR2RrQml0bWFwICopIG1hc2sKewogICAgcmV0dXJuIFtbKEdUS0ltYWdlICop
W3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsOnZhbCBtYXNrOm1hc2tdIGF1dG9yZWxlYXNlXTsKfQot
IChpZCkgaW5pdFdpdGhWYWw6KEdka0ltYWdlICopIHZhbCBtYXNrOihHZGtCaXRtYXAgKikgbWFz
awp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2ltYWdlX25ldyggdmFsICwgbWFz
ayldOwp9Ci0gKHZvaWQpIHNldDooR2RrSW1hZ2UgKikgdmFsIG1hc2s6KEdka0JpdG1hcCAqKSBt
YXNrCnsKICAgIGd0a19pbWFnZV9zZXQoZ3RrLCB2YWwgLCBtYXNrKTsKfQotICh2b2lkKSBnZXQ6
KEdka0ltYWdlICoqKSB2YWwgbWFzazooR2RrQml0bWFwICoqKSBtYXNrCnsKICAgIGd0a19pbWFn
ZV9nZXQoZ3RrLCB2YWwgLCBtYXNrKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZl
LUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAx
OTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJv
bSBndGtpbnB1dGRpYWxvZy5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2
ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtJbnB1dERpYWxvZy5oPgoKQGltcGxl
bWVudGF0aW9uIEdUS0lucHV0RGlhbG9nCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJu
IGd0a19pbnB1dF9kaWFsb2dfZ2V0X3R5cGUoKTsKfQorIChpZCkgaW5wdXREaWFsb2cKewogICAg
cmV0dXJuIFtbKEdUS0lucHV0RGlhbG9nICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNl
XTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX2lucHV0
X2RpYWxvZ19uZXcoKV07Cn0KI2RlZmluZSBndGsJKChHdGtJbnB1dERpYWxvZyAqKSBndGspCi0g
KEdUS1dpZGdldCAqKSBjbG9zZUJ1dHRvbgp7CiAgICByZXR1cm4gR1RPT0xLSVRfT0JKRUNUKGd0
ay0+Y2xvc2VfYnV0dG9uKTsKfQotIChHVEtXaWRnZXQgKikgc2F2ZUJ1dHRvbgp7CiAgICByZXR1
cm4gR1RPT0xLSVRfT0JKRUNUKGd0ay0+c2F2ZV9idXR0b24pOwp9CiN1bmRlZiBndGsKQGVuZAov
KgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0
CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdl
bmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RraW52aXNpYmxlLmggYnkgZ3RrZ2VuLgogKgog
KiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dU
S0ludmlzaWJsZS5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0ludmlzaWJsZQorIChHdGtUeXBlKSBn
ZXRUeXBlCnsKICAgIHJldHVybiBndGtfaW52aXNpYmxlX2dldF90eXBlKCk7Cn0KKyAoaWQpIGlu
dmlzaWJsZQp7CiAgICByZXR1cm4gW1soR1RLSW52aXNpYmxlICopW3NlbGYgYWxsb2NdIGluaXRd
IGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhH
dGs6Z3RrX2ludmlzaWJsZV9uZXcoKV07Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2
ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwg
MTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZy
b20gZ3RraXRlbS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9u
IDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtJdGVtLmg+CgpAaW1wbGVtZW50YXRpb24gR1RL
SXRlbQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfaXRlbV9nZXRfdHlwZSgp
Owp9Ci0gKHZvaWQpIHNlbGVjdAp7CiAgICBndGtfaXRlbV9zZWxlY3QoZ3RrKTsKfQotICh2b2lk
KSBkZXNlbGVjdAp7CiAgICBndGtfaXRlbV9kZXNlbGVjdChndGspOwp9Ci0gKHZvaWQpIHRvZ2ds
ZQp7CiAgICBndGtfaXRlbV90b2dnbGUoZ3RrKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2Jq
ZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAx
OTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2Fs
bHkgZnJvbSBndGtpdGVtZmFjdG9yeS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtJdGVtRmFjdG9yeS5oPgoj
aW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtBY2Nl
bEdyb3VwLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLSXRlbUZhY3RvcnkKKyAoR3RrVHlwZSkgZ2V0
VHlwZQp7CiAgICByZXR1cm4gZ3RrX2l0ZW1fZmFjdG9yeV9nZXRfdHlwZSgpOwp9CisgKGlkKSBp
dGVtRmFjdG9yeVdpdGhDb250YWluZXJUeXBlOihHdGtUeXBlKSBjb250YWluZXJfdHlwZSBwYXRo
OihOU1N0cmluZyAqKSBwYXRoIGFjY2VsR3JvdXA6KEdUS0FjY2VsR3JvdXAgKikgYWNjZWxfZ3Jv
dXAKewogICAgcmV0dXJuIFtbKEdUS0l0ZW1GYWN0b3J5ICopW3NlbGYgYWxsb2NdIGluaXRXaXRo
Q29udGFpbmVyVHlwZTpjb250YWluZXJfdHlwZSBwYXRoOnBhdGggYWNjZWxHcm91cDphY2NlbF9n
cm91cF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aENvbnRhaW5lclR5cGU6KEd0a1R5
cGUpIGNvbnRhaW5lcl90eXBlIHBhdGg6KE5TU3RyaW5nICopIHBhdGggYWNjZWxHcm91cDooR1RL
QWNjZWxHcm91cCAqKSBhY2NlbF9ncm91cAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6
Z3RrX2l0ZW1fZmFjdG9yeV9uZXcoIGNvbnRhaW5lcl90eXBlICxndG9vbGtpdF91dGY4X3N0cmlu
ZyggcGF0aCApLCBhY2NlbF9ncm91cCA/IGFjY2VsX2dyb3VwLT5ndGsgOiAwKV07Cn0KKyAodm9p
ZCkgcGFyc2VSYzooTlNTdHJpbmcgKikgZmlsZV9uYW1lCnsKICAgIGd0a19pdGVtX2ZhY3Rvcnlf
cGFyc2VfcmMoZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGZpbGVfbmFtZSkpOwp9CisgKHZvaWQpIHBh
cnNlUmNTdHJpbmc6KE5TU3RyaW5nICopIHJjX3N0cmluZwp7CiAgICBndGtfaXRlbV9mYWN0b3J5
X3BhcnNlX3JjX3N0cmluZyhndG9vbGtpdF91dGY4X3N0cmluZyggcmNfc3RyaW5nKSk7Cn0KKyAo
dm9pZCkgcGFyc2VSY1NjYW5uZXI6KEdTY2FubmVyICopIHNjYW5uZXIKewogICAgZ3RrX2l0ZW1f
ZmFjdG9yeV9wYXJzZV9yY19zY2FubmVyKCBzY2FubmVyKTsKfQorICh2b2lkKSBhZGRGb3JlaWdu
OihHVEtXaWRnZXQgKikgYWNjZWxfd2lkZ2V0IGZ1bGxQYXRoOihOU1N0cmluZyAqKSBmdWxsX3Bh
dGggYWNjZWxHcm91cDooR1RLQWNjZWxHcm91cCAqKSBhY2NlbF9ncm91cCBrZXl2YWw6KGd1aW50
KSBrZXl2YWwgbW9kaWZpZXJzOihHZGtNb2RpZmllclR5cGUpIG1vZGlmaWVycwp7CiAgICBndGtf
aXRlbV9mYWN0b3J5X2FkZF9mb3JlaWduKCBhY2NlbF93aWRnZXQgID8gYWNjZWxfd2lkZ2V0IC0+
Z3RrIDogMCxndG9vbGtpdF91dGY4X3N0cmluZyggZnVsbF9wYXRoICksIGFjY2VsX2dyb3VwICA/
IGFjY2VsX2dyb3VwIC0+Z3RrIDogMCwga2V5dmFsICwgbW9kaWZpZXJzKTsKfQorIChHVEtJdGVt
RmFjdG9yeSopIGZyb21XaWRnZXQ6KEdUS1dpZGdldCAqKSB3aWRnZXQKewogICAgcmV0dXJuIGd0
b29sa2l0X29iamVjdChndGtfaXRlbV9mYWN0b3J5X2Zyb21fd2lkZ2V0KCB3aWRnZXQgPyB3aWRn
ZXQtPmd0ayA6IDApLCAwKTsKfQorIChOU1N0cmluZyAqKSBwYXRoRnJvbVdpZGdldDooR1RLV2lk
Z2V0ICopIHdpZGdldAp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqY19zdHJpbmcoZ3RrX2l0ZW1f
ZmFjdG9yeV9wYXRoX2Zyb21fd2lkZ2V0KCB3aWRnZXQgPyB3aWRnZXQtPmd0ayA6IDApKTsKfQot
IChHVEtXaWRnZXQqKSBnZXRJdGVtOihOU1N0cmluZyAqKSBwYXRoCnsKICAgIHJldHVybiBndG9v
bGtpdF9vYmplY3QoZ3RrX2l0ZW1fZmFjdG9yeV9nZXRfaXRlbShndGssZ3Rvb2xraXRfdXRmOF9z
dHJpbmcoIHBhdGgpKSwgMCk7Cn0KLSAoR1RLV2lkZ2V0KikgZ2V0V2lkZ2V0OihOU1N0cmluZyAq
KSBwYXRoCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX2l0ZW1fZmFjdG9yeV9nZXRf
d2lkZ2V0KGd0ayxndG9vbGtpdF91dGY4X3N0cmluZyggcGF0aCkpLCAwKTsKfQotIChHVEtXaWRn
ZXQqKSBnZXRXaWRnZXRCeUFjdGlvbjooZ3VpbnQpIGFjdGlvbgp7CiAgICByZXR1cm4gZ3Rvb2xr
aXRfb2JqZWN0KGd0a19pdGVtX2ZhY3RvcnlfZ2V0X3dpZGdldF9ieV9hY3Rpb24oZ3RrLCBhY3Rp
b24pLCAwKTsKfQotIChHVEtXaWRnZXQqKSBnZXRJdGVtQnlBY3Rpb246KGd1aW50KSBhY3Rpb24K
ewogICAgcmV0dXJuIGd0b29sa2l0X29iamVjdChndGtfaXRlbV9mYWN0b3J5X2dldF9pdGVtX2J5
X2FjdGlvbihndGssIGFjdGlvbiksIDApOwp9CisgKHZvaWQpIGR1bXBJdGVtczooR3RrUGF0dGVy
blNwZWMgKikgcGF0aF9wc3BlYyBtb2RpZmllZE9ubHk6KGdib29sZWFuKSBtb2RpZmllZF9vbmx5
IHByaW50RnVuYzooR3RrUHJpbnRGdW5jKSBwcmludF9mdW5jIGZ1bmNEYXRhOihncG9pbnRlcikg
ZnVuY19kYXRhCnsKICAgIGd0a19pdGVtX2ZhY3RvcnlfZHVtcF9pdGVtcyggcGF0aF9wc3BlYyAs
IG1vZGlmaWVkX29ubHkgLCBwcmludF9mdW5jICwgZnVuY19kYXRhKTsKfQorICh2b2lkKSBkdW1w
UmM6KE5TU3RyaW5nICopIGZpbGVfbmFtZSBwYXRoUHNwZWM6KEd0a1BhdHRlcm5TcGVjICopIHBh
dGhfcHNwZWMgbW9kaWZpZWRPbmx5OihnYm9vbGVhbikgbW9kaWZpZWRfb25seQp7CiAgICBndGtf
aXRlbV9mYWN0b3J5X2R1bXBfcmMoZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGZpbGVfbmFtZSApLCBw
YXRoX3BzcGVjICwgbW9kaWZpZWRfb25seSk7Cn0KLSAodm9pZCkgY3JlYXRlSXRlbTooR3RrSXRl
bUZhY3RvcnlFbnRyeSAqKSBlbnRyeSBjYWxsYmFja0RhdGE6KGdwb2ludGVyKSBjYWxsYmFja19k
YXRhIGNhbGxiYWNrVHlwZTooZ3VpbnQpIGNhbGxiYWNrX3R5cGUKewogICAgZ3RrX2l0ZW1fZmFj
dG9yeV9jcmVhdGVfaXRlbShndGssIGVudHJ5ICwgY2FsbGJhY2tfZGF0YSAsIGNhbGxiYWNrX3R5
cGUpOwp9Ci0gKHZvaWQpIGNyZWF0ZUl0ZW1zOihndWludCkgbl9lbnRyaWVzIGVudHJpZXM6KEd0
a0l0ZW1GYWN0b3J5RW50cnkgKikgZW50cmllcyBjYWxsYmFja0RhdGE6KGdwb2ludGVyKSBjYWxs
YmFja19kYXRhCnsKICAgIGd0a19pdGVtX2ZhY3RvcnlfY3JlYXRlX2l0ZW1zKGd0aywgbl9lbnRy
aWVzICwgZW50cmllcyAsIGNhbGxiYWNrX2RhdGEpOwp9Ci0gKHZvaWQpIGRlbGV0ZUl0ZW06KE5T
U3RyaW5nICopIHBhdGgKewogICAgZ3RrX2l0ZW1fZmFjdG9yeV9kZWxldGVfaXRlbShndGssZ3Rv
b2xraXRfdXRmOF9zdHJpbmcoIHBhdGgpKTsKfQotICh2b2lkKSBkZWxldGVFbnRyeTooR3RrSXRl
bUZhY3RvcnlFbnRyeSAqKSBlbnRyeQp7CiAgICBndGtfaXRlbV9mYWN0b3J5X2RlbGV0ZV9lbnRy
eShndGssIGVudHJ5KTsKfQotICh2b2lkKSBkZWxldGVFbnRyaWVzOihndWludCkgbl9lbnRyaWVz
IGVudHJpZXM6KEd0a0l0ZW1GYWN0b3J5RW50cnkgKikgZW50cmllcwp7CiAgICBndGtfaXRlbV9m
YWN0b3J5X2RlbGV0ZV9lbnRyaWVzKGd0aywgbl9lbnRyaWVzICwgZW50cmllcyk7Cn0KLSAodm9p
ZCkgcG9wdXA6KGd1aW50KSB4IHk6KGd1aW50KSB5IG1vdXNlQnV0dG9uOihndWludCkgbW91c2Vf
YnV0dG9uIHRpbWU6KGd1aW50MzIpIHRpbWUKewogICAgZ3RrX2l0ZW1fZmFjdG9yeV9wb3B1cChn
dGssIHggLCB5ICwgbW91c2VfYnV0dG9uICwgdGltZSk7Cn0KLSAodm9pZCkgcG9wdXBXaXRoRGF0
YTooZ3BvaW50ZXIpIHBvcHVwX2RhdGEgZGVzdHJveTooR3RrRGVzdHJveU5vdGlmeSkgZGVzdHJv
eSB4OihndWludCkgeCB5OihndWludCkgeSBtb3VzZUJ1dHRvbjooZ3VpbnQpIG1vdXNlX2J1dHRv
biB0aW1lOihndWludDMyKSB0aW1lCnsKICAgIGd0a19pdGVtX2ZhY3RvcnlfcG9wdXBfd2l0aF9k
YXRhKGd0aywgcG9wdXBfZGF0YSAsIGRlc3Ryb3kgLCB4ICwgeSAsIG1vdXNlX2J1dHRvbiAsIHRp
bWUpOwp9Ci0gKGdwb2ludGVyKSBwb3B1cERhdGEKewogICAgcmV0dXJuIGd0a19pdGVtX2ZhY3Rv
cnlfcG9wdXBfZGF0YShndGspOwp9CisgKGdwb2ludGVyKSBwb3B1cERhdGFGcm9tV2lkZ2V0OihH
VEtXaWRnZXQgKikgd2lkZ2V0CnsKICAgIHJldHVybiBndGtfaXRlbV9mYWN0b3J5X3BvcHVwX2Rh
dGFfZnJvbV93aWRnZXQoIHdpZGdldCA/IHdpZGdldC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgc2V0
VHJhbnNsYXRlRnVuYzooR3RrVHJhbnNsYXRlRnVuYykgZnVuYyBkYXRhOihncG9pbnRlcikgZGF0
YSBub3RpZnk6KEd0a0Rlc3Ryb3lOb3RpZnkpIG5vdGlmeQp7CiAgICBndGtfaXRlbV9mYWN0b3J5
X3NldF90cmFuc2xhdGVfZnVuYyhndGssIGZ1bmMgLCBkYXRhICwgbm90aWZ5KTsKfQojaW5jbHVk
ZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Rm91bmRhdGlvbi9OU0F1
dG9yZWxlYXNlUG9vbC5oPgoKCnN0YXRpYyB2b2lkIGl0ZW1fZm9yd2FyZF9zaWduYWwgKGdwb2lu
dGVyIGRhdGEsIGd1aW50IGFjdGlvbiwgR3RrV2lkZ2V0ICp3aWRnZXQpCnsKICAgIE5TQXV0b3Jl
bGVhc2VQb29sICpwb29sID0gW05TQXV0b3JlbGVhc2VQb29sIG5ld107CiAgICBpZCB0YXJnZXQg
PSBndGtfb2JqZWN0X2dldF9kYXRhKChHdGtPYmplY3QgKikgd2lkZ2V0LCAiX21lbnVfdGFyZ2V0
Iik7CgojaWZkZWYgREVCVUcKICAgIGZwcmludGYoc3RkZXJyLCAiKGl0ZW1fZm9yd2FyZF9zaWdu
YWwgaW5pdCkgZ3RrID0gJXAsIGFjdGlvbiBbJXAgJXNdXG4iLAoJICAgIHdpZGdldCwgdGFyZ2V0
LCBzZWxfZ2V0X25hbWUoZGF0YSkpOwojZW5kaWYKICAgIFt0YXJnZXQgcGVyZm9ybVNlbGVjdG9y
OmRhdGEgd2l0aE9iamVjdDpHVE9PTEtJVF9PQkpFQ1Qod2lkZ2V0KV07CiAgICBbcG9vbCByZWxl
YXNlXTsKI2lmZGVmIERFQlVHCiAgICBmcHJpbnRmKHN0ZGVyciwgIihpdGVtX2ZvcndhcmRfc2ln
bmFsIGV4aXQpIGd0ayA9ICVwXG4iLCB3aWRnZXQpOwojZW5kaWYKfQoKIC8qIFRoaXMgbXVzdCBi
ZSBrZXB0IGluIHN5bmMgd2l0aCBndGtfaXRlbV9mYWN0b3J5X3BhcnNlX3BhdGgoKSEgKi8Kc3Rh
dGljIHZvaWQgaXRlbV9wYXJzZV9wYXRoIChjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzdHIpCnsK
ICAgIHdoaWxlICgqc3RyID09ICdfJyA/ICpzdHIrKyA6ICgqcGF0aCsrID0gKnN0cisrKSk7Cn0K
CiAtIChpZCkgaW5pdFdpdGhHdGs6KGdwb2ludGVyKSBfZ3RrCnsKICAgIFtzdXBlciBpbml0V2l0
aEd0azpfZ3RrXTsKICAgIGd0a193aWRnZXRfc2hvdyhndGtfaXRlbV9mYWN0b3J5X2dldF93aWRn
ZXQoX2d0aywgIiIpKTsKICAgIHJldHVybiAgc2VsZjsJLy8gYXZvaWQgYnVnIGluIG9iamNkb2MK
fQoKLyoKICogVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCB0byBjcmVhdGUgaXRlbSBmYWN0
b3kgZW50cmllcy4gTm90ZSB0aGF0CiAqIGl0IGV4cGVjdHMgYSB2ZWN0b3Igb2YgdHlwZSBHVEtJ
dGVtRmFjdG9yeUVudHJ5IChkZWZpbmVkIGluCiAqIEdUb29sS2l0L0dUS0l0ZW1GYWN0b3J5Lmgp
IGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsIEd0a0l0ZW1GYWN0b3J5RW50cnkuCiAqIEBzZWUgLWRl
bGV0ZUVudHJpZXM6Y291bnQ6CiAqLwotICh2b2lkKSBjcmVhdGVJdGVtczooR1RLSXRlbUZhY3Rv
cnlFbnRyeSAqKSBlbnRyaWVzIGNvdW50OihndWludCkgY291bnQKCSBmb3JUYXJnZXQ6KGlkKSB0
YXJnZXQKewogICAgZm9yICg7IGNvdW50LS07ICsrZW50cmllcykKICAgIHsKCWNoYXIgKnBhdGgg
PSBnX25ldyhjaGFyLCBzdHJsZW4oZW50cmllcy0+aXRlbS5wYXRoKSArIDEpOwoJR3RrV2lkZ2V0
ICppdGVtX3dpZGdldDsKCglpZiAoZW50cmllcy0+aXRlbS5jYWxsYmFjayA9PSBOVUxMICYmIGVu
dHJpZXMtPnNlbGVjdG9yKQoJICAgIGVudHJpZXMtPml0ZW0uY2FsbGJhY2sgPQoJCShHdGtJdGVt
RmFjdG9yeUNhbGxiYWNrKSBpdGVtX2ZvcndhcmRfc2lnbmFsOwoKCWd0a19pdGVtX2ZhY3Rvcnlf
Y3JlYXRlX2l0ZW0oZ3RrLCAmZW50cmllcy0+aXRlbSwKCQkJCSAgICAgKGdwb2ludGVyKSBlbnRy
aWVzLT5zZWxlY3RvciwgMSk7CgoJaXRlbV9wYXJzZV9wYXRoKHBhdGgsIGVudHJpZXMtPml0ZW0u
cGF0aCk7CglpdGVtX3dpZGdldCA9IGd0a19pdGVtX2ZhY3RvcnlfZ2V0X3dpZGdldChndGssIHBh
dGgpOwoJZ3RrX29iamVjdF9zZXRfZGF0YSgoR3RrT2JqZWN0ICopIGl0ZW1fd2lkZ2V0LCAiX21l
bnVfdGFyZ2V0IiwgdGFyZ2V0KTsKCWdfZnJlZShwYXRoKTsKICAgIH0KfQoKLyoKICogVGhpcyBp
cyB0aGUgcHJlZmVycmVkIG1ldGhvZCB0byBkZWxldGUgaXRlbSBmYWN0b3kgZW50cmllcy4gTm90
ZSB0aGF0IGl0CiAqIGV4cGVjdHMgYSB2ZWN0b3Igb2YgdHlwZSBHVEtJdGVtRmFjdG9yeUVudHJ5
IChkZWZpbmVkIGluCiAqIEdUb29sS2l0L0dUS0l0ZW1GYWN0b3J5LmgpIGluc3RlYWQgb2YgdGhl
IG9yaWdpbmFsIEd0a0l0ZW1GYWN0b3J5RW50cnkuCiAqIEBzZWUgLWNyZWF0ZUl0ZW1zOmNvdW50
OmZvclRhcmdldDoKICovCi0gKHZvaWQpIGRlbGV0ZUVudHJpZXM6KEdUS0l0ZW1GYWN0b3J5RW50
cnkgKikgZW50cmllcyBjb3VudDooZ3VpbnQpIGNvdW50CnsKICAgIGZvciAoOyBjb3VudC0tOyAr
K2VudHJpZXMpCglndGtfaXRlbV9mYWN0b3J5X2RlbGV0ZV9lbnRyeShndGssICZlbnRyaWVzLT5p
dGVtKTsKfQoKI2RlZmluZSBndGsJKChHdGtJdGVtRmFjdG9yeSAqKSBndGspCi0gKEdUS0FjY2Vs
R3JvdXAgKikgYWNjZWxHcm91cAp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0ay0+YWNj
ZWxfZ3JvdXAsICJHVEtBY2NlbEdyb3VwIik7Cn0KI3VuZGVmIGd0awpAZW5kCi8qCiAqIEdUb29s
S2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJp
Z2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1
dG9tYXRpY2FsbHkgZnJvbSBndGtsYWJlbC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtMYWJlbC5oPgoKQGlt
cGxlbWVudGF0aW9uIEdUS0xhYmVsCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0
a19sYWJlbF9nZXRfdHlwZSgpOwp9CisgKGlkKSBsYWJlbFdpdGhTdHI6KE5TU3RyaW5nICopIHN0
cgp7CiAgICByZXR1cm4gW1soR1RLTGFiZWwgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhTdHI6c3Ry
XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoU3RyOihOU1N0cmluZyAqKSBzdHIKewog
ICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19sYWJlbF9uZXcoZ3Rvb2xraXRfdXRmOF9z
dHJpbmcoIHN0cikpXTsKfQotICh2b2lkKSBzZXRUZXh0OihOU1N0cmluZyAqKSBzdHIKewogICAg
Z3RrX2xhYmVsX3NldF90ZXh0KGd0ayxndG9vbGtpdF91dGY4X3N0cmluZyggc3RyKSk7Cn0KLSAo
dm9pZCkgc2V0SnVzdGlmeTooR3RrSnVzdGlmaWNhdGlvbikganR5cGUKewogICAgZ3RrX2xhYmVs
X3NldF9qdXN0aWZ5KGd0aywganR5cGUpOwp9Ci0gKHZvaWQpIHNldFBhdHRlcm46KE5TU3RyaW5n
ICopIHBhdHRlcm4KewogICAgZ3RrX2xhYmVsX3NldF9wYXR0ZXJuKGd0ayxndG9vbGtpdF91dGY4
X3N0cmluZyggcGF0dGVybikpOwp9Ci0gKHZvaWQpIHNldExpbmVXcmFwOihnYm9vbGVhbikgd3Jh
cAp7CiAgICBndGtfbGFiZWxfc2V0X2xpbmVfd3JhcChndGssIHdyYXApOwp9Ci0gKHZvaWQpIGdl
dDooTlNTdHJpbmcgKiopIHN0cgp7CiAgICBjaGFyICpfb3V0dmFsXzE7CiAgICBndGtfbGFiZWxf
Z2V0KGd0aywmX291dHZhbF8xKTsKICAgICogc3RyID0gZ3Rvb2xraXRfb2JqY19zdHJpbmcoX291
dHZhbF8xKTsKfQotIChndWludCkgcGFyc2VVbGluZTooTlNTdHJpbmcgKikgc3RyaW5nCnsKICAg
IHJldHVybiBndGtfbGFiZWxfcGFyc2VfdWxpbmUoZ3RrLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBz
dHJpbmcpKTsKfQojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKLSAodm9p
ZCkgc2V0RG91YmxlVmFsdWU6KGRvdWJsZSkgdmFsdWUKewogICAgY2hhciBzdHJpbmdbNjRdOwoK
ICAgIHNwcmludGYoc3RyaW5nLCAiJWciLCB2YWx1ZSk7CiAgICBndGtfbGFiZWxfc2V0X3RleHQo
Z3RrLCBzdHJpbmcpOwp9CgotICh2b2lkKSBzZXRJbnRWYWx1ZTooaW50KSB2YWx1ZQp7CiAgICBj
aGFyIHN0cmluZ1s2NF07CgogICAgc3ByaW50ZihzdHJpbmcsICIlZCIsIHZhbHVlKTsKICAgIGd0
a19sYWJlbF9zZXRfdGV4dChndGssIHN0cmluZyk7Cn0KCi0gKHZvaWQpIHNldFN0cmluZ1ZhbHVl
OihOU1N0cmluZyAqKSB2YWx1ZQp7CiAgICBndGtfbGFiZWxfc2V0X3RleHQoZ3RrLCBndG9vbGtp
dF91dGY4X3N0cmluZyh2YWx1ZSkpOwp9CgotIChkb3VibGUpIGRvdWJsZVZhbHVlCnsKICAgIGNo
YXIgKnN0cmluZzsKCiAgICBndGtfbGFiZWxfZ2V0KGd0aywgJnN0cmluZyk7CiAgICByZXR1cm4g
YXRvZihzdHJpbmcpOwp9CgotIChpbnQpIGludFZhbHVlCnsKICAgIGNoYXIgKnN0cmluZzsKCiAg
ICBndGtfbGFiZWxfZ2V0KGd0aywgJnN0cmluZyk7CiAgICByZXR1cm4gYXRvaShzdHJpbmcpOwp9
CgotIChOU1N0cmluZyAqKSBzdHJpbmdWYWx1ZQp7CiAgICBjaGFyICpzdHJpbmc7CgogICAgZ3Rr
X2xhYmVsX2dldChndGssICZzdHJpbmcpOwogICAgcmV0dXJuIGd0b29sa2l0X29iamNfc3RyaW5n
KHN0cmluZyk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0
byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxt
YXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrbGF5b3V0Lmgg
YnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1
ZGUgPEdUb29sS2l0L0dUS0xheW91dC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+
CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtBZGp1c3RtZW50Lmg+CgpAaW1wbGVtZW50YXRpb24gR1RL
TGF5b3V0CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19sYXlvdXRfZ2V0X3R5
cGUoKTsKfQorIChpZCkgbGF5b3V0V2l0aEhhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGhh
ZGp1c3RtZW50IHZhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIHZhZGp1c3RtZW50CnsKICAg
IHJldHVybiBbWyhHVEtMYXlvdXQgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhIYWRqdXN0bWVudDpo
YWRqdXN0bWVudCB2YWRqdXN0bWVudDp2YWRqdXN0bWVudF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlk
KSBpbml0V2l0aEhhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGhhZGp1c3RtZW50IHZhZGp1
c3RtZW50OihHVEtBZGp1c3RtZW50ICopIHZhZGp1c3RtZW50CnsKICAgIHJldHVybiBbc2VsZiBp
bml0V2l0aEd0azpndGtfbGF5b3V0X25ldyggaGFkanVzdG1lbnQgID8gaGFkanVzdG1lbnQgLT5n
dGsgOiAwLCB2YWRqdXN0bWVudCA/IHZhZGp1c3RtZW50LT5ndGsgOiAwKV07Cn0KLSAodm9pZCkg
cHV0OihHVEtXaWRnZXQgKikgd2lkZ2V0IHg6KGdpbnQpIHggeTooZ2ludCkgeQp7CiAgICBndGtf
bGF5b3V0X3B1dChndGssIHdpZGdldCAgPyB3aWRnZXQgLT5ndGsgOiAwLCB4ICwgeSk7Cn0KLSAo
dm9pZCkgbW92ZTooR1RLV2lkZ2V0ICopIHdpZGdldCB4OihnaW50KSB4IHk6KGdpbnQpIHkKewog
ICAgZ3RrX2xheW91dF9tb3ZlKGd0aywgd2lkZ2V0ICA/IHdpZGdldCAtPmd0ayA6IDAsIHggLCB5
KTsKfQotICh2b2lkKSBzZXRTaXplOihndWludCkgd2lkdGggaGVpZ2h0OihndWludCkgaGVpZ2h0
CnsKICAgIGd0a19sYXlvdXRfc2V0X3NpemUoZ3RrLCB3aWR0aCAsIGhlaWdodCk7Cn0KLSAoR1RL
QWRqdXN0bWVudCopIGdldEhhZGp1c3RtZW50CnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3Qo
Z3RrX2xheW91dF9nZXRfaGFkanVzdG1lbnQoZ3RrKSwgMCk7Cn0KLSAoR1RLQWRqdXN0bWVudCop
IGdldFZhZGp1c3RtZW50CnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX2xheW91dF9n
ZXRfdmFkanVzdG1lbnQoZ3RrKSwgMCk7Cn0KLSAodm9pZCkgc2V0SGFkanVzdG1lbnQ6KEdUS0Fk
anVzdG1lbnQgKikgYWRqdXN0bWVudAp7CiAgICBndGtfbGF5b3V0X3NldF9oYWRqdXN0bWVudChn
dGssIGFkanVzdG1lbnQgPyBhZGp1c3RtZW50LT5ndGsgOiAwKTsKfQotICh2b2lkKSBzZXRWYWRq
dXN0bWVudDooR1RLQWRqdXN0bWVudCAqKSBhZGp1c3RtZW50CnsKICAgIGd0a19sYXlvdXRfc2V0
X3ZhZGp1c3RtZW50KGd0aywgYWRqdXN0bWVudCA/IGFkanVzdG1lbnQtPmd0ayA6IDApOwp9Ci0g
KHZvaWQpIGZyZWV6ZQp7CiAgICBndGtfbGF5b3V0X2ZyZWV6ZShndGspOwp9Ci0gKHZvaWQpIHRo
YXcKewogICAgZ3RrX2xheW91dF90aGF3KGd0ayk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9i
amVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykg
MTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNh
bGx5IGZyb20gZ3RrbGlzdC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2
ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtMaXN0Lmg+CiNpbmNsdWRlIDxHVG9v
bEtpdC9HVEtXaWRnZXQuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtMaXN0CisgKEd0a1R5cGUpIGdl
dFR5cGUKewogICAgcmV0dXJuIGd0a19saXN0X2dldF90eXBlKCk7Cn0KKyAoaWQpIGxpc3QKewog
ICAgcmV0dXJuIFtbKEdUS0xpc3QgKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9
Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfbGlzdF9uZXco
KV07Cn0KLSAodm9pZCkgaW5zZXJ0SXRlbXM6KE5TQXJyYXkgKikgaXRlbXMgcG9zaXRpb246KGdp
bnQpIHBvc2l0aW9uCnsKICAgIGd0a19saXN0X2luc2VydF9pdGVtcyhndGssZ3Rvb2xraXRfYXJy
YXlfdG9fbGlzdCggaXRlbXMgKSwgcG9zaXRpb24pOwp9Ci0gKHZvaWQpIGFwcGVuZEl0ZW1zOihO
U0FycmF5ICopIGl0ZW1zCnsKICAgIGd0a19saXN0X2FwcGVuZF9pdGVtcyhndGssZ3Rvb2xraXRf
YXJyYXlfdG9fbGlzdCggaXRlbXMpKTsKfQotICh2b2lkKSBwcmVwZW5kSXRlbXM6KE5TQXJyYXkg
KikgaXRlbXMKewogICAgZ3RrX2xpc3RfcHJlcGVuZF9pdGVtcyhndGssZ3Rvb2xraXRfYXJyYXlf
dG9fbGlzdCggaXRlbXMpKTsKfQotICh2b2lkKSByZW1vdmVJdGVtczooTlNBcnJheSAqKSBpdGVt
cwp7CiAgICBndGtfbGlzdF9yZW1vdmVfaXRlbXMoZ3RrLGd0b29sa2l0X2FycmF5X3RvX2xpc3Qo
IGl0ZW1zKSk7Cn0KLSAodm9pZCkgcmVtb3ZlSXRlbXNOb1VucmVmOihOU0FycmF5ICopIGl0ZW1z
CnsKICAgIGd0a19saXN0X3JlbW92ZV9pdGVtc19ub191bnJlZihndGssZ3Rvb2xraXRfYXJyYXlf
dG9fbGlzdCggaXRlbXMpKTsKfQotICh2b2lkKSBjbGVhckl0ZW1zOihnaW50KSBzdGFydCBlbmQ6
KGdpbnQpIGVuZAp7CiAgICBndGtfbGlzdF9jbGVhcl9pdGVtcyhndGssIHN0YXJ0ICwgZW5kKTsK
fQotICh2b2lkKSBzZWxlY3RJdGVtOihnaW50KSBpdGVtCnsKICAgIGd0a19saXN0X3NlbGVjdF9p
dGVtKGd0aywgaXRlbSk7Cn0KLSAodm9pZCkgdW5zZWxlY3RJdGVtOihnaW50KSBpdGVtCnsKICAg
IGd0a19saXN0X3Vuc2VsZWN0X2l0ZW0oZ3RrLCBpdGVtKTsKfQotICh2b2lkKSBzZWxlY3RDaGls
ZDooR1RLV2lkZ2V0ICopIGNoaWxkCnsKICAgIGd0a19saXN0X3NlbGVjdF9jaGlsZChndGssIGNo
aWxkID8gY2hpbGQtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHVuc2VsZWN0Q2hpbGQ6KEdUS1dpZGdl
dCAqKSBjaGlsZAp7CiAgICBndGtfbGlzdF91bnNlbGVjdF9jaGlsZChndGssIGNoaWxkID8gY2hp
bGQtPmd0ayA6IDApOwp9Ci0gKGdpbnQpIGNoaWxkUG9zaXRpb246KEdUS1dpZGdldCAqKSBjaGls
ZAp7CiAgICByZXR1cm4gZ3RrX2xpc3RfY2hpbGRfcG9zaXRpb24oZ3RrLCBjaGlsZCA/IGNoaWxk
LT5ndGsgOiAwKTsKfQotICh2b2lkKSBzZXRTZWxlY3Rpb25Nb2RlOihHdGtTZWxlY3Rpb25Nb2Rl
KSBtb2RlCnsKICAgIGd0a19saXN0X3NldF9zZWxlY3Rpb25fbW9kZShndGssIG1vZGUpOwp9Ci0g
KHZvaWQpIGV4dGVuZFNlbGVjdGlvbjooR3RrU2Nyb2xsVHlwZSkgc2Nyb2xsX3R5cGUgcG9zaXRp
b246KGdmbG9hdCkgcG9zaXRpb24gYXV0b1N0YXJ0U2VsZWN0aW9uOihnYm9vbGVhbikgYXV0b19z
dGFydF9zZWxlY3Rpb24KewogICAgZ3RrX2xpc3RfZXh0ZW5kX3NlbGVjdGlvbihndGssIHNjcm9s
bF90eXBlICwgcG9zaXRpb24gLCBhdXRvX3N0YXJ0X3NlbGVjdGlvbik7Cn0KLSAodm9pZCkgc3Rh
cnRTZWxlY3Rpb24KewogICAgZ3RrX2xpc3Rfc3RhcnRfc2VsZWN0aW9uKGd0ayk7Cn0KLSAodm9p
ZCkgZW5kU2VsZWN0aW9uCnsKICAgIGd0a19saXN0X2VuZF9zZWxlY3Rpb24oZ3RrKTsKfQotICh2
b2lkKSBzZWxlY3RBbGwKewogICAgZ3RrX2xpc3Rfc2VsZWN0X2FsbChndGspOwp9Ci0gKHZvaWQp
IHVuc2VsZWN0QWxsCnsKICAgIGd0a19saXN0X3Vuc2VsZWN0X2FsbChndGspOwp9Ci0gKHZvaWQp
IHNjcm9sbEhvcml6b250YWw6KEd0a1Njcm9sbFR5cGUpIHNjcm9sbF90eXBlIHBvc2l0aW9uOihn
ZmxvYXQpIHBvc2l0aW9uCnsKICAgIGd0a19saXN0X3Njcm9sbF9ob3Jpem9udGFsKGd0aywgc2Ny
b2xsX3R5cGUgLCBwb3NpdGlvbik7Cn0KLSAodm9pZCkgc2Nyb2xsVmVydGljYWw6KEd0a1Njcm9s
bFR5cGUpIHNjcm9sbF90eXBlIHBvc2l0aW9uOihnZmxvYXQpIHBvc2l0aW9uCnsKICAgIGd0a19s
aXN0X3Njcm9sbF92ZXJ0aWNhbChndGssIHNjcm9sbF90eXBlICwgcG9zaXRpb24pOwp9Ci0gKHZv
aWQpIHRvZ2dsZUFkZE1vZGUKewogICAgZ3RrX2xpc3RfdG9nZ2xlX2FkZF9tb2RlKGd0ayk7Cn0K
LSAodm9pZCkgdG9nZ2xlRm9jdXNSb3cKewogICAgZ3RrX2xpc3RfdG9nZ2xlX2ZvY3VzX3Jvdyhn
dGspOwp9Ci0gKHZvaWQpIHRvZ2dsZVJvdzooR1RLV2lkZ2V0ICopIGl0ZW0KewogICAgZ3RrX2xp
c3RfdG9nZ2xlX3JvdyhndGssIGl0ZW0gPyBpdGVtLT5ndGsgOiAwKTsKfQotICh2b2lkKSB1bmRv
U2VsZWN0aW9uCnsKICAgIGd0a19saXN0X3VuZG9fc2VsZWN0aW9uKGd0ayk7Cn0KLSAodm9pZCkg
ZW5kRHJhZ1NlbGVjdGlvbgp7CiAgICBndGtfbGlzdF9lbmRfZHJhZ19zZWxlY3Rpb24oZ3RrKTsK
fQojZGVmaW5lIGd0awkoKEd0a0xpc3QgKikgZ3RrKQotIChOU0FycmF5ICopIHNlbGVjdGlvbgp7
CiAgICByZXR1cm4gZ3Rvb2xraXRfbGlzdF90b19hcnJheShndGstPnNlbGVjdGlvbik7Cn0KI3Vu
ZGVmIGd0awpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRo
ZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBM
dWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtsaXN0aXRlbS5oIGJ5
IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRl
IDxHVG9vbEtpdC9HVEtMaXN0SXRlbS5oPgoKQGltcGxlbWVudGF0aW9uIEdUS0xpc3RJdGVtCisg
KEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19saXN0X2l0ZW1fZ2V0X3R5cGUoKTsK
fQorIChpZCkgbGlzdEl0ZW0KewogICAgcmV0dXJuIFtbKEdUS0xpc3RJdGVtICopW3NlbGYgYWxs
b2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYg
aW5pdFdpdGhHdGs6Z3RrX2xpc3RfaXRlbV9uZXcoKV07Cn0KKyAoaWQpIGxpc3RJdGVtV2l0aExh
YmVsOihOU1N0cmluZyAqKSBsYWJlbAp7CiAgICByZXR1cm4gW1soR1RLTGlzdEl0ZW0gKilbc2Vs
ZiBhbGxvY10gaW5pdFdpdGhMYWJlbDpsYWJlbF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0
V2l0aExhYmVsOihOU1N0cmluZyAqKSBsYWJlbAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhH
dGs6Z3RrX2xpc3RfaXRlbV9uZXdfd2l0aF9sYWJlbChndG9vbGtpdF91dGY4X3N0cmluZyggbGFi
ZWwpKV07Cn0KLSAodm9pZCkgc2VsZWN0CnsKICAgIGd0a19saXN0X2l0ZW1fc2VsZWN0KGd0ayk7
Cn0KLSAodm9pZCkgZGVzZWxlY3QKewogICAgZ3RrX2xpc3RfaXRlbV9kZXNlbGVjdChndGspOwp9
CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAg
VG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwog
KgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a21haW4uaCBieSBndGtnZW4uCiAq
CiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChh
dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQv
R1RLTWFpbi5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+CiNpbmNsdWRlIDxHVG9v
bEtpdC9HVEtPYmplY3QuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1N0eWxlLmg+CgpAaW1wbGVt
ZW50YXRpb24gR1RLTWFpbgotIChOU1N0cmluZyAqKSBjaGVja1ZlcnNpb246KGd1aW50KSByZXF1
aXJlZF9tYWpvciByZXF1aXJlZE1pbm9yOihndWludCkgcmVxdWlyZWRfbWlub3IgcmVxdWlyZWRN
aWNybzooZ3VpbnQpIHJlcXVpcmVkX21pY3JvCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmpjX3N0
cmluZyhndGtfY2hlY2tfdmVyc2lvbiggcmVxdWlyZWRfbWFqb3IgLCByZXF1aXJlZF9taW5vciAs
IHJlcXVpcmVkX21pY3JvKSk7Cn0KLSAodm9pZCkgZXhpdDooZ2ludCkgZXJyb3JfY29kZQp7CiAg
ICBndGtfZXhpdCggZXJyb3JfY29kZSk7Cn0KLSAoTlNTdHJpbmcgKikgc2V0TG9jYWxlCnsKICAg
IHJldHVybiBndG9vbGtpdF9vYmpjX3N0cmluZyhndGtfc2V0X2xvY2FsZSgpKTsKfQotIChnaW50
KSBldmVudHNQZW5kaW5nCnsKICAgIHJldHVybiBndGtfZXZlbnRzX3BlbmRpbmcoKTsKfQotICh2
b2lkKSBtYWluRG9FdmVudDooR2RrRXZlbnQgKikgZXZlbnQKewogICAgZ3RrX21haW5fZG9fZXZl
bnQoIGV2ZW50KTsKfQotICh2b2lkKSBtYWluCnsKICAgIGd0a19tYWluKCk7Cn0KLSAoZ3VpbnQp
IG1haW5MZXZlbAp7CiAgICByZXR1cm4gZ3RrX21haW5fbGV2ZWwoKTsKfQotICh2b2lkKSBtYWlu
UXVpdAp7CiAgICBndGtfbWFpbl9xdWl0KCk7Cn0KLSAoZ2ludCkgbWFpbkl0ZXJhdGlvbgp7CiAg
ICByZXR1cm4gZ3RrX21haW5faXRlcmF0aW9uKCk7Cn0KLSAoZ2ludCkgbWFpbkl0ZXJhdGlvbkRv
OihnYm9vbGVhbikgYmxvY2tpbmcKewogICAgcmV0dXJuIGd0a19tYWluX2l0ZXJhdGlvbl9kbygg
YmxvY2tpbmcpOwp9Ci0gKGdpbnQpIHRydWUKewogICAgcmV0dXJuIGd0a190cnVlKCk7Cn0KLSAo
Z2ludCkgZmFsc2UKewogICAgcmV0dXJuIGd0a19mYWxzZSgpOwp9Ci0gKHZvaWQpIGdyYWJBZGQ6
KEdUS1dpZGdldCAqKSB3aWRnZXQKewogICAgZ3RrX2dyYWJfYWRkKCB3aWRnZXQgPyB3aWRnZXQt
Pmd0ayA6IDApOwp9Ci0gKEdUS1dpZGdldCopIGdyYWJHZXRDdXJyZW50CnsKICAgIHJldHVybiBn
dG9vbGtpdF9vYmplY3QoZ3RrX2dyYWJfZ2V0X2N1cnJlbnQoKSwgMCk7Cn0KLSAodm9pZCkgZ3Jh
YlJlbW92ZTooR1RLV2lkZ2V0ICopIHdpZGdldAp7CiAgICBndGtfZ3JhYl9yZW1vdmUoIHdpZGdl
dCA/IHdpZGdldC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgaW5pdEFkZDooR3RrRnVuY3Rpb24pIGZ1
bmN0aW9uIGRhdGE6KGdwb2ludGVyKSBkYXRhCnsKICAgIGd0a19pbml0X2FkZCggZnVuY3Rpb24g
LCBkYXRhKTsKfQotICh2b2lkKSBxdWl0QWRkRGVzdHJveTooZ3VpbnQpIG1haW5fbGV2ZWwgb2Jq
ZWN0OihHVEtPYmplY3QgKikgb2JqZWN0CnsKICAgIGd0a19xdWl0X2FkZF9kZXN0cm95KCBtYWlu
X2xldmVsICwgb2JqZWN0ID8gb2JqZWN0LT5ndGsgOiAwKTsKfQotIChndWludCkgcXVpdEFkZDoo
Z3VpbnQpIG1haW5fbGV2ZWwgZnVuY3Rpb246KEd0a0Z1bmN0aW9uKSBmdW5jdGlvbiBkYXRhOihn
cG9pbnRlcikgZGF0YQp7CiAgICByZXR1cm4gZ3RrX3F1aXRfYWRkKCBtYWluX2xldmVsICwgZnVu
Y3Rpb24gLCBkYXRhKTsKfQotIChndWludCkgcXVpdEFkZEZ1bGw6KGd1aW50KSBtYWluX2xldmVs
IGZ1bmN0aW9uOihHdGtGdW5jdGlvbikgZnVuY3Rpb24gbWFyc2hhbDooR3RrQ2FsbGJhY2tNYXJz
aGFsKSBtYXJzaGFsIGRhdGE6KGdwb2ludGVyKSBkYXRhIGRlc3Ryb3k6KEd0a0Rlc3Ryb3lOb3Rp
ZnkpIGRlc3Ryb3kKewogICAgcmV0dXJuIGd0a19xdWl0X2FkZF9mdWxsKCBtYWluX2xldmVsICwg
ZnVuY3Rpb24gLCBtYXJzaGFsICwgZGF0YSAsIGRlc3Ryb3kpOwp9Ci0gKHZvaWQpIHF1aXRSZW1v
dmU6KGd1aW50KSBxdWl0X2hhbmRsZXJfaWQKewogICAgZ3RrX3F1aXRfcmVtb3ZlKCBxdWl0X2hh
bmRsZXJfaWQpOwp9Ci0gKHZvaWQpIHF1aXRSZW1vdmVCeURhdGE6KGdwb2ludGVyKSBkYXRhCnsK
ICAgIGd0a19xdWl0X3JlbW92ZV9ieV9kYXRhKCBkYXRhKTsKfQotIChndWludCkgdGltZW91dEFk
ZDooZ3VpbnQzMikgaW50ZXJ2YWwgZnVuY3Rpb246KEd0a0Z1bmN0aW9uKSBmdW5jdGlvbiBkYXRh
OihncG9pbnRlcikgZGF0YQp7CiAgICByZXR1cm4gZ3RrX3RpbWVvdXRfYWRkKCBpbnRlcnZhbCAs
IGZ1bmN0aW9uICwgZGF0YSk7Cn0KLSAoZ3VpbnQpIHRpbWVvdXRBZGRGdWxsOihndWludDMyKSBp
bnRlcnZhbCBmdW5jdGlvbjooR3RrRnVuY3Rpb24pIGZ1bmN0aW9uIG1hcnNoYWw6KEd0a0NhbGxi
YWNrTWFyc2hhbCkgbWFyc2hhbCBkYXRhOihncG9pbnRlcikgZGF0YSBkZXN0cm95OihHdGtEZXN0
cm95Tm90aWZ5KSBkZXN0cm95CnsKICAgIHJldHVybiBndGtfdGltZW91dF9hZGRfZnVsbCggaW50
ZXJ2YWwgLCBmdW5jdGlvbiAsIG1hcnNoYWwgLCBkYXRhICwgZGVzdHJveSk7Cn0KLSAodm9pZCkg
dGltZW91dFJlbW92ZTooZ3VpbnQpIHRpbWVvdXRfaGFuZGxlcl9pZAp7CiAgICBndGtfdGltZW91
dF9yZW1vdmUoIHRpbWVvdXRfaGFuZGxlcl9pZCk7Cn0KLSAoZ3VpbnQpIGlkbGVBZGQ6KEd0a0Z1
bmN0aW9uKSBmdW5jdGlvbiBkYXRhOihncG9pbnRlcikgZGF0YQp7CiAgICByZXR1cm4gZ3RrX2lk
bGVfYWRkKCBmdW5jdGlvbiAsIGRhdGEpOwp9Ci0gKGd1aW50KSBpZGxlQWRkUHJpb3JpdHk6KGdp
bnQpIHByaW9yaXR5IGZ1bmN0aW9uOihHdGtGdW5jdGlvbikgZnVuY3Rpb24gZGF0YTooZ3BvaW50
ZXIpIGRhdGEKewogICAgcmV0dXJuIGd0a19pZGxlX2FkZF9wcmlvcml0eSggcHJpb3JpdHkgLCBm
dW5jdGlvbiAsIGRhdGEpOwp9Ci0gKGd1aW50KSBpZGxlQWRkRnVsbDooZ2ludCkgcHJpb3JpdHkg
ZnVuY3Rpb246KEd0a0Z1bmN0aW9uKSBmdW5jdGlvbiBtYXJzaGFsOihHdGtDYWxsYmFja01hcnNo
YWwpIG1hcnNoYWwgZGF0YTooZ3BvaW50ZXIpIGRhdGEgZGVzdHJveTooR3RrRGVzdHJveU5vdGlm
eSkgZGVzdHJveQp7CiAgICByZXR1cm4gZ3RrX2lkbGVfYWRkX2Z1bGwoIHByaW9yaXR5ICwgZnVu
Y3Rpb24gLCBtYXJzaGFsICwgZGF0YSAsIGRlc3Ryb3kpOwp9Ci0gKHZvaWQpIGlkbGVSZW1vdmU6
KGd1aW50KSBpZGxlX2hhbmRsZXJfaWQKewogICAgZ3RrX2lkbGVfcmVtb3ZlKCBpZGxlX2hhbmRs
ZXJfaWQpOwp9Ci0gKHZvaWQpIGlkbGVSZW1vdmVCeURhdGE6KGdwb2ludGVyKSBkYXRhCnsKICAg
IGd0a19pZGxlX3JlbW92ZV9ieV9kYXRhKCBkYXRhKTsKfQotIChndWludCkgaW5wdXRBZGRGdWxs
OihnaW50KSBzb3VyY2UgY29uZGl0aW9uOihHZGtJbnB1dENvbmRpdGlvbikgY29uZGl0aW9uIGZ1
bmN0aW9uOihHZGtJbnB1dEZ1bmN0aW9uKSBmdW5jdGlvbiBtYXJzaGFsOihHdGtDYWxsYmFja01h
cnNoYWwpIG1hcnNoYWwgZGF0YTooZ3BvaW50ZXIpIGRhdGEgZGVzdHJveTooR3RrRGVzdHJveU5v
dGlmeSkgZGVzdHJveQp7CiAgICByZXR1cm4gZ3RrX2lucHV0X2FkZF9mdWxsKCBzb3VyY2UgLCBj
b25kaXRpb24gLCBmdW5jdGlvbiAsIG1hcnNoYWwgLCBkYXRhICwgZGVzdHJveSk7Cn0KLSAodm9p
ZCkgaW5wdXRSZW1vdmU6KGd1aW50KSBpbnB1dF9oYW5kbGVyX2lkCnsKICAgIGd0a19pbnB1dF9y
ZW1vdmUoIGlucHV0X2hhbmRsZXJfaWQpOwp9Ci0gKGd1aW50KSBrZXlTbm9vcGVySW5zdGFsbDoo
R3RrS2V5U25vb3BGdW5jKSBzbm9vcGVyIGZ1bmNEYXRhOihncG9pbnRlcikgZnVuY19kYXRhCnsK
ICAgIHJldHVybiBndGtfa2V5X3Nub29wZXJfaW5zdGFsbCggc25vb3BlciAsIGZ1bmNfZGF0YSk7
Cn0KLSAodm9pZCkga2V5U25vb3BlclJlbW92ZTooZ3VpbnQpIHNub29wZXJfaGFuZGxlcl9pZAp7
CiAgICBndGtfa2V5X3Nub29wZXJfcmVtb3ZlKCBzbm9vcGVyX2hhbmRsZXJfaWQpOwp9Ci0gKEdk
a0V2ZW50KikgZ2V0Q3VycmVudEV2ZW50CnsKICAgIHJldHVybiBndGtfZ2V0X2N1cnJlbnRfZXZl
bnQoKTsKfQotIChHVEtXaWRnZXQqKSBnZXRFdmVudFdpZGdldDooR2RrRXZlbnQgKikgZXZlbnQK
ewogICAgcmV0dXJuIGd0b29sa2l0X29iamVjdChndGtfZ2V0X2V2ZW50X3dpZGdldCggZXZlbnQp
LCAwKTsKfQotICh2b2lkKSByY0luaXQKewogICAgZ3RrX3JjX2luaXQoKTsKfQotICh2b2lkKSBy
Y0FkZERlZmF1bHRGaWxlOihOU1N0cmluZyAqKSBmaWxlbmFtZQp7CiAgICBndGtfcmNfYWRkX2Rl
ZmF1bHRfZmlsZShndG9vbGtpdF91dGY4X3N0cmluZyggZmlsZW5hbWUpKTsKfQotICh2b2lkKSBy
Y1NldERlZmF1bHRGaWxlczooTlNBcnJheSAgKikgZmlsZW5hbWVzCnsKICAgIGd0a19yY19zZXRf
ZGVmYXVsdF9maWxlcygoY2hhciAqKilndG9vbGtpdF9hcnJheV90b19zdHJ2ZWMoIGZpbGVuYW1l
cykpOwp9Ci0gKE5TQXJyYXkgICopIHJjR2V0RGVmYXVsdEZpbGVzCnsKICAgIHJldHVybiBndG9v
bGtpdF9zdHJ2ZWNfdG9fYXJyYXkoKGNvbnN0IGNoYXIgKiopZ3RrX3JjX2dldF9kZWZhdWx0X2Zp
bGVzKCkpOwp9Ci0gKHZvaWQpIHJjUGFyc2U6KE5TU3RyaW5nICopIGZpbGVuYW1lCnsKICAgIGd0
a19yY19wYXJzZShndG9vbGtpdF91dGY4X3N0cmluZyggZmlsZW5hbWUpKTsKfQotICh2b2lkKSBy
Y1BhcnNlU3RyaW5nOihOU1N0cmluZyAqKSByY19zdHJpbmcKewogICAgZ3RrX3JjX3BhcnNlX3N0
cmluZyhndG9vbGtpdF91dGY4X3N0cmluZyggcmNfc3RyaW5nKSk7Cn0KLSAoZ2Jvb2xlYW4pIHJj
UmVwYXJzZUFsbAp7CiAgICByZXR1cm4gZ3RrX3JjX3JlcGFyc2VfYWxsKCk7Cn0KLSAoR1RLU3R5
bGUqKSByY0dldFN0eWxlOihHVEtXaWRnZXQgKikgd2lkZ2V0CnsKICAgIHJldHVybiBndG9vbGtp
dF9vYmplY3QoZ3RrX3JjX2dldF9zdHlsZSggd2lkZ2V0ID8gd2lkZ2V0LT5ndGsgOiAwKSwgIkdU
S1N0eWxlIik7Cn0KLSAodm9pZCkgcmNBZGRXaWRnZXROYW1lU3R5bGU6KEd0a1JjU3R5bGUgKikg
cmNfc3R5bGUgcGF0dGVybjooTlNTdHJpbmcgKikgcGF0dGVybgp7CiAgICBndGtfcmNfYWRkX3dp
ZGdldF9uYW1lX3N0eWxlKCByY19zdHlsZSAsZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHBhdHRlcm4p
KTsKfQotICh2b2lkKSByY0FkZFdpZGdldENsYXNzU3R5bGU6KEd0a1JjU3R5bGUgKikgcmNfc3R5
bGUgcGF0dGVybjooTlNTdHJpbmcgKikgcGF0dGVybgp7CiAgICBndGtfcmNfYWRkX3dpZGdldF9j
bGFzc19zdHlsZSggcmNfc3R5bGUgLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBwYXR0ZXJuKSk7Cn0K
LSAodm9pZCkgcmNBZGRDbGFzc1N0eWxlOihHdGtSY1N0eWxlICopIHJjX3N0eWxlIHBhdHRlcm46
KE5TU3RyaW5nICopIHBhdHRlcm4KewogICAgZ3RrX3JjX2FkZF9jbGFzc19zdHlsZSggcmNfc3R5
bGUgLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBwYXR0ZXJuKSk7Cn0KLSAoR3RrUmNTdHlsZSopIHJj
U3R5bGVOZXcKewogICAgcmV0dXJuIGd0a19yY19zdHlsZV9uZXcoKTsKfQotICh2b2lkKSByY1N0
eWxlUmVmOihHdGtSY1N0eWxlICopIHJjX3N0eWxlCnsKICAgIGd0a19yY19zdHlsZV9yZWYoIHJj
X3N0eWxlKTsKfQotICh2b2lkKSByY1N0eWxlVW5yZWY6KEd0a1JjU3R5bGUgKikgcmNfc3R5bGUK
ewogICAgZ3RrX3JjX3N0eWxlX3VucmVmKCByY19zdHlsZSk7Cn0KLSAodm9pZCkgcmNTZXRJbWFn
ZUxvYWRlcjooR3RrSW1hZ2VMb2FkZXIpIGxvYWRlcgp7CiAgICBndGtfcmNfc2V0X2ltYWdlX2xv
YWRlciggbG9hZGVyKTsKfQotIChHZGtQaXhtYXAqKSByY0xvYWRJbWFnZTooR2RrQ29sb3JtYXAg
KikgY29sb3JtYXAgdHJhbnNwYXJlbnRDb2xvcjooR2RrQ29sb3IgKikgdHJhbnNwYXJlbnRfY29s
b3IgZmlsZW5hbWU6KE5TU3RyaW5nICopIGZpbGVuYW1lCnsKICAgIHJldHVybiBndGtfcmNfbG9h
ZF9pbWFnZSggY29sb3JtYXAgLCB0cmFuc3BhcmVudF9jb2xvciAsZ3Rvb2xraXRfdXRmOF9zdHJp
bmcoIGZpbGVuYW1lKSk7Cn0KLSAoTlNTdHJpbmcgKikgcmNGaW5kUGl4bWFwSW5QYXRoOihHU2Nh
bm5lciAqKSBzY2FubmVyIHBpeG1hcEZpbGU6KE5TU3RyaW5nICopIHBpeG1hcF9maWxlCnsKICAg
IHJldHVybiBndG9vbGtpdF9vYmpjX3N0cmluZyhndGtfcmNfZmluZF9waXhtYXBfaW5fcGF0aCgg
c2Nhbm5lciAsZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHBpeG1hcF9maWxlKSkpOwp9Ci0gKE5TU3Ry
aW5nICopIHJjRmluZE1vZHVsZUluUGF0aDooTlNTdHJpbmcgKikgbW9kdWxlX2ZpbGUKewogICAg
cmV0dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0a19yY19maW5kX21vZHVsZV9pbl9wYXRoKGd0
b29sa2l0X3V0Zjhfc3RyaW5nKCBtb2R1bGVfZmlsZSkpKTsKfQotIChOU1N0cmluZyAqKSByY0dl
dFRoZW1lRGlyCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmpjX3N0cmluZyhndGtfcmNfZ2V0X3Ro
ZW1lX2RpcigpKTsKfQotIChOU1N0cmluZyAqKSByY0dldE1vZHVsZURpcgp7CiAgICByZXR1cm4g
Z3Rvb2xraXRfb2JqY19zdHJpbmcoZ3RrX3JjX2dldF9tb2R1bGVfZGlyKCkpOwp9Ci0gKGd1aW50
KSByY1BhcnNlOihHU2Nhbm5lciAqKSBzY2FubmVyIGNvbG9yOihHZGtDb2xvciAqKSBjb2xvcgp7
CiAgICByZXR1cm4gZ3RrX3JjX3BhcnNlX2NvbG9yKCBzY2FubmVyICwgY29sb3IpOwp9Ci0gKGd1
aW50KSByY1BhcnNlOihHU2Nhbm5lciAqKSBzY2FubmVyIHN0YXRlOihHdGtTdGF0ZVR5cGUgKikg
c3RhdGUKewogICAgcmV0dXJuIGd0a19yY19wYXJzZV9zdGF0ZSggc2Nhbm5lciAsIHN0YXRlKTsK
fQotIChndWludCkgcmNQYXJzZTooR1NjYW5uZXIgKikgc2Nhbm5lciBwcmlvcml0eTooR3RrUGF0
aFByaW9yaXR5VHlwZSAqKSBwcmlvcml0eQp7CiAgICByZXR1cm4gZ3RrX3JjX3BhcnNlX3ByaW9y
aXR5KCBzY2FubmVyICwgcHJpb3JpdHkpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3Rp
dmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgs
IDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBm
cm9tIGd0a21lbnUuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lv
biAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLTWVudS5oPgojaW5jbHVkZSA8R1Rvb2xLaXQv
R1RLV2lkZ2V0Lmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtBY2NlbEdyb3VwLmg+CgpAaW1wbGVt
ZW50YXRpb24gR1RLTWVudQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfbWVu
dV9nZXRfdHlwZSgpOwp9CisgKGlkKSBtZW51CnsKICAgIHJldHVybiBbWyhHVEtNZW51ICopW3Nl
bGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4g
W3NlbGYgaW5pdFdpdGhHdGs6Z3RrX21lbnVfbmV3KCldOwp9Ci0gKHZvaWQpIGFwcGVuZDooR1RL
V2lkZ2V0ICopIGNoaWxkCnsKICAgIGd0a19tZW51X2FwcGVuZChndGssIGNoaWxkID8gY2hpbGQt
Pmd0ayA6IDApOwp9Ci0gKHZvaWQpIHByZXBlbmQ6KEdUS1dpZGdldCAqKSBjaGlsZAp7CiAgICBn
dGtfbWVudV9wcmVwZW5kKGd0aywgY2hpbGQgPyBjaGlsZC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkg
aW5zZXJ0OihHVEtXaWRnZXQgKikgY2hpbGQgcG9zaXRpb246KGdpbnQpIHBvc2l0aW9uCnsKICAg
IGd0a19tZW51X2luc2VydChndGssIGNoaWxkICA/IGNoaWxkIC0+Z3RrIDogMCwgcG9zaXRpb24p
Owp9Ci0gKHZvaWQpIHBvcHVwOihHVEtXaWRnZXQgKikgcGFyZW50X21lbnVfc2hlbGwgcGFyZW50
TWVudUl0ZW06KEdUS1dpZGdldCAqKSBwYXJlbnRfbWVudV9pdGVtIGZ1bmM6KEd0a01lbnVQb3Np
dGlvbkZ1bmMpIGZ1bmMgZGF0YTooZ3BvaW50ZXIpIGRhdGEgYnV0dG9uOihndWludCkgYnV0dG9u
IGFjdGl2YXRlVGltZTooZ3VpbnQzMikgYWN0aXZhdGVfdGltZQp7CiAgICBndGtfbWVudV9wb3B1
cChndGssIHBhcmVudF9tZW51X3NoZWxsICA/IHBhcmVudF9tZW51X3NoZWxsIC0+Z3RrIDogMCwg
cGFyZW50X21lbnVfaXRlbSAgPyBwYXJlbnRfbWVudV9pdGVtIC0+Z3RrIDogMCwgZnVuYyAsIGRh
dGEgLCBidXR0b24gLCBhY3RpdmF0ZV90aW1lKTsKfQotICh2b2lkKSByZXBvc2l0aW9uCnsKICAg
IGd0a19tZW51X3JlcG9zaXRpb24oZ3RrKTsKfQotICh2b2lkKSBwb3Bkb3duCnsKICAgIGd0a19t
ZW51X3BvcGRvd24oZ3RrKTsKfQotIChHVEtXaWRnZXQqKSBnZXRBY3RpdmUKewogICAgcmV0dXJu
IGd0b29sa2l0X29iamVjdChndGtfbWVudV9nZXRfYWN0aXZlKGd0ayksIDApOwp9Ci0gKHZvaWQp
IHNldEFjdGl2ZTooZ3VpbnQpIGluZGV4CnsKICAgIGd0a19tZW51X3NldF9hY3RpdmUoZ3RrLCBp
bmRleCk7Cn0KLSAodm9pZCkgc2V0QWNjZWxHcm91cDooR1RLQWNjZWxHcm91cCAqKSBhY2NlbF9n
cm91cAp7CiAgICBndGtfbWVudV9zZXRfYWNjZWxfZ3JvdXAoZ3RrLCBhY2NlbF9ncm91cCA/IGFj
Y2VsX2dyb3VwLT5ndGsgOiAwKTsKfQotIChHVEtBY2NlbEdyb3VwKikgZ2V0QWNjZWxHcm91cAp7
CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19tZW51X2dldF9hY2NlbF9ncm91cChndGsp
LCAiR1RLQWNjZWxHcm91cCIpOwp9Ci0gKHZvaWQpIGF0dGFjaFRvV2lkZ2V0OihHVEtXaWRnZXQg
KikgYXR0YWNoX3dpZGdldCBkZXRhY2hlcjooR3RrTWVudURldGFjaEZ1bmMpIGRldGFjaGVyCnsK
ICAgIGd0a19tZW51X2F0dGFjaF90b193aWRnZXQoZ3RrLCBhdHRhY2hfd2lkZ2V0ICA/IGF0dGFj
aF93aWRnZXQgLT5ndGsgOiAwLCBkZXRhY2hlcik7Cn0KLSAodm9pZCkgZGV0YWNoCnsKICAgIGd0
a19tZW51X2RldGFjaChndGspOwp9Ci0gKEdUS1dpZGdldCopIGdldEF0dGFjaFdpZGdldAp7CiAg
ICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19tZW51X2dldF9hdHRhY2hfd2lkZ2V0KGd0ayks
IDApOwp9Ci0gKHZvaWQpIHNldFRlYXJvZmZTdGF0ZTooZ2Jvb2xlYW4pIHRvcm5fb2ZmCnsKICAg
IGd0a19tZW51X3NldF90ZWFyb2ZmX3N0YXRlKGd0aywgdG9ybl9vZmYpOwp9Ci0gKHZvaWQpIHNl
dFRpdGxlOihOU1N0cmluZyAqKSB0aXRsZQp7CiAgICBndGtfbWVudV9zZXRfdGl0bGUoZ3RrLGd0
b29sa2l0X3V0Zjhfc3RyaW5nKCB0aXRsZSkpOwp9Ci0gKHZvaWQpIHJlb3JkZXJDaGlsZDooR1RL
V2lkZ2V0ICopIGNoaWxkIHBvc2l0aW9uOihnaW50KSBwb3NpdGlvbgp7CiAgICBndGtfbWVudV9y
ZW9yZGVyX2NoaWxkKGd0aywgY2hpbGQgID8gY2hpbGQgLT5ndGsgOiAwLCBwb3NpdGlvbik7Cn0K
QGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBU
b29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAq
CiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrbWVudWJhci5oIGJ5IGd0a2dlbi4K
ICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2Vy
IEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtp
dC9HVEtNZW51QmFyLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtXaWRnZXQuaD4KCkBpbXBsZW1l
bnRhdGlvbiBHVEtNZW51QmFyCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19t
ZW51X2Jhcl9nZXRfdHlwZSgpOwp9CisgKGlkKSBtZW51QmFyCnsKICAgIHJldHVybiBbWyhHVEtN
ZW51QmFyICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7
CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX21lbnVfYmFyX25ldygpXTsKfQotICh2
b2lkKSBhcHBlbmQ6KEdUS1dpZGdldCAqKSBjaGlsZAp7CiAgICBndGtfbWVudV9iYXJfYXBwZW5k
KGd0aywgY2hpbGQgPyBjaGlsZC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgcHJlcGVuZDooR1RLV2lk
Z2V0ICopIGNoaWxkCnsKICAgIGd0a19tZW51X2Jhcl9wcmVwZW5kKGd0aywgY2hpbGQgPyBjaGls
ZC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgaW5zZXJ0OihHVEtXaWRnZXQgKikgY2hpbGQgcG9zaXRp
b246KGdpbnQpIHBvc2l0aW9uCnsKICAgIGd0a19tZW51X2Jhcl9pbnNlcnQoZ3RrLCBjaGlsZCAg
PyBjaGlsZCAtPmd0ayA6IDAsIHBvc2l0aW9uKTsKfQotICh2b2lkKSBzZXRTaGFkb3dUeXBlOihH
dGtTaGFkb3dUeXBlKSB0eXBlCnsKICAgIGd0a19tZW51X2Jhcl9zZXRfc2hhZG93X3R5cGUoZ3Rr
LCB0eXBlKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRv
IHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1h
ciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGttZW51ZmFjdG9y
eS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNp
bmNsdWRlIDxHVG9vbEtpdC9HVEtNZW51RmFjdG9yeS5oPgoKQGltcGxlbWVudGF0aW9uIEdUS01l
bnVGYWN0b3J5CisgKGlkKSBtZW51RmFjdG9yeVdpdGhUeXBlOihHdGtNZW51RmFjdG9yeVR5cGUp
IHR5cGUKewogICAgcmV0dXJuIFtbKEdUS01lbnVGYWN0b3J5ICopW3NlbGYgYWxsb2NdIGluaXRX
aXRoVHlwZTp0eXBlXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoVHlwZTooR3RrTWVu
dUZhY3RvcnlUeXBlKSB0eXBlCnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfbWVu
dV9mYWN0b3J5X25ldyggdHlwZSldOwp9Ci0gKHZvaWQpIGRlc3Ryb3kKewogICAgZ3RrX21lbnVf
ZmFjdG9yeV9kZXN0cm95KGd0ayk7Cn0KLSAodm9pZCkgYWRkRW50cmllczooR3RrTWVudUVudHJ5
ICopIGVudHJpZXMgbmVudHJpZXM6KGludCkgbmVudHJpZXMKewogICAgZ3RrX21lbnVfZmFjdG9y
eV9hZGRfZW50cmllcyhndGssIGVudHJpZXMgLCBuZW50cmllcyk7Cn0KLSAodm9pZCkgYWRkU3Vi
ZmFjdG9yeTooR1RLTWVudUZhY3RvcnkgKikgc3ViZmFjdG9yeSBwYXRoOihOU1N0cmluZyAqKSBw
YXRoCnsKICAgIGd0a19tZW51X2ZhY3RvcnlfYWRkX3N1YmZhY3RvcnkoZ3RrLCBzdWJmYWN0b3J5
ICA/IHN1YmZhY3RvcnkgLT5ndGsgOiAwLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBwYXRoKSk7Cn0K
LSAodm9pZCkgcmVtb3ZlUGF0aHM6KE5TQXJyYXkgICopIHBhdGhzIG5wYXRoczooaW50KSBucGF0
aHMKewogICAgZ3RrX21lbnVfZmFjdG9yeV9yZW1vdmVfcGF0aHMoZ3RrLChjaGFyICoqKWd0b29s
a2l0X2FycmF5X3RvX3N0cnZlYyggcGF0aHMgKSwgbnBhdGhzKTsKfQotICh2b2lkKSByZW1vdmVF
bnRyaWVzOihHdGtNZW51RW50cnkgKikgZW50cmllcyBuZW50cmllczooaW50KSBuZW50cmllcwp7
CiAgICBndGtfbWVudV9mYWN0b3J5X3JlbW92ZV9lbnRyaWVzKGd0aywgZW50cmllcyAsIG5lbnRy
aWVzKTsKfQotICh2b2lkKSByZW1vdmVTdWJmYWN0b3J5OihHVEtNZW51RmFjdG9yeSAqKSBzdWJm
YWN0b3J5IHBhdGg6KE5TU3RyaW5nICopIHBhdGgKewogICAgZ3RrX21lbnVfZmFjdG9yeV9yZW1v
dmVfc3ViZmFjdG9yeShndGssIHN1YmZhY3RvcnkgID8gc3ViZmFjdG9yeSAtPmd0ayA6IDAsZ3Rv
b2xraXRfdXRmOF9zdHJpbmcoIHBhdGgpKTsKfQotIChHdGtNZW51UGF0aCopIGZpbmQ6KE5TU3Ry
aW5nICopIHBhdGgKewogICAgcmV0dXJuIGd0a19tZW51X2ZhY3RvcnlfZmluZChndGssZ3Rvb2xr
aXRfdXRmOF9zdHJpbmcoIHBhdGgpKTsKfQojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPEZv
dW5kYXRpb24vTlNBdXRvcmVsZWFzZVBvb2wuaD4KCgpzdGF0aWMgdm9pZCBtZW51X2ZvcndhcmRf
c2lnbmFsIChHdGtXaWRnZXQgKndpZGdldCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQp7CiAgICBOU0F1
dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtOU0F1dG9yZWxlYXNlUG9vbCBuZXddOwogICAgaWQgdGFy
Z2V0ID0gZ3RrX29iamVjdF9nZXRfZGF0YSgoR3RrT2JqZWN0ICopIHdpZGdldCwgIl9tZW51X3Rh
cmdldCIpOwoKI2lmZGVmIERFQlVHCiAgICBmcHJpbnRmKHN0ZGVyciwgIihtZW51X2ZvcndhcmRf
c2lnbmFsIGluaXQpIGd0ayA9ICVwLCBhY3Rpb24gWyVwICVzXVxuIiwKCSAgICB3aWRnZXQsIHRh
cmdldCwgc2VsX2dldF9uYW1lKHVzZXJfZGF0YSkpOwojZW5kaWYKICAgIFt0YXJnZXQgcGVyZm9y
bVNlbGVjdG9yOnVzZXJfZGF0YSB3aXRoT2JqZWN0OkdUT09MS0lUX09CSkVDVCh3aWRnZXQpXTsK
ICAgIFtwb29sIHJlbGVhc2VdOwojaWZkZWYgREVCVUcKICAgIGZwcmludGYoc3RkZXJyLCAiKG1l
bnVfZm9yd2FyZF9zaWduYWwgZXhpdCkgZ3RrID0gJXBcbiIsIHdpZGdldCk7CiNlbmRpZgp9Cgot
ICh2b2lkKSBhZGRFbnRyaWVzOihHdGtNZW51RW50cnkgKikgZW50cmllcyBmb3JUYXJnZXQ6KGlk
KSB0YXJnZXQKewogICAgR3RrTWVudUVudHJ5ICpiYXNlID0gZW50cmllczsKICAgIGludCBpbmRl
eCwgY291bnQgPSAwOwoKICAgIHdoaWxlIChlbnRyaWVzLT5wYXRoKSArK2VudHJpZXMsICsrY291
bnQ7CiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggIT0gY291bnQ7ICsraW5kZXgpCgliYXNlW2lu
ZGV4XS5jYWxsYmFjayA9IG1lbnVfZm9yd2FyZF9zaWduYWw7CgogICAgZ3RrX21lbnVfZmFjdG9y
eV9hZGRfZW50cmllcyhndGssIGJhc2UsIGNvdW50KTsKCiAgICBmb3IgKGluZGV4ID0gMDsgaW5k
ZXggIT0gY291bnQ7ICsraW5kZXgpCglpZiAoYmFzZVtpbmRleF0ud2lkZ2V0KQoJICAgIGd0a19v
YmplY3Rfc2V0X2RhdGEoKEd0a09iamVjdCAqKSBiYXNlW2luZGV4XS53aWRnZXQsCgkJCQkiX21l
bnVfdGFyZ2V0IiwgdGFyZ2V0KTsKfQoKI2RlZmluZSBndGsJKChHdGtNZW51RmFjdG9yeSAqKSBn
dGspCi0gKEdUS0FjY2VsR3JvdXAgKikgYWNjZWxHcm91cAp7CiAgICByZXR1cm4gZ3Rvb2xraXRf
b2JqZWN0KGd0ay0+YWNjZWxfZ3JvdXAsICJHVEtBY2NlbEdyb3VwIik7Cn0KLSAoR1RLV2lkZ2V0
ICopIHdpZGdldAp7CiAgICByZXR1cm4gR1RPT0xLSVRfT0JKRUNUKGd0ay0+d2lkZ2V0KTsKfQoj
dW5kZWYgZ3RrCkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8g
dGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFy
IEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a21lbnVpdGVtLmgg
YnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1
ZGUgPEdUb29sS2l0L0dUS01lbnVJdGVtLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtXaWRnZXQu
aD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtNZW51SXRlbQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAg
IHJldHVybiBndGtfbWVudV9pdGVtX2dldF90eXBlKCk7Cn0KKyAoaWQpIG1lbnVJdGVtCnsKICAg
IHJldHVybiBbWyhHVEtNZW51SXRlbSAqKVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07
Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19tZW51X2l0
ZW1fbmV3KCldOwp9CisgKGlkKSBtZW51SXRlbVdpdGhMYWJlbDooTlNTdHJpbmcgKikgbGFiZWwK
ewogICAgcmV0dXJuIFtbKEdUS01lbnVJdGVtICopW3NlbGYgYWxsb2NdIGluaXRXaXRoTGFiZWw6
bGFiZWxdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhMYWJlbDooTlNTdHJpbmcgKikg
bGFiZWwKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19tZW51X2l0ZW1fbmV3X3dp
dGhfbGFiZWwoZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGxhYmVsKSldOwp9Ci0gKHZvaWQpIHNldFN1
Ym1lbnU6KEdUS1dpZGdldCAqKSBzdWJtZW51CnsKICAgIGd0a19tZW51X2l0ZW1fc2V0X3N1Ym1l
bnUoZ3RrLCBzdWJtZW51ID8gc3VibWVudS0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgcmVtb3ZlU3Vi
bWVudQp7CiAgICBndGtfbWVudV9pdGVtX3JlbW92ZV9zdWJtZW51KGd0ayk7Cn0KLSAodm9pZCkg
c2V0UGxhY2VtZW50OihHdGtTdWJtZW51UGxhY2VtZW50KSBwbGFjZW1lbnQKewogICAgZ3RrX21l
bnVfaXRlbV9zZXRfcGxhY2VtZW50KGd0aywgcGxhY2VtZW50KTsKfQotICh2b2lkKSBjb25maWd1
cmU6KGdpbnQpIHNob3dfdG9nZ2xlX2luZGljYXRvciBzaG93U3VibWVudUluZGljYXRvcjooZ2lu
dCkgc2hvd19zdWJtZW51X2luZGljYXRvcgp7CiAgICBndGtfbWVudV9pdGVtX2NvbmZpZ3VyZShn
dGssIHNob3dfdG9nZ2xlX2luZGljYXRvciAsIHNob3dfc3VibWVudV9pbmRpY2F0b3IpOwp9Ci0g
KHZvaWQpIHNlbGVjdAp7CiAgICBndGtfbWVudV9pdGVtX3NlbGVjdChndGspOwp9Ci0gKHZvaWQp
IGRlc2VsZWN0CnsKICAgIGd0a19tZW51X2l0ZW1fZGVzZWxlY3QoZ3RrKTsKfQotICh2b2lkKSBh
Y3RpdmF0ZQp7CiAgICBndGtfbWVudV9pdGVtX2FjdGl2YXRlKGd0ayk7Cn0KLSAodm9pZCkgcmln
aHRKdXN0aWZ5CnsKICAgIGd0a19tZW51X2l0ZW1fcmlnaHRfanVzdGlmeShndGspOwp9CiNkZWZp
bmUgZ3RrCSgoR3RrTWVudUl0ZW0gKikgZ3RrKQotIChHVEtXaWRnZXQgKikgc3VibWVudQp7CiAg
ICByZXR1cm4gR1RPT0xLSVRfT0JKRUNUKGd0ay0+c3VibWVudSk7Cn0KI3VuZGVmIGd0awpAZW5k
Ci8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xr
aXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICog
R2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGttZW51c2hlbGwuaCBieSBndGtnZW4uCiAq
CiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChh
dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQv
R1RLTWVudVNoZWxsLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtXaWRnZXQuaD4KCkBpbXBsZW1l
bnRhdGlvbiBHVEtNZW51U2hlbGwKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3Rr
X21lbnVfc2hlbGxfZ2V0X3R5cGUoKTsKfQotICh2b2lkKSBhcHBlbmQ6KEdUS1dpZGdldCAqKSBj
aGlsZAp7CiAgICBndGtfbWVudV9zaGVsbF9hcHBlbmQoZ3RrLCBjaGlsZCA/IGNoaWxkLT5ndGsg
OiAwKTsKfQotICh2b2lkKSBwcmVwZW5kOihHVEtXaWRnZXQgKikgY2hpbGQKewogICAgZ3RrX21l
bnVfc2hlbGxfcHJlcGVuZChndGssIGNoaWxkID8gY2hpbGQtPmd0ayA6IDApOwp9Ci0gKHZvaWQp
IGluc2VydDooR1RLV2lkZ2V0ICopIGNoaWxkIHBvc2l0aW9uOihnaW50KSBwb3NpdGlvbgp7CiAg
ICBndGtfbWVudV9zaGVsbF9pbnNlcnQoZ3RrLCBjaGlsZCAgPyBjaGlsZCAtPmd0ayA6IDAsIHBv
c2l0aW9uKTsKfQotICh2b2lkKSBkZWFjdGl2YXRlCnsKICAgIGd0a19tZW51X3NoZWxsX2RlYWN0
aXZhdGUoZ3RrKTsKfQotICh2b2lkKSBzZWxlY3RJdGVtOihHVEtXaWRnZXQgKikgbWVudV9pdGVt
CnsKICAgIGd0a19tZW51X3NoZWxsX3NlbGVjdF9pdGVtKGd0aywgbWVudV9pdGVtID8gbWVudV9p
dGVtLT5ndGsgOiAwKTsKfQotICh2b2lkKSBkZXNlbGVjdAp7CiAgICBndGtfbWVudV9zaGVsbF9k
ZXNlbGVjdChndGspOwp9Ci0gKHZvaWQpIGFjdGl2YXRlSXRlbTooR1RLV2lkZ2V0ICopIG1lbnVf
aXRlbSBmb3JjZURlYWN0aXZhdGU6KGdib29sZWFuKSBmb3JjZV9kZWFjdGl2YXRlCnsKICAgIGd0
a19tZW51X3NoZWxsX2FjdGl2YXRlX2l0ZW0oZ3RrLCBtZW51X2l0ZW0gID8gbWVudV9pdGVtIC0+
Z3RrIDogMCwgZm9yY2VfZGVhY3RpdmF0ZSk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVj
dGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5
OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5
IGZyb20gZ3RrbWlzYy5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJz
aW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtNaXNjLmg+CgpAaW1wbGVtZW50YXRpb24g
R1RLTWlzYworIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfbWlzY19nZXRfdHlw
ZSgpOwp9Ci0gKHZvaWQpIHNldEFsaWdubWVudDooZ2Zsb2F0KSB4YWxpZ24geWFsaWduOihnZmxv
YXQpIHlhbGlnbgp7CiAgICBndGtfbWlzY19zZXRfYWxpZ25tZW50KGd0aywgeGFsaWduICwgeWFs
aWduKTsKfQotICh2b2lkKSBzZXRQYWRkaW5nOihnaW50KSB4cGFkIHlwYWQ6KGdpbnQpIHlwYWQK
ewogICAgZ3RrX21pc2Nfc2V0X3BhZGRpbmcoZ3RrLCB4cGFkICwgeXBhZCk7Cn0KQGVuZAovKgog
KiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAq
IENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVy
YXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3Rrbm90ZWJvb2suaCBieSBndGtnZW4uCiAqCiAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFs
IFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLTm90
ZWJvb2suaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1dpZGdldC5oPgoKQGltcGxlbWVudGF0aW9u
IEdUS05vdGVib29rCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19ub3RlYm9v
a19nZXRfdHlwZSgpOwp9CisgKGlkKSBub3RlYm9vawp7CiAgICByZXR1cm4gW1soR1RLTm90ZWJv
b2sgKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAg
IHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfbm90ZWJvb2tfbmV3KCldOwp9Ci0gKHZvaWQp
IGFwcGVuZFBhZ2U6KEdUS1dpZGdldCAqKSBjaGlsZCB0YWJMYWJlbDooR1RLV2lkZ2V0ICopIHRh
Yl9sYWJlbAp7CiAgICBndGtfbm90ZWJvb2tfYXBwZW5kX3BhZ2UoZ3RrLCBjaGlsZCAgPyBjaGls
ZCAtPmd0ayA6IDAsIHRhYl9sYWJlbCA/IHRhYl9sYWJlbC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkg
YXBwZW5kUGFnZU1lbnU6KEdUS1dpZGdldCAqKSBjaGlsZCB0YWJMYWJlbDooR1RLV2lkZ2V0ICop
IHRhYl9sYWJlbCBtZW51TGFiZWw6KEdUS1dpZGdldCAqKSBtZW51X2xhYmVsCnsKICAgIGd0a19u
b3RlYm9va19hcHBlbmRfcGFnZV9tZW51KGd0aywgY2hpbGQgID8gY2hpbGQgLT5ndGsgOiAwLCB0
YWJfbGFiZWwgID8gdGFiX2xhYmVsIC0+Z3RrIDogMCwgbWVudV9sYWJlbCA/IG1lbnVfbGFiZWwt
Pmd0ayA6IDApOwp9Ci0gKHZvaWQpIHByZXBlbmRQYWdlOihHVEtXaWRnZXQgKikgY2hpbGQgdGFi
TGFiZWw6KEdUS1dpZGdldCAqKSB0YWJfbGFiZWwKewogICAgZ3RrX25vdGVib29rX3ByZXBlbmRf
cGFnZShndGssIGNoaWxkICA/IGNoaWxkIC0+Z3RrIDogMCwgdGFiX2xhYmVsID8gdGFiX2xhYmVs
LT5ndGsgOiAwKTsKfQotICh2b2lkKSBwcmVwZW5kUGFnZU1lbnU6KEdUS1dpZGdldCAqKSBjaGls
ZCB0YWJMYWJlbDooR1RLV2lkZ2V0ICopIHRhYl9sYWJlbCBtZW51TGFiZWw6KEdUS1dpZGdldCAq
KSBtZW51X2xhYmVsCnsKICAgIGd0a19ub3RlYm9va19wcmVwZW5kX3BhZ2VfbWVudShndGssIGNo
aWxkICA/IGNoaWxkIC0+Z3RrIDogMCwgdGFiX2xhYmVsICA/IHRhYl9sYWJlbCAtPmd0ayA6IDAs
IG1lbnVfbGFiZWwgPyBtZW51X2xhYmVsLT5ndGsgOiAwKTsKfQotICh2b2lkKSBpbnNlcnRQYWdl
OihHVEtXaWRnZXQgKikgY2hpbGQgdGFiTGFiZWw6KEdUS1dpZGdldCAqKSB0YWJfbGFiZWwgcG9z
aXRpb246KGdpbnQpIHBvc2l0aW9uCnsKICAgIGd0a19ub3RlYm9va19pbnNlcnRfcGFnZShndGss
IGNoaWxkICA/IGNoaWxkIC0+Z3RrIDogMCwgdGFiX2xhYmVsICA/IHRhYl9sYWJlbCAtPmd0ayA6
IDAsIHBvc2l0aW9uKTsKfQotICh2b2lkKSBpbnNlcnRQYWdlTWVudTooR1RLV2lkZ2V0ICopIGNo
aWxkIHRhYkxhYmVsOihHVEtXaWRnZXQgKikgdGFiX2xhYmVsIG1lbnVMYWJlbDooR1RLV2lkZ2V0
ICopIG1lbnVfbGFiZWwgcG9zaXRpb246KGdpbnQpIHBvc2l0aW9uCnsKICAgIGd0a19ub3RlYm9v
a19pbnNlcnRfcGFnZV9tZW51KGd0aywgY2hpbGQgID8gY2hpbGQgLT5ndGsgOiAwLCB0YWJfbGFi
ZWwgID8gdGFiX2xhYmVsIC0+Z3RrIDogMCwgbWVudV9sYWJlbCAgPyBtZW51X2xhYmVsIC0+Z3Rr
IDogMCwgcG9zaXRpb24pOwp9Ci0gKHZvaWQpIHJlbW92ZVBhZ2U6KGdpbnQpIHBhZ2VfbnVtCnsK
ICAgIGd0a19ub3RlYm9va19yZW1vdmVfcGFnZShndGssIHBhZ2VfbnVtKTsKfQotIChnaW50KSBn
ZXRDdXJyZW50UGFnZQp7CiAgICByZXR1cm4gZ3RrX25vdGVib29rX2dldF9jdXJyZW50X3BhZ2Uo
Z3RrKTsKfQotIChHVEtXaWRnZXQqKSBnZXROdGhQYWdlOihnaW50KSBwYWdlX251bQp7CiAgICBy
ZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19ub3RlYm9va19nZXRfbnRoX3BhZ2UoZ3RrLCBwYWdl
X251bSksIDApOwp9Ci0gKGdpbnQpIHBhZ2VOdW06KEdUS1dpZGdldCAqKSBjaGlsZAp7CiAgICBy
ZXR1cm4gZ3RrX25vdGVib29rX3BhZ2VfbnVtKGd0aywgY2hpbGQgPyBjaGlsZC0+Z3RrIDogMCk7
Cn0KLSAodm9pZCkgc2V0UGFnZTooZ2ludCkgcGFnZV9udW0KewogICAgZ3RrX25vdGVib29rX3Nl
dF9wYWdlKGd0aywgcGFnZV9udW0pOwp9Ci0gKHZvaWQpIG5leHRQYWdlCnsKICAgIGd0a19ub3Rl
Ym9va19uZXh0X3BhZ2UoZ3RrKTsKfQotICh2b2lkKSBwcmV2UGFnZQp7CiAgICBndGtfbm90ZWJv
b2tfcHJldl9wYWdlKGd0ayk7Cn0KLSAodm9pZCkgc2V0U2hvd0JvcmRlcjooZ2Jvb2xlYW4pIHNo
b3dfYm9yZGVyCnsKICAgIGd0a19ub3RlYm9va19zZXRfc2hvd19ib3JkZXIoZ3RrLCBzaG93X2Jv
cmRlcik7Cn0KLSAodm9pZCkgc2V0U2hvd1RhYnM6KGdib29sZWFuKSBzaG93X3RhYnMKewogICAg
Z3RrX25vdGVib29rX3NldF9zaG93X3RhYnMoZ3RrLCBzaG93X3RhYnMpOwp9Ci0gKHZvaWQpIHNl
dFRhYlBvczooR3RrUG9zaXRpb25UeXBlKSBwb3MKewogICAgZ3RrX25vdGVib29rX3NldF90YWJf
cG9zKGd0aywgcG9zKTsKfQotICh2b2lkKSBzZXRIb21vZ2VuZW91c1RhYnM6KGdib29sZWFuKSBo
b21vZ2VuZW91cwp7CiAgICBndGtfbm90ZWJvb2tfc2V0X2hvbW9nZW5lb3VzX3RhYnMoZ3RrLCBo
b21vZ2VuZW91cyk7Cn0KLSAodm9pZCkgc2V0VGFiQm9yZGVyOihndWludCkgYm9yZGVyX3dpZHRo
CnsKICAgIGd0a19ub3RlYm9va19zZXRfdGFiX2JvcmRlcihndGssIGJvcmRlcl93aWR0aCk7Cn0K
LSAodm9pZCkgc2V0VGFiSGJvcmRlcjooZ3VpbnQpIHRhYl9oYm9yZGVyCnsKICAgIGd0a19ub3Rl
Ym9va19zZXRfdGFiX2hib3JkZXIoZ3RrLCB0YWJfaGJvcmRlcik7Cn0KLSAodm9pZCkgc2V0VGFi
VmJvcmRlcjooZ3VpbnQpIHRhYl92Ym9yZGVyCnsKICAgIGd0a19ub3RlYm9va19zZXRfdGFiX3Zi
b3JkZXIoZ3RrLCB0YWJfdmJvcmRlcik7Cn0KLSAodm9pZCkgc2V0U2Nyb2xsYWJsZTooZ2Jvb2xl
YW4pIHNjcm9sbGFibGUKewogICAgZ3RrX25vdGVib29rX3NldF9zY3JvbGxhYmxlKGd0aywgc2Ny
b2xsYWJsZSk7Cn0KLSAodm9pZCkgcG9wdXBFbmFibGUKewogICAgZ3RrX25vdGVib29rX3BvcHVw
X2VuYWJsZShndGspOwp9Ci0gKHZvaWQpIHBvcHVwRGlzYWJsZQp7CiAgICBndGtfbm90ZWJvb2tf
cG9wdXBfZGlzYWJsZShndGspOwp9Ci0gKEdUS1dpZGdldCAqKSBnZXRUYWJMYWJlbDooR1RLV2lk
Z2V0ICopIGNoaWxkCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX25vdGVib29rX2dl
dF90YWJfbGFiZWwoZ3RrLCBjaGlsZCA/IGNoaWxkLT5ndGsgOiAwKSwgMCk7Cn0KLSAodm9pZCkg
c2V0VGFiTGFiZWw6KEdUS1dpZGdldCAqKSBjaGlsZCB0YWJMYWJlbDooR1RLV2lkZ2V0ICopIHRh
Yl9sYWJlbAp7CiAgICBndGtfbm90ZWJvb2tfc2V0X3RhYl9sYWJlbChndGssIGNoaWxkICA/IGNo
aWxkIC0+Z3RrIDogMCwgdGFiX2xhYmVsID8gdGFiX2xhYmVsLT5ndGsgOiAwKTsKfQotICh2b2lk
KSBzZXRUYWJMYWJlbFRleHQ6KEdUS1dpZGdldCAqKSBjaGlsZCB0YWJUZXh0OihOU1N0cmluZyAq
KSB0YWJfdGV4dAp7CiAgICBndGtfbm90ZWJvb2tfc2V0X3RhYl9sYWJlbF90ZXh0KGd0aywgY2hp
bGQgID8gY2hpbGQgLT5ndGsgOiAwLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0YWJfdGV4dCkpOwp9
Ci0gKEdUS1dpZGdldCAqKSBnZXRNZW51TGFiZWw6KEdUS1dpZGdldCAqKSBjaGlsZAp7CiAgICBy
ZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19ub3RlYm9va19nZXRfbWVudV9sYWJlbChndGssIGNo
aWxkID8gY2hpbGQtPmd0ayA6IDApLCAwKTsKfQotICh2b2lkKSBzZXRNZW51TGFiZWw6KEdUS1dp
ZGdldCAqKSBjaGlsZCBtZW51TGFiZWw6KEdUS1dpZGdldCAqKSBtZW51X2xhYmVsCnsKICAgIGd0
a19ub3RlYm9va19zZXRfbWVudV9sYWJlbChndGssIGNoaWxkICA/IGNoaWxkIC0+Z3RrIDogMCwg
bWVudV9sYWJlbCA/IG1lbnVfbGFiZWwtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHNldE1lbnVMYWJl
bFRleHQ6KEdUS1dpZGdldCAqKSBjaGlsZCBtZW51VGV4dDooTlNTdHJpbmcgKikgbWVudV90ZXh0
CnsKICAgIGd0a19ub3RlYm9va19zZXRfbWVudV9sYWJlbF90ZXh0KGd0aywgY2hpbGQgID8gY2hp
bGQgLT5ndGsgOiAwLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBtZW51X3RleHQpKTsKfQotICh2b2lk
KSBxdWVyeVRhYkxhYmVsUGFja2luZzooR1RLV2lkZ2V0ICopIGNoaWxkIGV4cGFuZDooZ2Jvb2xl
YW4gKikgZXhwYW5kIGZpbGw6KGdib29sZWFuICopIGZpbGwgcGFja1R5cGU6KEd0a1BhY2tUeXBl
ICopIHBhY2tfdHlwZQp7CiAgICBndGtfbm90ZWJvb2tfcXVlcnlfdGFiX2xhYmVsX3BhY2tpbmco
Z3RrLCBjaGlsZCAgPyBjaGlsZCAtPmd0ayA6IDAsIGV4cGFuZCAsIGZpbGwgLCBwYWNrX3R5cGUp
Owp9Ci0gKHZvaWQpIHNldFRhYkxhYmVsUGFja2luZzooR1RLV2lkZ2V0ICopIGNoaWxkIGV4cGFu
ZDooZ2Jvb2xlYW4pIGV4cGFuZCBmaWxsOihnYm9vbGVhbikgZmlsbCBwYWNrVHlwZTooR3RrUGFj
a1R5cGUpIHBhY2tfdHlwZQp7CiAgICBndGtfbm90ZWJvb2tfc2V0X3RhYl9sYWJlbF9wYWNraW5n
KGd0aywgY2hpbGQgID8gY2hpbGQgLT5ndGsgOiAwLCBleHBhbmQgLCBmaWxsICwgcGFja190eXBl
KTsKfQotICh2b2lkKSByZW9yZGVyQ2hpbGQ6KEdUS1dpZGdldCAqKSBjaGlsZCBwb3NpdGlvbjoo
Z2ludCkgcG9zaXRpb24KewogICAgZ3RrX25vdGVib29rX3Jlb3JkZXJfY2hpbGQoZ3RrLCBjaGls
ZCAgPyBjaGlsZCAtPmd0ayA6IDAsIHBvc2l0aW9uKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0g
T2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChj
KSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRp
Y2FsbHkgZnJvbSBndGtvYmplY3QuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
ICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLT2JqZWN0Lmg+CgpAaW1wbGVt
ZW50YXRpb24gR1RLT2JqZWN0CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a19v
YmplY3RfZ2V0X3R5cGUoKTsKfQorIChndWludCkgY2xhc3NVc2VyU2lnbmFsTmV3djooR3RrT2Jq
ZWN0Q2xhc3MgKikga2xhc3MgbmFtZTooTlNTdHJpbmcgKikgbmFtZSBzaWduYWxGbGFnczooR3Rr
U2lnbmFsUnVuVHlwZSkgc2lnbmFsX2ZsYWdzIG1hcnNoYWxsZXI6KEd0a1NpZ25hbE1hcnNoYWxs
ZXIpIG1hcnNoYWxsZXIgcmV0dXJuVmFsOihHdGtUeXBlKSByZXR1cm5fdmFsIG5wYXJhbXM6KGd1
aW50KSBucGFyYW1zIHBhcmFtczooR3RrVHlwZSAqKSBwYXJhbXMKewogICAgcmV0dXJuIGd0a19v
YmplY3RfY2xhc3NfdXNlcl9zaWduYWxfbmV3digga2xhc3MgLGd0b29sa2l0X3V0Zjhfc3RyaW5n
KCBuYW1lICksIHNpZ25hbF9mbGFncyAsIG1hcnNoYWxsZXIgLCByZXR1cm5fdmFsICwgbnBhcmFt
cyAsIHBhcmFtcyk7Cn0KKyAoaWQpIG9iamVjdHZXaXRoVHlwZTooR3RrVHlwZSkgb2JqZWN0X3R5
cGUgbkFyZ3M6KGd1aW50KSBuX2FyZ3MgYXJnczooR3RrQXJnICopIGFyZ3MKewogICAgcmV0dXJu
IFtbKEdUS09iamVjdCAqKVtzZWxmIGFsbG9jXSBpbml0dldpdGhUeXBlOm9iamVjdF90eXBlIG5B
cmdzOm5fYXJncyBhcmdzOmFyZ3NdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdHZXaXRoVHlw
ZTooR3RrVHlwZSkgb2JqZWN0X3R5cGUgbkFyZ3M6KGd1aW50KSBuX2FyZ3MgYXJnczooR3RrQXJn
ICopIGFyZ3MKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19vYmplY3RfbmV3digg
b2JqZWN0X3R5cGUgLCBuX2FyZ3MgLCBhcmdzKV07Cn0KLSAodm9pZCkgZGVmYXVsdENvbnN0cnVj
dAp7CiAgICBndGtfb2JqZWN0X2RlZmF1bHRfY29uc3RydWN0KGd0ayk7Cn0KLSAodm9pZCkgc2lu
awp7CiAgICBndGtfb2JqZWN0X3NpbmsoZ3RrKTsKfQotICh2b2lkKSByZWYKewogICAgZ3RrX29i
amVjdF9yZWYoZ3RrKTsKfQotICh2b2lkKSB1bnJlZgp7CiAgICBndGtfb2JqZWN0X3VucmVmKGd0
ayk7Cn0KLSAodm9pZCkgd2Vha3JlZjooR3RrRGVzdHJveU5vdGlmeSkgbm90aWZ5IGRhdGE6KGdw
b2ludGVyKSBkYXRhCnsKICAgIGd0a19vYmplY3Rfd2Vha3JlZihndGssIG5vdGlmeSAsIGRhdGEp
Owp9Ci0gKHZvaWQpIHdlYWt1bnJlZjooR3RrRGVzdHJveU5vdGlmeSkgbm90aWZ5IGRhdGE6KGdw
b2ludGVyKSBkYXRhCnsKICAgIGd0a19vYmplY3Rfd2Vha3VucmVmKGd0aywgbm90aWZ5ICwgZGF0
YSk7Cn0KLSAodm9pZCkgZGVzdHJveQp7CiAgICBndGtfb2JqZWN0X2Rlc3Ryb3koZ3RrKTsKfQot
ICh2b2lkKSBnZXR2OihndWludCkgbl9hcmdzIGFyZ3M6KEd0a0FyZyAqKSBhcmdzCnsKICAgIGd0
a19vYmplY3RfZ2V0dihndGssIG5fYXJncyAsIGFyZ3MpOwp9Ci0gKHZvaWQpIHNldHY6KGd1aW50
KSBuX2FyZ3MgYXJnczooR3RrQXJnICopIGFyZ3MKewogICAgZ3RrX29iamVjdF9zZXR2KGd0aywg
bl9hcmdzICwgYXJncyk7Cn0KKyAoR3RrQXJnKikgcXVlcnlBcmdzOihHdGtUeXBlKSBjbGFzc190
eXBlIGFyZ0ZsYWdzOihndWludDMyICoqKSBhcmdfZmxhZ3MgbkFyZ3M6KGd1aW50ICopIG5fYXJn
cwp7CiAgICByZXR1cm4gZ3RrX29iamVjdF9xdWVyeV9hcmdzKCBjbGFzc190eXBlICwgYXJnX2Zs
YWdzICwgbl9hcmdzKTsKfQotICh2b2lkKSBzZXREYXRhOihOU1N0cmluZyAqKSBrZXkgZGF0YToo
Z3BvaW50ZXIpIGRhdGEKewogICAgZ3RrX29iamVjdF9zZXRfZGF0YShndGssZ3Rvb2xraXRfdXRm
OF9zdHJpbmcoIGtleSApLCBkYXRhKTsKfQotICh2b2lkKSBzZXREYXRhRnVsbDooTlNTdHJpbmcg
Kikga2V5IGRhdGE6KGdwb2ludGVyKSBkYXRhIGRlc3Ryb3k6KEd0a0Rlc3Ryb3lOb3RpZnkpIGRl
c3Ryb3kKewogICAgZ3RrX29iamVjdF9zZXRfZGF0YV9mdWxsKGd0ayxndG9vbGtpdF91dGY4X3N0
cmluZygga2V5ICksIGRhdGEgLCBkZXN0cm95KTsKfQotICh2b2lkKSByZW1vdmVEYXRhOihOU1N0
cmluZyAqKSBrZXkKewogICAgZ3RrX29iamVjdF9yZW1vdmVfZGF0YShndGssZ3Rvb2xraXRfdXRm
OF9zdHJpbmcoIGtleSkpOwp9Ci0gKGdwb2ludGVyKSBnZXREYXRhOihOU1N0cmluZyAqKSBrZXkK
ewogICAgcmV0dXJuIGd0a19vYmplY3RfZ2V0X2RhdGEoZ3RrLGd0b29sa2l0X3V0Zjhfc3RyaW5n
KCBrZXkpKTsKfQotICh2b2lkKSByZW1vdmVOb05vdGlmeTooTlNTdHJpbmcgKikga2V5CnsKICAg
IGd0a19vYmplY3RfcmVtb3ZlX25vX25vdGlmeShndGssZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGtl
eSkpOwp9Ci0gKHZvaWQpIHNldFVzZXJEYXRhOihncG9pbnRlcikgZGF0YQp7CiAgICBndGtfb2Jq
ZWN0X3NldF91c2VyX2RhdGEoZ3RrLCBkYXRhKTsKfQotIChncG9pbnRlcikgZ2V0VXNlckRhdGEK
ewogICAgcmV0dXJuIGd0a19vYmplY3RfZ2V0X3VzZXJfZGF0YShndGspOwp9CisgKHZvaWQpIGNs
YXNzQWRkU2lnbmFsczooR3RrT2JqZWN0Q2xhc3MgKikga2xhc3Mgc2lnbmFsczooZ3VpbnQgKikg
c2lnbmFscyBuc2lnbmFsczooZ3VpbnQpIG5zaWduYWxzCnsKICAgIGd0a19vYmplY3RfY2xhc3Nf
YWRkX3NpZ25hbHMoIGtsYXNzICwgc2lnbmFscyAsIG5zaWduYWxzKTsKfQorICh2b2lkKSBhZGRB
cmdUeXBlOihOU1N0cmluZyAqKSBhcmdfbmFtZSBhcmdUeXBlOihHdGtUeXBlKSBhcmdfdHlwZSBh
cmdGbGFnczooZ3VpbnQpIGFyZ19mbGFncyBhcmdJZDooZ3VpbnQpIGFyZ19pZAp7CiAgICBndGtf
b2JqZWN0X2FkZF9hcmdfdHlwZShndG9vbGtpdF91dGY4X3N0cmluZyggYXJnX25hbWUgKSwgYXJn
X3R5cGUgLCBhcmdfZmxhZ3MgLCBhcmdfaWQpOwp9Ci0gKHZvaWQpIHNldERhdGFCeUlkOihHUXVh
cmspIGRhdGFfaWQgZGF0YTooZ3BvaW50ZXIpIGRhdGEKewogICAgZ3RrX29iamVjdF9zZXRfZGF0
YV9ieV9pZChndGssIGRhdGFfaWQgLCBkYXRhKTsKfQotICh2b2lkKSBzZXREYXRhQnlJZEZ1bGw6
KEdRdWFyaykgZGF0YV9pZCBkYXRhOihncG9pbnRlcikgZGF0YSBkZXN0cm95OihHdGtEZXN0cm95
Tm90aWZ5KSBkZXN0cm95CnsKICAgIGd0a19vYmplY3Rfc2V0X2RhdGFfYnlfaWRfZnVsbChndGss
IGRhdGFfaWQgLCBkYXRhICwgZGVzdHJveSk7Cn0KLSAoZ3BvaW50ZXIpIGdldERhdGFCeUlkOihH
UXVhcmspIGRhdGFfaWQKewogICAgcmV0dXJuIGd0a19vYmplY3RfZ2V0X2RhdGFfYnlfaWQoZ3Rr
LCBkYXRhX2lkKTsKfQotICh2b2lkKSByZW1vdmVEYXRhQnlJZDooR1F1YXJrKSBkYXRhX2lkCnsK
ICAgIGd0a19vYmplY3RfcmVtb3ZlX2RhdGFfYnlfaWQoZ3RrLCBkYXRhX2lkKTsKfQotICh2b2lk
KSByZW1vdmVOb05vdGlmeUJ5SWQ6KEdRdWFyaykga2V5X2lkCnsKICAgIGd0a19vYmplY3RfcmVt
b3ZlX25vX25vdGlmeV9ieV9pZChndGssIGtleV9pZCk7Cn0Kc3RhdGljIHZvaWQgZGVzdHJveV9u
b3RpZnkgKEdUS09iamVjdCAqc2VsZikKewogICAgW3NlbGYgZGVhbGxvY107Cn0KCiAtIChpZCkg
aW5pdFdpdGhHdGs6KGdwb2ludGVyKSBfZ3RrCnsKICAgIFtzdXBlciBpbml0V2l0aEd0azpfZ3Rr
XTsKCiAgICAvLyBkaXNhYmxlIGZsb2F0aW5nIGZsYWcsIHdlIHVzZSBhdXRvcmVsZWFzZSBpbnN0
ZWFkLi4uCiAgICBHVEtfT0JKRUNUX1VOU0VUX0ZMQUdTKF9ndGssIEdUS19GTE9BVElORyk7CiAg
ICBbc2VsZiB3ZWFrcmVmOihHdGtEZXN0cm95Tm90aWZ5KSBkZXN0cm95X25vdGlmeSBkYXRhOnNl
bGZdOwoKICAgIGlmICh0YWcpIHRhZyA9IDA7CQkvLyB0YWcgdmFsdWUgLTEgaW5kaWNhdGVzICJk
byBub3Qgc2hvdyIKICAgIC8vIHNob3cgYWxsIHdpZGdldHMgKGV4Y2VwdCB3aW5kb3dzIGFuZCBt
ZW51cykgYnkgZGVmYXVsdAogICAgZWxzZSBpZiAoW3NlbGYgcmVzcG9uZHNUb1NlbGVjdG9yOkBz
ZWxlY3RvcihzaG93KV0gJiYKCSAgICAgIVtzZWxmIGlzS2luZE9mQ2xhc3M6W0dUS01lbnUgY2xh
c3NdXSAmJgoJICAgICAhW3NlbGYgaXNLaW5kT2ZDbGFzczpbR1RLV2luZG93IGNsYXNzXV0pIFso
aWQpIHNlbGYgc2hvd107CiAgICByZXR1cm4gc2VsZjsKfQoKI2RlZmluZSBndGsJKChHdGtPYmpl
Y3QgKikgZ3RrKQogLSAob25ld2F5IHZvaWQpIHJlbGVhc2UKewojaWZkZWYgREVCVUcKICAgIGlm
IChndGsgJiYgZ3RrLT5yZWZfY291bnQgPT0gMCkKCWdfZXJyb3IoInJlZl9jb3VudCA9PSAwIGlu
ICIgX19GSUxFX18gIiAocmVsZWFzZSkiKTsKI2VuZGlmCiAgICBpZiAoZ3RrKSBbc2VsZiB1bnJl
Zl07CiAgICBlbHNlIFtzZWxmIGRlYWxsb2NdOwp9CgogLSAoaWQpIHJldGFpbgp7CiAgICBpZiAo
Z3RrKSBbc2VsZiByZWZdOwogICAgcmV0dXJuIHNlbGY7Cn0KCiAtICh1bnNpZ25lZCkgcmV0YWlu
Q291bnQKewogICAgcmV0dXJuIGd0ayA/IGd0ay0+cmVmX2NvdW50IDogMTsKfQojdW5kZWYgZ3Rr
CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAg
VG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwog
KgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a29wdGlvbm1lbnUuaCBieSBndGtn
ZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rv
b2xLaXQvR1RLT3B0aW9uTWVudS5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+CgpA
aW1wbGVtZW50YXRpb24gR1RLT3B0aW9uTWVudQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJl
dHVybiBndGtfb3B0aW9uX21lbnVfZ2V0X3R5cGUoKTsKfQorIChpZCkgb3B0aW9uTWVudQp7CiAg
ICByZXR1cm4gW1soR1RLT3B0aW9uTWVudSAqKVtzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFz
ZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19vcHRp
b25fbWVudV9uZXcoKV07Cn0KLSAoR1RLV2lkZ2V0KikgZ2V0TWVudQp7CiAgICByZXR1cm4gZ3Rv
b2xraXRfb2JqZWN0KGd0a19vcHRpb25fbWVudV9nZXRfbWVudShndGspLCAwKTsKfQotICh2b2lk
KSBzZXRNZW51OihHVEtXaWRnZXQgKikgbWVudQp7CiAgICBndGtfb3B0aW9uX21lbnVfc2V0X21l
bnUoZ3RrLCBtZW51ID8gbWVudS0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgcmVtb3ZlTWVudQp7CiAg
ICBndGtfb3B0aW9uX21lbnVfcmVtb3ZlX21lbnUoZ3RrKTsKfQotICh2b2lkKSBzZXRIaXN0b3J5
OihndWludCkgaW5kZXgKewogICAgZ3RrX29wdGlvbl9tZW51X3NldF9oaXN0b3J5KGd0aywgaW5k
ZXgpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhl
IEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1
ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3BhY2tlci5oIGJ5IGd0
a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxH
VG9vbEtpdC9HVEtQYWNrZXIuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1dpZGdldC5oPgoKQGlt
cGxlbWVudGF0aW9uIEdUS1BhY2tlcgorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBn
dGtfcGFja2VyX2dldF90eXBlKCk7Cn0KKyAoaWQpIHBhY2tlcgp7CiAgICByZXR1cm4gW1soR1RL
UGFja2VyICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7
CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3BhY2tlcl9uZXcoKV07Cn0KLSAodm9p
ZCkgYWRkRGVmYXVsdHM6KEdUS1dpZGdldCAqKSBjaGlsZCBzaWRlOihHdGtTaWRlVHlwZSkgc2lk
ZSBhbmNob3I6KEd0a0FuY2hvclR5cGUpIGFuY2hvciBvcHRpb25zOihHdGtQYWNrZXJPcHRpb25z
KSBvcHRpb25zCnsKICAgIGd0a19wYWNrZXJfYWRkX2RlZmF1bHRzKGd0aywgY2hpbGQgID8gY2hp
bGQgLT5ndGsgOiAwLCBzaWRlICwgYW5jaG9yICwgb3B0aW9ucyk7Cn0KLSAodm9pZCkgYWRkOihH
VEtXaWRnZXQgKikgY2hpbGQgc2lkZTooR3RrU2lkZVR5cGUpIHNpZGUgYW5jaG9yOihHdGtBbmNo
b3JUeXBlKSBhbmNob3Igb3B0aW9uczooR3RrUGFja2VyT3B0aW9ucykgb3B0aW9ucyBib3JkZXJX
aWR0aDooZ3VpbnQpIGJvcmRlcl93aWR0aCBwYWRYOihndWludCkgcGFkX3ggcGFkWTooZ3VpbnQp
IHBhZF95IGlQYWRYOihndWludCkgaV9wYWRfeCBpUGFkWTooZ3VpbnQpIGlfcGFkX3kKewogICAg
Z3RrX3BhY2tlcl9hZGQoZ3RrLCBjaGlsZCAgPyBjaGlsZCAtPmd0ayA6IDAsIHNpZGUgLCBhbmNo
b3IgLCBvcHRpb25zICwgYm9yZGVyX3dpZHRoICwgcGFkX3ggLCBwYWRfeSAsIGlfcGFkX3ggLCBp
X3BhZF95KTsKfQotICh2b2lkKSBzZXRDaGlsZFBhY2tpbmc6KEdUS1dpZGdldCAqKSBjaGlsZCBz
aWRlOihHdGtTaWRlVHlwZSkgc2lkZSBhbmNob3I6KEd0a0FuY2hvclR5cGUpIGFuY2hvciBvcHRp
b25zOihHdGtQYWNrZXJPcHRpb25zKSBvcHRpb25zIGJvcmRlcldpZHRoOihndWludCkgYm9yZGVy
X3dpZHRoIHBhZFg6KGd1aW50KSBwYWRfeCBwYWRZOihndWludCkgcGFkX3kgaVBhZFg6KGd1aW50
KSBpX3BhZF94IGlQYWRZOihndWludCkgaV9wYWRfeQp7CiAgICBndGtfcGFja2VyX3NldF9jaGls
ZF9wYWNraW5nKGd0aywgY2hpbGQgID8gY2hpbGQgLT5ndGsgOiAwLCBzaWRlICwgYW5jaG9yICwg
b3B0aW9ucyAsIGJvcmRlcl93aWR0aCAsIHBhZF94ICwgcGFkX3kgLCBpX3BhZF94ICwgaV9wYWRf
eSk7Cn0KLSAodm9pZCkgcmVvcmRlckNoaWxkOihHVEtXaWRnZXQgKikgY2hpbGQgcG9zaXRpb246
KGdpbnQpIHBvc2l0aW9uCnsKICAgIGd0a19wYWNrZXJfcmVvcmRlcl9jaGlsZChndGssIGNoaWxk
ICA/IGNoaWxkIC0+Z3RrIDogMCwgcG9zaXRpb24pOwp9Ci0gKHZvaWQpIHNldFNwYWNpbmc6KGd1
aW50KSBzcGFjaW5nCnsKICAgIGd0a19wYWNrZXJfc2V0X3NwYWNpbmcoZ3RrLCBzcGFjaW5nKTsK
fQotICh2b2lkKSBzZXREZWZhdWx0Qm9yZGVyV2lkdGg6KGd1aW50KSBib3JkZXIKewogICAgZ3Rr
X3BhY2tlcl9zZXRfZGVmYXVsdF9ib3JkZXJfd2lkdGgoZ3RrLCBib3JkZXIpOwp9Ci0gKHZvaWQp
IHNldERlZmF1bHRQYWQ6KGd1aW50KSBwYWRfeCBwYWRZOihndWludCkgcGFkX3kKewogICAgZ3Rr
X3BhY2tlcl9zZXRfZGVmYXVsdF9wYWQoZ3RrLCBwYWRfeCAsIHBhZF95KTsKfQotICh2b2lkKSBz
ZXREZWZhdWx0SXBhZDooZ3VpbnQpIGlfcGFkX3ggaVBhZFk6KGd1aW50KSBpX3BhZF95CnsKICAg
IGd0a19wYWNrZXJfc2V0X2RlZmF1bHRfaXBhZChndGssIGlfcGFkX3ggLCBpX3BhZF95KTsKfQpA
ZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRv
b2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoK
ICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtwYW5lZC5oIGJ5IGd0a2dlbi4KICoK
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl
bmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9H
VEtQYW5lZC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+CgpAaW1wbGVtZW50YXRp
b24gR1RLUGFuZWQKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3BhbmVkX2dl
dF90eXBlKCk7Cn0KLSAodm9pZCkgYWRkMTooR1RLV2lkZ2V0ICopIGNoaWxkCnsKICAgIGd0a19w
YW5lZF9hZGQxKGd0aywgY2hpbGQgPyBjaGlsZC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgYWRkMjoo
R1RLV2lkZ2V0ICopIGNoaWxkCnsKICAgIGd0a19wYW5lZF9hZGQyKGd0aywgY2hpbGQgPyBjaGls
ZC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgcGFjazE6KEdUS1dpZGdldCAqKSBjaGlsZCByZXNpemU6
KGdib29sZWFuKSByZXNpemUgc2hyaW5rOihnYm9vbGVhbikgc2hyaW5rCnsKICAgIGd0a19wYW5l
ZF9wYWNrMShndGssIGNoaWxkICA/IGNoaWxkIC0+Z3RrIDogMCwgcmVzaXplICwgc2hyaW5rKTsK
fQotICh2b2lkKSBwYWNrMjooR1RLV2lkZ2V0ICopIGNoaWxkIHJlc2l6ZTooZ2Jvb2xlYW4pIHJl
c2l6ZSBzaHJpbms6KGdib29sZWFuKSBzaHJpbmsKewogICAgZ3RrX3BhbmVkX3BhY2syKGd0aywg
Y2hpbGQgID8gY2hpbGQgLT5ndGsgOiAwLCByZXNpemUgLCBzaHJpbmspOwp9Ci0gKHZvaWQpIHNl
dFBvc2l0aW9uOihnaW50KSBwb3NpdGlvbgp7CiAgICBndGtfcGFuZWRfc2V0X3Bvc2l0aW9uKGd0
aywgcG9zaXRpb24pOwp9Ci0gKHZvaWQpIHNldEhhbmRsZVNpemU6KGd1aW50MTYpIHNpemUKewog
ICAgZ3RrX3BhbmVkX3NldF9oYW5kbGVfc2l6ZShndGssIHNpemUpOwp9Ci0gKHZvaWQpIHNldEd1
dHRlclNpemU6KGd1aW50MTYpIHNpemUKewogICAgZ3RrX3BhbmVkX3NldF9ndXR0ZXJfc2l6ZShn
dGssIHNpemUpOwp9CiNkZWZpbmUgZ3RrCSgoR3RrUGFuZWQgKikgZ3RrKQotIChpZCkgY2hpbGQx
CnsKICAgIHJldHVybiBHVE9PTEtJVF9PQkpFQ1QoZ3RrLT5jaGlsZDEpOwp9Ci0gKGlkKSBjaGls
ZDIKewogICAgcmV0dXJuIEdUT09MS0lUX09CSkVDVChndGstPmNoaWxkMik7Cn0KI3VuZGVmIGd0
awpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1Q
IFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcK
ICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtwaXhtYXAuaCBieSBndGtnZW4u
CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xL
aXQvR1RLUGl4bWFwLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLUGl4bWFwCisgKEd0a1R5cGUpIGdl
dFR5cGUKewogICAgcmV0dXJuIGd0a19waXhtYXBfZ2V0X3R5cGUoKTsKfQorIChpZCkgcGl4bWFw
V2l0aFBpeG1hcDooR2RrUGl4bWFwICopIHBpeG1hcCBtYXNrOihHZGtCaXRtYXAgKikgbWFzawp7
CiAgICByZXR1cm4gW1soR1RLUGl4bWFwICopW3NlbGYgYWxsb2NdIGluaXRXaXRoUGl4bWFwOnBp
eG1hcCBtYXNrOm1hc2tdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhQaXhtYXA6KEdk
a1BpeG1hcCAqKSBwaXhtYXAgbWFzazooR2RrQml0bWFwICopIG1hc2sKewogICAgcmV0dXJuIFtz
ZWxmIGluaXRXaXRoR3RrOmd0a19waXhtYXBfbmV3KCBwaXhtYXAgLCBtYXNrKV07Cn0KLSAodm9p
ZCkgc2V0OihHZGtQaXhtYXAgKikgdmFsIG1hc2s6KEdka0JpdG1hcCAqKSBtYXNrCnsKICAgIGd0
a19waXhtYXBfc2V0KGd0aywgdmFsICwgbWFzayk7Cn0KLSAodm9pZCkgZ2V0OihHZGtQaXhtYXAg
KiopIHZhbCBtYXNrOihHZGtCaXRtYXAgKiopIG1hc2sKewogICAgZ3RrX3BpeG1hcF9nZXQoZ3Rr
LCB2YWwgLCBtYXNrKTsKfQotICh2b2lkKSBzZXRCdWlsZEluc2Vuc2l0aXZlOihndWludCkgYnVp
bGQKewogICAgZ3RrX3BpeG1hcF9zZXRfYnVpbGRfaW5zZW5zaXRpdmUoZ3RrLCBidWlsZCk7Cn0K
QGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBU
b29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAq
CiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrcGx1Zy5oIGJ5IGd0a2dlbi4KICoK
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl
bmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9H
VEtQbHVnLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLUGx1ZworIChHdGtUeXBlKSBnZXRUeXBlCnsK
ICAgIHJldHVybiBndGtfcGx1Z19nZXRfdHlwZSgpOwp9CisgKGlkKSBwbHVnV2l0aFNvY2tldElk
OihndWludDMyKSBzb2NrZXRfaWQKewogICAgcmV0dXJuIFtbKEdUS1BsdWcgKilbc2VsZiBhbGxv
Y10gaW5pdFdpdGhTb2NrZXRJZDpzb2NrZXRfaWRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5p
dFdpdGhTb2NrZXRJZDooZ3VpbnQzMikgc29ja2V0X2lkCnsKICAgIHJldHVybiBbc2VsZiBpbml0
V2l0aEd0azpndGtfcGx1Z19uZXcoIHNvY2tldF9pZCldOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQg
LSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQg
KGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21h
dGljYWxseSBmcm9tIGd0a3ByZXZpZXcuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLUHJldmlldy5oPgoKQGlt
cGxlbWVudGF0aW9uIEdUS1ByZXZpZXcKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4g
Z3RrX3ByZXZpZXdfZ2V0X3R5cGUoKTsKfQorICh2b2lkKSB1bmluaXQKewogICAgZ3RrX3ByZXZp
ZXdfdW5pbml0KCk7Cn0KKyAoaWQpIHByZXZpZXdXaXRoVHlwZTooR3RrUHJldmlld1R5cGUpIHR5
cGUKewogICAgcmV0dXJuIFtbKEdUS1ByZXZpZXcgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhUeXBl
OnR5cGVdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhUeXBlOihHdGtQcmV2aWV3VHlw
ZSkgdHlwZQp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3ByZXZpZXdfbmV3KCB0
eXBlKV07Cn0KLSAodm9pZCkgc2l6ZTooZ2ludCkgd2lkdGggaGVpZ2h0OihnaW50KSBoZWlnaHQK
ewogICAgZ3RrX3ByZXZpZXdfc2l6ZShndGssIHdpZHRoICwgaGVpZ2h0KTsKfQotICh2b2lkKSBw
dXQ6KEdka1dpbmRvdyAqKSB3aW5kb3cgZ2M6KEdka0dDICopIGdjIHNyY3g6KGdpbnQpIHNyY3gg
c3JjeTooZ2ludCkgc3JjeSBkZXN0eDooZ2ludCkgZGVzdHggZGVzdHk6KGdpbnQpIGRlc3R5IHdp
ZHRoOihnaW50KSB3aWR0aCBoZWlnaHQ6KGdpbnQpIGhlaWdodAp7CiAgICBndGtfcHJldmlld19w
dXQoZ3RrLCB3aW5kb3cgLCBnYyAsIHNyY3ggLCBzcmN5ICwgZGVzdHggLCBkZXN0eSAsIHdpZHRo
ICwgaGVpZ2h0KTsKfQotICh2b2lkKSBkcmF3Um93OihndWNoYXIgKikgZGF0YSB4OihnaW50KSB4
IHk6KGdpbnQpIHkgdzooZ2ludCkgdwp7CiAgICBndGtfcHJldmlld19kcmF3X3JvdyhndGssIGRh
dGEgLCB4ICwgeSAsIHcpOwp9Ci0gKHZvaWQpIHNldEV4cGFuZDooZ2Jvb2xlYW4pIGV4cGFuZAp7
CiAgICBndGtfcHJldmlld19zZXRfZXhwYW5kKGd0aywgZXhwYW5kKTsKfQorICh2b2lkKSBzZXRH
YW1tYTooZG91YmxlKSBnYW1tYQp7CiAgICBndGtfcHJldmlld19zZXRfZ2FtbWEoIGdhbW1hKTsK
fQorICh2b2lkKSBzZXRDb2xvckN1YmU6KGd1aW50KSBucmVkX3NoYWRlcyBuZ3JlZW5TaGFkZXM6
KGd1aW50KSBuZ3JlZW5fc2hhZGVzIG5ibHVlU2hhZGVzOihndWludCkgbmJsdWVfc2hhZGVzIG5n
cmF5U2hhZGVzOihndWludCkgbmdyYXlfc2hhZGVzCnsKICAgIGd0a19wcmV2aWV3X3NldF9jb2xv
cl9jdWJlKCBucmVkX3NoYWRlcyAsIG5ncmVlbl9zaGFkZXMgLCBuYmx1ZV9zaGFkZXMgLCBuZ3Jh
eV9zaGFkZXMpOwp9CisgKHZvaWQpIHNldEluc3RhbGxDbWFwOihnaW50KSBpbnN0YWxsX2NtYXAK
ewogICAgZ3RrX3ByZXZpZXdfc2V0X2luc3RhbGxfY21hcCggaW5zdGFsbF9jbWFwKTsKfQorICh2
b2lkKSBzZXRSZXNlcnZlZDooZ2ludCkgbnJlc2VydmVkCnsKICAgIGd0a19wcmV2aWV3X3NldF9y
ZXNlcnZlZCggbnJlc2VydmVkKTsKfQotICh2b2lkKSBzZXREaXRoZXI6KEdka1JnYkRpdGhlcikg
ZGl0aGVyCnsKICAgIGd0a19wcmV2aWV3X3NldF9kaXRoZXIoZ3RrLCBkaXRoZXIpOwp9CisgKEdk
a1Zpc3VhbCopIGdldFZpc3VhbAp7CiAgICByZXR1cm4gZ3RrX3ByZXZpZXdfZ2V0X3Zpc3VhbCgp
Owp9CisgKEdka0NvbG9ybWFwKikgZ2V0Q21hcAp7CiAgICByZXR1cm4gZ3RrX3ByZXZpZXdfZ2V0
X2NtYXAoKTsKfQorIChHdGtQcmV2aWV3SW5mbyopIGdldEluZm8KewogICAgcmV0dXJuIGd0a19w
cmV2aWV3X2dldF9pbmZvKCk7Cn0KKyAodm9pZCkgcmVzZXQKewogICAgZ3RrX3ByZXZpZXdfcmVz
ZXQoKTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRo
ZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBM
dWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGtwcm9ncmVzcy5oIGJ5
IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRl
IDxHVG9vbEtpdC9HVEtQcm9ncmVzcy5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQWRqdXN0bWVu
dC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS1Byb2dyZXNzCisgKEd0a1R5cGUpIGdldFR5cGUKewog
ICAgcmV0dXJuIGd0a19wcm9ncmVzc19nZXRfdHlwZSgpOwp9Ci0gKHZvaWQpIHNldFNob3dUZXh0
OihnaW50KSBzaG93X3RleHQKewogICAgZ3RrX3Byb2dyZXNzX3NldF9zaG93X3RleHQoZ3RrLCBz
aG93X3RleHQpOwp9Ci0gKHZvaWQpIHNldFRleHRBbGlnbm1lbnQ6KGdmbG9hdCkgeF9hbGlnbiB5
QWxpZ246KGdmbG9hdCkgeV9hbGlnbgp7CiAgICBndGtfcHJvZ3Jlc3Nfc2V0X3RleHRfYWxpZ25t
ZW50KGd0aywgeF9hbGlnbiAsIHlfYWxpZ24pOwp9Ci0gKHZvaWQpIHNldEZvcm1hdFN0cmluZzoo
TlNTdHJpbmcgKikgZm9ybWF0CnsKICAgIGd0a19wcm9ncmVzc19zZXRfZm9ybWF0X3N0cmluZyhn
dGssZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGZvcm1hdCkpOwp9Ci0gKHZvaWQpIHNldEFkanVzdG1l
bnQ6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudAp7CiAgICBndGtfcHJvZ3Jlc3Nfc2V0X2Fk
anVzdG1lbnQoZ3RrLCBhZGp1c3RtZW50ID8gYWRqdXN0bWVudC0+Z3RrIDogMCk7Cn0KLSAodm9p
ZCkgY29uZmlndXJlOihnZmxvYXQpIHZhbHVlIG1pbjooZ2Zsb2F0KSBtaW4gbWF4OihnZmxvYXQp
IG1heAp7CiAgICBndGtfcHJvZ3Jlc3NfY29uZmlndXJlKGd0aywgdmFsdWUgLCBtaW4gLCBtYXgp
Owp9Ci0gKHZvaWQpIHNldFBlcmNlbnRhZ2U6KGdmbG9hdCkgcGVyY2VudGFnZQp7CiAgICBndGtf
cHJvZ3Jlc3Nfc2V0X3BlcmNlbnRhZ2UoZ3RrLCBwZXJjZW50YWdlKTsKfQotICh2b2lkKSBzZXRW
YWx1ZTooZ2Zsb2F0KSB2YWx1ZQp7CiAgICBndGtfcHJvZ3Jlc3Nfc2V0X3ZhbHVlKGd0aywgdmFs
dWUpOwp9Ci0gKGdmbG9hdCkgZ2V0VmFsdWUKewogICAgcmV0dXJuIGd0a19wcm9ncmVzc19nZXRf
dmFsdWUoZ3RrKTsKfQotICh2b2lkKSBzZXRBY3Rpdml0eU1vZGU6KGd1aW50KSBhY3Rpdml0eV9t
b2RlCnsKICAgIGd0a19wcm9ncmVzc19zZXRfYWN0aXZpdHlfbW9kZShndGssIGFjdGl2aXR5X21v
ZGUpOwp9Ci0gKE5TU3RyaW5nICopIGdldEN1cnJlbnRUZXh0CnsKICAgIHJldHVybiBndG9vbGtp
dF9vYmpjX3N0cmluZyhndGtfcHJvZ3Jlc3NfZ2V0X2N1cnJlbnRfdGV4dChndGspKTsKfQotIChO
U1N0cmluZyAqKSBnZXRUZXh0RnJvbVZhbHVlOihnZmxvYXQpIHZhbHVlCnsKICAgIHJldHVybiBn
dG9vbGtpdF9vYmpjX3N0cmluZyhndGtfcHJvZ3Jlc3NfZ2V0X3RleHRfZnJvbV92YWx1ZShndGss
IHZhbHVlKSk7Cn0KLSAoZ2Zsb2F0KSBnZXRDdXJyZW50UGVyY2VudGFnZQp7CiAgICByZXR1cm4g
Z3RrX3Byb2dyZXNzX2dldF9jdXJyZW50X3BlcmNlbnRhZ2UoZ3RrKTsKfQotIChnZmxvYXQpIGdl
dFBlcmNlbnRhZ2VGcm9tVmFsdWU6KGdmbG9hdCkgdmFsdWUKewogICAgcmV0dXJuIGd0a19wcm9n
cmVzc19nZXRfcGVyY2VudGFnZV9mcm9tX3ZhbHVlKGd0aywgdmFsdWUpOwp9CkBlbmQKLyoKICog
R1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBD
b3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0
ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3Byb2dyZXNzYmFyLmggYnkgZ3RrZ2VuLgogKgogKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1By
b2dyZXNzQmFyLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtBZGp1c3RtZW50Lmg+CgpAaW1wbGVt
ZW50YXRpb24gR1RLUHJvZ3Jlc3NCYXIKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4g
Z3RrX3Byb2dyZXNzX2Jhcl9nZXRfdHlwZSgpOwp9CisgKGlkKSBwcm9ncmVzc0Jhcgp7CiAgICBy
ZXR1cm4gW1soR1RLUHJvZ3Jlc3NCYXIgKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2Vd
Owp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfcHJvZ3Jl
c3NfYmFyX25ldygpXTsKfQorIChpZCkgcHJvZ3Jlc3NCYXJXaXRoQWRqdXN0bWVudDooR1RLQWRq
dXN0bWVudCAqKSBhZGp1c3RtZW50CnsKICAgIHJldHVybiBbWyhHVEtQcm9ncmVzc0JhciAqKVtz
ZWxmIGFsbG9jXSBpbml0V2l0aEFkanVzdG1lbnQ6YWRqdXN0bWVudF0gYXV0b3JlbGVhc2VdOwp9
Ci0gKGlkKSBpbml0V2l0aEFkanVzdG1lbnQ6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudAp7
CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3Byb2dyZXNzX2Jhcl9uZXdfd2l0aF9h
ZGp1c3RtZW50KCBhZGp1c3RtZW50ID8gYWRqdXN0bWVudC0+Z3RrIDogMCldOwp9Ci0gKHZvaWQp
IHNldEJhclN0eWxlOihHdGtQcm9ncmVzc0JhclN0eWxlKSBzdHlsZQp7CiAgICBndGtfcHJvZ3Jl
c3NfYmFyX3NldF9iYXJfc3R5bGUoZ3RrLCBzdHlsZSk7Cn0KLSAodm9pZCkgc2V0RGlzY3JldGVC
bG9ja3M6KGd1aW50KSBibG9ja3MKewogICAgZ3RrX3Byb2dyZXNzX2Jhcl9zZXRfZGlzY3JldGVf
YmxvY2tzKGd0aywgYmxvY2tzKTsKfQotICh2b2lkKSBzZXRBY3Rpdml0eVN0ZXA6KGd1aW50KSBz
dGVwCnsKICAgIGd0a19wcm9ncmVzc19iYXJfc2V0X2FjdGl2aXR5X3N0ZXAoZ3RrLCBzdGVwKTsK
fQotICh2b2lkKSBzZXRBY3Rpdml0eUJsb2NrczooZ3VpbnQpIGJsb2Nrcwp7CiAgICBndGtfcHJv
Z3Jlc3NfYmFyX3NldF9hY3Rpdml0eV9ibG9ja3MoZ3RrLCBibG9ja3MpOwp9Ci0gKHZvaWQpIHNl
dE9yaWVudGF0aW9uOihHdGtQcm9ncmVzc0Jhck9yaWVudGF0aW9uKSBvcmllbnRhdGlvbgp7CiAg
ICBndGtfcHJvZ3Jlc3NfYmFyX3NldF9vcmllbnRhdGlvbihndGssIG9yaWVudGF0aW9uKTsKfQot
ICh2b2lkKSB1cGRhdGU6KGdmbG9hdCkgcGVyY2VudGFnZQp7CiAgICBndGtfcHJvZ3Jlc3NfYmFy
X3VwZGF0ZShndGssIHBlcmNlbnRhZ2UpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3Rp
dmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgs
IDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBm
cm9tIGd0a3JhZGlvYnV0dG9uLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAq
IHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1JhZGlvQnV0dG9uLmg+CgpAaW1w
bGVtZW50YXRpb24gR1RLUmFkaW9CdXR0b24KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1
cm4gZ3RrX3JhZGlvX2J1dHRvbl9nZXRfdHlwZSgpOwp9CisgKGlkKSByYWRpb0J1dHRvbldpdGhH
cm91cDooR1NMaXN0ICopIGdyb3VwCnsKICAgIHJldHVybiBbWyhHVEtSYWRpb0J1dHRvbiAqKVtz
ZWxmIGFsbG9jXSBpbml0V2l0aEdyb3VwOmdyb3VwXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGlu
aXRXaXRoR3JvdXA6KEdTTGlzdCAqKSBncm91cAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhH
dGs6Z3RrX3JhZGlvX2J1dHRvbl9uZXcoIGdyb3VwKV07Cn0KKyAoaWQpIHJhZGlvQnV0dG9uRnJv
bVdpZGdldFdpdGhHcm91cDooR1RLUmFkaW9CdXR0b24gKikgZ3JvdXAKewogICAgcmV0dXJuIFtb
KEdUS1JhZGlvQnV0dG9uICopW3NlbGYgYWxsb2NdIGluaXRGcm9tV2lkZ2V0V2l0aEdyb3VwOmdy
b3VwXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRGcm9tV2lkZ2V0V2l0aEdyb3VwOihHVEtS
YWRpb0J1dHRvbiAqKSBncm91cAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3Jh
ZGlvX2J1dHRvbl9uZXdfZnJvbV93aWRnZXQoIGdyb3VwID8gZ3JvdXAtPmd0ayA6IDApXTsKfQor
IChpZCkgcmFkaW9CdXR0b25XaXRoTGFiZWw6KEdTTGlzdCAqKSBncm91cCBsYWJlbDooTlNTdHJp
bmcgKikgbGFiZWwKewogICAgcmV0dXJuIFtbKEdUS1JhZGlvQnV0dG9uICopW3NlbGYgYWxsb2Nd
IGluaXRXaXRoTGFiZWw6Z3JvdXAgbGFiZWw6bGFiZWxdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkg
aW5pdFdpdGhMYWJlbDooR1NMaXN0ICopIGdyb3VwIGxhYmVsOihOU1N0cmluZyAqKSBsYWJlbAp7
CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3JhZGlvX2J1dHRvbl9uZXdfd2l0aF9s
YWJlbCggZ3JvdXAgLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBsYWJlbCkpXTsKfQorIChpZCkgcmFk
aW9CdXR0b25XaXRoTGFiZWxGcm9tV2lkZ2V0OihHVEtSYWRpb0J1dHRvbiAqKSBncm91cCBsYWJl
bDooTlNTdHJpbmcgKikgbGFiZWwKewogICAgcmV0dXJuIFtbKEdUS1JhZGlvQnV0dG9uICopW3Nl
bGYgYWxsb2NdIGluaXRXaXRoTGFiZWxGcm9tV2lkZ2V0Omdyb3VwIGxhYmVsOmxhYmVsXSBhdXRv
cmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoTGFiZWxGcm9tV2lkZ2V0OihHVEtSYWRpb0J1dHRv
biAqKSBncm91cCBsYWJlbDooTlNTdHJpbmcgKikgbGFiZWwKewogICAgcmV0dXJuIFtzZWxmIGlu
aXRXaXRoR3RrOmd0a19yYWRpb19idXR0b25fbmV3X3dpdGhfbGFiZWxfZnJvbV93aWRnZXQoIGdy
b3VwICA/IGdyb3VwIC0+Z3RrIDogMCxndG9vbGtpdF91dGY4X3N0cmluZyggbGFiZWwpKV07Cn0K
LSAoR1NMaXN0KikgZ3JvdXAKewogICAgcmV0dXJuIGd0a19yYWRpb19idXR0b25fZ3JvdXAoZ3Rr
KTsKfQotICh2b2lkKSBzZXRHcm91cDooR1NMaXN0ICopIGdyb3VwCnsKICAgIGd0a19yYWRpb19i
dXR0b25fc2V0X2dyb3VwKGd0aywgZ3JvdXApOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmpl
Y3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5
OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxs
eSBmcm9tIGd0a3JhZGlvbWVudWl0ZW0uaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLUmFkaW9NZW51SXRlbS5o
PgoKQGltcGxlbWVudGF0aW9uIEdUS1JhZGlvTWVudUl0ZW0KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7
CiAgICByZXR1cm4gZ3RrX3JhZGlvX21lbnVfaXRlbV9nZXRfdHlwZSgpOwp9CisgKGlkKSByYWRp
b01lbnVJdGVtV2l0aEdyb3VwOihHU0xpc3QgKikgZ3JvdXAKewogICAgcmV0dXJuIFtbKEdUS1Jh
ZGlvTWVudUl0ZW0gKilbc2VsZiBhbGxvY10gaW5pdFdpdGhHcm91cDpncm91cF0gYXV0b3JlbGVh
c2VdOwp9Ci0gKGlkKSBpbml0V2l0aEdyb3VwOihHU0xpc3QgKikgZ3JvdXAKewogICAgcmV0dXJu
IFtzZWxmIGluaXRXaXRoR3RrOmd0a19yYWRpb19tZW51X2l0ZW1fbmV3KCBncm91cCldOwp9Cisg
KGlkKSByYWRpb01lbnVJdGVtV2l0aExhYmVsOihHU0xpc3QgKikgZ3JvdXAgbGFiZWw6KE5TU3Ry
aW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbWyhHVEtSYWRpb01lbnVJdGVtICopW3NlbGYgYWxs
b2NdIGluaXRXaXRoTGFiZWw6Z3JvdXAgbGFiZWw6bGFiZWxdIGF1dG9yZWxlYXNlXTsKfQotIChp
ZCkgaW5pdFdpdGhMYWJlbDooR1NMaXN0ICopIGdyb3VwIGxhYmVsOihOU1N0cmluZyAqKSBsYWJl
bAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3JhZGlvX21lbnVfaXRlbV9uZXdf
d2l0aF9sYWJlbCggZ3JvdXAgLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBsYWJlbCkpXTsKfQotIChH
U0xpc3QqKSBncm91cAp7CiAgICByZXR1cm4gZ3RrX3JhZGlvX21lbnVfaXRlbV9ncm91cChndGsp
Owp9Ci0gKHZvaWQpIHNldEdyb3VwOihHU0xpc3QgKikgZ3JvdXAKewogICAgZ3RrX3JhZGlvX21l
bnVfaXRlbV9zZXRfZ3JvdXAoZ3RrLCBncm91cCk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9i
amVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykg
MTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNh
bGx5IGZyb20gZ3RrcmFuZ2UuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICog
dmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLUmFuZ2UuaD4KI2luY2x1ZGUgPEdU
b29sS2l0L0dUS0FkanVzdG1lbnQuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtSYW5nZQorIChHdGtU
eXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfcmFuZ2VfZ2V0X3R5cGUoKTsKfQotIChHVEtB
ZGp1c3RtZW50KikgZ2V0QWRqdXN0bWVudAp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0
a19yYW5nZV9nZXRfYWRqdXN0bWVudChndGspLCAwKTsKfQotICh2b2lkKSBzZXRVcGRhdGVQb2xp
Y3k6KEd0a1VwZGF0ZVR5cGUpIHBvbGljeQp7CiAgICBndGtfcmFuZ2Vfc2V0X3VwZGF0ZV9wb2xp
Y3koZ3RrLCBwb2xpY3kpOwp9Ci0gKHZvaWQpIHNldEFkanVzdG1lbnQ6KEdUS0FkanVzdG1lbnQg
KikgYWRqdXN0bWVudAp7CiAgICBndGtfcmFuZ2Vfc2V0X2FkanVzdG1lbnQoZ3RrLCBhZGp1c3Rt
ZW50ID8gYWRqdXN0bWVudC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgZHJhd0JhY2tncm91bmQKewog
ICAgZ3RrX3JhbmdlX2RyYXdfYmFja2dyb3VuZChndGspOwp9Ci0gKHZvaWQpIGNsZWFyQmFja2dy
b3VuZAp7CiAgICBndGtfcmFuZ2VfY2xlYXJfYmFja2dyb3VuZChndGspOwp9Ci0gKHZvaWQpIGRy
YXdUcm91Z2gKewogICAgZ3RrX3JhbmdlX2RyYXdfdHJvdWdoKGd0ayk7Cn0KLSAodm9pZCkgZHJh
d1NsaWRlcgp7CiAgICBndGtfcmFuZ2VfZHJhd19zbGlkZXIoZ3RrKTsKfQotICh2b2lkKSBkcmF3
U3RlcEZvcncKewogICAgZ3RrX3JhbmdlX2RyYXdfc3RlcF9mb3J3KGd0ayk7Cn0KLSAodm9pZCkg
ZHJhd1N0ZXBCYWNrCnsKICAgIGd0a19yYW5nZV9kcmF3X3N0ZXBfYmFjayhndGspOwp9Ci0gKHZv
aWQpIHNsaWRlclVwZGF0ZQp7CiAgICBndGtfcmFuZ2Vfc2xpZGVyX3VwZGF0ZShndGspOwp9Ci0g
KGdpbnQpIHRyb3VnaENsaWNrOihnaW50KSB4IHk6KGdpbnQpIHkganVtcFBlcmM6KGdmbG9hdCAq
KSBqdW1wX3BlcmMKewogICAgcmV0dXJuIGd0a19yYW5nZV90cm91Z2hfY2xpY2soZ3RrLCB4ICwg
eSAsIGp1bXBfcGVyYyk7Cn0KLSAodm9pZCkgZGVmYXVsdEhzbGlkZXJVcGRhdGUKewogICAgZ3Rr
X3JhbmdlX2RlZmF1bHRfaHNsaWRlcl91cGRhdGUoZ3RrKTsKfQotICh2b2lkKSBkZWZhdWx0VnNs
aWRlclVwZGF0ZQp7CiAgICBndGtfcmFuZ2VfZGVmYXVsdF92c2xpZGVyX3VwZGF0ZShndGspOwp9
Ci0gKGdpbnQpIGRlZmF1bHRIdHJvdWdoQ2xpY2s6KGdpbnQpIHggeTooZ2ludCkgeSBqdW1wUGVy
YzooZ2Zsb2F0ICopIGp1bXBfcGVyYwp7CiAgICByZXR1cm4gZ3RrX3JhbmdlX2RlZmF1bHRfaHRy
b3VnaF9jbGljayhndGssIHggLCB5ICwganVtcF9wZXJjKTsKfQotIChnaW50KSBkZWZhdWx0VnRy
b3VnaENsaWNrOihnaW50KSB4IHk6KGdpbnQpIHkganVtcFBlcmM6KGdmbG9hdCAqKSBqdW1wX3Bl
cmMKewogICAgcmV0dXJuIGd0a19yYW5nZV9kZWZhdWx0X3Z0cm91Z2hfY2xpY2soZ3RrLCB4ICwg
eSAsIGp1bXBfcGVyYyk7Cn0KLSAodm9pZCkgZGVmYXVsdEhtb3Rpb246KGdpbnQpIHhkZWx0YSB5
ZGVsdGE6KGdpbnQpIHlkZWx0YQp7CiAgICBndGtfcmFuZ2VfZGVmYXVsdF9obW90aW9uKGd0aywg
eGRlbHRhICwgeWRlbHRhKTsKfQotICh2b2lkKSBkZWZhdWx0Vm1vdGlvbjooZ2ludCkgeGRlbHRh
IHlkZWx0YTooZ2ludCkgeWRlbHRhCnsKICAgIGd0a19yYW5nZV9kZWZhdWx0X3Ztb3Rpb24oZ3Rr
LCB4ZGVsdGEgLCB5ZGVsdGEpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBp
bnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTks
IDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0
a3J1bGVyLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4x
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgog
Ki8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1J1bGVyLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLUnVs
ZXIKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3J1bGVyX2dldF90eXBlKCk7
Cn0KLSAodm9pZCkgc2V0TWV0cmljOihHdGtNZXRyaWNUeXBlKSBtZXRyaWMKewogICAgZ3RrX3J1
bGVyX3NldF9tZXRyaWMoZ3RrLCBtZXRyaWMpOwp9Ci0gKHZvaWQpIHNldFJhbmdlOihnZmxvYXQp
IGxvd2VyIHVwcGVyOihnZmxvYXQpIHVwcGVyIHBvc2l0aW9uOihnZmxvYXQpIHBvc2l0aW9uIG1h
eFNpemU6KGdmbG9hdCkgbWF4X3NpemUKewogICAgZ3RrX3J1bGVyX3NldF9yYW5nZShndGssIGxv
d2VyICwgdXBwZXIgLCBwb3NpdGlvbiAsIG1heF9zaXplKTsKfQotICh2b2lkKSBkcmF3VGlja3MK
ewogICAgZ3RrX3J1bGVyX2RyYXdfdGlja3MoZ3RrKTsKfQotICh2b2lkKSBkcmF3UG9zCnsKICAg
IGd0a19ydWxlcl9kcmF3X3BvcyhndGspOwp9CiNkZWZpbmUgZ3RrCSgoR3RrUnVsZXIgKikgZ3Rr
KQotICh2b2lkKSBzZXRQb3NpdGlvbjooZ2Zsb2F0KSBwb3NpdGlvbgp7CiAgICBndGstPnBvc2l0
aW9uID0gcG9zaXRpb247Cn0KLSAoZ2Zsb2F0KSBwb3NpdGlvbgp7CiAgICByZXR1cm4gZ3RrLT5w
b3NpdGlvbjsKfQojdW5kZWYgZ3RrCkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBp
bnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTks
IDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0
a3NjYWxlLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4x
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgog
Ki8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1NjYWxlLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLU2Nh
bGUKKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3NjYWxlX2dldF90eXBlKCk7
Cn0KLSAodm9pZCkgc2V0RGlnaXRzOihnaW50KSBkaWdpdHMKewogICAgZ3RrX3NjYWxlX3NldF9k
aWdpdHMoZ3RrLCBkaWdpdHMpOwp9Ci0gKHZvaWQpIHNldERyYXdWYWx1ZTooZ2Jvb2xlYW4pIGRy
YXdfdmFsdWUKewogICAgZ3RrX3NjYWxlX3NldF9kcmF3X3ZhbHVlKGd0aywgZHJhd192YWx1ZSk7
Cn0KLSAodm9pZCkgc2V0VmFsdWVQb3M6KEd0a1Bvc2l0aW9uVHlwZSkgcG9zCnsKICAgIGd0a19z
Y2FsZV9zZXRfdmFsdWVfcG9zKGd0aywgcG9zKTsKfQotIChnaW50KSBnZXRWYWx1ZVdpZHRoCnsK
ICAgIHJldHVybiBndGtfc2NhbGVfZ2V0X3ZhbHVlX3dpZHRoKGd0ayk7Cn0KLSAodm9pZCkgZHJh
d1ZhbHVlCnsKICAgIGd0a19zY2FsZV9kcmF3X3ZhbHVlKGd0ayk7Cn0KLSAodm9pZCkgc2V0RG91
YmxlVmFsdWU6KGRvdWJsZSkgdmFsdWUKewogICAgR3RrQWRqdXN0bWVudCAqYWRqdXN0bWVudCA9
IGd0a19yYW5nZV9nZXRfYWRqdXN0bWVudChndGspOwogICAgZ2Zsb2F0IG5ld192YWx1ZSA9IHZh
bHVlOwoKICAgIGlmIChhZGp1c3RtZW50LT52YWx1ZSAhPSBuZXdfdmFsdWUpCglndGtfYWRqdXN0
bWVudF9zZXRfdmFsdWUoYWRqdXN0bWVudCwgbmV3X3ZhbHVlKTsKfQoKLSAoZG91YmxlKSBkb3Vi
bGVWYWx1ZQp7CiAgICByZXR1cm4gZ3RrX3JhbmdlX2dldF9hZGp1c3RtZW50KGd0ayktPnZhbHVl
Owp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJ
TVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdp
ZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3Njcm9sbGJhci5oIGJ5IGd0
a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxH
VG9vbEtpdC9HVEtTY3JvbGxiYXIuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtTY3JvbGxiYXIKKyAo
R3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3Njcm9sbGJhcl9nZXRfdHlwZSgpOwp9
CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAg
VG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwog
KgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3Njcm9sbGVkd2luZG93LmggYnkg
Z3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUg
PEdUb29sS2l0L0dUS1Njcm9sbGVkV2luZG93Lmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtXaWRn
ZXQuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0FkanVzdG1lbnQuaD4KCkBpbXBsZW1lbnRhdGlv
biBHVEtTY3JvbGxlZFdpbmRvdworIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtf
c2Nyb2xsZWRfd2luZG93X2dldF90eXBlKCk7Cn0KKyAoaWQpIHNjcm9sbGVkV2luZG93V2l0aEhh
ZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGhhZGp1c3RtZW50IHZhZGp1c3RtZW50OihHVEtB
ZGp1c3RtZW50ICopIHZhZGp1c3RtZW50CnsKICAgIHJldHVybiBbWyhHVEtTY3JvbGxlZFdpbmRv
dyAqKVtzZWxmIGFsbG9jXSBpbml0V2l0aEhhZGp1c3RtZW50OmhhZGp1c3RtZW50IHZhZGp1c3Rt
ZW50OnZhZGp1c3RtZW50XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoSGFkanVzdG1l
bnQ6KEdUS0FkanVzdG1lbnQgKikgaGFkanVzdG1lbnQgdmFkanVzdG1lbnQ6KEdUS0FkanVzdG1l
bnQgKikgdmFkanVzdG1lbnQKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a19zY3Jv
bGxlZF93aW5kb3dfbmV3KCBoYWRqdXN0bWVudCAgPyBoYWRqdXN0bWVudCAtPmd0ayA6IDAsIHZh
ZGp1c3RtZW50ID8gdmFkanVzdG1lbnQtPmd0ayA6IDApXTsKfQotICh2b2lkKSBzZXRIYWRqdXN0
bWVudDooR1RLQWRqdXN0bWVudCAqKSBoYWRqdXN0bWVudAp7CiAgICBndGtfc2Nyb2xsZWRfd2lu
ZG93X3NldF9oYWRqdXN0bWVudChndGssIGhhZGp1c3RtZW50ID8gaGFkanVzdG1lbnQtPmd0ayA6
IDApOwp9Ci0gKHZvaWQpIHNldFZhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGhhZGp1c3Rt
ZW50CnsKICAgIGd0a19zY3JvbGxlZF93aW5kb3dfc2V0X3ZhZGp1c3RtZW50KGd0aywgaGFkanVz
dG1lbnQgPyBoYWRqdXN0bWVudC0+Z3RrIDogMCk7Cn0KLSAoR1RLQWRqdXN0bWVudCopIGdldEhh
ZGp1c3RtZW50CnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX3Njcm9sbGVkX3dpbmRv
d19nZXRfaGFkanVzdG1lbnQoZ3RrKSwgMCk7Cn0KLSAoR1RLQWRqdXN0bWVudCopIGdldFZhZGp1
c3RtZW50CnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX3Njcm9sbGVkX3dpbmRvd19n
ZXRfdmFkanVzdG1lbnQoZ3RrKSwgMCk7Cn0KLSAodm9pZCkgc2V0UG9saWN5OihHdGtQb2xpY3lU
eXBlKSBoc2Nyb2xsYmFyX3BvbGljeSB2c2Nyb2xsYmFyUG9saWN5OihHdGtQb2xpY3lUeXBlKSB2
c2Nyb2xsYmFyX3BvbGljeQp7CiAgICBndGtfc2Nyb2xsZWRfd2luZG93X3NldF9wb2xpY3koZ3Rr
LCBoc2Nyb2xsYmFyX3BvbGljeSAsIHZzY3JvbGxiYXJfcG9saWN5KTsKfQotICh2b2lkKSBzZXRQ
bGFjZW1lbnQ6KEd0a0Nvcm5lclR5cGUpIHdpbmRvd19wbGFjZW1lbnQKewogICAgZ3RrX3Njcm9s
bGVkX3dpbmRvd19zZXRfcGxhY2VtZW50KGd0aywgd2luZG93X3BsYWNlbWVudCk7Cn0KLSAodm9p
ZCkgYWRkV2l0aFZpZXdwb3J0OihHVEtXaWRnZXQgKikgY2hpbGQKewogICAgZ3RrX3Njcm9sbGVk
X3dpbmRvd19hZGRfd2l0aF92aWV3cG9ydChndGssIGNoaWxkID8gY2hpbGQtPmd0ayA6IDApOwp9
CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAg
VG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwog
KgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3NlcGFyYXRvci5oIGJ5IGd0a2dl
bi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVz
c2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9v
bEtpdC9HVEtTZXBhcmF0b3IuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtTZXBhcmF0b3IKKyAoR3Rr
VHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3NlcGFyYXRvcl9nZXRfdHlwZSgpOwp9CkBl
bmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9v
bGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgog
KiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3NvY2tldC5oIGJ5IGd0a2dlbi4KICoK
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdl
bmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9H
VEtTb2NrZXQuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtTb2NrZXQKKyAoaWQpIHNvY2tldAp7CiAg
ICByZXR1cm4gW1soR1RLU29ja2V0ICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsK
fQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3NvY2tldF9u
ZXcoKV07Cn0KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3NvY2tldF9nZXRf
dHlwZSgpOwp9Ci0gKHZvaWQpIHN0ZWFsOihndWludDMyKSB3aWQKewogICAgZ3RrX3NvY2tldF9z
dGVhbChndGssIHdpZCk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVy
ZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAw
MCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3Rrc3Bp
bmJ1dHRvbi5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIu
MSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
ICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtTcGluQnV0dG9uLmg+CiNpbmNsdWRlIDxHVG9vbEtp
dC9HVEtBZGp1c3RtZW50Lmg+CgpAaW1wbGVtZW50YXRpb24gR1RLU3BpbkJ1dHRvbgorIChHdGtU
eXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfc3Bpbl9idXR0b25fZ2V0X3R5cGUoKTsKfQot
ICh2b2lkKSBjb25maWd1cmU6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudCBjbGltYlJhdGU6
KGdmbG9hdCkgY2xpbWJfcmF0ZSBkaWdpdHM6KGd1aW50KSBkaWdpdHMKewogICAgZ3RrX3NwaW5f
YnV0dG9uX2NvbmZpZ3VyZShndGssIGFkanVzdG1lbnQgID8gYWRqdXN0bWVudCAtPmd0ayA6IDAs
IGNsaW1iX3JhdGUgLCBkaWdpdHMpOwp9CisgKGlkKSBzcGluQnV0dG9uV2l0aEFkanVzdG1lbnQ6
KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudCBjbGltYlJhdGU6KGdmbG9hdCkgY2xpbWJfcmF0
ZSBkaWdpdHM6KGd1aW50KSBkaWdpdHMKewogICAgcmV0dXJuIFtbKEdUS1NwaW5CdXR0b24gKilb
c2VsZiBhbGxvY10gaW5pdFdpdGhBZGp1c3RtZW50OmFkanVzdG1lbnQgY2xpbWJSYXRlOmNsaW1i
X3JhdGUgZGlnaXRzOmRpZ2l0c10gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aEFkanVz
dG1lbnQ6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudCBjbGltYlJhdGU6KGdmbG9hdCkgY2xp
bWJfcmF0ZSBkaWdpdHM6KGd1aW50KSBkaWdpdHMKewogICAgcmV0dXJuIFtzZWxmIGluaXRXaXRo
R3RrOmd0a19zcGluX2J1dHRvbl9uZXcoIGFkanVzdG1lbnQgID8gYWRqdXN0bWVudCAtPmd0ayA6
IDAsIGNsaW1iX3JhdGUgLCBkaWdpdHMpXTsKfQotICh2b2lkKSBzZXRBZGp1c3RtZW50OihHVEtB
ZGp1c3RtZW50ICopIGFkanVzdG1lbnQKewogICAgZ3RrX3NwaW5fYnV0dG9uX3NldF9hZGp1c3Rt
ZW50KGd0aywgYWRqdXN0bWVudCA/IGFkanVzdG1lbnQtPmd0ayA6IDApOwp9Ci0gKEdUS0FkanVz
dG1lbnQqKSBnZXRBZGp1c3RtZW50CnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX3Nw
aW5fYnV0dG9uX2dldF9hZGp1c3RtZW50KGd0ayksIDApOwp9Ci0gKHZvaWQpIHNldERpZ2l0czoo
Z3VpbnQpIGRpZ2l0cwp7CiAgICBndGtfc3Bpbl9idXR0b25fc2V0X2RpZ2l0cyhndGssIGRpZ2l0
cyk7Cn0KLSAoZ2Zsb2F0KSBnZXRWYWx1ZUFzRmxvYXQKewogICAgcmV0dXJuIGd0a19zcGluX2J1
dHRvbl9nZXRfdmFsdWVfYXNfZmxvYXQoZ3RrKTsKfQotIChnaW50KSBnZXRWYWx1ZUFzSW50CnsK
ICAgIHJldHVybiBndGtfc3Bpbl9idXR0b25fZ2V0X3ZhbHVlX2FzX2ludChndGspOwp9Ci0gKHZv
aWQpIHNldFZhbHVlOihnZmxvYXQpIHZhbHVlCnsKICAgIGd0a19zcGluX2J1dHRvbl9zZXRfdmFs
dWUoZ3RrLCB2YWx1ZSk7Cn0KLSAodm9pZCkgc2V0VXBkYXRlUG9saWN5OihHdGtTcGluQnV0dG9u
VXBkYXRlUG9saWN5KSBwb2xpY3kKewogICAgZ3RrX3NwaW5fYnV0dG9uX3NldF91cGRhdGVfcG9s
aWN5KGd0aywgcG9saWN5KTsKfQotICh2b2lkKSBzZXROdW1lcmljOihnYm9vbGVhbikgbnVtZXJp
Ywp7CiAgICBndGtfc3Bpbl9idXR0b25fc2V0X251bWVyaWMoZ3RrLCBudW1lcmljKTsKfQotICh2
b2lkKSBzcGluOihHdGtTcGluVHlwZSkgZGlyZWN0aW9uIGluY3JlbWVudDooZ2Zsb2F0KSBpbmNy
ZW1lbnQKewogICAgZ3RrX3NwaW5fYnV0dG9uX3NwaW4oZ3RrLCBkaXJlY3Rpb24gLCBpbmNyZW1l
bnQpOwp9Ci0gKHZvaWQpIHNldFdyYXA6KGdib29sZWFuKSB3cmFwCnsKICAgIGd0a19zcGluX2J1
dHRvbl9zZXRfd3JhcChndGssIHdyYXApOwp9Ci0gKHZvaWQpIHNldFNoYWRvd1R5cGU6KEd0a1No
YWRvd1R5cGUpIHNoYWRvd190eXBlCnsKICAgIGd0a19zcGluX2J1dHRvbl9zZXRfc2hhZG93X3R5
cGUoZ3RrLCBzaGFkb3dfdHlwZSk7Cn0KLSAodm9pZCkgc2V0U25hcFRvVGlja3M6KGdib29sZWFu
KSBzbmFwX3RvX3RpY2tzCnsKICAgIGd0a19zcGluX2J1dHRvbl9zZXRfc25hcF90b190aWNrcyhn
dGssIHNuYXBfdG9fdGlja3MpOwp9Ci0gKHZvaWQpIHVwZGF0ZQp7CiAgICBndGtfc3Bpbl9idXR0
b25fdXBkYXRlKGd0ayk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVy
ZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAw
MCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3Rrc3Rh
dHVzYmFyLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4x
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgog
Ki8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1N0YXR1c2Jhci5oPgoKQGltcGxlbWVudGF0aW9uIEdU
S1N0YXR1c2JhcgorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfc3RhdHVzYmFy
X2dldF90eXBlKCk7Cn0KKyAoaWQpIHN0YXR1c2Jhcgp7CiAgICByZXR1cm4gW1soR1RLU3RhdHVz
YmFyICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAg
ICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3N0YXR1c2Jhcl9uZXcoKV07Cn0KLSAoZ3Vp
bnQpIGdldENvbnRleHRJZDooTlNTdHJpbmcgKikgY29udGV4dF9kZXNjcmlwdGlvbgp7CiAgICBy
ZXR1cm4gZ3RrX3N0YXR1c2Jhcl9nZXRfY29udGV4dF9pZChndGssZ3Rvb2xraXRfdXRmOF9zdHJp
bmcoIGNvbnRleHRfZGVzY3JpcHRpb24pKTsKfQotIChndWludCkgcHVzaDooZ3VpbnQpIGNvbnRl
eHRfaWQgdGV4dDooTlNTdHJpbmcgKikgdGV4dAp7CiAgICByZXR1cm4gZ3RrX3N0YXR1c2Jhcl9w
dXNoKGd0aywgY29udGV4dF9pZCAsZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRleHQpKTsKfQotICh2
b2lkKSBwb3A6KGd1aW50KSBjb250ZXh0X2lkCnsKICAgIGd0a19zdGF0dXNiYXJfcG9wKGd0aywg
Y29udGV4dF9pZCk7Cn0KLSAodm9pZCkgcmVtb3ZlOihndWludCkgY29udGV4dF9pZCBtZXNzYWdl
SWQ6KGd1aW50KSBtZXNzYWdlX2lkCnsKICAgIGd0a19zdGF0dXNiYXJfcmVtb3ZlKGd0aywgY29u
dGV4dF9pZCAsIG1lc3NhZ2VfaWQpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUt
QyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5
OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9t
IGd0a3N0eWxlLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24g
Mi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1N0eWxlLmg+CgpAaW1wbGVtZW50YXRpb24gR1RL
U3R5bGUKKyAoaWQpIHN0eWxlCnsKICAgIHJldHVybiBbWyhHVEtTdHlsZSAqKVtzZWxmIGFsbG9j
XSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJuIFtzZWxmIGlu
aXRXaXRoR3RrOmd0a19zdHlsZV9uZXcoKV07Cn0KLSAoR1RLU3R5bGUqKSBjb3B5CnsKICAgIHJl
dHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX3N0eWxlX2NvcHkoZ3RrKSwgIkdUS1N0eWxlIik7Cn0K
LSAoR1RLU3R5bGUqKSBhdHRhY2g6KEdka1dpbmRvdyAqKSB3aW5kb3cKewogICAgcmV0dXJuIGd0
b29sa2l0X29iamVjdChndGtfc3R5bGVfYXR0YWNoKGd0aywgd2luZG93KSwgIkdUS1N0eWxlIik7
Cn0KLSAodm9pZCkgZGV0YWNoCnsKICAgIGd0a19zdHlsZV9kZXRhY2goZ3RrKTsKfQotIChHVEtT
dHlsZSopIHJlZgp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a19zdHlsZV9yZWYoZ3Rr
KSwgIkdUS1N0eWxlIik7Cn0KLSAodm9pZCkgdW5yZWYKewogICAgZ3RrX3N0eWxlX3VucmVmKGd0
ayk7Cn0KLSAodm9pZCkgc2V0QmFja2dyb3VuZDooR2RrV2luZG93ICopIHdpbmRvdyBzdGF0ZVR5
cGU6KEd0a1N0YXRlVHlwZSkgc3RhdGVfdHlwZQp7CiAgICBndGtfc3R5bGVfc2V0X2JhY2tncm91
bmQoZ3RrLCB3aW5kb3cgLCBzdGF0ZV90eXBlKTsKfQotICh2b2lkKSBhcHBseURlZmF1bHRCYWNr
Z3JvdW5kOihHZGtXaW5kb3cgKikgd2luZG93IHNldEJnOihnYm9vbGVhbikgc2V0X2JnIHN0YXRl
VHlwZTooR3RrU3RhdGVUeXBlKSBzdGF0ZV90eXBlIGFyZWE6KEdka1JlY3RhbmdsZSAqKSBhcmVh
IHg6KGdpbnQpIHggeTooZ2ludCkgeSB3aWR0aDooZ2ludCkgd2lkdGggaGVpZ2h0OihnaW50KSBo
ZWlnaHQKewogICAgZ3RrX3N0eWxlX2FwcGx5X2RlZmF1bHRfYmFja2dyb3VuZChndGssIHdpbmRv
dyAsIHNldF9iZyAsIHN0YXRlX3R5cGUgLCBhcmVhICwgeCAsIHkgLCB3aWR0aCAsIGhlaWdodCk7
Cn0KI2RlZmluZSBndGsJKChHdGtTdHlsZSAqKSBndGspCiAtIChvbmV3YXkgdm9pZCkgcmVsZWFz
ZQp7CiAgICB1bnNpZ25lZCByZWZfY291bnQgPSBndGsgPyBndGstPnJlZl9jb3VudCA6IDE7Cgoj
aWZkZWYgREVCVUcKICAgIGlmIChyZWZfY291bnQgPT0gMCkgZ19lcnJvcigicmVmX2NvdW50ID09
IDAgaW4gIiBfX0ZJTEVfXyAiIChyZWxlYXNlKSIpOwojZW5kaWYKICAgIGlmIChndGspIFtzZWxm
IHVucmVmXTsKICAgIGlmIChyZWZfY291bnQgPT0gMSkgW3NlbGYgZGVhbGxvY107Cn0KCiAtIChp
ZCkgcmV0YWluCnsKICAgIGlmIChndGspIFtzZWxmIHJlZl07CiAgICByZXR1cm4gc2VsZjsKfQoK
IC0gKHVuc2lnbmVkKSByZXRhaW5Db3VudAp7CiAgICByZXR1cm4gZ3RrID8gZ3RrLT5yZWZfY291
bnQgOiAxOwp9CiN1bmRlZiBndGsKQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGlu
dGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwg
MjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3Rr
dGFibGUuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAq
LwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLVGFibGUuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1dp
ZGdldC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS1RhYmxlCisgKEd0a1R5cGUpIGdldFR5cGUKewog
ICAgcmV0dXJuIGd0a190YWJsZV9nZXRfdHlwZSgpOwp9CisgKGlkKSB0YWJsZVdpdGhSb3dzOihn
dWludCkgcm93cyBjb2x1bW5zOihndWludCkgY29sdW1ucyBob21vZ2VuZW91czooZ2Jvb2xlYW4p
IGhvbW9nZW5lb3VzCnsKICAgIHJldHVybiBbWyhHVEtUYWJsZSAqKVtzZWxmIGFsbG9jXSBpbml0
V2l0aFJvd3M6cm93cyBjb2x1bW5zOmNvbHVtbnMgaG9tb2dlbmVvdXM6aG9tb2dlbmVvdXNdIGF1
dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdFdpdGhSb3dzOihndWludCkgcm93cyBjb2x1bW5zOihn
dWludCkgY29sdW1ucyBob21vZ2VuZW91czooZ2Jvb2xlYW4pIGhvbW9nZW5lb3VzCnsKICAgIHJl
dHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdGFibGVfbmV3KCByb3dzICwgY29sdW1ucyAsIGhv
bW9nZW5lb3VzKV07Cn0KLSAodm9pZCkgcmVzaXplOihndWludCkgcm93cyBjb2x1bW5zOihndWlu
dCkgY29sdW1ucwp7CiAgICBndGtfdGFibGVfcmVzaXplKGd0aywgcm93cyAsIGNvbHVtbnMpOwp9
Ci0gKHZvaWQpIGF0dGFjaDooR1RLV2lkZ2V0ICopIGNoaWxkIGxlZnRBdHRhY2g6KGd1aW50KSBs
ZWZ0X2F0dGFjaCByaWdodEF0dGFjaDooZ3VpbnQpIHJpZ2h0X2F0dGFjaCB0b3BBdHRhY2g6KGd1
aW50KSB0b3BfYXR0YWNoIGJvdHRvbUF0dGFjaDooZ3VpbnQpIGJvdHRvbV9hdHRhY2ggeG9wdGlv
bnM6KEd0a0F0dGFjaE9wdGlvbnMpIHhvcHRpb25zIHlvcHRpb25zOihHdGtBdHRhY2hPcHRpb25z
KSB5b3B0aW9ucyB4cGFkZGluZzooZ3VpbnQpIHhwYWRkaW5nIHlwYWRkaW5nOihndWludCkgeXBh
ZGRpbmcKewogICAgZ3RrX3RhYmxlX2F0dGFjaChndGssIGNoaWxkICA/IGNoaWxkIC0+Z3RrIDog
MCwgbGVmdF9hdHRhY2ggLCByaWdodF9hdHRhY2ggLCB0b3BfYXR0YWNoICwgYm90dG9tX2F0dGFj
aCAsIHhvcHRpb25zICwgeW9wdGlvbnMgLCB4cGFkZGluZyAsIHlwYWRkaW5nKTsKfQotICh2b2lk
KSBhdHRhY2hEZWZhdWx0czooR1RLV2lkZ2V0ICopIHdpZGdldCBsZWZ0QXR0YWNoOihndWludCkg
bGVmdF9hdHRhY2ggcmlnaHRBdHRhY2g6KGd1aW50KSByaWdodF9hdHRhY2ggdG9wQXR0YWNoOihn
dWludCkgdG9wX2F0dGFjaCBib3R0b21BdHRhY2g6KGd1aW50KSBib3R0b21fYXR0YWNoCnsKICAg
IGd0a190YWJsZV9hdHRhY2hfZGVmYXVsdHMoZ3RrLCB3aWRnZXQgID8gd2lkZ2V0IC0+Z3RrIDog
MCwgbGVmdF9hdHRhY2ggLCByaWdodF9hdHRhY2ggLCB0b3BfYXR0YWNoICwgYm90dG9tX2F0dGFj
aCk7Cn0KLSAodm9pZCkgc2V0Um93OihndWludCkgcm93IHNwYWNpbmc6KGd1aW50KSBzcGFjaW5n
CnsKICAgIGd0a190YWJsZV9zZXRfcm93X3NwYWNpbmcoZ3RrLCByb3cgLCBzcGFjaW5nKTsKfQot
ICh2b2lkKSBzZXRDb2w6KGd1aW50KSBjb2x1bW4gc3BhY2luZzooZ3VpbnQpIHNwYWNpbmcKewog
ICAgZ3RrX3RhYmxlX3NldF9jb2xfc3BhY2luZyhndGssIGNvbHVtbiAsIHNwYWNpbmcpOwp9Ci0g
KHZvaWQpIHNldFJvd1NwYWNpbmdzOihndWludCkgc3BhY2luZwp7CiAgICBndGtfdGFibGVfc2V0
X3Jvd19zcGFjaW5ncyhndGssIHNwYWNpbmcpOwp9Ci0gKHZvaWQpIHNldENvbFNwYWNpbmdzOihn
dWludCkgc3BhY2luZwp7CiAgICBndGtfdGFibGVfc2V0X2NvbF9zcGFjaW5ncyhndGssIHNwYWNp
bmcpOwp9Ci0gKHZvaWQpIHNldEhvbW9nZW5lb3VzOihnYm9vbGVhbikgaG9tb2dlbmVvdXMKewog
ICAgZ3RrX3RhYmxlX3NldF9ob21vZ2VuZW91cyhndGssIGhvbW9nZW5lb3VzKTsKfQojZGVmaW5l
IGd0awkoKEd0a1RhYmxlICopIGd0aykKLSAoZ2ludCkgcm93cwp7CiAgICByZXR1cm4gZ3RrLT5u
cm93czsKfQotIChnaW50KSBjb2x1bW5zCnsKICAgIHJldHVybiBndGstPm5jb2xzOwp9CiN1bmRl
ZiBndGsKQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUg
R0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVk
d2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3RrdGVhcm9mZm1lbnVpdGVt
LmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2lu
Y2x1ZGUgPEdUb29sS2l0L0dUS1RlYXJvZmZNZW51SXRlbS5oPgoKQGltcGxlbWVudGF0aW9uIEdU
S1RlYXJvZmZNZW51SXRlbQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfdGVh
cm9mZl9tZW51X2l0ZW1fZ2V0X3R5cGUoKTsKfQorIChpZCkgdGVhcm9mZk1lbnVJdGVtCnsKICAg
IHJldHVybiBbWyhHVEtUZWFyb2ZmTWVudUl0ZW0gKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3Jl
bGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtf
dGVhcm9mZl9tZW51X2l0ZW1fbmV3KCldOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3Rp
dmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgs
IDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBm
cm9tIGd0a3RleHQuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lv
biAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLVGV4dC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQv
R1RLQWRqdXN0bWVudC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS1RleHQKKyAoR3RrVHlwZSkgZ2V0
VHlwZQp7CiAgICByZXR1cm4gZ3RrX3RleHRfZ2V0X3R5cGUoKTsKfQorIChpZCkgdGV4dFdpdGhI
YWRqOihHVEtBZGp1c3RtZW50ICopIGhhZGogdmFkajooR1RLQWRqdXN0bWVudCAqKSB2YWRqCnsK
ICAgIHJldHVybiBbWyhHVEtUZXh0ICopW3NlbGYgYWxsb2NdIGluaXRXaXRoSGFkajpoYWRqIHZh
ZGo6dmFkal0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aEhhZGo6KEdUS0FkanVzdG1l
bnQgKikgaGFkaiB2YWRqOihHVEtBZGp1c3RtZW50ICopIHZhZGoKewogICAgcmV0dXJuIFtzZWxm
IGluaXRXaXRoR3RrOmd0a190ZXh0X25ldyggaGFkaiAgPyBoYWRqIC0+Z3RrIDogMCwgdmFkaiA/
IHZhZGotPmd0ayA6IDApXTsKfQotICh2b2lkKSBzZXRFZGl0YWJsZTooZ2Jvb2xlYW4pIGVkaXRh
YmxlCnsKICAgIGd0a190ZXh0X3NldF9lZGl0YWJsZShndGssIGVkaXRhYmxlKTsKfQotICh2b2lk
KSBzZXRXb3JkV3JhcDooZ2ludCkgd29yZF93cmFwCnsKICAgIGd0a190ZXh0X3NldF93b3JkX3dy
YXAoZ3RrLCB3b3JkX3dyYXApOwp9Ci0gKHZvaWQpIHNldExpbmVXcmFwOihnaW50KSBsaW5lX3dy
YXAKewogICAgZ3RrX3RleHRfc2V0X2xpbmVfd3JhcChndGssIGxpbmVfd3JhcCk7Cn0KLSAodm9p
ZCkgc2V0QWRqdXN0bWVudHM6KEdUS0FkanVzdG1lbnQgKikgaGFkaiB2YWRqOihHVEtBZGp1c3Rt
ZW50ICopIHZhZGoKewogICAgZ3RrX3RleHRfc2V0X2FkanVzdG1lbnRzKGd0aywgaGFkaiAgPyBo
YWRqIC0+Z3RrIDogMCwgdmFkaiA/IHZhZGotPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHNldFBvaW50
OihndWludCkgaW5kZXgKewogICAgZ3RrX3RleHRfc2V0X3BvaW50KGd0aywgaW5kZXgpOwp9Ci0g
KGd1aW50KSBnZXRQb2ludAp7CiAgICByZXR1cm4gZ3RrX3RleHRfZ2V0X3BvaW50KGd0ayk7Cn0K
LSAoZ3VpbnQpIGdldExlbmd0aAp7CiAgICByZXR1cm4gZ3RrX3RleHRfZ2V0X2xlbmd0aChndGsp
Owp9Ci0gKHZvaWQpIGZyZWV6ZQp7CiAgICBndGtfdGV4dF9mcmVlemUoZ3RrKTsKfQotICh2b2lk
KSB0aGF3CnsKICAgIGd0a190ZXh0X3RoYXcoZ3RrKTsKfQotICh2b2lkKSBpbnNlcnQ6KEdka0Zv
bnQgKikgZm9udCBmb3JlOihHZGtDb2xvciAqKSBmb3JlIGJhY2s6KEdka0NvbG9yICopIGJhY2sg
Y2hhcnM6KE5TU3RyaW5nICopIGNoYXJzIGxlbmd0aDooZ2ludCkgbGVuZ3RoCnsKICAgIGd0a190
ZXh0X2luc2VydChndGssIGZvbnQgLCBmb3JlICwgYmFjayAsZ3Rvb2xraXRfdXRmOF9zdHJpbmco
IGNoYXJzICksIGxlbmd0aCk7Cn0KLSAoZ2ludCkgYmFja3dhcmREZWxldGU6KGd1aW50KSBuY2hh
cnMKewogICAgcmV0dXJuIGd0a190ZXh0X2JhY2t3YXJkX2RlbGV0ZShndGssIG5jaGFycyk7Cn0K
LSAoZ2ludCkgZm9yd2FyZERlbGV0ZTooZ3VpbnQpIG5jaGFycwp7CiAgICByZXR1cm4gZ3RrX3Rl
eHRfZm9yd2FyZF9kZWxldGUoZ3RrLCBuY2hhcnMpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBP
YmplY3RpdmUtQyBpbnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMp
IDE5OTgsIDE5OTksIDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGlj
YWxseSBmcm9tIGd0a3RpcHNxdWVyeS5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtUaXBzUXVlcnkuaD4KI2lu
Y2x1ZGUgPEdUb29sS2l0L0dUS1dpZGdldC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS1RpcHNRdWVy
eQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfdGlwc19xdWVyeV9nZXRfdHlw
ZSgpOwp9CisgKGlkKSB0aXBzUXVlcnkKewogICAgcmV0dXJuIFtbKEdUS1RpcHNRdWVyeSAqKVtz
ZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXQKewogICAgcmV0dXJu
IFtzZWxmIGluaXRXaXRoR3RrOmd0a190aXBzX3F1ZXJ5X25ldygpXTsKfQotICh2b2lkKSBzdGFy
dFF1ZXJ5CnsKICAgIGd0a190aXBzX3F1ZXJ5X3N0YXJ0X3F1ZXJ5KGd0ayk7Cn0KLSAodm9pZCkg
c3RvcFF1ZXJ5CnsKICAgIGd0a190aXBzX3F1ZXJ5X3N0b3BfcXVlcnkoZ3RrKTsKfQotICh2b2lk
KSBzZXRDYWxsZXI6KEdUS1dpZGdldCAqKSBjYWxsZXIKewogICAgZ3RrX3RpcHNfcXVlcnlfc2V0
X2NhbGxlcihndGssIGNhbGxlciA/IGNhbGxlci0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgc2V0TGFi
ZWxzOihOU1N0cmluZyAqKSBsYWJlbF9pbmFjdGl2ZSBsYWJlbE5vVGlwOihOU1N0cmluZyAqKSBs
YWJlbF9ub190aXAKewogICAgZ3RrX3RpcHNfcXVlcnlfc2V0X2xhYmVscyhndGssZ3Rvb2xraXRf
dXRmOF9zdHJpbmcoIGxhYmVsX2luYWN0aXZlICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIGxhYmVs
X25vX3RpcCkpOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZhY2Ug
dG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAgIEVs
bWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3RvZ2dsZWJ1
dHRvbi5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICov
CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtUb2dnbGVCdXR0b24uaD4KCkBpbXBsZW1lbnRhdGlvbiBH
VEtUb2dnbGVCdXR0b24KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3RvZ2ds
ZV9idXR0b25fZ2V0X3R5cGUoKTsKfQorIChpZCkgdG9nZ2xlQnV0dG9uCnsKICAgIHJldHVybiBb
WyhHVEtUb2dnbGVCdXR0b24gKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0g
KGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdG9nZ2xlX2J1dHRv
bl9uZXcoKV07Cn0KKyAoaWQpIHRvZ2dsZUJ1dHRvbldpdGhMYWJlbDooTlNTdHJpbmcgKikgbGFi
ZWwKewogICAgcmV0dXJuIFtbKEdUS1RvZ2dsZUJ1dHRvbiAqKVtzZWxmIGFsbG9jXSBpbml0V2l0
aExhYmVsOmxhYmVsXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoTGFiZWw6KE5TU3Ry
aW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdG9nZ2xlX2J1
dHRvbl9uZXdfd2l0aF9sYWJlbChndG9vbGtpdF91dGY4X3N0cmluZyggbGFiZWwpKV07Cn0KLSAo
dm9pZCkgc2V0TW9kZTooZ2Jvb2xlYW4pIGRyYXdfaW5kaWNhdG9yCnsKICAgIGd0a190b2dnbGVf
YnV0dG9uX3NldF9tb2RlKGd0aywgZHJhd19pbmRpY2F0b3IpOwp9Ci0gKHZvaWQpIHNldEFjdGl2
ZTooZ2Jvb2xlYW4pIGlzX2FjdGl2ZQp7CiAgICBndGtfdG9nZ2xlX2J1dHRvbl9zZXRfYWN0aXZl
KGd0aywgaXNfYWN0aXZlKTsKfQotIChnYm9vbGVhbikgZ2V0QWN0aXZlCnsKICAgIHJldHVybiBn
dGtfdG9nZ2xlX2J1dHRvbl9nZXRfYWN0aXZlKGd0ayk7Cn0KLSAodm9pZCkgdG9nZ2xlZAp7CiAg
ICBndGtfdG9nZ2xlX2J1dHRvbl90b2dnbGVkKGd0ayk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAt
IE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAo
YykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0
aWNhbGx5IGZyb20gZ3RrdG9vbGJhci5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtUb29sYmFyLmg+CiNpbmNs
dWRlIDxHVG9vbEtpdC9HVEtXaWRnZXQuaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtUb29sYmFyCisg
KEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a190b29sYmFyX2dldF90eXBlKCk7Cn0K
KyAoaWQpIHRvb2xiYXJXaXRoT3JpZW50YXRpb246KEd0a09yaWVudGF0aW9uKSBvcmllbnRhdGlv
biBzdHlsZTooR3RrVG9vbGJhclN0eWxlKSBzdHlsZQp7CiAgICByZXR1cm4gW1soR1RLVG9vbGJh
ciAqKVtzZWxmIGFsbG9jXSBpbml0V2l0aE9yaWVudGF0aW9uOm9yaWVudGF0aW9uIHN0eWxlOnN0
eWxlXSBhdXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoT3JpZW50YXRpb246KEd0a09yaWVu
dGF0aW9uKSBvcmllbnRhdGlvbiBzdHlsZTooR3RrVG9vbGJhclN0eWxlKSBzdHlsZQp7CiAgICBy
ZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3Rvb2xiYXJfbmV3KCBvcmllbnRhdGlvbiAsIHN0
eWxlKV07Cn0KLSAoR1RLV2lkZ2V0KikgYXBwZW5kSXRlbTooTlNTdHJpbmcgKikgdGV4dCB0b29s
dGlwVGV4dDooTlNTdHJpbmcgKikgdG9vbHRpcF90ZXh0IHRvb2x0aXBQcml2YXRlVGV4dDooTlNT
dHJpbmcgKikgdG9vbHRpcF9wcml2YXRlX3RleHQgaWNvbjooR1RLV2lkZ2V0ICopIGljb24gY2Fs
bGJhY2s6KEd0a1NpZ25hbEZ1bmMpIGNhbGxiYWNrIHVzZXJEYXRhOihncG9pbnRlcikgdXNlcl9k
YXRhCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX3Rvb2xiYXJfYXBwZW5kX2l0ZW0o
Z3RrLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0ZXh0ICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRv
b2x0aXBfdGV4dCApLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0b29sdGlwX3ByaXZhdGVfdGV4dCAp
LCBpY29uICA/IGljb24gLT5ndGsgOiAwLCBjYWxsYmFjayAsIHVzZXJfZGF0YSksIDApOwp9Ci0g
KEdUS1dpZGdldCopIHByZXBlbmRJdGVtOihOU1N0cmluZyAqKSB0ZXh0IHRvb2x0aXBUZXh0OihO
U1N0cmluZyAqKSB0b29sdGlwX3RleHQgdG9vbHRpcFByaXZhdGVUZXh0OihOU1N0cmluZyAqKSB0
b29sdGlwX3ByaXZhdGVfdGV4dCBpY29uOihHVEtXaWRnZXQgKikgaWNvbiBjYWxsYmFjazooR3Rr
U2lnbmFsRnVuYykgY2FsbGJhY2sgdXNlckRhdGE6KGdwb2ludGVyKSB1c2VyX2RhdGEKewogICAg
cmV0dXJuIGd0b29sa2l0X29iamVjdChndGtfdG9vbGJhcl9wcmVwZW5kX2l0ZW0oZ3RrLGd0b29s
a2l0X3V0Zjhfc3RyaW5nKCB0ZXh0ICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRvb2x0aXBfdGV4
dCApLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0b29sdGlwX3ByaXZhdGVfdGV4dCApLCBpY29uICA/
IGljb24gLT5ndGsgOiAwLCBjYWxsYmFjayAsIHVzZXJfZGF0YSksIDApOwp9Ci0gKEdUS1dpZGdl
dCopIGluc2VydEl0ZW06KE5TU3RyaW5nICopIHRleHQgdG9vbHRpcFRleHQ6KE5TU3RyaW5nICop
IHRvb2x0aXBfdGV4dCB0b29sdGlwUHJpdmF0ZVRleHQ6KE5TU3RyaW5nICopIHRvb2x0aXBfcHJp
dmF0ZV90ZXh0IGljb246KEdUS1dpZGdldCAqKSBpY29uIGNhbGxiYWNrOihHdGtTaWduYWxGdW5j
KSBjYWxsYmFjayB1c2VyRGF0YTooZ3BvaW50ZXIpIHVzZXJfZGF0YSBwb3NpdGlvbjooZ2ludCkg
cG9zaXRpb24KewogICAgcmV0dXJuIGd0b29sa2l0X29iamVjdChndGtfdG9vbGJhcl9pbnNlcnRf
aXRlbShndGssZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRleHQgKSxndG9vbGtpdF91dGY4X3N0cmlu
ZyggdG9vbHRpcF90ZXh0ICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRvb2x0aXBfcHJpdmF0ZV90
ZXh0ICksIGljb24gID8gaWNvbiAtPmd0ayA6IDAsIGNhbGxiYWNrICwgdXNlcl9kYXRhICwgcG9z
aXRpb24pLCAwKTsKfQotICh2b2lkKSBhcHBlbmRTcGFjZQp7CiAgICBndGtfdG9vbGJhcl9hcHBl
bmRfc3BhY2UoZ3RrKTsKfQotICh2b2lkKSBwcmVwZW5kU3BhY2UKewogICAgZ3RrX3Rvb2xiYXJf
cHJlcGVuZF9zcGFjZShndGspOwp9Ci0gKHZvaWQpIGluc2VydFNwYWNlOihnaW50KSBwb3NpdGlv
bgp7CiAgICBndGtfdG9vbGJhcl9pbnNlcnRfc3BhY2UoZ3RrLCBwb3NpdGlvbik7Cn0KLSAoR1RL
V2lkZ2V0KikgYXBwZW5kRWxlbWVudDooR3RrVG9vbGJhckNoaWxkVHlwZSkgdHlwZSB3aWRnZXQ6
KEdUS1dpZGdldCAqKSB3aWRnZXQgdGV4dDooTlNTdHJpbmcgKikgdGV4dCB0b29sdGlwVGV4dDoo
TlNTdHJpbmcgKikgdG9vbHRpcF90ZXh0IHRvb2x0aXBQcml2YXRlVGV4dDooTlNTdHJpbmcgKikg
dG9vbHRpcF9wcml2YXRlX3RleHQgaWNvbjooR1RLV2lkZ2V0ICopIGljb24gY2FsbGJhY2s6KEd0
a1NpZ25hbEZ1bmMpIGNhbGxiYWNrIHVzZXJEYXRhOihncG9pbnRlcikgdXNlcl9kYXRhCnsKICAg
IHJldHVybiBndG9vbGtpdF9vYmplY3QoZ3RrX3Rvb2xiYXJfYXBwZW5kX2VsZW1lbnQoZ3RrLCB0
eXBlICwgd2lkZ2V0ICA/IHdpZGdldCAtPmd0ayA6IDAsZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRl
eHQgKSxndG9vbGtpdF91dGY4X3N0cmluZyggdG9vbHRpcF90ZXh0ICksZ3Rvb2xraXRfdXRmOF9z
dHJpbmcoIHRvb2x0aXBfcHJpdmF0ZV90ZXh0ICksIGljb24gID8gaWNvbiAtPmd0ayA6IDAsIGNh
bGxiYWNrICwgdXNlcl9kYXRhKSwgMCk7Cn0KLSAoR1RLV2lkZ2V0KikgcHJlcGVuZEVsZW1lbnQ6
KEd0a1Rvb2xiYXJDaGlsZFR5cGUpIHR5cGUgd2lkZ2V0OihHVEtXaWRnZXQgKikgd2lkZ2V0IHRl
eHQ6KE5TU3RyaW5nICopIHRleHQgdG9vbHRpcFRleHQ6KE5TU3RyaW5nICopIHRvb2x0aXBfdGV4
dCB0b29sdGlwUHJpdmF0ZVRleHQ6KE5TU3RyaW5nICopIHRvb2x0aXBfcHJpdmF0ZV90ZXh0IGlj
b246KEdUS1dpZGdldCAqKSBpY29uIGNhbGxiYWNrOihHdGtTaWduYWxGdW5jKSBjYWxsYmFjayB1
c2VyRGF0YTooZ3BvaW50ZXIpIHVzZXJfZGF0YQp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0
KGd0a190b29sYmFyX3ByZXBlbmRfZWxlbWVudChndGssIHR5cGUgLCB3aWRnZXQgID8gd2lkZ2V0
IC0+Z3RrIDogMCxndG9vbGtpdF91dGY4X3N0cmluZyggdGV4dCApLGd0b29sa2l0X3V0Zjhfc3Ry
aW5nKCB0b29sdGlwX3RleHQgKSxndG9vbGtpdF91dGY4X3N0cmluZyggdG9vbHRpcF9wcml2YXRl
X3RleHQgKSwgaWNvbiAgPyBpY29uIC0+Z3RrIDogMCwgY2FsbGJhY2sgLCB1c2VyX2RhdGEpLCAw
KTsKfQotIChHVEtXaWRnZXQqKSBpbnNlcnRFbGVtZW50OihHdGtUb29sYmFyQ2hpbGRUeXBlKSB0
eXBlIHdpZGdldDooR1RLV2lkZ2V0ICopIHdpZGdldCB0ZXh0OihOU1N0cmluZyAqKSB0ZXh0IHRv
b2x0aXBUZXh0OihOU1N0cmluZyAqKSB0b29sdGlwX3RleHQgdG9vbHRpcFByaXZhdGVUZXh0OihO
U1N0cmluZyAqKSB0b29sdGlwX3ByaXZhdGVfdGV4dCBpY29uOihHVEtXaWRnZXQgKikgaWNvbiBj
YWxsYmFjazooR3RrU2lnbmFsRnVuYykgY2FsbGJhY2sgdXNlckRhdGE6KGdwb2ludGVyKSB1c2Vy
X2RhdGEgcG9zaXRpb246KGdpbnQpIHBvc2l0aW9uCnsKICAgIHJldHVybiBndG9vbGtpdF9vYmpl
Y3QoZ3RrX3Rvb2xiYXJfaW5zZXJ0X2VsZW1lbnQoZ3RrLCB0eXBlICwgd2lkZ2V0ICA/IHdpZGdl
dCAtPmd0ayA6IDAsZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRleHQgKSxndG9vbGtpdF91dGY4X3N0
cmluZyggdG9vbHRpcF90ZXh0ICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRvb2x0aXBfcHJpdmF0
ZV90ZXh0ICksIGljb24gID8gaWNvbiAtPmd0ayA6IDAsIGNhbGxiYWNrICwgdXNlcl9kYXRhICwg
cG9zaXRpb24pLCAwKTsKfQotICh2b2lkKSBhcHBlbmRXaWRnZXQ6KEdUS1dpZGdldCAqKSB3aWRn
ZXQgdG9vbHRpcFRleHQ6KE5TU3RyaW5nICopIHRvb2x0aXBfdGV4dCB0b29sdGlwUHJpdmF0ZVRl
eHQ6KE5TU3RyaW5nICopIHRvb2x0aXBfcHJpdmF0ZV90ZXh0CnsKICAgIGd0a190b29sYmFyX2Fw
cGVuZF93aWRnZXQoZ3RrLCB3aWRnZXQgID8gd2lkZ2V0IC0+Z3RrIDogMCxndG9vbGtpdF91dGY4
X3N0cmluZyggdG9vbHRpcF90ZXh0ICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRvb2x0aXBfcHJp
dmF0ZV90ZXh0KSk7Cn0KLSAodm9pZCkgcHJlcGVuZFdpZGdldDooR1RLV2lkZ2V0ICopIHdpZGdl
dCB0b29sdGlwVGV4dDooTlNTdHJpbmcgKikgdG9vbHRpcF90ZXh0IHRvb2x0aXBQcml2YXRlVGV4
dDooTlNTdHJpbmcgKikgdG9vbHRpcF9wcml2YXRlX3RleHQKewogICAgZ3RrX3Rvb2xiYXJfcHJl
cGVuZF93aWRnZXQoZ3RrLCB3aWRnZXQgID8gd2lkZ2V0IC0+Z3RrIDogMCxndG9vbGtpdF91dGY4
X3N0cmluZyggdG9vbHRpcF90ZXh0ICksZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIHRvb2x0aXBfcHJp
dmF0ZV90ZXh0KSk7Cn0KLSAodm9pZCkgaW5zZXJ0V2lkZ2V0OihHVEtXaWRnZXQgKikgd2lkZ2V0
IHRvb2x0aXBUZXh0OihOU1N0cmluZyAqKSB0b29sdGlwX3RleHQgdG9vbHRpcFByaXZhdGVUZXh0
OihOU1N0cmluZyAqKSB0b29sdGlwX3ByaXZhdGVfdGV4dCBwb3NpdGlvbjooZ2ludCkgcG9zaXRp
b24KewogICAgZ3RrX3Rvb2xiYXJfaW5zZXJ0X3dpZGdldChndGssIHdpZGdldCAgPyB3aWRnZXQg
LT5ndGsgOiAwLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCB0b29sdGlwX3RleHQgKSxndG9vbGtpdF91
dGY4X3N0cmluZyggdG9vbHRpcF9wcml2YXRlX3RleHQgKSwgcG9zaXRpb24pOwp9Ci0gKHZvaWQp
IHNldE9yaWVudGF0aW9uOihHdGtPcmllbnRhdGlvbikgb3JpZW50YXRpb24KewogICAgZ3RrX3Rv
b2xiYXJfc2V0X29yaWVudGF0aW9uKGd0aywgb3JpZW50YXRpb24pOwp9Ci0gKHZvaWQpIHNldFN0
eWxlOihHdGtUb29sYmFyU3R5bGUpIHN0eWxlCnsKICAgIGd0a190b29sYmFyX3NldF9zdHlsZShn
dGssIHN0eWxlKTsKfQotICh2b2lkKSBzZXRTcGFjZVNpemU6KGdpbnQpIHNwYWNlX3NpemUKewog
ICAgZ3RrX3Rvb2xiYXJfc2V0X3NwYWNlX3NpemUoZ3RrLCBzcGFjZV9zaXplKTsKfQotICh2b2lk
KSBzZXRTcGFjZVN0eWxlOihHdGtUb29sYmFyU3BhY2VTdHlsZSkgc3BhY2Vfc3R5bGUKewogICAg
Z3RrX3Rvb2xiYXJfc2V0X3NwYWNlX3N0eWxlKGd0aywgc3BhY2Vfc3R5bGUpOwp9Ci0gKHZvaWQp
IHNldFRvb2x0aXBzOihnaW50KSBlbmFibGUKewogICAgZ3RrX3Rvb2xiYXJfc2V0X3Rvb2x0aXBz
KGd0aywgZW5hYmxlKTsKfQotICh2b2lkKSBzZXRCdXR0b25SZWxpZWY6KEd0a1JlbGllZlN0eWxl
KSByZWxpZWYKewogICAgZ3RrX3Rvb2xiYXJfc2V0X2J1dHRvbl9yZWxpZWYoZ3RrLCByZWxpZWYp
Owp9Ci0gKEd0a1JlbGllZlN0eWxlKSBnZXRCdXR0b25SZWxpZWYKewogICAgcmV0dXJuIGd0a190
b29sYmFyX2dldF9idXR0b25fcmVsaWVmKGd0ayk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9i
amVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykg
MTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNh
bGx5IGZyb20gZ3RrdG9vbHRpcHMuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
ICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLVG9vbHRpcHMuaD4KI2luY2x1
ZGUgPEdUb29sS2l0L0dUS1dpZGdldC5oPgoKQGltcGxlbWVudGF0aW9uIEdUS1Rvb2x0aXBzCisg
KEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a190b29sdGlwc19nZXRfdHlwZSgpOwp9
CisgKGlkKSB0b29sdGlwcwp7CiAgICByZXR1cm4gW1soR1RLVG9vbHRpcHMgKilbc2VsZiBhbGxv
Y10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBp
bml0V2l0aEd0azpndGtfdG9vbHRpcHNfbmV3KCldOwp9Ci0gKHZvaWQpIGVuYWJsZQp7CiAgICBn
dGtfdG9vbHRpcHNfZW5hYmxlKGd0ayk7Cn0KLSAodm9pZCkgZGlzYWJsZQp7CiAgICBndGtfdG9v
bHRpcHNfZGlzYWJsZShndGspOwp9Ci0gKHZvaWQpIHNldERlbGF5OihndWludCkgZGVsYXkKewog
ICAgZ3RrX3Rvb2x0aXBzX3NldF9kZWxheShndGssIGRlbGF5KTsKfQotICh2b2lkKSBzZXRUaXA6
KEdUS1dpZGdldCAqKSB3aWRnZXQgdGlwVGV4dDooTlNTdHJpbmcgKikgdGlwX3RleHQgdGlwUHJp
dmF0ZTooTlNTdHJpbmcgKikgdGlwX3ByaXZhdGUKewogICAgZ3RrX3Rvb2x0aXBzX3NldF90aXAo
Z3RrLCB3aWRnZXQgID8gd2lkZ2V0IC0+Z3RrIDogMCxndG9vbGtpdF91dGY4X3N0cmluZyggdGlw
X3RleHQgKSxndG9vbGtpdF91dGY4X3N0cmluZyggdGlwX3ByaXZhdGUpKTsKfQotICh2b2lkKSBz
ZXRDb2xvcnM6KEdka0NvbG9yICopIGJhY2tncm91bmQgZm9yZWdyb3VuZDooR2RrQ29sb3IgKikg
Zm9yZWdyb3VuZAp7CiAgICBndGtfdG9vbHRpcHNfc2V0X2NvbG9ycyhndGssIGJhY2tncm91bmQg
LCBmb3JlZ3JvdW5kKTsKfQorIChHdGtUb29sdGlwc0RhdGEqKSBkYXRhR2V0OihHVEtXaWRnZXQg
Kikgd2lkZ2V0CnsKICAgIHJldHVybiBndGtfdG9vbHRpcHNfZGF0YV9nZXQoIHdpZGdldCA/IHdp
ZGdldC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgZm9yY2VXaW5kb3cKewogICAgZ3RrX3Rvb2x0aXBz
X2ZvcmNlX3dpbmRvdyhndGspOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBp
bnRlcmZhY2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTks
IDIwMDAgIEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0
a3RyZWUuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAq
LwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLVHJlZS5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lk
Z2V0Lmg+CgpAaW1wbGVtZW50YXRpb24gR1RLVHJlZQorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAg
IHJldHVybiBndGtfdHJlZV9nZXRfdHlwZSgpOwp9CisgKGlkKSB0cmVlCnsKICAgIHJldHVybiBb
WyhHVEtUcmVlICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5p
dAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3RyZWVfbmV3KCldOwp9Ci0gKHZv
aWQpIGFwcGVuZDooR1RLV2lkZ2V0ICopIHRyZWVfaXRlbQp7CiAgICBndGtfdHJlZV9hcHBlbmQo
Z3RrLCB0cmVlX2l0ZW0gPyB0cmVlX2l0ZW0tPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHByZXBlbmQ6
KEdUS1dpZGdldCAqKSB0cmVlX2l0ZW0KewogICAgZ3RrX3RyZWVfcHJlcGVuZChndGssIHRyZWVf
aXRlbSA/IHRyZWVfaXRlbS0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgaW5zZXJ0OihHVEtXaWRnZXQg
KikgdHJlZV9pdGVtIHBvc2l0aW9uOihnaW50KSBwb3NpdGlvbgp7CiAgICBndGtfdHJlZV9pbnNl
cnQoZ3RrLCB0cmVlX2l0ZW0gID8gdHJlZV9pdGVtIC0+Z3RrIDogMCwgcG9zaXRpb24pOwp9Ci0g
KHZvaWQpIHJlbW92ZUl0ZW1zOihOU0FycmF5ICopIGl0ZW1zCnsKICAgIGd0a190cmVlX3JlbW92
ZV9pdGVtcyhndGssZ3Rvb2xraXRfYXJyYXlfdG9fbGlzdCggaXRlbXMpKTsKfQotICh2b2lkKSBj
bGVhckl0ZW1zOihnaW50KSBzdGFydCBlbmQ6KGdpbnQpIGVuZAp7CiAgICBndGtfdHJlZV9jbGVh
cl9pdGVtcyhndGssIHN0YXJ0ICwgZW5kKTsKfQotICh2b2lkKSBzZWxlY3RJdGVtOihnaW50KSBp
dGVtCnsKICAgIGd0a190cmVlX3NlbGVjdF9pdGVtKGd0aywgaXRlbSk7Cn0KLSAodm9pZCkgdW5z
ZWxlY3RJdGVtOihnaW50KSBpdGVtCnsKICAgIGd0a190cmVlX3Vuc2VsZWN0X2l0ZW0oZ3RrLCBp
dGVtKTsKfQotICh2b2lkKSBzZWxlY3RDaGlsZDooR1RLV2lkZ2V0ICopIHRyZWVfaXRlbQp7CiAg
ICBndGtfdHJlZV9zZWxlY3RfY2hpbGQoZ3RrLCB0cmVlX2l0ZW0gPyB0cmVlX2l0ZW0tPmd0ayA6
IDApOwp9Ci0gKHZvaWQpIHVuc2VsZWN0Q2hpbGQ6KEdUS1dpZGdldCAqKSB0cmVlX2l0ZW0Kewog
ICAgZ3RrX3RyZWVfdW5zZWxlY3RfY2hpbGQoZ3RrLCB0cmVlX2l0ZW0gPyB0cmVlX2l0ZW0tPmd0
ayA6IDApOwp9Ci0gKGdpbnQpIGNoaWxkUG9zaXRpb246KEdUS1dpZGdldCAqKSBjaGlsZAp7CiAg
ICByZXR1cm4gZ3RrX3RyZWVfY2hpbGRfcG9zaXRpb24oZ3RrLCBjaGlsZCA/IGNoaWxkLT5ndGsg
OiAwKTsKfQotICh2b2lkKSBzZXRTZWxlY3Rpb25Nb2RlOihHdGtTZWxlY3Rpb25Nb2RlKSBtb2Rl
CnsKICAgIGd0a190cmVlX3NldF9zZWxlY3Rpb25fbW9kZShndGssIG1vZGUpOwp9Ci0gKHZvaWQp
IHNldFZpZXdNb2RlOihHdGtUcmVlVmlld01vZGUpIG1vZGUKewogICAgZ3RrX3RyZWVfc2V0X3Zp
ZXdfbW9kZShndGssIG1vZGUpOwp9Ci0gKHZvaWQpIHNldFZpZXdMaW5lczooZ3VpbnQpIGZsYWcK
ewogICAgZ3RrX3RyZWVfc2V0X3ZpZXdfbGluZXMoZ3RrLCBmbGFnKTsKfQojZGVmaW5lIGd0awko
KEd0a1RyZWUgKikgZ3RrKQotIChOU0FycmF5ICopIHNlbGVjdGlvbgp7CiAgICByZXR1cm4gZ3Rv
b2xraXRfbGlzdF90b19hcnJheShndGstPnNlbGVjdGlvbik7Cn0KI3VuZGVmIGd0awpAZW5kCi8q
CiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQK
ICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2Vu
ZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGt0cmVlaXRlbS5oIGJ5IGd0a2dlbi4KICoKICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy
YWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtU
cmVlSXRlbS5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+CgpAaW1wbGVtZW50YXRp
b24gR1RLVHJlZUl0ZW0KKyAoR3RrVHlwZSkgZ2V0VHlwZQp7CiAgICByZXR1cm4gZ3RrX3RyZWVf
aXRlbV9nZXRfdHlwZSgpOwp9CisgKGlkKSB0cmVlSXRlbQp7CiAgICByZXR1cm4gW1soR1RLVHJl
ZUl0ZW0gKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsK
ICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdHJlZV9pdGVtX25ldygpXTsKfQorIChp
ZCkgdHJlZUl0ZW1XaXRoTGFiZWw6KE5TU3RyaW5nICopIGxhYmVsCnsKICAgIHJldHVybiBbWyhH
VEtUcmVlSXRlbSAqKVtzZWxmIGFsbG9jXSBpbml0V2l0aExhYmVsOmxhYmVsXSBhdXRvcmVsZWFz
ZV07Cn0KLSAoaWQpIGluaXRXaXRoTGFiZWw6KE5TU3RyaW5nICopIGxhYmVsCnsKICAgIHJldHVy
biBbc2VsZiBpbml0V2l0aEd0azpndGtfdHJlZV9pdGVtX25ld193aXRoX2xhYmVsKGd0b29sa2l0
X3V0Zjhfc3RyaW5nKCBsYWJlbCkpXTsKfQotICh2b2lkKSBzZXRTdWJ0cmVlOihHVEtXaWRnZXQg
Kikgc3VidHJlZQp7CiAgICBndGtfdHJlZV9pdGVtX3NldF9zdWJ0cmVlKGd0aywgc3VidHJlZSA/
IHN1YnRyZWUtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHJlbW92ZVN1YnRyZWUKewogICAgZ3RrX3Ry
ZWVfaXRlbV9yZW1vdmVfc3VidHJlZShndGspOwp9Ci0gKHZvaWQpIHNlbGVjdAp7CiAgICBndGtf
dHJlZV9pdGVtX3NlbGVjdChndGspOwp9Ci0gKHZvaWQpIGRlc2VsZWN0CnsKICAgIGd0a190cmVl
X2l0ZW1fZGVzZWxlY3QoZ3RrKTsKfQotICh2b2lkKSBleHBhbmQKewogICAgZ3RrX3RyZWVfaXRl
bV9leHBhbmQoZ3RrKTsKfQotICh2b2lkKSBjb2xsYXBzZQp7CiAgICBndGtfdHJlZV9pdGVtX2Nv
bGxhcHNlKGd0ayk7Cn0KI2RlZmluZSBndGsJKChHdGtUcmVlSXRlbSAqKSBndGspCi0gKEdUS1dp
ZGdldCAqKSBzdWJ0cmVlCnsKICAgIHJldHVybiBHVE9PTEtJVF9PQkpFQ1QoZ3RrLT5zdWJ0cmVl
KTsKfQojdW5kZWYgZ3RrCkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZh
Y2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAg
IEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3ZiYm94
LmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2lu
Y2x1ZGUgPEdUb29sS2l0L0dUS1ZCdXR0b25Cb3guaD4KCkBpbXBsZW1lbnRhdGlvbiBHVEtWQnV0
dG9uQm94CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a192YnV0dG9uX2JveF9n
ZXRfdHlwZSgpOwp9CisgKGlkKSB2QnV0dG9uQm94CnsKICAgIHJldHVybiBbWyhHVEtWQnV0dG9u
Qm94ICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKfQotIChpZCkgaW5pdAp7CiAg
ICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3ZidXR0b25fYm94X25ldygpXTsKfQorIChn
aW50KSBnZXRTcGFjaW5nRGVmYXVsdAp7CiAgICByZXR1cm4gZ3RrX3ZidXR0b25fYm94X2dldF9z
cGFjaW5nX2RlZmF1bHQoKTsKfQorICh2b2lkKSBzZXRTcGFjaW5nRGVmYXVsdDooZ2ludCkgc3Bh
Y2luZwp7CiAgICBndGtfdmJ1dHRvbl9ib3hfc2V0X3NwYWNpbmdfZGVmYXVsdCggc3BhY2luZyk7
Cn0KKyAoR3RrQnV0dG9uQm94U3R5bGUpIGdldExheW91dERlZmF1bHQKewogICAgcmV0dXJuIGd0
a192YnV0dG9uX2JveF9nZXRfbGF5b3V0X2RlZmF1bHQoKTsKfQorICh2b2lkKSBzZXRMYXlvdXRE
ZWZhdWx0OihHdGtCdXR0b25Cb3hTdHlsZSkgbGF5b3V0CnsKICAgIGd0a192YnV0dG9uX2JveF9z
ZXRfbGF5b3V0X2RlZmF1bHQoIGxheW91dCk7Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVj
dGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5
OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5
IGZyb20gZ3RrdmJveC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJz
aW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtWQm94Lmg+CgpAaW1wbGVtZW50YXRpb24g
R1RLVkJveAorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJldHVybiBndGtfdmJveF9nZXRfdHlw
ZSgpOwp9CisgKGlkKSB2Qm94V2l0aEhvbW9nZW5lb3VzOihnYm9vbGVhbikgaG9tb2dlbmVvdXMg
c3BhY2luZzooZ2ludCkgc3BhY2luZwp7CiAgICByZXR1cm4gW1soR1RLVkJveCAqKVtzZWxmIGFs
bG9jXSBpbml0V2l0aEhvbW9nZW5lb3VzOmhvbW9nZW5lb3VzIHNwYWNpbmc6c3BhY2luZ10gYXV0
b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0V2l0aEhvbW9nZW5lb3VzOihnYm9vbGVhbikgaG9tb2dl
bmVvdXMgc3BhY2luZzooZ2ludCkgc3BhY2luZwp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhH
dGs6Z3RrX3Zib3hfbmV3KCBob21vZ2VuZW91cyAsIHNwYWNpbmcpXTsKfQpAZW5kCi8qCiAqIEdU
b29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29w
eXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVk
IGF1dG9tYXRpY2FsbHkgZnJvbSBndGt2aWV3cG9ydC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgog
KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVi
bGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0
aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtWaWV3cG9y
dC5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLQWRqdXN0bWVudC5oPgoKQGltcGxlbWVudGF0aW9u
IEdUS1ZpZXdwb3J0CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a192aWV3cG9y
dF9nZXRfdHlwZSgpOwp9CisgKGlkKSB2aWV3cG9ydFdpdGhIYWRqdXN0bWVudDooR1RLQWRqdXN0
bWVudCAqKSBoYWRqdXN0bWVudCB2YWRqdXN0bWVudDooR1RLQWRqdXN0bWVudCAqKSB2YWRqdXN0
bWVudAp7CiAgICByZXR1cm4gW1soR1RLVmlld3BvcnQgKilbc2VsZiBhbGxvY10gaW5pdFdpdGhI
YWRqdXN0bWVudDpoYWRqdXN0bWVudCB2YWRqdXN0bWVudDp2YWRqdXN0bWVudF0gYXV0b3JlbGVh
c2VdOwp9Ci0gKGlkKSBpbml0V2l0aEhhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGhhZGp1
c3RtZW50IHZhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIHZhZGp1c3RtZW50CnsKICAgIHJl
dHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdmlld3BvcnRfbmV3KCBoYWRqdXN0bWVudCAgPyBo
YWRqdXN0bWVudCAtPmd0ayA6IDAsIHZhZGp1c3RtZW50ID8gdmFkanVzdG1lbnQtPmd0ayA6IDAp
XTsKfQotIChHVEtBZGp1c3RtZW50KikgZ2V0SGFkanVzdG1lbnQKewogICAgcmV0dXJuIGd0b29s
a2l0X29iamVjdChndGtfdmlld3BvcnRfZ2V0X2hhZGp1c3RtZW50KGd0ayksIDApOwp9Ci0gKEdU
S0FkanVzdG1lbnQqKSBnZXRWYWRqdXN0bWVudAp7CiAgICByZXR1cm4gZ3Rvb2xraXRfb2JqZWN0
KGd0a192aWV3cG9ydF9nZXRfdmFkanVzdG1lbnQoZ3RrKSwgMCk7Cn0KLSAodm9pZCkgc2V0SGFk
anVzdG1lbnQ6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudAp7CiAgICBndGtfdmlld3BvcnRf
c2V0X2hhZGp1c3RtZW50KGd0aywgYWRqdXN0bWVudCA/IGFkanVzdG1lbnQtPmd0ayA6IDApOwp9
Ci0gKHZvaWQpIHNldFZhZGp1c3RtZW50OihHVEtBZGp1c3RtZW50ICopIGFkanVzdG1lbnQKewog
ICAgZ3RrX3ZpZXdwb3J0X3NldF92YWRqdXN0bWVudChndGssIGFkanVzdG1lbnQgPyBhZGp1c3Rt
ZW50LT5ndGsgOiAwKTsKfQotICh2b2lkKSBzZXRTaGFkb3dUeXBlOihHdGtTaGFkb3dUeXBlKSB0
eXBlCnsKICAgIGd0a192aWV3cG9ydF9zZXRfc2hhZG93X3R5cGUoZ3RrLCB0eXBlKTsKfQpAZW5k
Ci8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xr
aXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICog
R2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGt2cGFuZWQuaCBieSBndGtnZW4uCiAqCiAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RL
VlBhbmVkLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLVlBhbmVkCisgKEd0a1R5cGUpIGdldFR5cGUK
ewogICAgcmV0dXJuIGd0a192cGFuZWRfZ2V0X3R5cGUoKTsKfQorIChpZCkgdlBhbmVkCnsKICAg
IHJldHVybiBbWyhHVEtWUGFuZWQgKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwp9
Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdnBhbmVkX25l
dygpXTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRo
ZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBM
dWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGt2cnVsZXIuaCBieSBn
dGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqLwojaW5jbHVkZSA8
R1Rvb2xLaXQvR1RLVlJ1bGVyLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLVlJ1bGVyCisgKEd0a1R5
cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a192cnVsZXJfZ2V0X3R5cGUoKTsKfQorIChpZCkg
dlJ1bGVyCnsKICAgIHJldHVybiBbWyhHVEtWUnVsZXIgKilbc2VsZiBhbGxvY10gaW5pdF0gYXV0
b3JlbGVhc2VdOwp9Ci0gKGlkKSBpbml0CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpn
dGtfdnJ1bGVyX25ldygpXTsKfQpAZW5kCi8qCiAqIEdUb29sS2l0IC0gT2JqZWN0aXZlLUMgaW50
ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAy
MDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBndGt2
c2NhbGUuaCBieSBndGtnZW4uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAq
LwojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLVlNjYWxlLmg+CiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtB
ZGp1c3RtZW50Lmg+CgpAaW1wbGVtZW50YXRpb24gR1RLVlNjYWxlCisgKEd0a1R5cGUpIGdldFR5
cGUKewogICAgcmV0dXJuIGd0a192c2NhbGVfZ2V0X3R5cGUoKTsKfQorIChpZCkgdlNjYWxlV2l0
aEFkanVzdG1lbnQ6KEdUS0FkanVzdG1lbnQgKikgYWRqdXN0bWVudAp7CiAgICByZXR1cm4gW1so
R1RLVlNjYWxlICopW3NlbGYgYWxsb2NdIGluaXRXaXRoQWRqdXN0bWVudDphZGp1c3RtZW50XSBh
dXRvcmVsZWFzZV07Cn0KLSAoaWQpIGluaXRXaXRoQWRqdXN0bWVudDooR1RLQWRqdXN0bWVudCAq
KSBhZGp1c3RtZW50CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdnNjYWxlX25l
dyggYWRqdXN0bWVudCA/IGFkanVzdG1lbnQtPmd0ayA6IDApXTsKfQpAZW5kCi8qCiAqIEdUb29s
S2l0IC0gT2JqZWN0aXZlLUMgaW50ZXJmYWNlIHRvIHRoZSBHSU1QIFRvb2xraXQKICogQ29weXJp
Z2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwICBFbG1hciBMdWR3aWcKICoKICogR2VuZXJhdGVkIGF1
dG9tYXRpY2FsbHkgZnJvbSBndGt2c2Nyb2xsYmFyLmggYnkgZ3RrZ2VuLgogKgogKiBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAq
IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdUb29sS2l0L0dUS1ZTY3JvbGxi
YXIuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0FkanVzdG1lbnQuaD4KCkBpbXBsZW1lbnRhdGlv
biBHVEtWU2Nyb2xsYmFyCisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a192c2Ny
b2xsYmFyX2dldF90eXBlKCk7Cn0KKyAoaWQpIHZTY3JvbGxiYXJXaXRoQWRqdXN0bWVudDooR1RL
QWRqdXN0bWVudCAqKSBhZGp1c3RtZW50CnsKICAgIHJldHVybiBbWyhHVEtWU2Nyb2xsYmFyICop
W3NlbGYgYWxsb2NdIGluaXRXaXRoQWRqdXN0bWVudDphZGp1c3RtZW50XSBhdXRvcmVsZWFzZV07
Cn0KLSAoaWQpIGluaXRXaXRoQWRqdXN0bWVudDooR1RLQWRqdXN0bWVudCAqKSBhZGp1c3RtZW50
CnsKICAgIHJldHVybiBbc2VsZiBpbml0V2l0aEd0azpndGtfdnNjcm9sbGJhcl9uZXcoIGFkanVz
dG1lbnQgPyBhZGp1c3RtZW50LT5ndGsgOiAwKV07Cn0KQGVuZAovKgogKiBHVG9vbEtpdCAtIE9i
amVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUgR0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykg
MTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVkd2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNh
bGx5IGZyb20gZ3RrdnNlcGFyYXRvci5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KICovCiNpbmNsdWRlIDxHVG9vbEtpdC9HVEtWU2VwYXJhdG9yLmg+CgpA
aW1wbGVtZW50YXRpb24gR1RLVlNlcGFyYXRvcgorIChHdGtUeXBlKSBnZXRUeXBlCnsKICAgIHJl
dHVybiBndGtfdnNlcGFyYXRvcl9nZXRfdHlwZSgpOwp9CisgKGlkKSB2U2VwYXJhdG9yCnsKICAg
IHJldHVybiBbWyhHVEtWU2VwYXJhdG9yICopW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNl
XTsKfQotIChpZCkgaW5pdAp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3ZzZXBh
cmF0b3JfbmV3KCldOwp9CkBlbmQKLyoKICogR1Rvb2xLaXQgLSBPYmplY3RpdmUtQyBpbnRlcmZh
Y2UgdG8gdGhlIEdJTVAgVG9vbGtpdAogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDAg
IEVsbWFyIEx1ZHdpZwogKgogKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGd0a3dpZGdl
dC5oIGJ5IGd0a2dlbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICovCiNp
bmNsdWRlIDxHVG9vbEtpdC9HVEtXaWRnZXQuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0FjY2Vs
R3JvdXAuaD4KI2luY2x1ZGUgPEdUb29sS2l0L0dUS0FkanVzdG1lbnQuaD4KI2luY2x1ZGUgPEdU
b29sS2l0L0dUS1N0eWxlLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLV2lkZ2V0CisgKEd0a1R5cGUp
IGdldFR5cGUKewogICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3R5cGUoKTsKfQorIChpZCkgd2lk
Z2V0dldpdGhUeXBlOihHdGtUeXBlKSB0eXBlIG5BcmdzOihndWludCkgbmFyZ3MgYXJnczooR3Rr
QXJnICopIGFyZ3MKewogICAgcmV0dXJuIFtbKEdUS1dpZGdldCAqKVtzZWxmIGFsbG9jXSBpbml0
dldpdGhUeXBlOnR5cGUgbkFyZ3M6bmFyZ3MgYXJnczphcmdzXSBhdXRvcmVsZWFzZV07Cn0KLSAo
aWQpIGluaXR2V2l0aFR5cGU6KEd0a1R5cGUpIHR5cGUgbkFyZ3M6KGd1aW50KSBuYXJncyBhcmdz
OihHdGtBcmcgKikgYXJncwp7CiAgICByZXR1cm4gW3NlbGYgaW5pdFdpdGhHdGs6Z3RrX3dpZGdl
dF9uZXd2KCB0eXBlICwgbmFyZ3MgLCBhcmdzKV07Cn0KLSAodm9pZCkgcmVmCnsKICAgIGd0a193
aWRnZXRfcmVmKGd0ayk7Cn0KLSAodm9pZCkgdW5yZWYKewogICAgZ3RrX3dpZGdldF91bnJlZihn
dGspOwp9Ci0gKHZvaWQpIGRlc3Ryb3kKewogICAgZ3RrX3dpZGdldF9kZXN0cm95KGd0ayk7Cn0K
LSAodm9pZCkgZGVzdHJveWVkOihHVEtXaWRnZXQgKiopIHdpZGdldF9wb2ludGVyCnsKICAgIEd0
a1dpZGdldCAqX291dHZhbF8xOwogICAgZ3RrX3dpZGdldF9kZXN0cm95ZWQoZ3RrLCZfb3V0dmFs
XzEpOwogICAgKiB3aWRnZXRfcG9pbnRlciA9IGd0b29sa2l0X29iamVjdChfb3V0dmFsXzEsIDAp
Owp9Ci0gKHZvaWQpIGdldDooR3RrQXJnICopIGFyZwp7CiAgICBndGtfd2lkZ2V0X2dldChndGss
IGFyZyk7Cn0KLSAodm9pZCkgZ2V0djooZ3VpbnQpIG5hcmdzIGFyZ3M6KEd0a0FyZyAqKSBhcmdz
CnsKICAgIGd0a193aWRnZXRfZ2V0dihndGssIG5hcmdzICwgYXJncyk7Cn0KLSAodm9pZCkgc2V0
djooZ3VpbnQpIG5hcmdzIGFyZ3M6KEd0a0FyZyAqKSBhcmdzCnsKICAgIGd0a193aWRnZXRfc2V0
dihndGssIG5hcmdzICwgYXJncyk7Cn0KLSAodm9pZCkgdW5wYXJlbnQKewogICAgZ3RrX3dpZGdl
dF91bnBhcmVudChndGspOwp9Ci0gKHZvaWQpIHNob3cKewogICAgZ3RrX3dpZGdldF9zaG93KGd0
ayk7Cn0KLSAodm9pZCkgc2hvd05vdwp7CiAgICBndGtfd2lkZ2V0X3Nob3dfbm93KGd0ayk7Cn0K
LSAodm9pZCkgaGlkZQp7CiAgICBndGtfd2lkZ2V0X2hpZGUoZ3RrKTsKfQotICh2b2lkKSBzaG93
QWxsCnsKICAgIGd0a193aWRnZXRfc2hvd19hbGwoZ3RrKTsKfQotICh2b2lkKSBoaWRlQWxsCnsK
ICAgIGd0a193aWRnZXRfaGlkZV9hbGwoZ3RrKTsKfQotICh2b2lkKSBtYXAKewogICAgZ3RrX3dp
ZGdldF9tYXAoZ3RrKTsKfQotICh2b2lkKSB1bm1hcAp7CiAgICBndGtfd2lkZ2V0X3VubWFwKGd0
ayk7Cn0KLSAodm9pZCkgcmVhbGl6ZQp7CiAgICBndGtfd2lkZ2V0X3JlYWxpemUoZ3RrKTsKfQot
ICh2b2lkKSB1bnJlYWxpemUKewogICAgZ3RrX3dpZGdldF91bnJlYWxpemUoZ3RrKTsKfQotICh2
b2lkKSBxdWV1ZURyYXcKewogICAgZ3RrX3dpZGdldF9xdWV1ZV9kcmF3KGd0ayk7Cn0KLSAodm9p
ZCkgcXVldWVEcmF3QXJlYTooZ2ludCkgeCB5OihnaW50KSB5IHdpZHRoOihnaW50KSB3aWR0aCBo
ZWlnaHQ6KGdpbnQpIGhlaWdodAp7CiAgICBndGtfd2lkZ2V0X3F1ZXVlX2RyYXdfYXJlYShndGss
IHggLCB5ICwgd2lkdGggLCBoZWlnaHQpOwp9Ci0gKHZvaWQpIHF1ZXVlQ2xlYXIKewogICAgZ3Rr
X3dpZGdldF9xdWV1ZV9jbGVhcihndGspOwp9Ci0gKHZvaWQpIHF1ZXVlQ2xlYXJBcmVhOihnaW50
KSB4IHk6KGdpbnQpIHkgd2lkdGg6KGdpbnQpIHdpZHRoIGhlaWdodDooZ2ludCkgaGVpZ2h0CnsK
ICAgIGd0a193aWRnZXRfcXVldWVfY2xlYXJfYXJlYShndGssIHggLCB5ICwgd2lkdGggLCBoZWln
aHQpOwp9Ci0gKHZvaWQpIHF1ZXVlUmVzaXplCnsKICAgIGd0a193aWRnZXRfcXVldWVfcmVzaXpl
KGd0ayk7Cn0KLSAodm9pZCkgZHJhdzooR2RrUmVjdGFuZ2xlICopIGFyZWEKewogICAgZ3RrX3dp
ZGdldF9kcmF3KGd0aywgYXJlYSk7Cn0KLSAodm9pZCkgZHJhd0ZvY3VzCnsKICAgIGd0a193aWRn
ZXRfZHJhd19mb2N1cyhndGspOwp9Ci0gKHZvaWQpIGRyYXdEZWZhdWx0CnsKICAgIGd0a193aWRn
ZXRfZHJhd19kZWZhdWx0KGd0ayk7Cn0KLSAodm9pZCkgc2l6ZVJlcXVlc3Q6KEd0a1JlcXVpc2l0
aW9uICopIHJlcXVpc2l0aW9uCnsKICAgIGd0a193aWRnZXRfc2l6ZV9yZXF1ZXN0KGd0aywgcmVx
dWlzaXRpb24pOwp9Ci0gKHZvaWQpIHNpemVBbGxvY2F0ZTooR3RrQWxsb2NhdGlvbiAqKSBhbGxv
Y2F0aW9uCnsKICAgIGd0a193aWRnZXRfc2l6ZV9hbGxvY2F0ZShndGssIGFsbG9jYXRpb24pOwp9
Ci0gKHZvaWQpIGdldENoaWxkUmVxdWlzaXRpb246KEd0a1JlcXVpc2l0aW9uICopIHJlcXVpc2l0
aW9uCnsKICAgIGd0a193aWRnZXRfZ2V0X2NoaWxkX3JlcXVpc2l0aW9uKGd0aywgcmVxdWlzaXRp
b24pOwp9Ci0gKHZvaWQpIGFkZEFjY2VsZXJhdG9yOihOU1N0cmluZyAqKSBhY2NlbF9zaWduYWwg
YWNjZWxHcm91cDooR1RLQWNjZWxHcm91cCAqKSBhY2NlbF9ncm91cCBhY2NlbEtleTooZ3VpbnQp
IGFjY2VsX2tleSBhY2NlbE1vZHM6KGd1aW50KSBhY2NlbF9tb2RzIGFjY2VsRmxhZ3M6KEd0a0Fj
Y2VsRmxhZ3MpIGFjY2VsX2ZsYWdzCnsKICAgIGd0a193aWRnZXRfYWRkX2FjY2VsZXJhdG9yKGd0
ayxndG9vbGtpdF91dGY4X3N0cmluZyggYWNjZWxfc2lnbmFsICksIGFjY2VsX2dyb3VwICA/IGFj
Y2VsX2dyb3VwIC0+Z3RrIDogMCwgYWNjZWxfa2V5ICwgYWNjZWxfbW9kcyAsIGFjY2VsX2ZsYWdz
KTsKfQotICh2b2lkKSByZW1vdmVBY2NlbGVyYXRvcjooR1RLQWNjZWxHcm91cCAqKSBhY2NlbF9n
cm91cCBhY2NlbEtleTooZ3VpbnQpIGFjY2VsX2tleSBhY2NlbE1vZHM6KGd1aW50KSBhY2NlbF9t
b2RzCnsKICAgIGd0a193aWRnZXRfcmVtb3ZlX2FjY2VsZXJhdG9yKGd0aywgYWNjZWxfZ3JvdXAg
ID8gYWNjZWxfZ3JvdXAgLT5ndGsgOiAwLCBhY2NlbF9rZXkgLCBhY2NlbF9tb2RzKTsKfQotICh2
b2lkKSByZW1vdmVBY2NlbGVyYXRvcnM6KE5TU3RyaW5nICopIGFjY2VsX3NpZ25hbCB2aXNpYmxl
T25seTooZ2Jvb2xlYW4pIHZpc2libGVfb25seQp7CiAgICBndGtfd2lkZ2V0X3JlbW92ZV9hY2Nl
bGVyYXRvcnMoZ3RrLGd0b29sa2l0X3V0Zjhfc3RyaW5nKCBhY2NlbF9zaWduYWwgKSwgdmlzaWJs
ZV9vbmx5KTsKfQotIChndWludCkgYWNjZWxlcmF0b3JTaWduYWw6KEdUS0FjY2VsR3JvdXAgKikg
YWNjZWxfZ3JvdXAgYWNjZWxLZXk6KGd1aW50KSBhY2NlbF9rZXkgYWNjZWxNb2RzOihndWludCkg
YWNjZWxfbW9kcwp7CiAgICByZXR1cm4gZ3RrX3dpZGdldF9hY2NlbGVyYXRvcl9zaWduYWwoZ3Rr
LCBhY2NlbF9ncm91cCAgPyBhY2NlbF9ncm91cCAtPmd0ayA6IDAsIGFjY2VsX2tleSAsIGFjY2Vs
X21vZHMpOwp9Ci0gKHZvaWQpIGxvY2tBY2NlbGVyYXRvcnMKewogICAgZ3RrX3dpZGdldF9sb2Nr
X2FjY2VsZXJhdG9ycyhndGspOwp9Ci0gKHZvaWQpIHVubG9ja0FjY2VsZXJhdG9ycwp7CiAgICBn
dGtfd2lkZ2V0X3VubG9ja19hY2NlbGVyYXRvcnMoZ3RrKTsKfQotIChnYm9vbGVhbikgYWNjZWxl
cmF0b3JzTG9ja2VkCnsKICAgIHJldHVybiBndGtfd2lkZ2V0X2FjY2VsZXJhdG9yc19sb2NrZWQo
Z3RrKTsKfQotIChnaW50KSBldmVudDooR2RrRXZlbnQgKikgZXZlbnQKewogICAgcmV0dXJuIGd0
a193aWRnZXRfZXZlbnQoZ3RrLCBldmVudCk7Cn0KLSAoZ2Jvb2xlYW4pIGFjdGl2YXRlCnsKICAg
IHJldHVybiBndGtfd2lkZ2V0X2FjdGl2YXRlKGd0ayk7Cn0KLSAoZ2Jvb2xlYW4pIHNldFNjcm9s
bEFkanVzdG1lbnRzOihHVEtBZGp1c3RtZW50ICopIGhhZGp1c3RtZW50IHZhZGp1c3RtZW50OihH
VEtBZGp1c3RtZW50ICopIHZhZGp1c3RtZW50CnsKICAgIHJldHVybiBndGtfd2lkZ2V0X3NldF9z
Y3JvbGxfYWRqdXN0bWVudHMoZ3RrLCBoYWRqdXN0bWVudCAgPyBoYWRqdXN0bWVudCAtPmd0ayA6
IDAsIHZhZGp1c3RtZW50ID8gdmFkanVzdG1lbnQtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHJlcGFy
ZW50OihHVEtXaWRnZXQgKikgbmV3X3BhcmVudAp7CiAgICBndGtfd2lkZ2V0X3JlcGFyZW50KGd0
aywgbmV3X3BhcmVudCA/IG5ld19wYXJlbnQtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHBvcHVwOihn
aW50KSB4IHk6KGdpbnQpIHkKewogICAgZ3RrX3dpZGdldF9wb3B1cChndGssIHggLCB5KTsKfQot
IChnaW50KSBpbnRlcnNlY3Q6KEdka1JlY3RhbmdsZSAqKSBhcmVhIGludGVyc2VjdGlvbjooR2Rr
UmVjdGFuZ2xlICopIGludGVyc2VjdGlvbgp7CiAgICByZXR1cm4gZ3RrX3dpZGdldF9pbnRlcnNl
Y3QoZ3RrLCBhcmVhICwgaW50ZXJzZWN0aW9uKTsKfQotICh2b2lkKSBncmFiRm9jdXMKewogICAg
Z3RrX3dpZGdldF9ncmFiX2ZvY3VzKGd0ayk7Cn0KLSAodm9pZCkgZ3JhYkRlZmF1bHQKewogICAg
Z3RrX3dpZGdldF9ncmFiX2RlZmF1bHQoZ3RrKTsKfQotICh2b2lkKSBzZXROYW1lOihOU1N0cmlu
ZyAqKSBuYW1lCnsKICAgIGd0a193aWRnZXRfc2V0X25hbWUoZ3RrLGd0b29sa2l0X3V0Zjhfc3Ry
aW5nKCBuYW1lKSk7Cn0KLSAoTlNTdHJpbmcgKikgZ2V0TmFtZQp7CiAgICByZXR1cm4gZ3Rvb2xr
aXRfb2JqY19zdHJpbmcoZ3RrX3dpZGdldF9nZXRfbmFtZShndGspKTsKfQotICh2b2lkKSBzZXRT
dGF0ZTooR3RrU3RhdGVUeXBlKSBzdGF0ZQp7CiAgICBndGtfd2lkZ2V0X3NldF9zdGF0ZShndGss
IHN0YXRlKTsKfQotICh2b2lkKSBzZXRTZW5zaXRpdmU6KGdib29sZWFuKSBzZW5zaXRpdmUKewog
ICAgZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGd0aywgc2Vuc2l0aXZlKTsKfQotICh2b2lkKSBz
ZXRBcHBQYWludGFibGU6KGdib29sZWFuKSBhcHBfcGFpbnRhYmxlCnsKICAgIGd0a193aWRnZXRf
c2V0X2FwcF9wYWludGFibGUoZ3RrLCBhcHBfcGFpbnRhYmxlKTsKfQotICh2b2lkKSBzZXRQYXJl
bnQ6KEdUS1dpZGdldCAqKSBwYXJlbnQKewogICAgZ3RrX3dpZGdldF9zZXRfcGFyZW50KGd0aywg
cGFyZW50ID8gcGFyZW50LT5ndGsgOiAwKTsKfQotICh2b2lkKSBzZXRQYXJlbnRXaW5kb3c6KEdk
a1dpbmRvdyAqKSBwYXJlbnRfd2luZG93CnsKICAgIGd0a193aWRnZXRfc2V0X3BhcmVudF93aW5k
b3coZ3RrLCBwYXJlbnRfd2luZG93KTsKfQotIChHZGtXaW5kb3cgKikgZ2V0UGFyZW50V2luZG93
CnsKICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9wYXJlbnRfd2luZG93KGd0ayk7Cn0KLSAodm9p
ZCkgc2V0VXBvc2l0aW9uOihnaW50KSB4IHk6KGdpbnQpIHkKewogICAgZ3RrX3dpZGdldF9zZXRf
dXBvc2l0aW9uKGd0aywgeCAsIHkpOwp9Ci0gKHZvaWQpIHNldFVzaXplOihnaW50KSB3aWR0aCBo
ZWlnaHQ6KGdpbnQpIGhlaWdodAp7CiAgICBndGtfd2lkZ2V0X3NldF91c2l6ZShndGssIHdpZHRo
ICwgaGVpZ2h0KTsKfQotICh2b2lkKSBzZXRFdmVudHM6KGdpbnQpIGV2ZW50cwp7CiAgICBndGtf
d2lkZ2V0X3NldF9ldmVudHMoZ3RrLCBldmVudHMpOwp9Ci0gKHZvaWQpIGFkZEV2ZW50czooZ2lu
dCkgZXZlbnRzCnsKICAgIGd0a193aWRnZXRfYWRkX2V2ZW50cyhndGssIGV2ZW50cyk7Cn0KLSAo
dm9pZCkgc2V0RXh0ZW5zaW9uRXZlbnRzOihHZGtFeHRlbnNpb25Nb2RlKSBtb2RlCnsKICAgIGd0
a193aWRnZXRfc2V0X2V4dGVuc2lvbl9ldmVudHMoZ3RrLCBtb2RlKTsKfQotIChHZGtFeHRlbnNp
b25Nb2RlKSBnZXRFeHRlbnNpb25FdmVudHMKewogICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X2V4
dGVuc2lvbl9ldmVudHMoZ3RrKTsKfQotIChHVEtXaWRnZXQqKSBnZXRUb3BsZXZlbAp7CiAgICBy
ZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a193aWRnZXRfZ2V0X3RvcGxldmVsKGd0ayksIDApOwp9
Ci0gKEdUS1dpZGdldCopIGdldEFuY2VzdG9yOihHdGtUeXBlKSB3aWRnZXRfdHlwZQp7CiAgICBy
ZXR1cm4gZ3Rvb2xraXRfb2JqZWN0KGd0a193aWRnZXRfZ2V0X2FuY2VzdG9yKGd0aywgd2lkZ2V0
X3R5cGUpLCAwKTsKfQotIChHZGtDb2xvcm1hcCopIGdldENvbG9ybWFwCnsKICAgIHJldHVybiBn
dGtfd2lkZ2V0X2dldF9jb2xvcm1hcChndGspOwp9Ci0gKEdka1Zpc3VhbCopIGdldFZpc3VhbAp7
CiAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfdmlzdWFsKGd0ayk7Cn0KLSAodm9pZCkgc2V0Q29s
b3JtYXA6KEdka0NvbG9ybWFwICopIGNvbG9ybWFwCnsKICAgIGd0a193aWRnZXRfc2V0X2NvbG9y
bWFwKGd0aywgY29sb3JtYXApOwp9Ci0gKHZvaWQpIHNldFZpc3VhbDooR2RrVmlzdWFsICopIHZp
c3VhbAp7CiAgICBndGtfd2lkZ2V0X3NldF92aXN1YWwoZ3RrLCB2aXN1YWwpOwp9Ci0gKGdpbnQp
IGdldEV2ZW50cwp7CiAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfZXZlbnRzKGd0ayk7Cn0KLSAo
dm9pZCkgZ2V0UG9pbnRlcjooZ2ludCAqKSB4IHk6KGdpbnQgKikgeQp7CiAgICBndGtfd2lkZ2V0
X2dldF9wb2ludGVyKGd0aywgeCAsIHkpOwp9Ci0gKGdpbnQpIGlzQW5jZXN0b3I6KEdUS1dpZGdl
dCAqKSBhbmNlc3Rvcgp7CiAgICByZXR1cm4gZ3RrX3dpZGdldF9pc19hbmNlc3RvcihndGssIGFu
Y2VzdG9yID8gYW5jZXN0b3ItPmd0ayA6IDApOwp9Ci0gKGdpbnQpIGhpZGVPbkRlbGV0ZQp7CiAg
ICByZXR1cm4gZ3RrX3dpZGdldF9oaWRlX29uX2RlbGV0ZShndGspOwp9Ci0gKHZvaWQpIHNldFN0
eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfd2lkZ2V0X3NldF9zdHlsZShndGssIHN0
eWxlID8gc3R5bGUtPmd0ayA6IDApOwp9Ci0gKHZvaWQpIHNldFJjU3R5bGUKewogICAgZ3RrX3dp
ZGdldF9zZXRfcmNfc3R5bGUoZ3RrKTsKfQotICh2b2lkKSBlbnN1cmVTdHlsZQp7CiAgICBndGtf
d2lkZ2V0X2Vuc3VyZV9zdHlsZShndGspOwp9Ci0gKEdUS1N0eWxlKikgZ2V0U3R5bGUKewogICAg
cmV0dXJuIGd0b29sa2l0X29iamVjdChndGtfd2lkZ2V0X2dldF9zdHlsZShndGspLCAiR1RLU3R5
bGUiKTsKfQotICh2b2lkKSByZXN0b3JlRGVmYXVsdFN0eWxlCnsKICAgIGd0a193aWRnZXRfcmVz
dG9yZV9kZWZhdWx0X3N0eWxlKGd0ayk7Cn0KLSAodm9pZCkgbW9kaWZ5U3R5bGU6KEd0a1JjU3R5
bGUgKikgc3R5bGUKewogICAgZ3RrX3dpZGdldF9tb2RpZnlfc3R5bGUoZ3RrLCBzdHlsZSk7Cn0K
LSAodm9pZCkgc2V0Q29tcG9zaXRlTmFtZTooTlNTdHJpbmcgKikgbmFtZQp7CiAgICBndGtfd2lk
Z2V0X3NldF9jb21wb3NpdGVfbmFtZShndGssZ3Rvb2xraXRfdXRmOF9zdHJpbmcoIG5hbWUpKTsK
fQotIChOU1N0cmluZyAqKSBnZXRDb21wb3NpdGVOYW1lCnsKICAgIHJldHVybiBndG9vbGtpdF9v
YmpjX3N0cmluZyhndGtfd2lkZ2V0X2dldF9jb21wb3NpdGVfbmFtZShndGspKTsKfQotICh2b2lk
KSByZXNldFJjU3R5bGVzCnsKICAgIGd0a193aWRnZXRfcmVzZXRfcmNfc3R5bGVzKGd0ayk7Cn0K
KyAodm9pZCkgcHVzaFN0eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfd2lkZ2V0X3B1
c2hfc3R5bGUoIHN0eWxlID8gc3R5bGUtPmd0ayA6IDApOwp9CisgKHZvaWQpIHB1c2hDb2xvcm1h
cDooR2RrQ29sb3JtYXAgKikgY21hcAp7CiAgICBndGtfd2lkZ2V0X3B1c2hfY29sb3JtYXAoIGNt
YXApOwp9CisgKHZvaWQpIHB1c2hWaXN1YWw6KEdka1Zpc3VhbCAqKSB2aXN1YWwKewogICAgZ3Rr
X3dpZGdldF9wdXNoX3Zpc3VhbCggdmlzdWFsKTsKfQorICh2b2lkKSBwdXNoQ29tcG9zaXRlQ2hp
bGQKewogICAgZ3RrX3dpZGdldF9wdXNoX2NvbXBvc2l0ZV9jaGlsZCgpOwp9CisgKHZvaWQpIHBv
cENvbXBvc2l0ZUNoaWxkCnsKICAgIGd0a193aWRnZXRfcG9wX2NvbXBvc2l0ZV9jaGlsZCgpOwp9
CisgKHZvaWQpIHBvcFN0eWxlCnsKICAgIGd0a193aWRnZXRfcG9wX3N0eWxlKCk7Cn0KKyAodm9p
ZCkgcG9wQ29sb3JtYXAKewogICAgZ3RrX3dpZGdldF9wb3BfY29sb3JtYXAoKTsKfQorICh2b2lk
KSBwb3BWaXN1YWwKewogICAgZ3RrX3dpZGdldF9wb3BfdmlzdWFsKCk7Cn0KKyAodm9pZCkgc2V0
RGVmYXVsdFN0eWxlOihHVEtTdHlsZSAqKSBzdHlsZQp7CiAgICBndGtfd2lkZ2V0X3NldF9kZWZh
dWx0X3N0eWxlKCBzdHlsZSA/IHN0eWxlLT5ndGsgOiAwKTsKfQorICh2b2lkKSBzZXREZWZhdWx0
Q29sb3JtYXA6KEdka0NvbG9ybWFwICopIGNvbG9ybWFwCnsKICAgIGd0a193aWRnZXRfc2V0X2Rl
ZmF1bHRfY29sb3JtYXAoIGNvbG9ybWFwKTsKfQorICh2b2lkKSBzZXREZWZhdWx0VmlzdWFsOihH
ZGtWaXN1YWwgKikgdmlzdWFsCnsKICAgIGd0a193aWRnZXRfc2V0X2RlZmF1bHRfdmlzdWFsKCB2
aXN1YWwpOwp9CisgKEdUS1N0eWxlKikgZ2V0RGVmYXVsdFN0eWxlCnsKICAgIHJldHVybiBndG9v
bGtpdF9vYmplY3QoZ3RrX3dpZGdldF9nZXRfZGVmYXVsdF9zdHlsZSgpLCAiR1RLU3R5bGUiKTsK
fQorIChHZGtDb2xvcm1hcCopIGdldERlZmF1bHRDb2xvcm1hcAp7CiAgICByZXR1cm4gZ3RrX3dp
ZGdldF9nZXRfZGVmYXVsdF9jb2xvcm1hcCgpOwp9CisgKEdka1Zpc3VhbCopIGdldERlZmF1bHRW
aXN1YWwKewogICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X2RlZmF1bHRfdmlzdWFsKCk7Cn0KLSAo
dm9pZCkgc2hhcGVDb21iaW5lTWFzazooR2RrQml0bWFwICopIHNoYXBlX21hc2sgb2Zmc2V0WDoo
Z2ludCkgb2Zmc2V0X3ggb2Zmc2V0WTooZ2ludCkgb2Zmc2V0X3kKewogICAgZ3RrX3dpZGdldF9z
aGFwZV9jb21iaW5lX21hc2soZ3RrLCBzaGFwZV9tYXNrICwgb2Zmc2V0X3ggLCBvZmZzZXRfeSk7
Cn0KLSAodm9pZCkgcGF0aDooZ3VpbnQgKikgcGF0aF9sZW5ndGggcGF0aDooTlNTdHJpbmcgKiop
IHBhdGggcGF0aFJldmVyc2VkOihOU1N0cmluZyAqKikgcGF0aF9yZXZlcnNlZAp7CiAgICBjaGFy
ICpfb3V0dmFsXzI7CiAgICBjaGFyICpfb3V0dmFsXzE7CiAgICBndGtfd2lkZ2V0X3BhdGgoZ3Rr
LCBwYXRoX2xlbmd0aCAsJl9vdXR2YWxfMSwmX291dHZhbF8yKTsKICAgICogcGF0aCAgPSBndG9v
bGtpdF9vYmpjX3N0cmluZyhfb3V0dmFsXzEpOwogICAgKiBwYXRoX3JldmVyc2VkID0gZ3Rvb2xr
aXRfb2JqY19zdHJpbmcoX291dHZhbF8yKTsKfQotICh2b2lkKSBjbGFzc1BhdGg6KGd1aW50ICop
IHBhdGhfbGVuZ3RoIHBhdGg6KE5TU3RyaW5nICoqKSBwYXRoIHBhdGhSZXZlcnNlZDooTlNTdHJp
bmcgKiopIHBhdGhfcmV2ZXJzZWQKewogICAgY2hhciAqX291dHZhbF8yOwogICAgY2hhciAqX291
dHZhbF8xOwogICAgZ3RrX3dpZGdldF9jbGFzc19wYXRoKGd0aywgcGF0aF9sZW5ndGggLCZfb3V0
dmFsXzEsJl9vdXR2YWxfMik7CiAgICAqIHBhdGggID0gZ3Rvb2xraXRfb2JqY19zdHJpbmcoX291
dHZhbF8xKTsKICAgICogcGF0aF9yZXZlcnNlZCA9IGd0b29sa2l0X29iamNfc3RyaW5nKF9vdXR2
YWxfMik7Cn0KI2RlZmluZSBndGsJKChHdGtXaWRnZXQgKikgZ3RrKQotIChHVEtXaWRnZXQgKikg
Z2V0UGFyZW50CnsKICAgIHJldHVybiBHVE9PTEtJVF9PQkpFQ1QoZ3RrLT5wYXJlbnQpOwp9Ci0g
KEdka1dpbmRvdyAqKSBnZXRXaW5kb3cKewogICAgcmV0dXJuIGd0ay0+d2luZG93Owp9CiN1bmRl
ZiBndGsKQGVuZAovKgogKiBHVG9vbEtpdCAtIE9iamVjdGl2ZS1DIGludGVyZmFjZSB0byB0aGUg
R0lNUCBUb29sa2l0CiAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCAgRWxtYXIgTHVk
d2lnCiAqCiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gZ3Rrd2luZG93LmggYnkgZ3Rr
Z2VuLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KI2luY2x1ZGUgPEdU
b29sS2l0L0dUS1dpbmRvdy5oPgojaW5jbHVkZSA8R1Rvb2xLaXQvR1RLV2lkZ2V0Lmg+CiNpbmNs
dWRlIDxHVG9vbEtpdC9HVEtBY2NlbEdyb3VwLmg+CgpAaW1wbGVtZW50YXRpb24gR1RLV2luZG93
CisgKEd0a1R5cGUpIGdldFR5cGUKewogICAgcmV0dXJuIGd0a193aW5kb3dfZ2V0X3R5cGUoKTsK
fQorIChpZCkgd2luZG93V2l0aFR5cGU6KEd0a1dpbmRvd1R5cGUpIHR5cGUKewogICAgcmV0dXJu
IFtbKEdUS1dpbmRvdyAqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFR5cGU6dHlwZV0gYXV0b3JlbGVh
c2VdOwp9Ci0gKGlkKSBpbml0V2l0aFR5cGU6KEd0a1dpbmRvd1R5cGUpIHR5cGUKewogICAgcmV0
dXJuIFtzZWxmIGluaXRXaXRoR3RrOmd0a193aW5kb3dfbmV3KCB0eXBlKV07Cn0KLSAodm9pZCkg
c2V0VGl0bGU6KE5TU3RyaW5nICopIHRpdGxlCnsKICAgIGd0a193aW5kb3dfc2V0X3RpdGxlKGd0
ayxndG9vbGtpdF91dGY4X3N0cmluZyggdGl0bGUpKTsKfQotICh2b2lkKSBzZXRXbWNsYXNzOihO
U1N0cmluZyAqKSB3bWNsYXNzX25hbWUgd21jbGFzc0NsYXNzOihOU1N0cmluZyAqKSB3bWNsYXNz
X2NsYXNzCnsKICAgIGd0a193aW5kb3dfc2V0X3dtY2xhc3MoZ3RrLGd0b29sa2l0X3V0Zjhfc3Ry
aW5nKCB3bWNsYXNzX25hbWUgKSxndG9vbGtpdF91dGY4X3N0cmluZyggd21jbGFzc19jbGFzcykp
Owp9Ci0gKHZvaWQpIHNldFBvbGljeTooZ2ludCkgYWxsb3dfc2hyaW5rIGFsbG93R3JvdzooZ2lu
dCkgYWxsb3dfZ3JvdyBhdXRvU2hyaW5rOihnaW50KSBhdXRvX3Nocmluawp7CiAgICBndGtfd2lu
ZG93X3NldF9wb2xpY3koZ3RrLCBhbGxvd19zaHJpbmsgLCBhbGxvd19ncm93ICwgYXV0b19zaHJp
bmspOwp9Ci0gKHZvaWQpIGFkZEFjY2VsR3JvdXA6KEdUS0FjY2VsR3JvdXAgKikgYWNjZWxfZ3Jv
dXAKewogICAgZ3RrX3dpbmRvd19hZGRfYWNjZWxfZ3JvdXAoZ3RrLCBhY2NlbF9ncm91cCA/IGFj
Y2VsX2dyb3VwLT5ndGsgOiAwKTsKfQotICh2b2lkKSByZW1vdmVBY2NlbEdyb3VwOihHVEtBY2Nl
bEdyb3VwICopIGFjY2VsX2dyb3VwCnsKICAgIGd0a193aW5kb3dfcmVtb3ZlX2FjY2VsX2dyb3Vw
KGd0aywgYWNjZWxfZ3JvdXAgPyBhY2NlbF9ncm91cC0+Z3RrIDogMCk7Cn0KLSAodm9pZCkgc2V0
UG9zaXRpb246KEd0a1dpbmRvd1Bvc2l0aW9uKSBwb3NpdGlvbgp7CiAgICBndGtfd2luZG93X3Nl
dF9wb3NpdGlvbihndGssIHBvc2l0aW9uKTsKfQotIChnaW50KSBhY3RpdmF0ZUZvY3VzCnsKICAg
IHJldHVybiBndGtfd2luZG93X2FjdGl2YXRlX2ZvY3VzKGd0ayk7Cn0KLSAoZ2ludCkgYWN0aXZh
dGVEZWZhdWx0CnsKICAgIHJldHVybiBndGtfd2luZG93X2FjdGl2YXRlX2RlZmF1bHQoZ3RrKTsK
fQotICh2b2lkKSBzZXRUcmFuc2llbnRGb3I6KEdUS1dpbmRvdyAqKSBwYXJlbnQKewogICAgZ3Rr
X3dpbmRvd19zZXRfdHJhbnNpZW50X2ZvcihndGssIHBhcmVudCA/IHBhcmVudC0+Z3RrIDogMCk7
Cn0KLSAodm9pZCkgc2V0R2VvbWV0cnlIaW50czooR1RLV2lkZ2V0ICopIGdlb21ldHJ5X3dpZGdl
dCBnZW9tZXRyeTooR2RrR2VvbWV0cnkgKikgZ2VvbWV0cnkgZ2VvbU1hc2s6KEdka1dpbmRvd0hp
bnRzKSBnZW9tX21hc2sKewogICAgZ3RrX3dpbmRvd19zZXRfZ2VvbWV0cnlfaGludHMoZ3RrLCBn
ZW9tZXRyeV93aWRnZXQgID8gZ2VvbWV0cnlfd2lkZ2V0IC0+Z3RrIDogMCwgZ2VvbWV0cnkgLCBn
ZW9tX21hc2spOwp9Ci0gKHZvaWQpIHNldERlZmF1bHRTaXplOihnaW50KSB3aWR0aCBoZWlnaHQ6
KGdpbnQpIGhlaWdodAp7CiAgICBndGtfd2luZG93X3NldF9kZWZhdWx0X3NpemUoZ3RrLCB3aWR0
aCAsIGhlaWdodCk7Cn0KLSAodm9pZCkgc2V0TW9kYWw6KGdib29sZWFuKSBtb2RhbAp7CiAgICBn
dGtfd2luZG93X3NldF9tb2RhbChndGssIG1vZGFsKTsKfQojaW5jbHVkZSA8Rm91bmRhdGlvbi9O
U0F1dG9yZWxlYXNlUG9vbC5oPgojaW5jbHVkZSA8Rm91bmRhdGlvbi9OU05vdGlmaWNhdGlvbi5o
PgoKCk5TU3RyaW5nICpHVEtXaW5kb3dEaWRCZWNvbWVNYWluTm90aWZpY2F0aW9uID0gQCJHVEtX
aW5kb3dEaWRCZWNvbWVNYWluIjsKTlNTdHJpbmcgKkdUS1dpbmRvd0RpZFJlc2lnbk1haW5Ob3Rp
ZmljYXRpb24gPSBAIkdUS1dpbmRvd0RpZFJlc2lnbk1haW4iOwpOU1N0cmluZyAqR1RLV2luZG93
V2lsbENsb3NlTm90aWZpY2F0aW9uID0gQCJHVEtXaW5kb3dXaWxsQ2xvc2UiOwpOU1N0cmluZyAq
R1RLV2luZG93V2lsbE9wZW5Ob3RpZmljYXRpb24gPSBAIkdUS1dpbmRvd1dpbGxPcGVuIjsKCnN0
YXRpYyBnaW50IGZvY3VzX2luX3dpbmRvdyAoR3RrV2lkZ2V0ICp3aW4sIEdka0V2ZW50ICpldmVu
dCwgR1RLV2luZG93ICpzZWxmKQp7CiAgICBOU0F1dG9yZWxlYXNlUG9vbCAqcG9vbCA9IFtOU0F1
dG9yZWxlYXNlUG9vbCBuZXddOwoKICAgIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENl
bnRlcl0gcG9zdE5vdGlmaWNhdGlvbk5hbWU6CglHVEtXaW5kb3dEaWRCZWNvbWVNYWluTm90aWZp
Y2F0aW9uIG9iamVjdDpzZWxmXTsKICAgIFtwb29sIHJlbGVhc2VdOwogICAgcmV0dXJuIE5POwp9
CgpzdGF0aWMgZ2ludCBmb2N1c19vdXRfd2luZG93IChHdGtXaWRnZXQgKndpbiwgR2RrRXZlbnQg
KmV2ZW50LCBHVEtXaW5kb3cgKnNlbGYpCnsKICAgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sID0g
W05TQXV0b3JlbGVhc2VQb29sIG5ld107CgogICAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZh
dWx0Q2VudGVyXSBwb3N0Tm90aWZpY2F0aW9uTmFtZToKCUdUS1dpbmRvd0RpZFJlc2lnbk1haW5O
b3RpZmljYXRpb24gb2JqZWN0OnNlbGZdOwogICAgW3Bvb2wgcmVsZWFzZV07CiAgICByZXR1cm4g
Tk87Cn0KCnN0YXRpYyBnaW50IGRlbGV0ZV93aW5kb3cgKEd0a1dpZGdldCAqd2luLCBHZGtFdmVu
dCAqZXZlbnQsIEdUS1dpbmRvdyAqc2VsZikKewogICAgTlNBdXRvcmVsZWFzZVBvb2wgKnBvb2wg
PSBbTlNBdXRvcmVsZWFzZVBvb2wgbmV3XTsKICAgIGlkIGRlbGVnYXRlID0gW3NlbGYgZGVsZWdh
dGVdOwogICAgZ2ludCByZXN1bHQgPSBOTzsKCiAgICBpZiAoW2RlbGVnYXRlIHJlc3BvbmRzVG9T
ZWxlY3RvcjpAc2VsZWN0b3Iod2luZG93U2hvdWxkQ2xvc2U6KV0gJiYKCVtkZWxlZ2F0ZSB3aW5k
b3dTaG91bGRDbG9zZTpzZWxmXSA9PSBOTykgcmVzdWx0ID0gWUVTOwogICAgW3Bvb2wgcmVsZWFz
ZV07CiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgdm9pZCBkZXN0cm95X3dpbmRvdyAoR3Rr
V2lkZ2V0ICp3aW4sIEdUS1dpbmRvdyAqc2VsZikKewogICAgTlNBdXRvcmVsZWFzZVBvb2wgKnBv
b2wgPSBbTlNBdXRvcmVsZWFzZVBvb2wgbmV3XTsKCiAgICBbW05TTm90aWZpY2F0aW9uQ2VudGVy
IGRlZmF1bHRDZW50ZXJdIHBvc3ROb3RpZmljYXRpb25OYW1lOgoJR1RLV2luZG93V2lsbENsb3Nl
Tm90aWZpY2F0aW9uIG9iamVjdDpzZWxmXTsKICAgIFtwb29sIHJlbGVhc2VdOwp9CgogLSAoaWQp
IGluaXRXaXRoR3RrOihncG9pbnRlcikgX2d0awp7CiAgICBbc3VwZXIgaW5pdFdpdGhHdGs6X2d0
a107CgogICAgZ3RrX3NpZ25hbF9jb25uZWN0KF9ndGssICJmb2N1c19pbl9ldmVudCIsCgkJCShH
dGtTaWduYWxGdW5jKSBmb2N1c19pbl93aW5kb3csIHNlbGYpOwogICAgZ3RrX3NpZ25hbF9jb25u
ZWN0KF9ndGssICJmb2N1c19vdXRfZXZlbnQiLAoJCQkoR3RrU2lnbmFsRnVuYykgZm9jdXNfb3V0
X3dpbmRvdywgc2VsZik7CiAgICBndGtfc2lnbmFsX2Nvbm5lY3QoX2d0aywgImRlc3Ryb3kiLCAo
R3RrU2lnbmFsRnVuYykgZGVzdHJveV93aW5kb3csIHNlbGYpOwoKICAgIFtbTlNOb3RpZmljYXRp
b25DZW50ZXIgZGVmYXVsdENlbnRlcl0gcG9zdE5vdGlmaWNhdGlvbk5hbWU6CglHVEtXaW5kb3dX
aWxsT3Blbk5vdGlmaWNhdGlvbiBvYmplY3Q6c2VsZl07CgogICAgW3NlbGYgcmVmXTsJCS8vIGZp
cnN0IHJlZmVyZW5jZSBpcyBtaXNzaW5nIChkdWUgdG8gZmxvYXRpbmcgZmxhZykKICAgIHJldHVy
biAgc2VsZjsJLy8gYXZvaWQgYnVnIGluIG9iamNkb2MKfQoKLyoKICogU2V0IHRoZSBkZWxlZ2F0
ZSBvYmplY3Qgb2YgdGhpcyB3aW5kb3cgb3IgdW5zZXQgaXQgKGlmIC9kZWxlZ2F0ZS8KICogaXMg
fG5pbHwpLiBJZiB0aGUgZGVsZWdhdGUgaW1wbGVtZW50cyBzb21lIG9mIHRoZSBtZXRob2RzIGRl
c2NyaWJlZAogKiBpbiB0aGUgcHJvdG9jb2wgQHByb3RvKEdUS1dpbmRvd0RlbGVnYXRlKSwgaXQg
d2lsbCBiZSBub3RpZmllZCBieQogKiB0aGUgd2luZG93IG9uIHRoZSBjb3JyZXNwb25kaW5nIGV2
ZW50cy4KICovCi0gKHZvaWQpIHNldERlbGVnYXRlOihpZCkgb2JqZWN0CnsKICAgIE5TTm90aWZp
Y2F0aW9uQ2VudGVyICpjZW50ZXIgPSBbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRl
cl07CgogICAgaWYgKGRlbGVnYXRlKSBbY2VudGVyIHJlbW92ZU9ic2VydmVyOmRlbGVnYXRlIG5h
bWU6bmlsIG9iamVjdDpzZWxmXTsKICAgIGRlbGVnYXRlID0gb2JqZWN0OwoKICAgIGlmIChbb2Jq
ZWN0IHJlc3BvbmRzVG9TZWxlY3RvcjpAc2VsZWN0b3Iod2luZG93RGlkQmVjb21lTWFpbjopXSkK
CVtjZW50ZXIgYWRkT2JzZXJ2ZXI6b2JqZWN0IHNlbGVjdG9yOkBzZWxlY3Rvcih3aW5kb3dEaWRC
ZWNvbWVNYWluOikKCQluYW1lOkdUS1dpbmRvd0RpZEJlY29tZU1haW5Ob3RpZmljYXRpb24gb2Jq
ZWN0OnNlbGZdOwogICAgaWYgKFtvYmplY3QgcmVzcG9uZHNUb1NlbGVjdG9yOkBzZWxlY3Rvcih3
aW5kb3dEaWRSZXNpZ25NYWluOildKQoJW2NlbnRlciBhZGRPYnNlcnZlcjpvYmplY3Qgc2VsZWN0
b3I6QHNlbGVjdG9yKHdpbmRvd0RpZFJlc2lnbk1haW46KQoJCW5hbWU6R1RLV2luZG93RGlkUmVz
aWduTWFpbk5vdGlmaWNhdGlvbiBvYmplY3Q6c2VsZl07CiAgICBpZiAoW29iamVjdCByZXNwb25k
c1RvU2VsZWN0b3I6QHNlbGVjdG9yKHdpbmRvd1dpbGxDbG9zZTopXSkKCVtjZW50ZXIgYWRkT2Jz
ZXJ2ZXI6b2JqZWN0IHNlbGVjdG9yOkBzZWxlY3Rvcih3aW5kb3dXaWxsQ2xvc2U6KQoJCW5hbWU6
R1RLV2luZG93V2lsbENsb3NlTm90aWZpY2F0aW9uIG9iamVjdDpzZWxmXTsKCiAgICBpZiAoaGFu
ZGxlcl9pZCA9PSAwICYmCglbb2JqZWN0IHJlc3BvbmRzVG9TZWxlY3RvcjpAc2VsZWN0b3Iod2lu
ZG93U2hvdWxkQ2xvc2U6KV0pCgloYW5kbGVyX2lkID0gZ3RrX3NpZ25hbF9jb25uZWN0KGd0aywg
ImRlbGV0ZV9ldmVudCIsCgkJCQkJKEd0a1NpZ25hbEZ1bmMpIGRlbGV0ZV93aW5kb3csIHNlbGYp
Owp9CgovKgogKiBSZXR1cm4gdGhpcyB3aW5kb3cncyBkZWxlZ2F0ZSBvYmplY3QuCiAqLwotIChp
ZCkgZGVsZWdhdGUKewogICAgcmV0dXJuIGRlbGVnYXRlOwp9CgovKgogKiBTZW5kIGEgL2RlbGV0
ZV9ldmVudC8gc2lnbmFsIHRvIHRoaXMgd2luZG93LCBpLmUuIGFjdCBhcyBpZiB0aGUgdXNlcgog
KiBoYWQgY2xvc2VkIHRoZSByZWNlaXZlciB2aWEgdGhlIHdpbmRvdyBtYW5hZ2VyLiBUaGUgL3Nl
bmRlci8gcGFyYW1ldGVyCiAqIGlzIGlnbm9yZWQuPHA+CiAqIElmIHRoZSBkZWxlZ2F0ZSBpbXBs
ZW1lbnRzIHRoZSBtZXRob2Q6CiAqIDxwcmU+CiAqIC0gKEJPT0wpIHdpbmRvd1Nob3VsZENsb3Nl
OihHVEtXaW5kb3cgKikgc2VuZGVyPC9wcmU+CiAqCiAqIHRoaXMgbWVzc2FnZSBpcyBzZW50IHRv
IHRoZSBkZWxlZ2F0ZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgd2luZG93CiAqIHNob3VsZCBh
Y3R1YWxseSBiZSBjbG9zZWQuIElmIGl0IHJldHVybnMgfFlFU3wsIHRoaXMgbWV0aG9kIHdpbGwg
cG9zdAogKiB0aGUgR1RLV2luZG93V2lsbENsb3NlTm90aWZpY2F0aW9uIHRvIHRoZSBkZWZhdWx0
IG5vdGlmaWNhdGlvbiBjZW50ZXIKICogYW5kIGNsb3NlIHRoZSB3aW5kb3cuCiAqIEBzZWUgLWRl
c3Ryb3kKICovCi0gKHZvaWQpIHBlcmZvcm1DbG9zZTooaWQpIHNlbmRlcgp7CiAgICBHZGtFdmVu
dCBldmVudCA9IHsgR0RLX0RFTEVURSB9OwogICAgZ2ludCByZXN1bHQ7CgogICAgZXZlbnQuYW55
LndpbmRvdyA9ICgoR3RrV2lkZ2V0ICopIGd0ayktPndpbmRvdzsKICAgIGd0a19zaWduYWxfZW1p
dF9ieV9uYW1lKGd0aywgImRlbGV0ZV9ldmVudCIsICZldmVudCwgJnJlc3VsdCk7Cn0KCiNkZWZp
bmUgZ3RrCSgoR3RrV2luZG93ICopIGd0aykKLSAoTlNTdHJpbmcgKikgdGl0bGUKewogICAgcmV0
dXJuIGd0b29sa2l0X29iamNfc3RyaW5nKGd0ay0+dGl0bGUpOwp9Ci0gKEdUS1dpZGdldCAqKSBm
b2N1c1dpZGdldAp7CiAgICByZXR1cm4gR1RPT0xLSVRfT0JKRUNUKGd0ay0+Zm9jdXNfd2lkZ2V0
KTsKfQotIChHVEtXaWRnZXQgKikgZGVmYXVsdFdpZGdldAp7CiAgICByZXR1cm4gR1RPT0xLSVRf
T0JKRUNUKGd0ay0+ZGVmYXVsdF93aWRnZXQpOwp9CiN1bmRlZiBndGsKQGVuZAo=
>From tromey@gcc.gnu.org Sun Apr 01 00:00:00 2001
From: tromey@gcc.gnu.org
To: tromey@gcc.gnu.org
Cc: gcc-prs@gcc.gnu.org
Subject: Re: java/2280
Date: Sun, 01 Apr 2001 00:00:00 -0000
Message-id: <20010313235602.7839.qmail@sourceware.cygnus.com>
X-SW-Source: 2001-q1/msg02306.html
Content-length: 759

The following reply was made to PR java/2280; it has been noted by GNATS.

From: tromey@gcc.gnu.org
To: gcc-gnats@gcc.gnu.org, nobody@gcc.gnu.org, praun@inf.ethz.ch,
  tromey@gcc.gnu.org
Cc:  
Subject: Re: java/2280
Date: 13 Mar 2001 23:55:04 -0000

 Synopsis: gcj -C does not translate Java 'finally' correctly
 
 Responsible-Changed-From-To: unassigned->tromey
 Responsible-Changed-By: tromey
 Responsible-Changed-When: Tue Mar 13 15:55:04 2001
 Responsible-Changed-Why:
     This is mine.
 State-Changed-From-To: open->analyzed
 State-Changed-By: tromey
 State-Changed-When: Tue Mar 13 15:55:04 2001
 State-Changed-Why:
     This is the same as 2216.
     A patch should go in soon.
 
 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=2280&database=gcc


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: c++/1772
@ 2001-04-29  4:56 lerdsuwa
  0 siblings, 0 replies; 2+ messages in thread
From: lerdsuwa @ 2001-04-29  4:56 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c++/1772; it has been noted by GNATS.

From: lerdsuwa@gcc.gnu.org
To: Jens.Maurer@gmx.net, gcc-gnats@gcc.gnu.org, nobody@gcc.gnu.org
Cc:  
Subject: Re: c++/1772
Date: 29 Apr 2001 11:55:08 -0000

 Synopsis: ICE when instantiating templates with "long long" values
 
 State-Changed-From-To: analyzed->closed
 State-Changed-By: lerdsuwa
 State-Changed-When: Sun Apr 29 07:55:08 2001
 State-Changed-Why:
     Fixed in gcc 3.0 branch.
 
 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=1772&database=gcc


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2001-04-29  4:56 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-04-01  0:00 c++/1772 gdr
2001-04-29  4:56 c++/1772 lerdsuwa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).