This is the mail archive of the gcc-prs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

c++/6887: g++-3.1 fails to link program on AIX 4.3.3



>Number:         6887
>Category:       c++
>Synopsis:       g++-3.1 fails to link program on AIX 4.3.3
>Confidential:   no
>Severity:       critical
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Fri May 31 08:16:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator:     Philippe Nobili
>Release:        unknown-1.0
>Organization:
>Environment:
Reading specs from /DEVTOOLS/free/AIX4.3/lib/gcc-lib/powerpc-ibm-aix4.3.3.0/3.1/specs
Configured with: ../gcc-3.1/configure --prefix=/DEVTOOLS/free/AIX4.3
Thread model: aix
gcc version 3.1
>Description:
g++-3.1 fails to correctly link-edit program on
AIX 4.3.3.

(So do g++-3.0.x x=0,1,2,3,4)
>How-To-Repeat:
g++ -c -frepo tryg++.cc
g++ tryg++.o

<==> Command Output : <==>

collect: recompiling tryg++.cc
collect: relinking
collect: recompiling tryg++.cc
collect: relinking
ld: 0711-317 ERROR: Undefined symbol: .std::ios_base::Init::Init[in-charge]()
ld: 0711-317 ERROR: Undefined symbol: .std::ios_base::Init::~Init [in-charge]()ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
collect2: ld returned 8 exit status
>Fix:
None
>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: application/octet-stream; name="tryg++.cc"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="tryg++.cc"

LyogJElkJCAqLwoKI2luY2x1ZGUgPGxpc3Q+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxtYXA+
CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxzdGFjaz4K
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZCA7Cgp0eXBlZGVmIGZsb2F0
IFNwQ29vcmQgOwoKY2xhc3MgUG9pbnQgewoKcHVibGljIDoKCiAgUG9pbnQoKSB7IHhfID0gMCwg
eV8gPSAwLCB6XyA9IDAgOyB9CiAgUG9pbnQoU3BDb29yZCB4LFNwQ29vcmQgeSxTcENvb3JkIHop
IHsgeF8gPSB4LCB5XyA9IHksIHpfID0geiA7IH0KICBQb2ludChjb25zdCBQb2ludCYgcHQpIHsg
eF8gPSBwdC54XywgeV8gPSBwdC55Xywgel8gPSBwdC56XyA7IH0KICBQb2ludCYgb3BlcmF0b3Ig
PShjb25zdCBQb2ludCYgcHQpIHsKICAgIGlmKCAmcHQgIT0gdGhpcyApIHsKICAgICAgeF8gPSBw
dC54XywgeV8gPSBwdC55Xywgel8gPSBwdC56XyA7CiAgICB9CiAgICByZXR1cm4gKnRoaXMgOwog
IH0KICB+UG9pbnQoKSB7fQoKICBib29sIG9wZXJhdG9yID09IChjb25zdCBQb2ludCYgcHQpIGNv
bnN0IHsKICAgIHJldHVybiB4XyA9PSBwdC54XyAmJiB5XyA9PSBwdC55XyAmJiB6XyA9PSBwdC56
XyA7CiAgfQoKICBTcENvb3JkIHgoKSBjb25zdCB7IHJldHVybiB4XyA7IH0KICBTcENvb3JkIHko
KSBjb25zdCB7IHJldHVybiB5XyA7IH0KICBTcENvb3JkIHooKSBjb25zdCB7IHJldHVybiB6XyA7
IH0KCiAgdm9pZCB4KFNwQ29vcmQgeCkgeyB4XyA9IHggOyB9CiAgdm9pZCB5KFNwQ29vcmQgeSkg
eyB5XyA9IHkgOyB9CiAgdm9pZCB6KFNwQ29vcmQgeikgeyB6XyA9IHogOyB9Cgpwcml2YXRlIDoK
CiAgU3BDb29yZCB4Xyx5Xyx6XyA7Cn0gOwoKY2xhc3MgUG9pbnRzIHsKCnB1YmxpYyA6CgogIFBv
aW50cyAoaW50IHNpemUpIDogcG9pbnRzXyhzaXplKSB7fQogIH5Qb2ludHMoKSB7fQoKICB2b2lk
IHB1c2hQb2ludChjb25zdCBQb2ludCYgcHQpIHsKICAgIHBvaW50c19bcG9pbnRzXy5zaXplKCld
ID0gcHQgOwogIH0KICB2b2lkIGFkZFBvaW50QXQoY29uc3QgUG9pbnQmIHB0LGludCBwb3MpIHsK
ICAgIHBvaW50c19bcG9zXSA9IHB0IDsKICB9CiAgY29uc3QgUG9pbnQmIGdldFBvaW50KGludCBw
aWQpIGNvbnN0IHsKICAgIHJldHVybiBwb2ludHNfW3BpZF0gOwogIH0KCnByaXZhdGUgOgoKICBz
dGQ6OnZlY3RvcjxQb2ludD4gcG9pbnRzXyA7Cn0gOwoKY2xhc3MgVmVjdG9yIHsKCnB1YmxpYyA6
CgogIFZlY3RvcigpIHsgeF8gPSAwLCB5XyA9IDAsIHpfID0gMCA7IH0KICBWZWN0b3IoU3BDb29y
ZCB4LFNwQ29vcmQgeSxTcENvb3JkIHopIHsgeF8gPSB4LCB5XyA9IHksIHpfID0geiA7IH0KICBW
ZWN0b3IoY29uc3QgVmVjdG9yJiB2KSB7IHhfID0gdi54XywgeV8gPSB2LnlfLCB6XyA9IHYuel8g
OyB9CiAgVmVjdG9yKGNvbnN0IFBvaW50JiBvcmcsY29uc3QgUG9pbnQmIGV4dCkgewogICAgeF8g
PSBleHQueCgpIC0gb3JnLngoKSA7CiAgICB5XyA9IGV4dC55KCkgLSBvcmcueSgpIDsKICAgIHpf
ID0gZXh0LnooKSAtIG9yZy56KCkgOwogIH0KICBWZWN0b3IoY29uc3QgUG9pbnQmIGV4dCkgeyB4
XyA9IGV4dC54KCkgOyB5XyA9IGV4dC55KCkgOyB6XyA9IGV4dC56KCkgOyB9CiAgVmVjdG9yJiBv
cGVyYXRvciA9KGNvbnN0IFZlY3RvciYgdikgewogICAgaWYoICZ2ICE9IHRoaXMgKSB7IHhfID0g
di54XyA7IHlfID0gdi55XyA7IHpfID0gdi56XyA7IH0KICAgIHJldHVybiAqdGhpcyA7CiAgfQoK
ICBWZWN0b3Igb3BlcmF0b3IgXihjb25zdCBWZWN0b3ImIHYpIGNvbnN0IHsKICAgIHJldHVybiBW
ZWN0b3IoKHlfKnYuel8gLSB5Xyp6XyksKHpfKnYueF8gLSB2LnpfKnhfKSwoeF8qdi55XyAtIHYu
eF8qeV8pKSA7CiAgfQogIFNwQ29vcmQgb3BlcmF0b3IgKihjb25zdCBWZWN0b3ImIHYpIGNvbnN0
IHsKICAgIHJldHVybiB4Xyp2LnhfICsgeV8qdi55XyArIHpfKnYuel8gOwogIH0KICBTcENvb3Jk
ICB4KCkgY29uc3QgeyByZXR1cm4geF8gOyB9CiAgU3BDb29yZCAgeSgpIGNvbnN0IHsgcmV0dXJu
IHlfIDsgfQogIFNwQ29vcmQgIHooKSBjb25zdCB7IHJldHVybiB6XyA7IH0KCiAgU3BDb29yZCYg
eCgpIHsgcmV0dXJuIHhfIDsgfQogIFNwQ29vcmQmIHkoKSB7IHJldHVybiB5XyA7IH0KICBTcENv
b3JkJiB6KCkgeyByZXR1cm4gel8gOyB9CgogIFNwQ29vcmQgc3Fub3JtKCkgY29uc3QgeyByZXR1
cm4geF8qeF8gKyB5Xyp5XyArIHpfKnpfIDsgfQoKcHJpdmF0ZSA6CgogIFNwQ29vcmQgeF8sIHlf
LCB6XyA7Cn0gOwoKLy8vIE51bWVyZXJlZCBUTkFwZXguCi8qKgogIEluZGV4ZWQgYXBleCBmcm9t
IDxpPjE8L2k+IHRvIDxpPm48L2k+LgogICovCmNsYXNzIFROQXBleCB7CgpwdWJsaWMgOgoKICAv
KiogQ29uc3RydWN0b3IKICAgIEJ1aWxkcyB0aGUgYXBleCBudW1iZXJlZCA8aT5udW1fYXBleDwv
aT4uCiAgICBAcGFyYW0gbnVtX2luZGV4IFRoZSBpbmRleCBvZiB0aGUgYXBleCBiZWluZyBidWls
dC4KICAgICovCiAgVE5BcGV4IChpbnQgbnVtX2FwZXgpIHsgYXBleElkXyA9IG51bV9hcGV4IDsg
fQogIH5UTkFwZXgoKSB7fQoKICAvKioKICAgIEdldHMgdGhlIGFwZXgncyBpbmRleC4KICAgIEBy
ZXR1cm4gQW4gaW50ZWdlciBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byA8Yj4xPC9iPi4KICAgICov
CiAgaW50IGdldEFwZXhJZCgpIGNvbnN0IHsgcmV0dXJuIGFwZXhJZF8gOyB9Cgpwcml2YXRlIDoK
CiAgaW50IGFwZXhJZF8gOwp9IDsKCi8vLyBFZGdlIHdpdGggYHdpbmdzJwovKioKICBUaGlzIGNs
YXNzIGlzIHVzZWQgdG8gbW9kZWwgdGhlIGVkZ2Ugc2hhcmVkIGJ5IHR3byBhZGphY2VudCBjZWxs
cy4KICBBbnkgZWRnZSBrbm93cyBhYm91dCB0aGUgdHdvIGNlbGxzIHRoYXQgc2hhcmUgaXQuCiAg
Ki8KCmNsYXNzIFROQ2VsbCA7CgpjbGFzcyBUTkVkZ2UgewoKcHVibGljIDoKCiAgLyoqIENvbnN0
cnVjdG9yLgogICAgQnVpbGRzIGFuIGVkZ2UuIFRoZSBpbmRleCBpcyBhbiBpbnRlZ2VyID49IDxi
PjE8L2I+LgogICAgKi8gICAKICBUTkVkZ2UoaW50IG51bV9hcmV0ZSkgeyBlZGdlSWRfID0gbnVt
X2FyZXRlIDsgfQogIH5UTkVkZ2UoKSB7fQoKICAvKioKICAgIENvbm5lY3RzIHR3byBhcGljZXMg
d2l0aGluIHRoaXMgZWRnZS4gVGhlIG9yZGVyaW5nIG9mIHRoZSB0d28gYXBpY2VzCiAgICBoYXMg
bm8gaW1wb3J0YW5jZSBoZXJlLgogICAgQHBhcmFtIGExIFRoZSBmaXJzdCBhcGV4LgogICAgQHBh
cmFtIGEyIFRoZSBzZWNvbmQgb25lLgogICAgKi8KICB2b2lkIGNvbm5lY3RBcGljZXMoVE5BcGV4
ICphMSxUTkFwZXggKmEyKSB7CiAgICBhcGljZXNfWzBdID0gYTEgOwogICAgYXBpY2VzX1sxXSA9
IGEyIDsKICB9CiAgLyoqCiAgICBSZXR1cm5zIG9uZSBvZiB0aGUgY2VsbHMgdGhhdCBzaGFyZSB0
aGlzIGVkZ2UuCiAgICBAcGFyYW0gd2luZyBlaXRoZXIgPGI+MDwvYj4gb3IgPGI+MTwvYj4uCiAg
ICBAcmV0dXJuIEEgY29uc3QgcG9pbnRlciB0byB0aGUgY2VsbCBvciAwIGlmIHRoZSBlZGdlIGlz
IG9uIGEgYm91bmRhcnkuCiAgICAqLwogIGNvbnN0IFROQ2VsbCogZ2V0V2luZyhpbnQgd2luZykg
Y29uc3QgewogICAgcmV0dXJuIHdpbmdzX1t3aW5nXSA7CiAgfQogIC8qKgogICAgUmV0dXJucyBh
biBhcGV4IG9mIHRoaXMgZWRnZS4KICAgIEBwYXJhbSBhcGV4IGVpdGhlciA8Yj4wPC9iPiBvciA8
Yj4xPC9iPi4KICAgIEByZXR1cm4gQSBjb25zdCBwb2ludGVyIHRvIHRoZSBhcGV4LgogICovCiAg
Y29uc3QgVE5BcGV4KiBnZXRBcGV4KGludCBhcGV4KSBjb25zdCB7CiAgICByZXR1cm4gYXBpY2Vz
X1thcGV4XSA7CiAgfQogIC8qKgogICAgU2V0cyBvbmUgb2YgdGhlIHR3byA8aW0+d2luZ3M8L2lt
PiBvZiB0aGlzIGVkZ2UuCiAgICBAcGFyYW0gd2luZyBlaXRoZXIgPGI+MDwvYj4gb3IgPGI+MTwv
Yj4uCiAgICBAcGFyYW0gdHIgVGhlIGNlbGwgb24gdGhpcyBzaWRlIG9mIHRoZSBlZ2RlLgogICAg
Ki8KICB2b2lkIHNldFdpbmcoaW50IHdpbmcsVE5DZWxsKiB0cikgewogICAgd2luZ3NfW3dpbmdd
ID0gdHIgOwogIH0KICAvKioKICAgIEdldHMgdGhlIGluZGV4IG9mIHRoaXMgZWRnZS4KICAgIEBy
ZXR1cm4gQW4gaW50ZWdlciA+PSA8Yj4xPC9iPi4KICAgICovCiAgaW50IGdldEVkZ2VJZCgpIGNv
bnN0IHsgcmV0dXJuIGVkZ2VJZF8gOyB9CiAgCnByaXZhdGUgOgoKICBpbnQgICAgIGVkZ2VJZF8g
ICAgOwogIFROQXBleCAqYXBpY2VzX1syXSA7CiAgVE5DZWxsICp3aW5nc18gWzJdIDsKfSA7Cgov
Ly8gVHJpYW5ndWxhciBjZWxsLgovKioKICBBbnkgPGI+VE5DZWxsPC9iPiBtYWludGFpbnMgaXRz
IGNvbm5lY3Rpdml0eSB0byBhZGphY2VudCBjZWxscy4gSXQgaGFzIDMKICA8ZW0+YXBpY2VzPC9l
bT4gYW5kIDMgPGVtPmVkZ2VzPC9lbT4uIFRoZSBlZGdlcyBhcmUgb3JkZXJlZCBjbG9jay13aXNl
IGFuZAogIGFwZXggPGI+azwvYj4gZmFjZXMgZWRnZSA8Yj5rPC9iPiwgd2ljaCBncmVhdGx5IHNp
bXBsaWZpZXMgdGhlIHN0cnVjdHVyZQogIHRyYXZlcnNhbC4KICAqLwpjbGFzcyBUTkNlbGwgewoK
cHVibGljIDoKCiAgLyoqIENvbnN0cnVjdG9yLgogICAgQnVpbGRzIGFuIGluc3RhbmNlIGZyb20g
aXRzIGluZGV4LgogICAgKi8KICBUTkNlbGwoaW50IHRyaWFuZ2xlSWQpIHsgdHJpYW5nbGVJZF8g
PSB0cmlhbmdsZUlkIDsgfQogIC8qKiBEZXN0cnVjdG9yLgogICAqLwogIH5UTkNlbGwoKSB7fQog
IC8qKiBHZXR0aW5nIHRoZSBjZWxsJ3MgaWRlbnRpZmljYXRvci4KICAgIFRoaXMgbWV0aG9kIHJl
dHVybnMgdGhlIGNlbGwncyBpZC4KICAgIEByZXR1cm4gQW4gaW50ZWdlciA+PSA8Yj4xPC9iPi4K
ICAgICovCiAgaW50IGdldENlbGxJZCgpIGNvbnN0IHsgcmV0dXJuIHRyaWFuZ2xlSWRfIDsgfQog
IC8qKiBDb25uZWN0aW5nIGFwaWNlcy4KICAgIENvbm5lY3RzIGFwaWNlcyA8Yj5wMTwvYj4sIDxi
PnAyPC9iPiBhbmQgPGI+cDM8L2I+LgogICAgQHBhcmFtIHAxLHAyLHAzIFRoZSBhcGljZXMgdG8g
YmUgY29ubmVjdGVkLgogICAgKi8KICB2b2lkIGNvbm5lY3RBcGljZXMoVE5BcGV4ICpwMSxUTkFw
ZXggKnAyLFROQXBleCAqcDMpIHsKCiAgICBhcGljZXNfWzBdID0gcDEgOwogICAgYXBpY2VzX1sx
XSA9IHAyIDsKICAgIGFwaWNlc19bMl0gPSBwMyA7CiAgfQogIC8qKiBDb25lY3RpbmcgZWRnZXMu
CiAgICBDb25uZWN0cyBlZGdlcyA8Yj5hMTwvYj4sIDxiPmEyPC9iPiBhbmQgPGI+YTM8L2I+LiBU
aGUgYXBpY2VzIGFyZQogICAgaW50ZXJuYWxseSByZWFycmFuZ2VkIHRvIGluc3VyZSB0aGUgZ2xv
YmFsIGluZGV4aW5nIGlzIHJlc3BlY3RlZC4KICAgIEBwYXJhbSBhMSxhMixhMyBUaGUgZWRnZXMg
dG8gYmUgY29ubmVjdGVkLgogICAgKi8KICBib29sIGNvbm5lY3RFZGdlcyhUTkVkZ2UgKmExLFRO
RWRnZSAqYTIsVE5FZGdlICphMykgewoKICAgIGVkZ2VzX1swXSA9IGExIDsKICAgIGVkZ2VzX1sx
XSA9IGEyIDsKICAgIGVkZ2VzX1syXSA9IGEzIDsKCiAgICAvLyBpbnRlcm5hbCByZWFycmFuZ2lu
ZyBvZiBhcGljZXMuIEFwZXggbnVtYmVyIGkgbXVzdCBmYWNlIGVkZ2UgbnVtYmVyIGkuCiAgICAK
ICAgIFROQXBleCAqbmV3QXBpY2VzWzNdIDsKICAgIG5ld0FwaWNlc1swXSA9IG5ld0FwaWNlc1sx
XSA9IG5ld0FwaWNlc1syXSA9IDAgOwogICAgCiAgICBmb3IoaW50IGkgPSAwIDsgaSA8IDMgOyBp
KyspIHsKICAgICAgZm9yKGludCBrID0gMCA7IGsgPCAzIDsgaysrKSB7CglpZiggZWRnZXNfW2ld
LT5nZXRBcGV4KDApICE9IGFwaWNlc19ba10gJiYKCSAgICBlZGdlc19baV0tPmdldEFwZXgoMSkg
IT0gYXBpY2VzX1trXSApIHsKCSAgCgkgIG5ld0FwaWNlc1tpXSA9IGFwaWNlc19ba10gOwoJICBi
cmVhayA7Cgl9CiAgICAgIH0KICAgIH0KICAgIGFwaWNlc19bMF0gPSBuZXdBcGljZXNbMF0gOwog
ICAgYXBpY2VzX1sxXSA9IG5ld0FwaWNlc1sxXSA7CiAgICBhcGljZXNfWzJdID0gbmV3QXBpY2Vz
WzJdIDsKICB9CiAgLyoqIFNldHRpbmcgdGhlIG5laWdoYm91cnMuCiAgICBTZXRzIHRoZSBuLXRo
IGNlbGwncyBuZWlnaGJvdXIuIENlbGwgPGltPm48L2ltPiBpcyB0aGUgY2VsbCBvcHBvc2l0ZQog
ICAgdG8gYXBleCA8aW0+bjwvaW0+LgogICAgQHBhcmFtIG4gPGI+MDwvYj4sIDxiPjE8L2I+IG9y
IDxiPjI8L2I+LgogICAgQHBhcmFtIGMgVGhlIGNlbGwuCiAgICAqLwogIHZvaWQgc2V0TmVpZ2hi
b3VyKGludCBuLFROQ2VsbCogYykgewogICAgaWYoIG4gPj0gMCAmJiBuIDw9IDIgKSBuZWlnaGJv
dXJzX1tuXSA9IGMgOwogIH0KICAvKiogR2V0dGluZyB0aGUgbi10aCBuZWlnaGJvdXIuCiAgICBS
ZXR1cm5zIHRoZSBuLXRoIG5laWdoYm91ciBjZWxsLgogICAgQHBhcmFtIG4gPGI+MDwvYj4sIDxi
PjE8L2I+IG9yIDxiPjM8L2I+LgogICAgQHJldHVybiBUaGUgbmVpZ2hib3VyIGNlbGwgb3IgMCBp
ZiBub25lLgogICAgKi8KICBUTkNlbGwqIGdldE5laWdoYm91cihpbnQgbikgY29uc3QgewogICAg
cmV0dXJuIChuID49IDAgJiYgbiA8PSAyKSA/IG5laWdoYm91cnNfW25dIDogMCA7CiAgfQogIC8q
KiBBcGV4IGZhY2luZyBlZGdlLgogICAgUmV0dXJucyB0aGUgYXBleCBmYWNpbmcgZWRnZSA8ZW0+
ZTwvZW0+LgogICAgQHBhcmFtIGUgVGhlIGVkZ2UuCiAgICBAcmV0dXJuIEEgcG9pbnRlciB0byB0
aGUgYXBleCBmYWNpbmcgPGVtPmU8L2VtPi4KICAgICovCiAgY29uc3QgVE5BcGV4KiBhcGV4RmFj
aW5nRWRnZShjb25zdCBUTkVkZ2UqIGUpIGNvbnN0IHsKCiAgICBpbnQgbG9jYWxFZGdlID0gLTEg
OwogICAgaWYgICAgICggZSA9PSBlZGdlc19bMF0gKSBsb2NhbEVkZ2UgPSAwIDsKICAgIGVsc2Ug
aWYoIGUgPT0gZWRnZXNfWzFdICkgbG9jYWxFZGdlID0gMSA7CiAgICBlbHNlIGlmKCBlID09IGVk
Z2VzX1syXSApIGxvY2FsRWRnZSA9IDIgOwogICAgcmV0dXJuIChsb2NhbEVkZ2UgIT0gLTEpID8g
YXBleEZhY2luZ0VkZ2UobG9jYWxFZGdlKSA6IDA7CiAgfQogIC8qKiBBcGV4IGZhY2luZyBlZGdl
IG51bWJlci4KICAgIFJldHVybnMgdGhlIGFwZXggZmFjaW5nIGVkZ2UgPGVtPkxvY2FsVE5FZGdl
PC9lbT4uCiAgICBAcGFyYW0gbG9jYWxUTkVkZ2UgPGI+MDwvYj4sIDxiPjE8L2I+IG9yIDxiPjI8
L2I+LgogICAgQHJldHVybiBBIHBvaW50ZXIgdG8gdGhlIGFwZXguCiAgICAqLwogIGNvbnN0IFRO
QXBleCogYXBleEZhY2luZ0VkZ2UoaW50IGxvY2FsRWRnZSkgY29uc3QgewogICAgcmV0dXJuIChs
b2NhbEVkZ2UgPj0gMCAmJiBsb2NhbEVkZ2UgPD0gMikgPyBhcGljZXNfW2xvY2FsRWRnZV0gOiAw
OwogIH0KICAvKiogR2V0dGluZyB0aGUgbG9jYWxBcGV4LXRoIGFwZXguCiAgICBSZXR1cm5zIGFw
ZXggbnVtYmVyIDxlbT5sb2NhbFROQXBleDwvZW0+LgogICAgQHBhcmFtIGxvY2FsVE5BcGV4IDxi
PjA8L2I+LCA8Yj4xPC9iPiBvciA8Yj4yPC9iPi4KICAgIEByZXR1cm4gQSBwb2ludGVyIHRvIHRo
ZSBhcGV4LgogICAgKi8KICBUTkFwZXgqIGdldEFwZXgoaW50IGxvY2FsQXBleCkgY29uc3Qgewog
ICAgcmV0dXJuIChsb2NhbEFwZXggPj0gMCAmJiBsb2NhbEFwZXggPD0gMikgPyBhcGljZXNfW2xv
Y2FsQXBleF0gOiAwOwogIH0KICAvKiogR2V0dGluZyB0aGUgbG9jYWxFZGdlLXRoIGVkZ2UuCiAg
ICBSZXR1cm5zIGVkZ2UgbnVtYmVyIDxlbT5sb2NhbFRORWRnZTwvZW0+LgogICAgQHBhcmFtIGxv
Y2FsRWRnZSA8Yj4wPC9iPiwgPGI+MTwvYj4gb3IgPGI+MjwvYj4uCiAgICBAcmV0dXJuIEEgcG9p
bnRlciB0byB0aGUgZWRnZS4KICAgICovCiAgVE5FZGdlKiBnZXRFZGdlKGludCBsb2NhbEVkZ2Up
IGNvbnN0IHsKICAgIHJldHVybiAobG9jYWxFZGdlID49IDAgJiYgbG9jYWxFZGdlIDw9IDIpID8g
ZWRnZXNfW2xvY2FsRWRnZV0gOiAwIDsKICB9Cgpwcml2YXRlIDoKCiAgaW50ICAgICAgIHRyaWFu
Z2xlSWRfICAgIDsKICBUTkVkZ2UgICAgICplZGdlc18gICAgIFszXSA7CiAgVE5BcGV4ICAgICAq
YXBpY2VzXyAgICBbM10gOwogIFROQ2VsbCAqbmVpZ2hib3Vyc19bM10gOwp9IDsKCi8vLyBUTkNh
bnZhcwovKioKICBUaGlzIGNsYXNzIGFpbXMgYXQgZGVzY3JpYmluZyB0aGUgZ3JpZCB1c2VkIGZv
ciBidWlsZGluZwogIHRoZSBpbml0aWFsIHRyaWFuZ3VsYXRlZCBuZXR3b3JrLiBJdCBnaXZlcyB0
aGUgZ3JpZCdzIGRpbWVuc2lvbnMKICBhcyB3ZWxsIGFzIHRoZSBwb3NpdGlvbiBvZiBub24tdmFs
dWVkIGFwaWNlcy4KICAqLwpjbGFzcyBUTkNhbnZhcyB7CgpwdWJsaWMgOgoKICAvKiogQ29uc3Ry
dWN0b3IuCiAgICBCdWlsZHMgYW4gZW1wdHkgQ2FudmFzIDxiPm54PC9iPiBieSA8Yj5ueTwvYj4g
Y2VsbHMuIFRoZSBjYW52YXMgaXMgYWxzbwogICAgcmVzcG9uc2libGUgZm9yIHN0b3JpbmcgdGhl
IHBvc2l0aW9uIG9mIG5vbi12YWx1ZWQgYXBpY2VzLgogICAgQHBhcmFtIG54LG55IFRoZSBudW1i
ZXIgb2YgY2VsbHMgb24gYm90aCB4IGFuZCB5IGF4aXMuCiAgICAqLwogIFROQ2FudmFzIChpbnQg
bngsaW50IG55KSA7CiAgLy8vIENvcHkgY29uc3RydWN0b3IuCiAgVE5DYW52YXMgKGNvbnN0IFRO
Q2FudmFzJiBjYW52YXMpIDsKICB+VE5DYW52YXMoKSA7CgogIC8vLyBBc3NpZ25tZW50IG9wZXJh
dG9yLgogIFROQ2FudmFzJiBvcGVyYXRvciA9KGNvbnN0IFROQ2FudmFzJikgOwoKICAvKiogU2lt
cGxlIGNoZWNraW5nLgogICAgQ2hlY2tzIHRoZSB2YWxpZGl0eSBvZiB0aGUgY2FudmFzLiBBIGNh
bnZhcyBpcyB2YWxpZCBpZiB0aGUgbnVtYmVyCiAgICBvZiBjZWxscyBvbiBlYWNoIGF4aXMgaXMg
YXQgbGVhc3QgPGI+MTwvYj4uCiAgICBAcmV0dXJuIDxiPnRydWU8L2I+IG9yIDxiPmZhbHNlPC9i
Pi4KICAgICovCiAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgewogICAgcmV0dXJuIG54XyA+PSAxICYm
IG55XyA+PSAxIDsKICB9CiAgLyoqIEdldHRpbmcgdGhlIG51bWJlciBvZiBub2Rlcy4KICAgIFJl
dHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBvZiB0aGUgZ3JpZC4KICAgIEByZXR1cm4gVU4gaW50
ZWdlciBlcXVhbCB0byA8ZW0+KG54KzEpKihueSsxKTwvZW0+LgogICAgKi8KICBpbnQgbmJQb2lu
dHMoKSBjb25zdCB7IHJldHVybiAobnhfKzEpKihueV8rMSkgOyB9CgogIC8vLyBHZXR0aW5nIHRo
ZSBudW1iZXIgb2YgY2VsbHMuCiAgLy9AewogIC8vLyBBbG9uZyB4IGF4aXMuCiAgaW50IGdldE54
KCkgY29uc3QgeyByZXR1cm4gbnhfIDsgfQogIC8vLyBBbG9uZyB5IGF4aXMuCiAgaW50IGdldE55
KCkgY29uc3QgeyByZXR1cm4gbnlfIDsgfQogIC8vQH0KICAKICAvLy8gTWFuYWdlbWVudCBvZiBu
b24gdmFsdWVzLgogIC8vQHsKICAvLy8gRGVjbGFyZXMgYSBub24gdmFsdWVkIG5vZGUuCiAgLy8v
IEBwYXJhbSBwb2ludElkIFRoZSBub2RlIGlkZW50aWZpY2F0b3IuCiAgdm9pZCBhZGROb25WYWx1
ZUF0KGludCBwb2ludElkKSB7CiAgICBub25WYWx1ZXNfLmluc2VydChwb2ludElkKSA7CiAgfQog
IC8vLyBSZW1vdmVzIGEgbm9uIHZhbHVlZCBub2RlLgogIC8vLyBAcGFyYW0gcG9pbnRJZCBUaGUg
bm9kZSBpZGVudGlmaWNhdG9yLgogIHZvaWQgcmVtTm9uVmFsdWVBdChpbnQgcG9pbnRJZCkgewog
ICAgbm9uVmFsdWVzXy5lcmFzZShwb2ludElkKSA7CiAgfQogIC8vLyBSZXR1cm5zIHdoZXRoZXIg
YSBub2RlIGlzIG5vbiB2YWx1ZWQuCiAgLy8vIEBwYXJhbSBwb2ludElkIFRoZSBub2RlIGlkZW50
aWZpY2F0b3IuCiAgYm9vbCBpc05vblZhbHVlZEF0KGludCBwb2ludElkKSBjb25zdCB7CiAgICBy
ZXR1cm4gbm9uVmFsdWVzXy5maW5kKHBvaW50SWQpICE9IG5vblZhbHVlc18uZW5kKCkgOwogIH0K
ICAvLy8gUmV0dXJucyB3aGV0aGVyIGEgbm9kZSBpcyB2YWx1ZWQuCiAgLy8vIEBwYXJhbSBwb2lu
dElkIFRoZSBub2RlIGlkZW50aWZpY2F0b3IuCiAgYm9vbCBpc1ZhbHVlZEF0KGludCBwb2ludElk
KSBjb25zdCB7CiAgICByZXR1cm4gIWlzTm9uVmFsdWVkQXQocG9pbnRJZCkgOwogIH0KICAvL0B9
Cgpwcml2YXRlIDoKCiAgaW50IG54XywgbnlfIDsKICBTcENvb3JkIGR4XywgZHlfIDsKICBzZXQ8
aW50PiBub25WYWx1ZXNfIDsKfSA7CgovLy8gVHJpYW5ndWxhdGVkIG5ldHdvcmsuCi8qKgogIFZl
cnkgc2ltcGxlIHRyaWFuZ3VsYXRlZCBuZXR3b3JrLiBJdCBpcyB1c2VkIGFzIGEgdG9wb2xvZ2lj
YWwKICBiYXNpcyBmb3IgZXh0cmFjdGluZyB0cmlhbmd1bGF0ZWQgcGF0Y2hlcy4KICAqLwpjbGFz
cyBUTmV0IHsKCnB1YmxpYyA6CgogIHR5cGVkZWYgdmVjdG9yPFROQ2VsbCo+OjppdGVyYXRvciBp
dGVyYXRvciA7CiAgdHlwZWRlZiB2ZWN0b3I8VE5DZWxsKj46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0
X2l0ZXJhdG9yICAgOwogIApwdWJsaWMgOgoKICAvLy8gQ29uc3RydWN0b3IuCiAgVE5ldCAoKSA7
CgogIC8qKiBEZXN0cnVjdG9yLgogICAgTGVzIGRlc3RydWN0ZXVyIGTpdHJ1aXQgdG91cyBsZXMg
6WxlbWVudHMgZHUgculzZWF1IChjZWxsdWxlcywgc29tbWV0cwogICAgZXQgYXLqdGVzLgogICAg
Ki8KICB+VE5ldCgpIDsKCiAgLyoqCiAgICBBIHBhcnRpciBkJ3VuIGNhbmV2YXMsIGMnZXN0IOAg
ZGlyZSBkZSBsYSBkb25u6WUgZCd1bmUgZ3JpbGxlIGV0IGRlCiAgICBub24gdmFsZXVycywgb24g
Y29uc3RydWl0IGxlIHLpc2VhdSB0cmlhbmd1bOkuCiAgICBAcGFyYW0gY2FudmFzIExlIGNhbmV2
YXMgdXRpbGlz6SBwb3VyIGxhIGNvbnN0cnVjdGlvbgogICAgQHJldHVybiA8Yj50cnVlPC9iPiBv
dSA8Yj5mYWxzZTwvYj4uCiAgICBAc2VlIFROQ2FudmFzCiAgICAqLwogIGJvb2wgIGJ1aWxkT24o
Y29uc3QgVE5DYW52YXMqIGNhbnZhcykgOwoKICAvKioKICAgIFJldG91cm5lIGxlIGNhbmV2YXMg
dXRpbGlz6SBwb3VyIGNvbnN0cnVpcmUgY2UgculzZWF1LgogICAgKi8KICBjb25zdCBUTkNhbnZh
cyogIGdldENhbnZhcygpIGNvbnN0IHsgcmV0dXJuIGNhbnZhc18gOyB9CgogIC8vLyBJdGVyYXRl
dXJzLgogIC8vLyBAewogIC8vLyBSZXRvdXJuZSB1biBpdGVyYXRldXIgZGUgY2VsbHVsZXMuCiAg
aXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiB0cmdsc18uYmVnaW4oKSA7IH0KICAvLy8gUmV0b3Vy
bmUgdW4gcG9pbnRldXIgdmVycyBsYSBmaW4gZGUgbGEgbGlzdGUgZGUgY2VsbHVsZXMuCiAgaXRl
cmF0b3IgZW5kICAoKSB7IHJldHVybiB0cmdsc18uZW5kICAoKSA7IH0KICAvLy8gUmV0b3VybmUg
dW4gaXRlcmF0ZXVyIDxiPmNvbnN0YW50PC9iPiBkZSBjZWxsdWxlcy4KICBjb25zdF9pdGVyYXRv
ciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHRyZ2xzXy5iZWdpbigpIDsgfQogIC8vLyBJZGVtLiBw
b3VyIGxhIGZpbiBkZSBsYSBsaXN0ZS4KICBjb25zdF9pdGVyYXRvciBlbmQgICgpIGNvbnN0IHsg
cmV0dXJuIHRyZ2xzXy5lbmQgICgpIDsgfQogIC8vLyBAfQoKcHJpdmF0ZSA6CgogIHZvaWQgY2xl
YW5VcCgpIDsKICAKICB2b2lkIHNldENlbGxBdChUTkNlbGwgKnRyLGludCBwb3MpIHsKICAgIHRy
Z2xzX1twb3NdID0gdHIgOwogIH0KICBUTkNlbGwqIGdldENlbGxBdChpbnQgcG9zKSBjb25zdCB7
CiAgICByZXR1cm4gdHJnbHNfW3Bvc10gOwogIH0KCnByaXZhdGUgOgoKICB2b2lkIHJlbW92ZUNl
bGxzKGNvbnN0IHZlY3RvcjxUTkNlbGwqPiYgdHJnbHMpIDsgCiAgdm9pZCBidWlsZEFwaWNlcyh2
ZWN0b3I8VE5BcGV4Kj4mKSA7CiAgdm9pZCBidWlsZEVkZ2VzRnJvbUFwaWNlcyh2ZWN0b3I8VE5F
ZGdlKj4mLGNvbnN0IHZlY3RvcjxUTkFwZXgqPiYpIDsKICB2b2lkIGJ1aWxkRnJvbUVkZ2VzQW5k
QXBpY2VzKGNvbnN0IHZlY3RvcjxUTkVkZ2UqPiYsY29uc3QgdmVjdG9yPFROQXBleCo+JikgOwoK
ICB2b2lkIGJ1aWxkTmV0d29yaygpIDsKICB2b2lkIGJ1aWxkRWRnZXNXaW5ncyhjb25zdCB2ZWN0
b3I8VE5FZGdlKj4mKSA7CgogIHZvaWQgYWNjb3VudHNGb3JOb25WYWx1ZXMoKSA7CgogIGJvb2wg
bm9uVmFsdWVkQXBleChjb25zdCBUTkFwZXgqIGEpIGNvbnN0IHsKICAgIHJldHVybiBnZXRDYW52
YXMoKS0+aXNOb25WYWx1ZWRBdChhLT5nZXRBcGV4SWQoKSkgOwogIH0KCnByaXZhdGUgOgoKICBU
TkNhbnZhcyAqY2FudmFzXyA7CiAgdmVjdG9yPFROQ2VsbCo+IHRyZ2xzXyA7Cn0gOwogIApUTkNh
bnZhczo6VE5DYW52YXMoaW50IG54LGludCBueSkgewoKICBueF8gPSBueCA7CiAgbnlfID0gbnkg
Owp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX18KClROQ2FudmFzOjpUTkNhbnZhcyhjb25zdCBUTkNh
bnZhcyYgY2FudmFzKSB7CgogICp0aGlzID0gY2FudmFzIDsKfQovL19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fCgpUTkNhbnZhcyYgVE5DYW52YXM6Om9wZXJhdG9yID0oY29uc3QgVE5DYW52YXMmIGNhbnZh
cykgewoKICBpZiggdGhpcyAhPSAmY2FudmFzICkgewoKICAgIG54XyA9IGNhbnZhcy5ueF8gOwog
ICAgbnlfICA9Y2FudmFzLm55XyA7CiAgICBkeF8gPSBjYW52YXMuZHhfIDsKICAgIGR5XyA9IGNh
bnZhcy5keV8gOwogICAgbm9uVmFsdWVzXyA9IGNhbnZhcy5ub25WYWx1ZXNfIDsKICB9CiAgcmV0
dXJuICp0aGlzIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpUTkNhbnZhczo6flROQ2FudmFz
KCkgewoKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KClROZXQ6OlROZXQoKSB7CgogIGNhbnZhc18g
PSAwIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpUTmV0Ojp+VE5ldCgpIHsKCiAgY2xlYW5V
cCgpIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgovLyBQdXJwb3NlIDogZGVsZWxlcyB0aGUg
ZW50aXJlIHN0b3JhZ2UgKGFwaWNlcyxlZGdlcyAmIGNlbGxzKS4KCnZvaWQgVE5ldDo6Y2xlYW5V
cCgpIHsKCiAgaWYoIGNhbnZhc18gKSB7CiAgICBkZWxldGUgY2FudmFzXyA7CiAgICBjYW52YXNf
ID0gMCA7CiAgfQogIHJlbW92ZUNlbGxzKHRyZ2xzXykgOwp9Ci8vX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X18KCi8vIFB1cnBvc2UgOiBkZWxldGVzIHRoZSBjZWxscyBmcm9tIGB0cmdscycuIEFwaWNlcyAm
IGVkZ2VzIGFyZSBhbHNvCi8vICAgICAgICAgICBkZWxldGVkLiBUaGlzIG1ldGhvZCBpcyBwcml2
YXRlLgoKdm9pZCBUTmV0OjpyZW1vdmVDZWxscyhjb25zdCBzdGQ6OnZlY3RvcjxUTkNlbGwqPiYg
dHJnbHMpIHsKCiAgc3RkOjpzZXQ8VE5FZGdlKj4gZWRnZXNUb0RlbGV0ZSA7CiAgc3RkOjpzZXQ8
VE5BcGV4Kj4gYXBpY2VzVG9EZWxldGUgOwoKICBmb3Ioc3RkOjp2ZWN0b3I8VE5DZWxsKj46OmNv
bnN0X2l0ZXJhdG9yIGkgPSB0cmdscy5iZWdpbigpIDsKICAgICAgaSAhPSB0cmdscy5lbmQoKSA7
CiAgICAgIGkrKykgewogICAgCiAgICBUTkNlbGwgKnQgPSAqaSA7CiAgICBlZGdlc1RvRGVsZXRl
Lmluc2VydCAoY29uc3RfY2FzdDxUTkVkZ2UqPih0LT5nZXRFZGdlKDApKSkgOwogICAgZWRnZXNU
b0RlbGV0ZS5pbnNlcnQgKGNvbnN0X2Nhc3Q8VE5FZGdlKj4odC0+Z2V0RWRnZSgxKSkpIDsKICAg
IGVkZ2VzVG9EZWxldGUuaW5zZXJ0IChjb25zdF9jYXN0PFRORWRnZSo+KHQtPmdldEVkZ2UoMikp
KSA7CiAgICBhcGljZXNUb0RlbGV0ZS5pbnNlcnQoY29uc3RfY2FzdDxUTkFwZXgqPih0LT5nZXRB
cGV4KDApKSkgOwogICAgYXBpY2VzVG9EZWxldGUuaW5zZXJ0KGNvbnN0X2Nhc3Q8VE5BcGV4Kj4o
dC0+Z2V0QXBleCgxKSkpIDsKICAgIGFwaWNlc1RvRGVsZXRlLmluc2VydChjb25zdF9jYXN0PFRO
QXBleCo+KHQtPmdldEFwZXgoMikpKSA7CiAgICBkZWxldGUgdCA7CiAgfQogIGZvcihzdGQ6OnNl
dDxUTkVkZ2UqPjo6aXRlcmF0b3IgaSA9IGVkZ2VzVG9EZWxldGUuYmVnaW4oKSA7CiAgICAgIGkg
IT0gZWRnZXNUb0RlbGV0ZS5lbmQoKSA7CiAgICAgIGkrKykgewogICAgZGVsZXRlICppIDsKICB9
CiAgZm9yKHN0ZDo6c2V0PFROQXBleCo+OjppdGVyYXRvciBpID0gYXBpY2VzVG9EZWxldGUuYmVn
aW4oKSA7CiAgICAgIGkgIT0gYXBpY2VzVG9EZWxldGUuZW5kKCkgOwogICAgICBpKyspIHsKICAg
IGRlbGV0ZSAqaSA7CiAgfQp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKLy8KLy8gUHVycG9zZSA6
IGJ1aWxkcyB0aGUgaW50ZXJuYWwgdmVjdG9yIG9mIGFwaWNlcyBhbmQgcmV0dXJucyBpdCBpbnRv
IGBhcGljZXMnLgovLyAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcHJpdmF0ZS4KCnZvaWQgVE5l
dDo6YnVpbGRBcGljZXMoc3RkOjp2ZWN0b3I8VE5BcGV4Kj4mIGFwaWNlcykgewoKICBpbnQgbngg
PSBnZXRDYW52YXMoKS0+Z2V0TngoKSA7CiAgaW50IG55ID0gZ2V0Q2FudmFzKCktPmdldE55KCkg
OwoKICBhcGljZXMucmVzaXplKChueCsxKSoobnkrMSkpIDsKICAKICBmb3IoaW50IGogPSAwICA7
IGogPCAobnkrMSkgOyBqKyspIHsKICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IChueCsxKSA7IGkr
KykgewogICAgICBUTkFwZXggKmFwZXggPSBuZXcgVE5BcGV4KGkraioobngrMSkrMSkgOwogICAg
ICBhcGljZXNbaStqKihueCsxKV0gPSBhcGV4IDsKICAgIH0KICB9Cn0KLy9fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fXwoKLy8KLy8gUHVycG9zZTogY29ubmVjdHMgYXBpY2VzIHRvIGJ1aWxkIGVkZ2VzLgoK
dm9pZCBUTmV0OjpidWlsZEVkZ2VzRnJvbUFwaWNlcyhzdGQ6OnZlY3RvcjxUTkVkZ2UqPiYgZWRn
ZXMsY29uc3Qgc3RkOjp2ZWN0b3I8VE5BcGV4Kj4mIGEpIHsKCiAgaW50IG54ID0gZ2V0Q2FudmFz
KCktPmdldE54KCkgOwogIGludCBueSA9IGdldENhbnZhcygpLT5nZXROeSgpIDsKCiAgaW50IG5i
VE5FZGdlcyA9ICAzKm54Km55K254K255OwogIGVkZ2VzLnJlc2l6ZShuYlRORWRnZXMpIDsKICBp
bnQgc3ViMSAgICA9ICBueCoobnkrMSkgOwogIAogIGZvcihpbnQgaSA9IDAgOyBpIDwgc3ViMSA7
IGkrKykgeyAvLyBbMCxueF8qKG55XysxKVsKICAgCiAgICBUTkVkZ2UgKmUgID0gbmV3IFRORWRn
ZShpKzEpIDsKICAgIGUtPmNvbm5lY3RBcGljZXMoYVtpICsgaW50KGkvbngpICAgIF0sCgkJICAg
ICBhW2kgKyBpbnQoaS9ueCkgKyAxXSkgOwogICAgZWRnZXNbaV0gPSBlIDsKICB9CiAgaW50IG54
eSAgPSBueCpueSA7IAogIGludCBzdWIyID0gMipueHkrbngrbnkgOwoKICBmb3IoaW50IGkgPSBz
dWIxIDsgaSA8IHN1YjIgOyBpKyspIHsgLy8gW254KihueSsxKSwyKm54Km55K254K255WwogICAg
VE5FZGdlICplICA9IG5ldyBUTkVkZ2UoaSsxKSA7CiAgICBlLT5jb25uZWN0QXBpY2VzKGFbaSAg
ICAtIHN1YjFdLAoJCSAgICAgYVtpICsgMSAtIG54eV0pIDsKICAgIGVkZ2VzW2ldID0gZSA7CiAg
fQogIGZvcihpbnQgaSA9IHN1YjIgOyBpIDwgbmJUTkVkZ2VzIDsgaSsrKSB7IC8vIFsyKm54Xypu
eV8rbnhfK255XywzKm54XypueV8rbnhfK255X1sKICAgIFRORWRnZSAqZSAgPSBuZXcgVE5FZGdl
KGkrMSkgOwogICAgZS0+Y29ubmVjdEFwaWNlcyhhW2kgKyAxIC0yKm54eSAtbnggLW55ICsgaW50
KChpLTIqbnh5LW54LW55KS9ueCldLAoJCSAgICAgYVtpICsgMSAtMipueHkgLW55ICAgICArIGlu
dCgoaS0yKm54eS1ueC1ueSkvbngpXSkgOwogICAgZWRnZXNbaV0gPSBlIDsKICB9Cn0KLy9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fCgovLwovLyBQdXJwb3NlOiBidWlsZHMgdGhlIHRyaWFuZ3VsYXRlZCBu
ZXR3b3JrIGZyb20gdGhlIGFwaWNlcyAmIGVkZ2VzLiBUaGlzCi8vICAgICAgICAgIG1ldGhvZHMg
aGFuZGxlcyBkaWZmZXJlbnRseSBvZGQtIGFuZCBldmVuLSBudW1iZXJlZCBjZWxscy4KCnZvaWQg
VE5ldDo6YnVpbGRGcm9tRWRnZXNBbmRBcGljZXMoY29uc3Qgc3RkOjp2ZWN0b3I8VE5FZGdlKj4m
IGUsY29uc3Qgc3RkOjp2ZWN0b3I8VE5BcGV4Kj4mIGEpIHsKICBpbnQgbnggPSBnZXRDYW52YXMo
KS0+Z2V0TngoKSA7CiAgaW50IG55ID0gZ2V0Q2FudmFzKCktPmdldE55KCkgOwoKICBpbnQgbmJU
TkNlbGxzID0gMipueCpueSAgOwogIHRyZ2xzXy5yZXNpemUobmJUTkNlbGxzKSA7CgogIGZvcihp
bnQgaSA9IDAgOyBpIDwgbmJUTkNlbGxzIDsgaSArPSAyKSB7IC8vIE9kZCBudW1iZXJlZCB0cmlh
bmdsZXMKCiAgICBpbnQgY2kgPSBpKzEgOwogICAgVE5DZWxsICp0cmdsID0gbmV3IFROQ2VsbChj
aSkgOwogICAgc2V0Q2VsbEF0KHRyZ2wsaSkgOwoKICAgIHRyZ2wtPmNvbm5lY3RBcGljZXMoYVso
Y2krMSkvMiAtIDEgICAgICArIGludChjaS8oMipueCkpXSwKCQkJYVsoY2krMSkvMiAgICAgKyBu
eCArIGludChjaS8oMipueCkpXSwKCQkJYVsoY2krMSkvMiAgICAgICAgICArIGludChjaS8oMipu
eCkpXSkgOwoKICAgIHRyZ2wtPmNvbm5lY3RFZGdlcyhlWyhjaSsxKS8yIC0gMSBdLAoJCSAgICAg
ICBlWyhjaSsxKS8yIC0gMSArIG54KihueSsxKSAgICAgICAgICAgICsgaW50KGNpLygyKm54KSld
LAoJCSAgICAgICBlWyhjaSsxKS8yIC0gMSArIG54KihueSsxKSArIG55KihueCsxKSAgICAgICAg
ICAgICAgICBdKSA7CiAgfQogIGZvcihpbnQgaSA9IDEgOyBpIDwgbmJUTkNlbGxzIDsgaSArPSAy
KSB7IC8vIEV2ZW4gbnVtYmVyZWQgdHJpYW5nbGVzCgogICAgaW50IGNpID0gaSsxIDsKICAgIFRO
Q2VsbCAqdHJnbCA9IG5ldyBUTkNlbGwoY2kpIDsKICAgIHNldENlbGxBdCh0cmdsLGkpIDsKCiAg
ICB0cmdsLT5jb25uZWN0QXBpY2VzKGFbY2kvMiAgICAgICAgICArIGludCgoY2ktMSkvKDIqbngp
KV0sCgkJCWFbY2kvMiAgICAgKyBueCArIGludCgoY2ktMSkvKDIqbngpKV0sCgkJCWFbY2kvMiAr
IDEgKyBueCArIGludCgoY2ktMSkvKDIqbngpKV0pIDsKCiAgICB0cmdsLT5jb25uZWN0RWRnZXMo
ZVtjaS8yIC0gMSArIG54ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwK
CQkgICAgICAgZVtjaS8yICAgICArIG54KihueSsxKSAgICAgICAgICAgICsgaW50KChjaS0xKS8o
MipueCkpXSwKCQkgICAgICAgZVtjaS8yIC0gMSArIG54KihueSsxKSArIG55KihueCsxKSAgICAg
ICAgICAgICAgICAgICAgXSkgOwogIH0KICBidWlsZEVkZ2VzV2luZ3MoZSkgOwogIGJ1aWxkTmV0
d29yaygpIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCi8vCi8vIFB1cnBvc2U6IGVzdGFibGlz
aGVzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gY2VsbHMuCgp2b2lkIFROZXQ6OmJ1aWxkTmV0d29y
aygpIHsKCiAgaW50IG54ID0gZ2V0Q2FudmFzKCktPmdldE54KCkgOwogIGludCBueSA9IGdldENh
bnZhcygpLT5nZXROeSgpIDsKICAKICBmb3IoaXRlcmF0b3IgaSA9IGJlZ2luKCkgOyBpICE9IGVu
ZCgpIDsgaSsrKSB7CgogICAgVE5DZWxsICp0cmdsID0gKmkgOwogICBpbnQgVCA9IHRyZ2wtPmdl
dENlbGxJZCgpIDsKCiAgIGJvb2wgaW5Eb21haW5bM10gOwogICBmb3IoaW50IGogPSAwIDsgaiA8
IDMgOyBqKyspIHsKICAgICBpZiggKFQlMiAgICAgID09IDEgJiYgVCA8PSAyKm54ICAgICAgICYm
IGogPT0gMCApIHx8CgkgKFQlKDIqbngpID09IDEgICAgICAgICAgICAgICAgICAgICYmIGogPT0g
MSApIHx8CgkgKFQlKDIqbngpID09IDAgICAgICAgICAgICAgICAgICAgICYmIGogPT0gMSApIHx8
CgkgKFQlMiAgICAgID09IDAgJiYgVCA+IDIqbngqKG55LTEpICYmIGogPT0gMCkpIHsKICAgICAg
IGluRG9tYWluW2pdID0gZmFsc2UgOwogICAgIH0KICAgICBlbHNlIGluRG9tYWluW2pdID0gdHJ1
ZSA7CiAgIH0KICAgaWYoIFQlMiA9PSAwICkgeyAvLyBFdmVuIG51bWJlcmVkIHRyaWFuZ2xlCiAg
ICAgdHJnbC0+c2V0TmVpZ2hib3VyKDAsKGluRG9tYWluWzBdID8gZ2V0Q2VsbEF0KFQgKyAyKm54
IC0gMikgOiAwKSkgOwogICAgIHRyZ2wtPnNldE5laWdoYm91cigxLChpbkRvbWFpblsxXSA/IGdl
dENlbGxBdChUICAgICAgICAgICApIDogMCkpIDsKICAgICB0cmdsLT5zZXROZWlnaGJvdXIoMiwo
aW5Eb21haW5bMl0gPyBnZXRDZWxsQXQoVCAgICAgICAgLSAyKSA6IDApKSA7CiAgIH0KICAgZWxz
ZSB7IC8vIE9kZCBudW1iZXJlZCB0cmlhbmdsZQogICAgIHRyZ2wtPnNldE5laWdoYm91cigwLChp
bkRvbWFpblswXSA/IGdldENlbGxBdChUIC0gMipueCkgOiAwKSkgOwogICAgIHRyZ2wtPnNldE5l
aWdoYm91cigxLChpbkRvbWFpblsxXSA/IGdldENlbGxBdChUIC0gMiAgICkgOiAwKSkgOwogICAg
IHRyZ2wtPnNldE5laWdoYm91cigyLChpbkRvbWFpblsyXSA/IGdldENlbGxBdChUICAgICAgICkg
OiAwKSkgOwogICB9CiAgfQp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCi8vCi8vIFB1cnBvc2U6
IGNvbm5lY3QgZWRnZXMgdG8gdGhlaXIgbmVpZ2hib3VyIHRyaWFuZ2xlcy4KCnZvaWQgVE5ldDo6
YnVpbGRFZGdlc1dpbmdzKGNvbnN0IHN0ZDo6dmVjdG9yPFRORWRnZSo+JiBlZGdlcykgewoKICBp
bnQgbnggPSBnZXRDYW52YXMoKS0+Z2V0TngoKSA7CiAgaW50IG55ID0gZ2V0Q2FudmFzKCktPmdl
dE55KCkgOwoKICBpbnQgc3ViMSA9IG54KihueSsxKSA7CiAgaW50IG54eSAgPSBueCpueSA7CiAK
ICBmb3IoaW50IGkgPSAwIDsgaSA8IHN1YjEgOyBpKyspIHsgLy8gWzAsbnhfKihueV8rMSlbCiAg
ICBUTkVkZ2UgKmEgPSBlZGdlc1tpXSA7CiAgICBpZigoaSsxKSA8PSBueHkgKSBhLT5zZXRXaW5n
KDAsdHJnbHNfWzIqaV0pIDsKICAgIGlmKChpKzEpID49IG54ICApIGEtPnNldFdpbmcoMSx0cmds
c19bMiooaSsxKS0yKm54LTFdKTsKICB9CiAgaW50IHN1YjIgPSAyKm54Km55ICsgbnggKyBueSA7
CiAgCiAgZm9yKGludCBpID0gc3ViMSA7IGkgPCBzdWIyIDsgaSsrKSB7IC8vIFtueCoobnkrMSks
MipueCpueStueCtueVsKICAgIFRORWRnZSAqYSA9IGVkZ2VzW2ldIDsKICAgIGlmKCAoaSsxLXN1
YjEpJShueCsxKSAhPSAxICkKICAgICAgYS0+c2V0V2luZygwLHRyZ2xzX1syKihpIC0gc3ViMSAt
IGludCgoaSAtIHN1YjEpLyhueCsxKSkpIC0gMV0pIDsKICAgIGlmKCAoaSsxLXN1YjEpJShueCsx
KSAhPSAwKQogICAgICBhLT5zZXRXaW5nKDEsdHJnbHNfWzIqKGkgLSBzdWIxIC0gaW50KChpIC0g
c3ViMSkvKG54KzEpKSldKSA7CiAgfQogIGludCBuYlRORWRnZXMgPSBlZGdlcy5zaXplKCkgOwog
IAogIGZvcihpbnQgaSA9IHN1YjIgOyBpIDwgbmJUTkVkZ2VzIDsgaSsrKSB7IC8vIFsyKm54Km55
K254K255LG5iVE5FZGdlc1sKICAgIFRORWRnZSAqYSA9IGVkZ2VzW2ldIDsKICAgIGEtPnNldFdp
bmcoMCx0cmdsc19bMiooaSArIDEgLSAyKm54eSAtIG54IC0gbnkpIC0gMl0pIDsKICAgIGEtPnNl
dFdpbmcoMSx0cmdsc19bMiooaSArIDEgLSAyKm54eSAtIG54IC0gbnkpIC0gMV0pIDsKICB9Cgp9
Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXwoKLy8KLy8gUHVycG9zZTogYWNjb3VudHMgZm9yIG5vbi12
YWx1ZWQgYXBpY2VzLgoKLy8gRE9DOiBBY2NvdW50aW5nIGZvciBub24tdmFsdWVzCgovLyBQcmlu
Y2lwbGUgKGFsZ28uIEFiZGVsa3JpbSBUYWxhYWxvdXQpCi8vIGZvciBlYWNoICh0cmlhbmdsZSkg
ZG8KLy8gICBpZiAob25lIG9mIHRoZSBhcGljZXMgaXMgbm9uLXZhbHVlZCkKLy8gICAgICB0aGVu
Ci8vICAgICAgICAgICBkbyBub3Qgc2VsZWN0IHRoZSB0cmlhbmdsZSBpbiB0aGUgZmluYWwgbGlz
dAovLyAgIGVsc2UKLy8gICAgIGZvciBlYWNoIChlZGdlICdlJykgZG8KLy8gICAgICAgIFNpIHRo
ZSBhcGV4IG9wcG9zaXRlIHRvICdlJyBpcyBub24tdmFsdWVkCi8vICAgICAgICAgIDEpIFRoZSBj
ZWxsIG9wcG9zaXRlIHRvICdlJyBpcyBubyBtb3JlIGEgbmVpZ2hib3VyIG9mIGB0cicKLy8gICAg
ICAgICAgMikgVGhlIGNlbGwgb3Bwb3NpdGUgdG8gJ2UnIGlzIG5vIG1vcmUgYSB3aW5nIG9mICdl
JwovLyAgICAgZG9uZQovLyAgICBlbmRpZgovLyBkb25lCgp2b2lkIFROZXQ6OmFjY291bnRzRm9y
Tm9uVmFsdWVzKCkgewoKICBpbnQgbmJUTkNlbGxzID0gdHJnbHNfLnNpemUoKSA7CiAgCiAgc3Rk
Ojp2ZWN0b3I8VE5DZWxsKj4gdHJpYW5nbGVzVG9LZWVwICAgOwogIHN0ZDo6dmVjdG9yPFROQ2Vs
bCo+IHRyaWFuZ2xlc1RvUmVtb3ZlIDsKICAKICBmb3IoaXRlcmF0b3IgaSA9IGJlZ2luKCkgOyBp
ICE9IGVuZCgpIDsgaSsrICkgewoKICAgVE5DZWxsICp0ciA9ICppIDsKCiAgIC8vIElmIG5vbmUg
b2YgdGhlIHRocmVlIGFwaWNlcyBpcyBsb2NhdGVkIGF0IGEgbm9uLXZhbHVlZCBncmlkIHBvc2l0
aW9uLAogICAvLyBjaGVja3MgdGhlIG5laWdoYm91cnMuCiAgIAogICBpZiggIW5vblZhbHVlZEFw
ZXgodHItPmdldEFwZXgoMCkpICYmCiAgICAgICAhbm9uVmFsdWVkQXBleCh0ci0+Z2V0QXBleCgx
KSkgJiYKICAgICAgICFub25WYWx1ZWRBcGV4KHRyLT5nZXRBcGV4KDIpKSApIHsKCiAgICAgLy8g
S2VlcHMgdGhpcyB0cmlhbmdsZSBpbiB0aGUgZmluYWwgc2V0CgogICAgIHRyaWFuZ2xlc1RvS2Vl
cC5wdXNoX2JhY2sodHIpIDsKICAgICBmb3IoaW50IGkgPSAwIDsgaSA8IDMgOyBpKyspIHsKCiAg
ICAgICBUTkNlbGwgKm4gPSB0ci0+Z2V0TmVpZ2hib3VyKGkpIDsKICAgICAgIGlmKCBuICkgewoK
CSBUTkVkZ2UgKmUgPSB0ci0+Z2V0RWRnZShpKSA7CgkgY29uc3QgVE5BcGV4ICpwID0gbi0+YXBl
eEZhY2luZ0VkZ2UoZSkgOwoKCSAvLyBJZiAncCcgaXMgbm9uLXZhbHVlZCwgdGhlIGktdGggbmVp
Z2hib3VyIG9mIHRyIGlzIHNldCB0byAwLCBhbmQKCSAvLyBUaGUgd2luZyBvZiAnZScgbG9va2lu
ZyBhdCAnbicgaXMgYWxzbyBzZXQgdG8gMC4KCSAKCSBpZiggbm9uVmFsdWVkQXBleChwKSApIHsK
CgkgICB0ci0+c2V0TmVpZ2hib3VyKGksMCkgOwoJICAgaWYoIGUtPmdldFdpbmcoMCkgPT0gbiAp
IGUtPnNldFdpbmcoMCwwKSA7CgkgICBlbHNlICAgICAgICAgICAgICAgICAgICAgZS0+c2V0V2lu
ZygxLDApIDsKCSB9CiAgICAgICB9CiAgICAgfQogICB9CiAgIGVsc2UgewogICAgIHRyaWFuZ2xl
c1RvUmVtb3ZlLnB1c2hfYmFjayh0cikgOwogICB9CiAgfQogLy8gQXQgdGhlIGVuZCwgJ3RyaWFu
Z2xlc1RvS2VlcCcgaG9sZHMgdGhlIHJlbWFpbmluZyB0cmlhbmdsZSB3aXRoIGNvbm5lY3Rpb25z
CiAvLyBwcm9wZXJseSBzZXQtdXAuIERlbGV0ZXMgdGhlIHRyaWFuZ2xlcyBoZWxkIGJ5ICd0cmlh
bmdsZXNUb1JlbW92ZScKCiB0cmdsc18gPSB0cmlhbmdsZXNUb0tlZXAgOwogLy9yZW1vdmVDZWxs
cyh0cmlhbmdsZXNUb1JlbW92ZSkgOwp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCi8vCi8vIFB1
cnBvc2U6IGJ1aWxkIGB0aGlzJyBvbiBjYW52YXMgYGNhbnZhcycuIGBjYW52YXMnIGlzIHN1cHBv
c2VkIHRvIHByb3ZpZGUKLy8gICAgICAgICAgdGhlIGdyaWQncyBnZW9tZXRyeSBhbmQgdGhlIGxv
Y2F0aW9ucyBvZiB0aGUgbm9uLXZhbHVlZCBhcGljZXMuCgpib29sIFROZXQ6OmJ1aWxkT24oY29u
c3QgVE5DYW52YXMqIGNhbnZhcykgewoKICBpZiggY2FudmFzID09IDAgfHwgIWNhbnZhcy0+aXNW
YWxpZCgpICkgewogICAgLy8gRG8gc29tZXRoaW5nIG1vcmUgaW50ZWxsaWdlbnQgLi4uCiAgICBy
ZXR1cm4gZmFsc2UgOwogIH0KICBjbGVhblVwKCkgOwogIGNhbnZhc18gPSBuZXcgVE5DYW52YXMo
KmNhbnZhcykgOwoKICAvLyBhcGljZXM6IChueSsxKSoobngrMSkKICAvLyBlZGdlcyA6IDMqbngq
bnkrbngrbnkKICAvLyB0cmlhbmdsZXMgOiAyKm54Km55CgogIHN0ZDo6dmVjdG9yPFROQXBleCo+
IGFwaWNlcyA7CiAgc3RkOjp2ZWN0b3I8VE5FZGdlKj4gZWRnZXMgIDsKICAKICBidWlsZEFwaWNl
cyhhcGljZXMpIDsKICBidWlsZEVkZ2VzRnJvbUFwaWNlcyAoZWRnZXMsYXBpY2VzKSA7CiAgYnVp
bGRGcm9tRWRnZXNBbmRBcGljZXMoZWRnZXMsYXBpY2VzKSA7CgogIGFjY291bnRzRm9yTm9uVmFs
dWVzKCkgOwogIHJldHVybiB0cnVlIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgovLy8gQnJh
bmNoJ3MgYm91bmRhcnkuCi8qKiBUaGlzIGNsYXNzIG1vZGVscyBhIGJyYW5jaCdzIGJvdW5kYXJ5
LiBUaGUgYm91bmRhcnkgaXMgYnVpbHQgdXAKICBmcm9tIHRoZSBzZXQgb2YgZWRnZXMgc3Vycm91
bmRpbmcgYSB0cmlhbmd1bGF0ZWQgY29udGlub3VzIHBhdGNoLgogICovCmNsYXNzIEJyYW5jaEJv
dW5kYXJ5IHsKCnB1YmxpYyA6CgogIHR5cGVkZWYgc2V0PGNvbnN0IFRORWRnZSo+OjppdGVyYXRv
ciBpdGVyYXRvciA7CiAgdHlwZWRlZiBzZXQ8Y29uc3QgVE5FZGdlKj46OmNvbnN0X2l0ZXJhdG9y
IGNvbnN0X2l0ZXJhdG9yIDsKICAKcHVibGljIDoKCiAgQnJhbmNoQm91bmRhcnkgKCkgOwogIEJy
YW5jaEJvdW5kYXJ5IChjb25zdCBCcmFuY2hCb3VuZGFyeSYpIDsKICB+QnJhbmNoQm91bmRhcnko
KSA7CgogIC8qKiBBZGRpbmcgYW4gZWRnZS4KICAgIEFkZHMgYW4gZWRnZSB0byB0aGlzIGJvdW5k
YXJ5LiBFZGdlIGR1cGxpY2F0aW9uIGlzCiAgICBub3QgcGVybWl0dGVkLgogICAgQHBhcmFtIGUg
QSBjb25zdCBwb2ludGVyIHRvIHRoZSBlZGdlLgogICAgQHNlZSBUTkVkZ2UKICAgICovCiAgdm9p
ZCBhZGRFZGdlKGNvbnN0IFRORWRnZSogZSkgeyBlZGdlc18uaW5zZXJ0KGUpIDsgfQogIC8qKiBS
ZW1vdmluZyBhbiBlZGdlLgogICAgUmVtb3ZlcyBhbiBlZGdlIGZyb20gdGhpcyBib3VuZGFyeS4g
VGhpcyBtYXkgaGFwcGVuIHdoZW4gc2V2ZXJhbAogICAgcGF0Y2hlcyBnZXQgbWVyZ2VkLgogICAg
QHBhcmFtIGUgVGhlIGVkZ2UgYmVpbmcgcmVtb3ZlZC4KICAgIEBzZWUgVE5FZGdlCiAgICAqLwog
IHZvaWQgcmVtRWRnZShjb25zdCBUTkVkZ2UqIGUpIHsgZWRnZXNfLmVyYXNlKGUpIDsgfQoKICAv
Ly8gSXRlcmF0aW5nLgogIC8vQHsKICAvLy8gU3RhcnRzIGl0ZXJhdGluZy4KICAvLy8gQHJldHVy
biBBbiBpdGVyYXRvciB0byB0aGUgc2V0IG9mIGJvdW5kYXJ5J3MgZWRnZXMuCiAgaXRlcmF0b3Ig
YmVnaW4oKSB7IHJldHVybiBlZGdlc18uYmVnaW4oKSA7IH0KICAvLy8gU3RvcCBpdGVyYXRpbmcu
CiAgLy8vIEByZXR1cm4gYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuCiAg
aXRlcmF0b3IgZW5kICAoKSB7IHJldHVybiBlZGdlc18uZW5kICAoKSA7IH0KICAvL0B9CiAgY29u
c3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBlZGdlc18uYmVnaW4oKSA7IH0KICBj
b25zdF9pdGVyYXRvciBlbmQgICgpIGNvbnN0IHsgcmV0dXJuIGVkZ2VzXy5lbmQgICgpIDsgfQog
IAogIGNvbnN0IFRORWRnZSogdmFsdWUoaXRlcmF0b3ImIGkpIGNvbnN0IHsgcmV0dXJuICppIDsg
fSAgCiAgdm9pZCBuZXh0KGl0ZXJhdG9yJiBpKSAgICAgICAgICAgY29uc3QgeyBpKysgOyB9Cgog
IC8qKiBTaGFyZWQgZWRnZSBkZXRlY3Rpb24uCiAgICBUZXN0cyB3aGV0aGVyIHRoaXMgYm91bmRh
cnkgaXMgYWRqYWNlbnQgdG8gPGI+YjwvYj4uIFRoZXkgYXJlCiAgICBpZiB0aGV5IHNoYXJlIGF0
IGxlYXN0IG9uZSBlZGdlLgogICAgQHBhcmFtIGIgQSBwb2ludGVyIHRvIGFub3RoZXIgYm91bmRh
cnkuCiAgICBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZS4KICAgICovCiAgYm9vbCBzaGFyZUVkZ2Vz
V2l0aChjb25zdCBCcmFuY2hCb3VuZGFyeSogYikgY29uc3QgewojaWYgMAogICAgc2V0PGNvbnN0
IFRORWRnZSo+IGludGVyIDsKICAgIHNldF9pbnRlcnNlY3Rpb24oYmVnaW4oKSxlbmQoKSxiLT5i
ZWdpbigpLGItPmVuZCgpLAoJCSAgICAgaW5zZXJ0X2l0ZXJhdG9yPHNldDxjb25zdCBUTkVkZ2Uq
PiA+KGludGVyLGludGVyLmJlZ2luKCkpKTsKICAgIHJldHVybiBpbnRlci5zaXplKCkgPiAwIDsK
I2Vsc2UKICAgIGJvb2wgc2hhcmUgPSBmYWxzZTsKICAgIGZvcihjb25zdF9pdGVyYXRvciBpID0g
YmVnaW4oKSA7IGkgIT0gZW5kKCkgOyBpKyspIHsKICAgICAgaWYoIGItPmVkZ2VzXy5maW5kKCpp
KSAhPSBiLT5lbmQoKSApIHsKCXNoYXJlID0gdHJ1ZSA7CglicmVhayA7CiAgICAgIH0KICAgIH0K
ICAgIHJldHVybiBzaGFyZSA7CiNlbmRpZgogIH0KICAvKiogSW50ZWdyYXRpbmcgYSBib3VuZGFy
eS4KICAgIEludGVncmF0ZXMgYm91bmRhcnkgPGI+YjwvYj4gd2l0aGluIHRoaXMgYm91bmRhcnku
CiAgICBAcGFyYW0gYiBUaGUgYm91bmRhcnkgdG8gYmUgaW50ZWdyYXRlZC4KICAgICovCiAgdm9p
ZCBpbnRlZ3JhdGUoY29uc3QgQnJhbmNoQm91bmRhcnkgKmIpIDsKCnByaXZhdGUgOgoKICBzZXQ8
Y29uc3QgVE5FZGdlKj4gZWRnZXNfIDsKfSA7CgovKiogVHJpYW5ndWxhdGVkIHBhdGNoLgogIFRo
aXMgY2xhc3MgcmVwcmVzZW50cyBhIHRyaWFuZ3VsYXRlZCBwYXRjaCwgdGhhdCBpcyBhIHNldCBv
ZiBjb250aWd1dXMKICBjZWxscyBib3JkZXJlZCBieSBhIHNldCBvZiBlZGdlcyAoLmkuZSBhIGJv
dW5kYXJ5KS4KICAqLwpjbGFzcyBCcmFuY2ggewoKcHVibGljIDoKCiAgdHlwZWRlZiBzZXQ8Y29u
c3QgVE5DZWxsKj46Oml0ZXJhdG9yIGl0ZXJhdG9yIDsKICB0eXBlZGVmIHNldDxjb25zdCBUTkNl
bGwqPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3IgOwogIApwdWJsaWMgOgoKICAvKiog
Q29uc3RydWN0b3IuCiAgICBBIHBhdGNoIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZnJvbSBhbiBpbml0
aWFsIGNlbGwgdXNlZCBhcyBhCiAgICA8SU0+c2VlZDwvSU0+LiBUaGUgc2VlZCBpcyB0aGUgZmly
c3QgY2VsbCBvZiB0aGUgcGF0Y2ggYW5kIHNldHMKICAgIGFsc28gaXRzIGZpcnN0IGJvdW5kYXJ5
LgogICAgQHBhcmFtIHNlZWQgVGhlIGluaXRpYWwgY2VsbC4KICAgIEBzZWUgVE5DZWxsCiAgICAq
LwogIEJyYW5jaCAoY29uc3QgVE5DZWxsICpzZWVkKSA7CiAgQnJhbmNoIChjb25zdCBCcmFuY2gm
KSA7CiAgfkJyYW5jaCgpIDsKCiAgLyoqIEJyYW5jaCBpbnRlZ3JhdGlvbi4KICAgIEludGVncmF0
ZXMgYnJhbmNoIDxCPmJyPC9CPiBpbiB0aGlzIGJyYW5jaC4gVGhlIGJvdW5kYXJpZXMgYXJlIGFs
c28KICAgIG1lcmdlZC4KICAgIEBwYXJhbSBiciBUaGUgYnJhbmNoIHRvIGJlIGludGVncmF0ZWQu
CiAgICBAc2VlIEJyYW5jaEJvdW5kYXJ5CiAgICAqLwogIHZvaWQgaW50ZWdyYXRlKGNvbnN0IEJy
YW5jaCAqYnIpIDsKCiAgYm9vbCBhZGphY2VudFRvKGNvbnN0IEJyYW5jaCAqYnIpIGNvbnN0IHsK
ICAgIHJldHVybiBib3VuZGFyeV8tPnNoYXJlRWRnZXNXaXRoKGJyLT5ib3VuZGFyeV8pIDsKICB9
CiAgU3BDb29yZCBhcmVhKCkgY29uc3QgeyByZXR1cm4gU3BDb29yZCh0cmdsc18uc2l6ZSgpKSA7
IH0KCiAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiB0cmdsc18uYmVnaW4oKSA7IH0KICBpdGVy
YXRvciBlbmQgICgpIHsgcmV0dXJuIHRyZ2xzXy5lbmQgICgpIDsgfQogIAogIGNvbnN0X2l0ZXJh
dG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gdHJnbHNfLmJlZ2luKCkgOyB9CiAgY29uc3RfaXRl
cmF0b3IgZW5kICAoKSBjb25zdCB7IHJldHVybiB0cmdsc18uZW5kICAoKSA7IH0KCiAgYm9vbCBv
d25zQ2VsbChjb25zdCBUTkNlbGwgKnRyZ2wpIGNvbnN0IHsKICAgIHJldHVybiB0cmdsc18uZmlu
ZCh0cmdsKSAhPSBlbmQoKSA7CiAgfQogIHZvaWQgYWRkQ2VsbChjb25zdCBUTkNlbGwgKnRyZ2wp
IHsgdHJnbHNfLmluc2VydCh0cmdsKSA7IH0KICB2b2lkIHJlbUNlbGwoY29uc3QgVE5DZWxsICp0
cmdsKSB7IHRyZ2xzXy5lcmFzZSAodHJnbCkgOyB9CiAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0
dXJuIHRyZ2xzXy5zaXplKCkgPT0gMCA7IH0KCiAgY29uc3QgVE5DZWxsKiB2YWx1ZShpdGVyYXRv
ciYgaSkgY29uc3QgeyByZXR1cm4gKmkgOyB9CiAgdm9pZCBuZXh0KGl0ZXJhdG9yJiBpKSAgICAg
ICAgICAgY29uc3QgeyBpKysgOyB9CiAKICBjb25zdCBCcmFuY2hCb3VuZGFyeSogZ2V0Qm91bmRh
cnkoKSBjb25zdCB7CiAgICByZXR1cm4gYm91bmRhcnlfIDsKICB9CiAgY29uc3QgVE5DZWxsKiBn
ZXRTZWVkKCkgY29uc3QgewogICAgcmV0dXJuIHNlZWRfIDsKICB9Cgpwcml2YXRlIDoKCiAgc2V0
PGNvbnN0IFROQ2VsbCo+IHRyZ2xzXyA7CiAgY29uc3QgVE5DZWxsICAgICAgKnNlZWRfICA7CiAg
QnJhbmNoQm91bmRhcnkgICAgKmJvdW5kYXJ5XyA7Cn0gOwoKLyoqIFNldCBvZiBicmFuY2hlcy4K
ICBUaGlzIGNsYXNzIHN0b3JlcyBhIHNldCBvZiBicmFuY2hlcy4gSXQgaGFzIHRoZSBwYXJ0aWN1
bGFyaXR5IHRvCiAgb3B0aW9uYWxseSBtYW5hZ2UgdGhlIGxpZmUgb2YgZW1iZWRkZWQgYnJhbmNo
ZXMuIEluIHRoaXMgY2FzZSwKICB0aGUgYnJhbmNoZXMgYWRkZWQgdG8gYW4gaW5zdGFuY2Ugb2Yg
dGhpcyBjbGFzcyBnZXQgZGVzdHJveWVkCiAgd2hlbiB0aGUgaW5zdGFuY2UgaXMgZGVzdHJveWVk
LgogICovCmNsYXNzIEJyYW5jaFNldCB7CgpwdWJsaWMgOgoKICB0eXBlZGVmIGxpc3Q8Y29uc3Qg
QnJhbmNoKj46Oml0ZXJhdG9yIGl0ZXJhdG9yIDsKICB0eXBlZGVmIGxpc3Q8Y29uc3QgQnJhbmNo
Kj46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yIDsKICBmcmllbmQgY2xhc3MgQnJhbmNo
U2V0QnVpbGRlciA7CiAgZnJpZW5kIGNsYXNzIEJyYW5jaEludGVncmF0ZXIgOwogIApwdWJsaWMg
OgoKICAvLy8gQ29uc3RydWN0b3IuCiAgQnJhbmNoU2V0KCkgOwogIC8vLyBDb3B5IGNvbnN0cnVj
dG9yLgogIEJyYW5jaFNldChjb25zdCBCcmFuY2hTZXQmKSA7CiAgfkJyYW5jaFNldCgpIDsKCiAg
Ly8vIEl0ZXJhdGlvbi4KICAvL0B7CiAgLy8vIFN0YXJ0cyB0byBpdGVyYXRlIG92ZXIgdGhlIGJy
YW5jaGVzLgogIC8vLyBAcmV0dXJuIEFuIGl0ZXJhdG9yLgogIGl0ZXJhdG9yIGJlZ2luKCkgeyBy
ZXR1cm4gYnJhbmNoZXNfLmJlZ2luKCkgOyB9CiAgLy8vIFN0b3BzIGl0ZXJhdGluZy4KICAvLy8g
QHJldHVybiBBIG1hcmtlciB0byB0aGUgZW5kIG9mIHRoZSBzZXQuCiAgLy9AfQogIGl0ZXJhdG9y
IGVuZCAgKCkgeyByZXR1cm4gYnJhbmNoZXNfLmVuZCAgKCkgOyB9CgogIGNvbnN0X2l0ZXJhdG9y
IGJlZ2luKCkgY29uc3QgeyByZXR1cm4gYnJhbmNoZXNfLmJlZ2luKCkgOyB9CiAgY29uc3RfaXRl
cmF0b3IgZW5kICAoKSBjb25zdCB7IHJldHVybiBicmFuY2hlc18uZW5kKCkgICA7IH0KCiAgY29u
c3QgQnJhbmNoKiB2YWx1ZShpdGVyYXRvciYgaSkgICAgICAgY29uc3QgeyByZXR1cm4gKmkgOyB9
CiAgY29uc3QgQnJhbmNoKiB2YWx1ZShjb25zdF9pdGVyYXRvciYgaSkgY29uc3QgeyByZXR1cm4g
KmkgOyB9CgogIHZvaWQgbmV4dChpdGVyYXRvciYgaSkgICAgICAgY29uc3QgeyBpKysgOyB9CiAg
dm9pZCBuZXh0KGNvbnN0X2l0ZXJhdG9yJiBpKSBjb25zdCB7IGkrKyA7IH0KCiAgLyoqIFN3aXRj
aGVzIG9uL29mZiBtYW5hZ2VtZW50LgogICAgVGhpcyBjYWxsIHN3aXRjaGVzIG9uIGFuZCBvZmYg
YXV0b21hdGljIG1lbW9yeSBtYW5hZ2VtZW50CiAgICBvZiBlbWJlZGRlZCBicmFuY2hlcy4KICAg
IEBwYXJhbSBtYW5hZ2UgTXVzdCBiZSA8Yj50cnVlPC9iPiB0byB0dXJuIG9uIGF1dG9tYXRpYyBt
YW5hZ2VtZW50LgogICAgKi8KICB2b2lkIG1hbmFnZUJyYW5jaGVzKGJvb2wgbWFuYWdlKSB7CiAg
ICBtYW5hZ2VCcmFuY2hlc18gPSBtYW5hZ2UgOwogIH0KICAvKiogU3RhdHVzIG9mIGF1dG9tYXRp
YyBtYW5hZ2VtZW50LgogICAgUmV0dXJucyB3aGV0aGVyIGF1dG9tYXRpYyBicmFuY2gncyBtYW5h
Z2VtZW50IGlzIGJlaW5nCiAgICBwZXJmb3JtZWQuCiAgICAqLwogIGJvb2wgbWFuYWdlQnJhbmNo
ZXMoKSBjb25zdCB7IHJldHVybiBtYW5hZ2VCcmFuY2hlc18gOyB9Cgpwcml2YXRlIDoKCiAgdm9p
ZCBjbGVhblVwKCkgOwogIHZvaWQgYWRkQnJhbmNoKGNvbnN0IEJyYW5jaCogYikgewogICAgYnJh
bmNoZXNfLnB1c2hfYmFjayhtYW5hZ2VCcmFuY2hlcygpID8gbmV3IEJyYW5jaCgqYikgOiBiKSA7
CiAgfQogIHZvaWQgcmVtQnJhbmNoKEJyYW5jaCogYikgewogICAgYnJhbmNoZXNfLnJlbW92ZShi
KSA7CiAgICBpZiggbWFuYWdlQnJhbmNoZXMoKSApIGRlbGV0ZSBiIDsKICB9Cgpwcml2YXRlIDoK
CiAgbGlzdDxjb25zdCBCcmFuY2gqPiBicmFuY2hlc18gOwogIEJyYW5jaFNldCYgb3BlcmF0b3Ig
PShjb25zdCBCcmFuY2hTZXQmKSA7CiAgYm9vbCBtYW5hZ2VCcmFuY2hlc18gOwp9IDsKCi8qKiBC
dWlsZGluZyBhIHNldCBvZiBicmFuY2hlcy4KICBUaGlzIGNsYXNzIGlzIGEgcHJvY2Vzc29yIHVz
ZWQgdG8gYnVpbGQgYW4gaW5pdGlhbCBzZXQgb2YKICB0cmlhbmd1bGF0ZWQgcGF0Y2hlcy4gVGhv
c2UgcGF0Y2hlcyBtYXkgYmUgcG9zdC1wcm9jZXNzZWQKICBsYXRlci1vbi4gVGhlIHJlc3VsdCBv
ZiB0aGUgYnVpbGRpbmcgcHJvY2VzcyBpcyBhIHNldCBvZgogIGJyYW5jaGVzLgogICovCmNsYXNz
IEJyYW5jaFNldEJ1aWxkZXIgewoKcHVibGljIDoKCiAgdHlwZWRlZiBsaXN0PEJyYW5jaCo+Ojpp
dGVyYXRvciBpdGVyYXRvciA7CiAgdHlwZWRlZiBsaXN0PEJyYW5jaCo+Ojpjb25zdF9pdGVyYXRv
ciBjb25zdF9pdGVyYXRvciA7CgpwdWJsaWMgOgoKICAvKiogQ3JlYXRvci4KICAgIENyZWF0ZXMg
YSBidWlsZGVyIGZyb20gYSB0cmlhZ3VsYXRlZCBuZXR5d29yay4gVGhlIGJ1aWxkZXIKICAgIG1h
eSBiZSB1c2VkIHNldmVyYWwgdGltZXMgZm9yIGRpZmZlcmVudCBnZW9tZXRyaWVzLgogICAgQHBh
cmFtIHRuZXQgVGhlIHRyaWFuZ3VsYXRlZCBuZXR3b3JrLgogICAgQHNlZSBUTmV0CiAgICAqLwog
IEJyYW5jaFNldEJ1aWxkZXIoY29uc3QgVE5ldCopIDsKICB+QnJhbmNoU2V0QnVpbGRlcigpIDsK
CiAgLyoqIE11bHRpLXZhbHVlZCBicmFuY2hlcy4KICAgIFJldHVybnMgd2hldGhlciBicmFuY2hl
cyBhcmUgYWxsb3dlZCB0byBiZQogICAgbXVsdGktdmFsdWVkLgogICAgQHBhcmFtIG11bHRpIDxi
PnRydWU8L2I+IG9yIDxiPmZhbHNlPC9iPi4KICAgICovCiAgdm9pZCBtdWx0aVZhbHVlZChib29s
IG11bHRpKSB7CiAgICBtdWx0aVZhbHVlZF8gPSBtdWx0aSA7CiAgfQogIGJvb2wgbXVsdGlWYWx1
ZWQoKSBjb25zdCB7CiAgICByZXR1cm4gbXVsdGlWYWx1ZWRfIDsKICB9CiAgLyoqIEJ1aWxkaW5n
IHRoZSBicmFuY2hlcy4KICAgIEJ1aWxkcyBhIHNldCBvZiBicmFuY2hlcyB1c2luZyBhIGdpdmVu
IGdlb21ldHJ5LiBUaGUgZ2VvbWV0cnkgaXMKICAgIHByb3ZpZGVkIGJ5IGEgc2ltcGxlIHNldCBv
ZiBwb2ludHMuCiAgICBAcGFyYW0gYnJzZXQgVGhlIHNldCBvZiBicmFuY2hlcyB0byBiZSBidWls
dC4KICAgIEBwYXJhbSBwb2ludHMgVGhlIHNldCBvZiBwb2ludHMgcHJvdmlkaW5nIHRoZSBnZW9t
ZXRyeS4KICAgIEByZXR1cm4gPGI+dHJ1ZTwvYj4gdXBvbiBzdWNjZXNzZnVsbCBjb21wbGV0aW9u
LCA8Yj5mYWxzZTwvYj4gb3RoZXJ3aXNlLgogICAgQHNlZSBCcmFuY2hTZXQKICAgICovCiAgYm9v
bCBidWlsZEZyb20oQnJhbmNoU2V0JiBicnNldCxjb25zdCBQb2ludHMmKSA7CgogIGl0ZXJhdG9y
IGJlZ2luKCkgeyByZXR1cm4gYnJhbmNoZXNfLmJlZ2luKCkgOyB9CiAgaXRlcmF0b3IgZW5kICAo
KSB7IHJldHVybiBicmFuY2hlc18uZW5kICAoKSA7IH0KCiAgY29uc3RfaXRlcmF0b3IgYmVnaW4o
KSBjb25zdCB7IHJldHVybiBicmFuY2hlc18uYmVnaW4oKSA7IH0KICBjb25zdF9pdGVyYXRvciBl
bmQgICgpIGNvbnN0IHsgcmV0dXJuIGJyYW5jaGVzXy5lbmQgICgpIDsgfQoKICBjb25zdCBCcmFu
Y2gqIHZhbHVlKGl0ZXJhdG9yJiBpKSAgICAgICBjb25zdCB7IHJldHVybiAqaSA7IH0KICBjb25z
dCBCcmFuY2gqIHZhbHVlKGNvbnN0X2l0ZXJhdG9yJiBpKSBjb25zdCB7IHJldHVybiAqaSA7IH0K
CiAgdm9pZCBuZXh0KGl0ZXJhdG9yJiBpKSAgICAgICBjb25zdCB7IGkrKyA7IH0KICB2b2lkIG5l
eHQoY29uc3RfaXRlcmF0b3ImIGkpIGNvbnN0IHsgaSsrIDsgfQoKICBjb25zdCBQb2ludCYgZ2V0
UG9pbnQoaW50IHBpZCkgY29uc3QgewogICAgcmV0dXJuIHBvaW50c18tPmdldFBvaW50KHBpZC0x
KSA7CiAgfQogIApwcml2YXRlIDoKCiAgdm9pZCBjbGVhblVwKCkgOwogIHZvaWQgYnVpbGQoQnJh
bmNoU2V0JikgOwogIHZvaWQgYnVpbGRCcmFuY2goQnJhbmNoKiBicmFuY2gpIDsKICBib29sIHBy
b3BhZ2F0ZUJyYW5jaChCcmFuY2gqIGIsY29uc3QgVE5DZWxsKiB0LGNvbnN0IFRORWRnZSAqZSkg
OwoKICB2b2lkIGFkZEJyYW5jaChCcmFuY2gqIGJyYW5jaCkgewogICAgYnJhbmNoZXNfLnB1c2hf
YmFjayhicmFuY2gpIDsKICAgIHRyaWFuZ2xlTWFwX1ticmFuY2gtPmdldFNlZWQoKV0gPSBicmFu
Y2ggOwogIH0KICB2b2lkIGFkZEluQnJhbmNoKEJyYW5jaCogYnJhbmNoLGNvbnN0IFROQ2VsbCAq
dHJnbCkgewogICAgYnJhbmNoLT5hZGRDZWxsKHRyZ2wpIDsKICAgIHRyaWFuZ2xlTWFwX1t0cmds
XSA9IGJyYW5jaCA7CiAgfQogIEJyYW5jaCogZmluZEJyYW5jaE93bmluZyhjb25zdCBUTkNlbGwg
KnRyKSBjb25zdCB7CiAgICBtYXA8Y29uc3QgVE5DZWxsKixCcmFuY2gqPjo6Y29uc3RfaXRlcmF0
b3IgaSA9IHRyaWFuZ2xlTWFwXy5maW5kKHRyKSA7CiAgICByZXR1cm4gaSA9PSB0cmlhbmdsZU1h
cF8uZW5kKCkgPyAwIDogaS0+c2Vjb25kIDsKICB9CiAgQnJhbmNoKiBuZXdCcmFuY2goY29uc3Qg
VE5DZWxsKiBzZWVkKSB7CiAgICBCcmFuY2ggKmJyID0gbmV3IEJyYW5jaChzZWVkKSA7CiAgICBh
ZGRCcmFuY2goYnIpIDsKICAgIHJldHVybiBiciA7CiAgfQoKcHJpdmF0ZSA6CgogIGJvb2wgICAg
ICAgICAgICAgICAgICAgICAgICAgbXVsdGlWYWx1ZWRfIDsKICBjb25zdCBUTmV0ICAgICAgICAg
ICAgICAgICAgKnRuZXRfICAgICAgICA7CiAgY29uc3QgUG9pbnRzICAgICAgICAgICAgICAgICpw
b2ludHNfICAgICAgOwogIG1hcDxjb25zdCBUTkNlbGwqLEJyYW5jaCo+IHRyaWFuZ2xlTWFwXyAg
IDsKICBsaXN0PEJyYW5jaCo+ICAgICAgICAgICAgICAgIGJyYW5jaGVzXyAgICA7Cn0gOwoKLyoq
IEludGVncmF0aW5nIGJyYW5jaGVzLgogIEFmdGVyIGRldGVjdGlvbiwgYSBncmVhdCBudW1iZXIg
b2YgYnJhbmNoZXMgbWF5IGJlIGZvdW5kLiBUaGUKICBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMg
dG8gZmlsdGVyIHRoZSBpbml0aWFsIHNldCBvZiBicmFuY2hlcwogIHNvIGFzIHRvIHJlaW50ZWdy
YXRlIHNvbWVvZiB0aGUgYnJhbmNoZXMgaW50byBvdGhlciBvbmVzLiBUaGUKICByZS1pbnRlZ3Jh
dGlvbiBtYXUgd29yayBpbiBvbmUgb3Igc2V2ZXJhbCBwYXNzZXMuCiAgKi8KY2xhc3MgQnJhbmNo
SW50ZWdyYXRlciB7CgpwdWJsaWMgOgoKICBCcmFuY2hJbnRlZ3JhdGVyKCkgOwogIHZpcnR1YWwg
fkJyYW5jaEludGVncmF0ZXIoKSA7CgogIC8qKiBJbnRlZ3JhdGluZyBicmFuY2hlcy4KICAgIElu
dGVncmF0ZXMgYnJhbmNoZXMgZnJvbSA8Yj5zcmM8L2I+LiBCcmFuY2hlcyBhcmUgb3V0cHV0CiAg
ICBpbiA8Yj5kc3Q8L2I+LgogICAgQHBhcmFtIHNyYyBUaGUgaW5wdXQgcmVhZC1vbmx5IHNldCBv
ZiBicmFuY2hlcy4KICAgIEBwYXJhbSBkc3QgVGhlIG91dHB1dCBzZXQgb2YgYnJhbmNoZXMgKGlu
aXRpYWxseSBlbXB0aWVkKS4KICAgIEBzZWUgQnJhbmNoU2V0CiAgICAqLwogIHZvaWQgcnVuKGNv
bnN0IEJyYW5jaFNldCYgc3JjLEJyYW5jaFNldCYgZHN0KSA7CgogIC8qKiBHZXR0aW5nIHJ1bm5p
bmcgbW9kZS4KICAgIFJldHVybnMgd2hldGhlciBpbnRlZ3JhdGlvbiBtdXN0IHJ1biBpbiBvbmUg
cGFzcy4KICAgIEByZXR1cm4gQSBib29sZWFuIHZhbHVlLgogICAgKi8KICBib29sIHJ1bkluT25l
UGFzcygpIGNvbnN0IHsgcmV0dXJuIGluT25lUGFzc18gOyB9CiAgLyoqIFNldHRpbmcgcnVubmlu
ZyBtb2RlLgogICAgU2V0cyB3aGV0aGVyICBpbnRlZ3JhdGlvbiBtdXN0IHJ1biBpbiBvbmUgcGFz
cy4KICAgIEBwYXJhbSBpbk9uZVBhc3MgQSBib29sZWFuIHZhbHVlLCA8Yj50cnVlPC9iPiBmb3Ig
b25lLXBhc3MgbW9kZS4KICAgICovCiAgdm9pZCBydW5Jbk9uZVBhc3MoYm9vbCBpbk9uZVBhc3Mp
IHsKICAgIGluT25lUGFzc18gPSBpbk9uZVBhc3MgOwogIH0KCnByb3RlY3RlZCA6CgogIC8vLyBJ
bnRlZ3JhdGlvbiBlbmdpbmVzLgogIC8vQHsKICAvLy8gRGV0ZWN0aW5nIHRoZSBicmFuY2hlcyB0
byBiZSByZS1pbnRlZ3JhdGVkLgogIC8vLyBAcGFyYW0gc2V0IFRoZSBpbml0aWFsIHNldCBvZiBi
cmFuY2hlcy4KICAvLy8gQHBhcmFtIGwgVGhlIGxpc3Qgb2YgYnJhbmNoZXMgdG8gYmUgaW50ZWdy
YXRlZC4KICB2aXJ0dWFsIHZvaWQgYnJhbmNoZXNUb0JlSW50ZWdyYXRlZChjb25zdCBCcmFuY2hT
ZXQmLGxpc3Q8QnJhbmNoKj4mKSA7CiAgLy8vIEdldHRpbmcgdGhlIGhvc3QgYnJhbmNoIGZvciBp
bnRlZ3JhdGluZyBicmFuY2hlcyB0byBiZSByZW1vdmVkLgogIC8vLyBAcGFyYW0gc2V0IFRoZSBz
ZXQgb2YgYnJhbmNoZXMgaW4gd2hpY2ggdG8gbG9vayBmb3IgdGhlIGJyYW5jaC4KICAvLy8gQHBh
cmFtIGJyYW5jaCBUaGUgYnJhbmNoIHRvIGJlIHJlLWludGVncmF0ZWQuCiAgLy8vIEByZXR1cm4g
QSBjb25zdCBwb2ludGVyIHRvIHRoZSBgaG9zdCcgYnJhbmNoLgogIHZpcnR1YWwgQnJhbmNoKiBi
cmFuY2hGb3JJbnRlZ3JhdGluZyhjb25zdCBCcmFuY2hTZXQmLGNvbnN0IEJyYW5jaCopIDsKICAv
L0B9Cgpwcml2YXRlIDoKCiAgYm9vbCBpbk9uZVBhc3NfIDsKfSA7CgovKiogQSBzcGVjaWFsIHB1
cnBvc2UgaW50ZWdyYXRvci4KICBUaGlzIGNsYXNzIGludGVncmF0ZXMgYnJhbmNoZXMgYmFzZWQg
b24gdGhlaXIgc2l6ZSByZWdhcmRpbmcKICB0aGUgbWVhbiBzaXplIHdpdGhpbiBhbGwgcGF0Y2hl
cy4gVGhpcyBpcyBqdXN0IGFuIGV4YW1wbGUgb2YKICB3aGF0IGNhbiBiZSBkb25lLgogICovCmNs
YXNzIFRpbnlCcmFuY2hSZW1vdmVyIDogcHVibGljIEJyYW5jaEludGVncmF0ZXIgewoKcHVibGlj
IDoKCiAgVGlueUJyYW5jaFJlbW92ZXIoKSA7CiAgflRpbnlCcmFuY2hSZW1vdmVyKCkgOwoKICAv
KiogU2V0dGluZyByZW1vdmFsIHJhdGlvLgogICAgU2V0cyB0aGUgcmF0aW8gKHRoZSBzaXplIG9m
IHRoZSBicmFuY2ggb3ZlciB0aGUgc2l6ZSBvZiB0aGUgZ3JlYXRlc3QKICAgIGJyYW5jaCksIHVu
ZGVyIHdoaWNoIHRoZSBicmFuY2ggaGFzIHRvIGJlIHJlLWludGVncmF0ZWQgaW50byBhbm90aGVy
IG9uZS4KICAgIEBwYXJhbSByZW1vdmFsUmF0aW8gQSBmbG9hdGluZyBwb2ludCB2YWx1ZSAodHlw
aWNhbGx5IDxiPjAuMDE8L2I+IG9yCiAgICA8Yj4wLjAwNTwvYj4pLgogICAgKi8KICB2b2lkIHNl
dFJlbW92YWxSYXRpbyhTcENvb3JkIHJlbW92YWxSYXRpbykgewogICAgcmVtb3ZhbFJhdGlvXyA9
IHJlbW92YWxSYXRpbyA7CiAgfQogIC8qKiBHZXR0aW5nIHJlbW92YWwgcmF0aW8uCiAgICBHZXRz
IHRoZSByZW1vdmFsIHJhdGlvIGZvciByZS1pbnRlZ3JhdGluZyBicmFuY2hlcy4gVGhlIHJhdGlv
IGRlZmF1bHRzCiAgICB0byA8Yj4wLjAxPC9iPi4KICAgIEByZXR1cm4gQSBmbG9hdGluZyBwb2lu
dCB2YWx1ZS4KICAgICovCiAgU3BDb29yZCBnZXRSZW1vdmFsUmF0aW8oKSBjb25zdCB7CiAgICBy
ZXR1cm4gcmVtb3ZhbFJhdGlvXyA7CiAgfQoKcHJvdGVjdGVkIDoKCiAgdm9pZCBicmFuY2hlc1Rv
QmVJbnRlZ3JhdGVkKGNvbnN0IEJyYW5jaFNldCYsbGlzdDxCcmFuY2gqPiYpIDsKICBCcmFuY2gq
IGJyYW5jaEZvckludGVncmF0aW5nKGNvbnN0IEJyYW5jaFNldCYsY29uc3QgQnJhbmNoKikgOwoK
cHJpdmF0ZSA6CiAgCiAgU3BDb29yZCBjb21wdXRlTWF4QXJlYShjb25zdCBCcmFuY2hTZXQmIGJz
ZXQpIDsKICBTcENvb3JkIHJlbW92YWxSYXRpb18gOwp9IDsKCi8vCi8vIFB1cnBvc2U6IGNyZWF0
ZXMgYSBuZXcgYnJhbmNoIGZyb20gc2VlZCBgc2VlZCcuIGBzZWVkJyBpcyBhbHNvIHRoZSBmaXJz
dAovLyAgICAgICAgICBjZWxsIGluIHRoZSBicmFuY2guCgpCcmFuY2g6OkJyYW5jaChjb25zdCBU
TkNlbGwqIHNlZWQpIHsKCiAgYWRkQ2VsbChzZWVkXyA9IHNlZWQpIDsKICBib3VuZGFyeV8gPSBu
ZXcgQnJhbmNoQm91bmRhcnkoKSA7CiAgYm91bmRhcnlfLT5hZGRFZGdlKHNlZWRfLT5nZXRFZGdl
KDApKSA7CiAgYm91bmRhcnlfLT5hZGRFZGdlKHNlZWRfLT5nZXRFZGdlKDEpKSA7CiAgYm91bmRh
cnlfLT5hZGRFZGdlKHNlZWRfLT5nZXRFZGdlKDIpKSA7Cn0KLy9fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
XwoKQnJhbmNoOjpCcmFuY2goY29uc3QgQnJhbmNoJiBicikgewoKICBib3VuZGFyeV8gPSBuZXcg
QnJhbmNoQm91bmRhcnkoKmJyLmJvdW5kYXJ5XykgOwogIHRyZ2xzXyAgICA9IGJyLnRyZ2xzXyA7
Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXwoKQnJhbmNoOjp+QnJhbmNoKCkgewoKICBkZWxldGUg
Ym91bmRhcnlfIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgovLwovLyBQdXJwb3NlOiBpbnRl
Z3JhdGVzIGJyYW5jaCBgYnInIGluIGB0aGlzJy4gVGhlIHR3byBib3VuZGFyaWVzIGFyZSBhbHNv
Ci8vICAgICAgICAgIG1lcmdlZC4KCnZvaWQgQnJhbmNoOjppbnRlZ3JhdGUoY29uc3QgQnJhbmNo
ICpicikgewoKICBzZXQ8Y29uc3QgVE5DZWxsKj4gbmV3VHJnbHMgOwogIHNldF91bmlvbihiZWdp
bigpLGVuZCgpLGJyLT5iZWdpbigpLGJyLT5lbmQoKSwKCSAgICBpbnNlcnRfaXRlcmF0b3I8c2V0
PGNvbnN0IFROQ2VsbCo+ID4obmV3VHJnbHMsbmV3VHJnbHMuYmVnaW4oKSkpIDsKICB0cmdsc18g
PSBuZXdUcmdscyA7CiAgYm91bmRhcnlfLT5pbnRlZ3JhdGUoYnItPmdldEJvdW5kYXJ5KCkpIDsK
fQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fCgpCcmFuY2hCb3VuZGFyeTo6QnJhbmNoQm91bmRhcnko
KSB7Cgp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCkJyYW5jaEJvdW5kYXJ5OjpCcmFuY2hCb3Vu
ZGFyeShjb25zdCBCcmFuY2hCb3VuZGFyeSYgYm91bmRhcnkpIHsKCiAgZWRnZXNfID0gYm91bmRh
cnkuZWRnZXNfIDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCkJyYW5jaEJvdW5kYXJ5Ojp+QnJh
bmNoQm91bmRhcnkoKSB7Cgp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCi8vCi8vIFB1cnBvc2U6
IGludGVncmF0ZXMgYm91bmRhcnkgYGJyJyBpbiBgdGhpcycuIFRoZSBmaW5hbCBzZXQgb2YgZWdk
ZSBFMwovLyAgICAgICAgICBpcyBFMzogKEUxIHVuaW9uIEUyKSAtIChFMSBpbnRlciBFMikKCnZv
aWQgQnJhbmNoQm91bmRhcnk6OmludGVncmF0ZShjb25zdCBCcmFuY2hCb3VuZGFyeSAqYikgewoK
ICAgIHNldDxjb25zdCBUTkVkZ2UqPiBzZXRJbnRlcixzZXRGaW5hbCxzZXRVbmlvbiA7CiAgICBz
ZXRfdW5pb24oYmVnaW4oKSxlbmQoKSxiLT5iZWdpbigpLGItPmVuZCgpLAoJICAgICAgaW5zZXJ0
X2l0ZXJhdG9yPHNldDxjb25zdCBUTkVkZ2UqPiA+KHNldFVuaW9uLHNldFVuaW9uLmJlZ2luKCkp
KSA7CiAgICBzZXRfaW50ZXJzZWN0aW9uKGJlZ2luKCksZW5kKCksYi0+YmVnaW4oKSxiLT5lbmQo
KSwKCQkgICAgIGluc2VydF9pdGVyYXRvcjxzZXQ8Y29uc3QgVE5FZGdlKj4gPihzZXRJbnRlcixz
ZXRJbnRlci5iZWdpbigpKSkgOwoKICAgIHNldF9kaWZmZXJlbmNlKHNldFVuaW9uLmJlZ2luKCks
c2V0VW5pb24uZW5kKCksCgkJICAgc2V0SW50ZXIuYmVnaW4oKSxzZXRJbnRlci5lbmQoKSwKCQkg
ICBpbnNlcnRfaXRlcmF0b3I8c2V0PGNvbnN0IFRORWRnZSo+ID4oc2V0RmluYWwsc2V0RmluYWwu
YmVnaW4oKSkpIDsKCiAgICBlZGdlc18gPSBzZXRGaW5hbCA7Cn0KLy9fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fCgovLyBQdXJwb3NlOiByZXR1cm4gd2hldGhlciBdQSxCXSBpbnRlcnNlY3RzIFtDRF0uIFRo
ZSBjYWxjdWxhdGlvbiBpcyBwZXJmb3JtZWQKLy8gICAgICAgICAgYWZ0ZXIgcHJvamVjdGlvbiBv
biBhbiBob3Jpem9udGFsIHBsYW5lLgoKaW5saW5lIGJvb2wgaW50ZXJzZWN0KGNvbnN0IFBvaW50
JiBBLGNvbnN0IFBvaW50JiBCLAoJCSAgICAgIGNvbnN0IFBvaW50JiBDLGNvbnN0IFBvaW50JiBE
KSB7CiAgCiAgVmVjdG9yIENBKEMsQSksQ0IoQyxCKSxEQShELEEpLERCKEQsQikgOwogIENBLnoo
KSA9IDAuMCA7IENCLnooKSA9IDAuMCA7IERBLnooKSA9IDAuMCA7IERCLnooKSA9IDAuMCA7CiAg
cmV0dXJuIChDQV5DQikqKERBXkRCKSA8PSAwICYmIChDQV5EQSkqKENCXkRCKSA8IDAgOwp9Ci8v
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX18KCkJyYW5jaFNldEJ1aWxkZXI6OkJyYW5jaFNldEJ1aWxkZXIo
Y29uc3QgVE5ldCogdG5ldCkgewoKICB0bmV0XyA9IHRuZXQgOwogIG11bHRpVmFsdWVkXyA9IHRy
dWUgOwp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCkJyYW5jaFNldEJ1aWxkZXI6On5CcmFuY2hT
ZXRCdWlsZGVyKCkgewoKICBjbGVhblVwKCkgOwp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCi8v
Ci8vIFB1cnBvc2U6IGlzIGl0IHBvc3NpYmxlIHRvIHByb3BhZ2F0ZSB0aGlzIGJyYW5jaCBmcm9t
IGNlbGwgJ3QnIGluCi8vICAgICAgICAgIGRpcmVjdGlvbiBvZiBlZGdlICdlJyA/Cgpib29sIEJy
YW5jaFNldEJ1aWxkZXI6OnByb3BhZ2F0ZUJyYW5jaChCcmFuY2gqIGIsY29uc3QgVE5DZWxsKiB0
LGNvbnN0IFRORWRnZSAqZSkgewoKICBjb25zdCBQb2ludCYgcDEgPSBnZXRQb2ludCh0LT5nZXRB
cGV4KDApLT5nZXRBcGV4SWQgKCkpIDsKICBjb25zdCBQb2ludCYgcDIgPSBnZXRQb2ludCh0LT5n
ZXRBcGV4KDEpLT5nZXRBcGV4SWQgKCkpIDsKICBjb25zdCBQb2ludCYgcDMgPSBnZXRQb2ludCh0
LT5nZXRBcGV4KDIpLT5nZXRBcGV4SWQgKCkpIDsKCiAgUG9pbnQgSSgocDEueCgpICsgcDIueCgp
ICsgcDMueCgpKS8zLChwMS55KCkgKyBwMi55KCkgKyBwMy55KCkpLzMsMC4wKSA7CgogIC8vIEdl
dHMgdGhlIG5ldyBjZWxsLCBzaGFyaW5nIGVkZ2UgJ2UnIHdpdGggJ3QnLiBBbmQgY2hlY2sgd2hl
dGhlciB0aGUKICAvLyBjZWxsIGlzICd0dXJuaW5nIGJhY2snLgogIAogIGNvbnN0IFROQ2VsbCAq
bmIgPSAoZS0+Z2V0V2luZygwKSA9PSB0ID8gZS0+Z2V0V2luZygxKSA6IGUtPmdldFdpbmcoMCkp
IDsKCiAgY29uc3QgVE5BcGV4ICphcGV4UyAgPSBuYi0+YXBleEZhY2luZ0VkZ2UoZSkgOwogIGNv
bnN0IFROQXBleCAqYXBleE8xID0gZS0+Z2V0QXBleCgwKSA7CiAgY29uc3QgVE5BcGV4ICphcGV4
TzIgPSBlLT5nZXRBcGV4KDEpIDsKCiAgY29uc3QgUG9pbnQgJlMgID0gZ2V0UG9pbnQoYXBleFMt
PmdldEFwZXhJZCAoKSkgOwogIGNvbnN0IFBvaW50ICZPMSA9IGdldFBvaW50KGFwZXhPMS0+Z2V0
QXBleElkKCkpIDsKICBjb25zdCBQb2ludCAmTzIgPSBnZXRQb2ludChhcGV4TzItPmdldEFwZXhJ
ZCgpKSA7CgogIFZlY3RvciBTTzEoUyxPMSksU08yKFMsTzIpLElPMShJLE8xKSxJTzIoSSxPMikg
OwogIFNPMS56KCkgPSAwLjAgOyBTTzIueigpID0gMC4wIDsgIElPMS56KCkgPSAwLjAgOyBJTzIu
eigpID0gMC4wIDsKICAKICBpZiggKFNPMV5TTzIpKihJTzFeSU8yKSA+PSAwICkgcmV0dXJuIGZh
bHNlIDsKCiAgLy8gaWYgbXVsdGktdmFsdWVkIGJyYW5jaGVzIGFyZSBub3QgYWxsb3dlZCwgY2hl
Y2tzIHRoZSBpbnRlcnNlY3Rpb24gd2l0aAogIC8vIGFsbCBlZGdlcyBvZiB0aGUgYnJhbmNoJ3Mg
Ym91bmRhcnkgKHRoaXMgaXMgdGhlIG1vc3QgdGltZS1jb25zdW1pbmcKICAvLyBhbmQgd2lsbCBo
YXZlIHRvIGJlIGltcHJvdmVkLgogIAogIGlmKCAhbXVsdGlWYWx1ZWQoKSApIHsKCiAgICBjb25z
dCBCcmFuY2hCb3VuZGFyeSAqYm91bmRhcnkgPSBiLT5nZXRCb3VuZGFyeSgpIDsKICAgIEJyYW5j
aEJvdW5kYXJ5Ojpjb25zdF9pdGVyYXRvciBpdCA7CgogICAgZm9yKGl0ID0gYm91bmRhcnktPmJl
Z2luKCkgOyBpdCAhPSBib3VuZGFyeS0+ZW5kKCkgOyBpdCsrKSB7CiAgICAgIGNvbnN0IFRORWRn
ZSAqZSA9ICppdCA7CiAgICAgIGNvbnN0IFROQXBleCAqYXBleE8xMSA9IGUtPmdldEFwZXgoMCks
ICphcGV4TzIyID0gZS0+Z2V0QXBleCgxKSA7CiAgICAgIGlmKCBpbnRlcnNlY3QoTzEsCgkJICAg
IFMsCgkJICAgIGdldFBvaW50KGFwZXhPMTEtPmdldEFwZXhJZCgpKSwKCQkgICAgZ2V0UG9pbnQo
YXBleE8yMi0+Z2V0QXBleElkKCkpKSB8fAogICAgICAgICAgaW50ZXJzZWN0KE8yLAoJCSAgICBT
LAoJCSAgICBnZXRQb2ludChhcGV4TzExLT5nZXRBcGV4SWQoKSksCgkJICAgIGdldFBvaW50KGFw
ZXhPMjItPmdldEFwZXhJZCgpKSkgKSB7CglicmVhayA7CiAgICAgIH0KICAgIH0KICAgIHJldHVy
biBpdCA9PSBib3VuZGFyeS0+ZW5kKCkgOwogIH0KICByZXR1cm4gdHJ1ZSA7Cn0KLy9fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fCgovLwovLyBQdXJwb3NlOiBidWlsZHMgYSBuZXcgYnJhbmNoIGBicmFuY2gn
LgoKdm9pZCBCcmFuY2hTZXRCdWlsZGVyOjpidWlsZEJyYW5jaChCcmFuY2gqIGJyYW5jaCkgewoK
ICBCcmFuY2hCb3VuZGFyeSogYm91bmRhcnkgPSBjb25zdF9jYXN0PEJyYW5jaEJvdW5kYXJ5Kj4o
YnJhbmNoLT5nZXRCb3VuZGFyeSgpKSA7CgogIHN0YWNrPGNvbnN0IFROQ2VsbCo+IGdhbW1hIDsK
ICBnYW1tYS5wdXNoKGJyYW5jaC0+Z2V0U2VlZCgpKSA7CgogIC8vIFdoaWxlIHRoZXJlIGFyZSBj
ZWxscyB0byBhZGQgLi4uLgogIAogIHdoaWxlKCAhZ2FtbWEuZW1wdHkoKSApIHsKCiAgICBjb25z
dCBUTkNlbGwgKnQgPSBnYW1tYS50b3AoKSA7CiAgICBnYW1tYS5wb3AoKSA7CgogICAgLy8gR2V0
cyB0aGUgY2VsbCB0byBiZSBoYW5kbGVkLCBhbmQgZm9yIGVhY2ggb2YgaXRzIG5laWdoYm91cnMg
bm90IGFscmVhZHkKICAgIC8vIHBhcnQgb2YgYSBicmFuY2gsIHRyaWVzIHRvIHByb3BhZ2F0ZSB0
aGUgYnJhbmNoIGluIGl0cyBkaXJlY3Rpb24uCiAgICAKICAgIGZvcihpbnQgaSA9IDAgOyBpIDwg
MyA7IGkrKykgewogICAgICBUTkNlbGwgKm5laWdoYm91ciA9IHQtPmdldE5laWdoYm91cihpKSA7
CiAgICAgIGlmKCBuZWlnaGJvdXIgKSB7CgoJVE5FZGdlICpzaGFyZWRFZGdlID0gdC0+Z2V0RWRn
ZShpKSA7CglCcmFuY2ggKm93bmVyIDsgCglpZiggKG93bmVyID0gZmluZEJyYW5jaE93bmluZyhu
ZWlnaGJvdXIpKSA9PSAwICkgewoKCSAgaWYoIHByb3BhZ2F0ZUJyYW5jaChicmFuY2gsdCxzaGFy
ZWRFZGdlKSApIHsKCSAgICAvLyBJZiB0aGUgcHJvcGFnYXRpb24gaXMgc3VjY2Vzc2Z1bGwsIGFk
ZHMgdGhlIGNlbGwgaW50byB0aGUKCSAgICAvLyBicmFuY2ggYmVpbmcgYnVpbHQgYW5kIHB1c2hl
ZCB0aGUgY2VsbCBpbnRvIHRoZSBzdGFjay4KCSAgICBhZGRJbkJyYW5jaChicmFuY2gsbmVpZ2hi
b3VyKSA7CgkgICAgZ2FtbWEucHVzaChuZWlnaGJvdXIpIDsKCgkgICAgZm9yKGludCBqID0gMCA7
IGogPCAzIDsgaisrKSB7CgkgICAgICBjb25zdCBUTkVkZ2UgKmJvcmRlckVkZ2UgPSBuZWlnaGJv
dXItPmdldEVkZ2UoaikgOwoJICAgICAgaWYoIGJvcmRlckVkZ2UgIT0gc2hhcmVkRWRnZSApIHsK
CQlib3VuZGFyeS0+YWRkRWRnZShib3JkZXJFZGdlKSA7CgkgICAgICB9CgkgICAgfQoJICAgIC8v
IFJlbW92ZXMgdGhlIHNoYXJlZCBlZGdlIGZyb20gdGhlIGJvdW5kYXJ5LCBzaW5jZSB0aGUgYnJh
bmNoCgkgICAgLy8gaGFzIGJlZW4gZW5sYXJnZWQgYmV5b25kIGl0IC4uLgoJICAgIGJvdW5kYXJ5
LT5yZW1FZGdlKHNoYXJlZEVkZ2UpIDsKCSAgfQoJfQoJZWxzZSBpZiggb3duZXIgPT0gYnJhbmNo
KSB7CgkgIGJvdW5kYXJ5LT5yZW1FZGdlKHNoYXJlZEVkZ2UpIDsKCX0KICAgICAgfQogICAgfQog
IH0KfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fCgp2b2lkIEJyYW5jaFNldEJ1aWxkZXI6OmJ1aWxk
KEJyYW5jaFNldCYgYnJzZXQpIHsKCiAgYnJzZXQuY2xlYW5VcCgpIDsKICBmb3IoaXRlcmF0b3Ig
aSA9IGJlZ2luKCkgOyBpICE9IGVuZCgpIDsgaSsrKSB7CiAgICBicnNldC5hZGRCcmFuY2goKmkp
IDsKICB9Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKdm9pZCBCcmFuY2hTZXRCdWlsZGVyOjpj
bGVhblVwKCkgewoKICBmb3IoaXRlcmF0b3IgaSA9IGJlZ2luKCkgOyBpICE9IGVuZCgpIDsgaSsr
KSB7CiAgICBCcmFuY2ggKmIgPSAqaSA7CiAgICBkZWxldGUgYiA7CiAgfQogIGJyYW5jaGVzXy5j
bGVhcigpIDsKICB0cmlhbmdsZU1hcF8uY2xlYXIoKSA7Cn0KLy9fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
CgovLwovLyBQdXJwb3NlOiBidWlsZHMgdGhlIHNldCBvZiBicmFuY2hlcyBgYnJzZXQnLCB1c2lu
ZyB0aGUgZ2VvbWV0cnkgb2YKLy8gICAgICAgICAgcG9pbnRzIGBwb2ludHMnLgoKYm9vbCBCcmFu
Y2hTZXRCdWlsZGVyOjpidWlsZEZyb20oQnJhbmNoU2V0JiBicnNldCxjb25zdCBQb2ludHMmIHBv
aW50cykgewoKICAvLyBDaGVja3MgaGVyZSB0aGUgdmFsaWRpdHkgb2YgJ3BvaW50cycgKC5pLiBp
dHMgc2l6ZSByZWdhcmRpbmcgdGhlIGdyaWQKICAvLyBzaXplKQogIC8vIC4uLgogIHBvaW50c18g
PSAmcG9pbnRzIDsKICBmb3IoVE5ldDo6Y29uc3RfaXRlcmF0b3IgbWkgPSB0bmV0Xy0+YmVnaW4o
KSA7CiAgICAgIG1pICE9IHRuZXRfLT5lbmQoKSA7CiAgICAgIG1pKyspIHsKICAgIC8vIElmIHRo
aXMgY2VsbCBpcyBhbHJlYWR5IGluIG9uZSBicmFuY2gsIGNvbnRpbnVlcyB3aXRoIHRoZQogICAg
Ly8gbmV4dCBjZWxsLgogICAgVE5DZWxsICp0ciA9ICptaSA7CiAgICBpZiggZmluZEJyYW5jaE93
bmluZyh0cikgIT0gMCApIHsKICAgICAgY29udGludWUgOwogICAgfQogICAgLy8gSWYgbm90LCBh
dHRlbXB0cyB0byBwcm9wYWdhdGUgdGhpcyBicmFuY2guCiAgICBCcmFuY2ggKmJyID0gbmV3QnJh
bmNoKHRyKSA7CiAgICBidWlsZEJyYW5jaChicikgOwogIH0KICAvLyBSZW1vdmUgdGlueSBicmFu
Y2hlcyAmIHJlLWludGVncmF0ZSB0aGVtIChhbm90aGVyIGNsYXNzIGNvdWxkIGFsc28gYmUgdXNl
ZAogIC8vIGZvciBwb3N0LXByb2Nlc3NpbmcgYnJhbmNoZXMuCgogIGJ1aWxkKGJyc2V0KSA7CiAg
Y2xlYW5VcCgpICAgIDsKICByZXR1cm4gdHJ1ZSAgOwp9Ci8vX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoK
QnJhbmNoU2V0OjpCcmFuY2hTZXQoKSA6IGJyYW5jaGVzXygpLCBtYW5hZ2VCcmFuY2hlc18odHJ1
ZSkgewoKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpCcmFuY2hTZXQ6On5CcmFuY2hTZXQoKSB7
CgogIGNsZWFuVXAoKSA7Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKQnJhbmNoU2V0OjpCcmFu
Y2hTZXQoY29uc3QgQnJhbmNoU2V0JiBicnNldCkgewoKICAqdGhpcyA9IGJyc2V0IDsKfQovL19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18KCkJyYW5jaFNldCYgQnJhbmNoU2V0OjpvcGVyYXRvciA9KGNvbnN0
IEJyYW5jaFNldCYgYnJzZXQpIHsKCiAgaWYoIHRoaXMgIT0gJmJyc2V0ICkgewogICAgY2xlYW5V
cCgpIDsKICAgIGZvcihjb25zdF9pdGVyYXRvciBpID0gYnJzZXQuYmVnaW4oKSA7IGkgIT0gYnJz
ZXQuZW5kKCkgOyBpKyspIHsKICAgICAgYWRkQnJhbmNoKCppKSA7CiAgICB9CiAgfQogIHJldHVy
biAqdGhpcyA7Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgp2b2lkIEJyYW5jaFNldDo6Y2xlYW5V
cCgpIHsKCiAgaWYoIG1hbmFnZUJyYW5jaGVzKCkgKSB7CiAgICBmb3IoaXRlcmF0b3IgaSA9IGJl
Z2luKCkgOyBpICE9IGVuZCgpIDsgaSsrKSB7CiAgICAgIEJyYW5jaCAqYiA9IGNvbnN0X2Nhc3Q8
QnJhbmNoKj4oKmkpIDsKICAgICAgZGVsZXRlIGIgOwogICAgfQogIH0KICBicmFuY2hlc18uY2xl
YXIoKSA7Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKQnJhbmNoSW50ZWdyYXRlcjo6QnJhbmNo
SW50ZWdyYXRlcigpIHsKCiAgaW5PbmVQYXNzXyA9IGZhbHNlOwp9Ci8vX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18KCkJyYW5jaEludGVncmF0ZXI6On5CcmFuY2hJbnRlZ3JhdGVyKCkgewoKfQovL19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX18KCnZvaWQgQnJhbmNoSW50ZWdyYXRlcjo6YnJhbmNoZXNUb0JlSW50ZWdy
YXRlZChjb25zdCBCcmFuY2hTZXQmLGxpc3Q8QnJhbmNoKj4mIGJycykgewoKICBicnMuY2xlYXIo
KSA7Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKQnJhbmNoKiBCcmFuY2hJbnRlZ3JhdGVyOjpi
cmFuY2hGb3JJbnRlZ3JhdGluZyhjb25zdCBCcmFuY2hTZXQmLGNvbnN0IEJyYW5jaCopIHsKCiAg
cmV0dXJuIDAgOwp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCi8vCi8vIFB1cnBvc2U6IHN0YXJ0
aW5nIGZyb20gYW4gaW5pdGlhbCBzZXQgb2YgYnJhbmNoZXMgYHNyYycsIGNyZWF0ZXMgYSBuZXcK
Ly8gICAgICAgICAgc2V0IG9mIGJyYW5jaGVzIG9uIG91dHB1dC4gVHdvIHZpcnR1YWwgbWV0aG9k
cwovLyAgICAgICAgICAnYnJhbmNoZXNUb0JlSW50ZWdyYXRlZCcgJiBgYnJhbmNoRm9ySW50ZWdy
YXRpbmcnIGhhdmUgdG8gYmUKLy8gICAgICAgICAgcmUtZGVmaW5lZCBieSBjaGlsZCBjbGFzc2Vz
LgoKdm9pZCBCcmFuY2hJbnRlZ3JhdGVyOjpydW4oY29uc3QgQnJhbmNoU2V0JiBzcmMsQnJhbmNo
U2V0JiBkc3QpIHsKCiAgLy8gR2V0cyB0aGUgaW5pdGlhbCBzZXQgb2YgYnJhbmNoZXMgdG8gYmUg
cmUtaW50ZWdyYXRlZCBpbiBgdG9SZWludGVncmF0ZScKCiAgZHN0ID0gc3JjIDsKICBsaXN0PEJy
YW5jaCo+IHRvUmVpbnRlZ3JhdGUgOwogIGJyYW5jaGVzVG9CZUludGVncmF0ZWQoZHN0LHRvUmVp
bnRlZ3JhdGUpIDsKCiAgLy8gV2hpbGUgdGhlcmUgYXJlIHN0aWxsIGJyYW5jaGVzIHRvIGJlIGlu
dGVncmF0ZWQsIHNjYW5zIHRob3NlIGJyYW5jaGVzCiAgLy8gYW5kIGZvciBlYWNoIG9mIHRoZW0s
IGxvb2sgZm9yIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGJyYW5jaCBmb3IgbWVyZ2luZwogIAogIHdo
aWxlKCB0b1JlaW50ZWdyYXRlLnNpemUoKSA+IDAgKSB7CiAgICBmb3IobGlzdDxCcmFuY2gqPjo6
aXRlcmF0b3IgaSA9IHRvUmVpbnRlZ3JhdGUuYmVnaW4oKSA7CglpICE9IHRvUmVpbnRlZ3JhdGUu
ZW5kKCkgOwoJaSsrKSB7CiAgICAgIC8vIExvb2sgZm9yIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGJy
YW5jaCBmb3IgaW50ZWdyYXRpbmcgYHRvQmVJbnRlZ3JhdGVkJwogICAgICAvLyBpbnRvLgogICAg
ICBCcmFuY2ggKnRvQmVJbnRlZ3JhdGVkID0gKmkgOwogICAgICBCcmFuY2ggKmJyID0gYnJhbmNo
Rm9ySW50ZWdyYXRpbmcoZHN0LHRvQmVJbnRlZ3JhdGVkKSA7CiAgICAgIC8vIElmIHRoaXMgYnJu
YWNoIGRvZXMgZXhpc3QsIGNhbGxzIEJyYW5jaDo6aW50ZWdyYXRlIGFuZCByZW1vdmVzCiAgICAg
IC8vIGB0b0JlSW50ZWdyYXRlZCcgZnJvbSB0aGUgbGlzdCBvZiBicmFuY2hlcyB0byBiZSBpbnRl
Z3JhdGVkLgogICAgICBpZiggYnIgJiYgYnIgIT0gdG9CZUludGVncmF0ZWQgKSB7Cglici0+aW50
ZWdyYXRlKHRvQmVJbnRlZ3JhdGVkKSA7Cglkc3QucmVtQnJhbmNoKHRvQmVJbnRlZ3JhdGVkKSA7
CiAgICAgIH0KICAgIH0KICAgIC8vIElmIHRoZSByZS1pbnRlZ3JhdGlvbiB3b3JrcyBpbiBvbmx5
IG9uZSBwYXNzLCBjbGVhcnMgdGhlIGxpc3QsCiAgICAvLyBvdGhlcndpc2Ugc3RhcnRzIGFsbCBv
dmVyIGFnYWluIC4uLi4KICAgIGlmKCBpbk9uZVBhc3NfICkgdG9SZWludGVncmF0ZS5jbGVhcigp
IDsKICAgIGVsc2UgICAgICAgICAgICAgYnJhbmNoZXNUb0JlSW50ZWdyYXRlZChkc3QsdG9SZWlu
dGVncmF0ZSkgOwogIH0KfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KClRpbnlCcmFuY2hSZW1vdmVy
OjpUaW55QnJhbmNoUmVtb3ZlcigpIDogQnJhbmNoSW50ZWdyYXRlcigpIHsKCiAgcmVtb3ZhbFJh
dGlvXyA9IDAuMSA7Cn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKVGlueUJyYW5jaFJlbW92ZXI6
On5UaW55QnJhbmNoUmVtb3ZlcigpIHsKCn0KLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKU3BDb29y
ZCBUaW55QnJhbmNoUmVtb3Zlcjo6Y29tcHV0ZU1heEFyZWEoY29uc3QgQnJhbmNoU2V0JiBic2V0
KSB7CiAgCiAgU3BDb29yZCBtYXhfYXJlYSA9IDAuMDAgOwogIGZvcihCcmFuY2hTZXQ6OmNvbnN0
X2l0ZXJhdG9yIGkgPSBic2V0LmJlZ2luKCkgOyBpICE9IGJzZXQuZW5kKCkgOyBpKyspIHsKICAg
IFNwQ29vcmQgYXJlYSA9ICgqaSktPmFyZWEoKSA7CiAgICBpZiggYXJlYSA+IG1heF9hcmVhICkg
bWF4X2FyZWEgID0gYXJlYSA7CiAgfQogIHJldHVybiBtYXhfYXJlYSA7Cn0KLy9fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fCgovLwovLyBQdXJwb3NlOiBnZXRzIHRoZSBicmFuY2hlcyB0byBiZSByZS1pbnRl
Z3JhdGVkIGZyb20gdGhlIGxpc3Qgb2YKLy8gICAgICAgICAgYnJhbmNoZXMgYGJzZXQnLiBUaGUg
ZGVjaXNpb24gaXMgdGFrZW4gYmFzZWQgb24gdGhlIHNpemUgb2YKLy8gICAgICAgICAgZWFjaCBi
cmFuY2ggcmVnYXJkaW5nIHRoZSBzaXplIG9mIHRoZSBncmVhdGVzdCBvbmUgKHNpemUgaXMKLy8g
ICAgICAgICAgY2FsY3VsYXRlZCBpbiB0ZXJtcyBvZiBudW1iZXIgb2YgY2VsbHMpLgoKdm9pZCBU
aW55QnJhbmNoUmVtb3Zlcjo6YnJhbmNoZXNUb0JlSW50ZWdyYXRlZChjb25zdCBCcmFuY2hTZXQm
IGJzZXQsCgkJCQkJICAgICAgIGxpc3Q8QnJhbmNoKj4mIHRvUmVpbnRlZ3JhdGUpIHsKCiAgU3BD
b29yZCBtYXhfYXJlYSA9IGNvbXB1dGVNYXhBcmVhKGJzZXQpIDsKICB0b1JlaW50ZWdyYXRlLmNs
ZWFyKCk7CiAgCiAgZm9yKEJyYW5jaFNldDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBic2V0LmJlZ2lu
KCkgOyBpdCAhPSBic2V0LmVuZCgpIDsgaXQrKykgewogICAgCiAgICBpZiggKCppdCktPmFyZWEo
KS9tYXhfYXJlYSA8IGdldFJlbW92YWxSYXRpbygpICkgewogICAgICB0b1JlaW50ZWdyYXRlLnB1
c2hfYmFjayhjb25zdF9jYXN0PEJyYW5jaCo+KCppdCkpIDsKICAgIH0KICB9Cn0KLy9fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fCgovLwovLyBQdXJwb3NlOiBmaW5kIHRoZSBsYXJnZXN0IGJyYW5jaCAtLSBp
LmUgdGhhdCBvZiB0aGUgZ3JlYXRlc3QgYXJlYQovLyAgICAgICAgICBhZGphY2VudCB0byAnYnIn
IC0tIGFuZCByZXR1cm5zIGl0LgoKQnJhbmNoKiBUaW55QnJhbmNoUmVtb3Zlcjo6YnJhbmNoRm9y
SW50ZWdyYXRpbmcoY29uc3QgQnJhbmNoU2V0JiBic2V0LAoJCQkJCQljb25zdCBCcmFuY2gqIGJy
KSB7CgogIEJyYW5jaCAqdGhlQnJhbmNoID0gMCA7CiAgU3BDb29yZCBtYXhBcmVhID0gMC4wIDsK
ICAKICBmb3IoQnJhbmNoU2V0Ojpjb25zdF9pdGVyYXRvciBpdCA9IGJzZXQuYmVnaW4oKSA7IGl0
ICE9IGJzZXQuZW5kKCkgOyBpdCsrKSB7CiAgICBjb25zdCBCcmFuY2ggKnRvQ2hlY2sgPSAqaXQg
OwogICAgU3BDb29yZCB0aGVBcmVhIDsKICAgIGlmKCB0b0NoZWNrICE9IGJyICYmCgl0b0NoZWNr
LT5hZGphY2VudFRvKGJyKSAmJgoJKHRoZUFyZWEgPSB0b0NoZWNrLT5hcmVhKCkpID4gbWF4QXJl
YSApIHsKICAgICAgdGhlQnJhbmNoID0gY29uc3RfY2FzdDxCcmFuY2gqPih0b0NoZWNrKSA7CiAg
ICAgIG1heEFyZWEgPSB0aGVBcmVhIDsKICAgIH0KICB9CiAgcmV0dXJuIHRoZUJyYW5jaCA7Cn0K
Ly9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fCgppbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikgewoK
ICAgcmV0dXJuIDAgOwp9Cg==


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]