PEP 489: Multi-phase extension module initialization; version 6

Petr Viktorin <[email protected]> Wed, 20 May 2015 13:34:04 +0200
Newsgroups gmane.comp.python.import
Message-ID <CA+=+wqAsvYgKy+f2zD5F+i02KRgAQ+2T=yZOeFNRaDp9MBpnaA@mail.gmail.com>
SGVsbG8sCkJhc2VkIG1haW5seSBvbiBjb21tZW50cyBieSBFcmljIFNub3csIEkndmUgc2VudCBh
bm90aGVyIHVwZGF0ZSB0byBQRVAgNDg5LgoKU2VlIHRoZSBkaWZmIGF0IGh0dHBzOi8vaGcucHl0
aG9uLm9yZy9wZXBzL3Jldi9hYWQ3YTM5YTY5NWIKCkhlcmUgaXMgYSBjb3B5IGZvciB5b3VyIGNv
bnZlbmllbmNlOgoKUEVQOiA0ODkKVGl0bGU6IE11bHRpLXBoYXNlIGV4dGVuc2lvbiBtb2R1bGUg
aW5pdGlhbGl6YXRpb24KVmVyc2lvbjogJFJldmlzaW9uJApMYXN0LU1vZGlmaWVkOiAkRGF0ZSQK
QXV0aG9yOiBQZXRyIFZpa3RvcmluIDxlbmN1a291QGdtYWlsLmNvbT4sCiAgICAgICAgU3RlZmFu
IEJlaG5lbCA8c3RlZmFuX21sQGJlaG5lbC5kZT4sCiAgICAgICAgTmljayBDb2dobGFuIDxuY29n
aGxhbkBnbWFpbC5jb20+CkRpc2N1c3Npb25zLVRvOiBpbXBvcnQtc2lnQHB5dGhvbi5vcmcKU3Rh
dHVzOiBEcmFmdApUeXBlOiBTdGFuZGFyZHMgVHJhY2sKQ29udGVudC1UeXBlOiB0ZXh0L3gtcnN0
CkNyZWF0ZWQ6IDExLUF1Zy0yMDEzClB5dGhvbi1WZXJzaW9uOiAzLjUKUG9zdC1IaXN0b3J5OiAy
My1BdWctMjAxMywgMjAtRmViLTIwMTUsIDE2LUFwci0yMDE1ClJlc29sdXRpb246CgoKQWJzdHJh
Y3QKPT09PT09PT0KClRoaXMgUEVQIHByb3Bvc2VzIGEgcmVkZXNpZ24gb2YgdGhlIHdheSBpbiB3
aGljaCBidWlsdC1pbiBhbmQgZXh0ZW5zaW9uIG1vZHVsZXMKaW50ZXJhY3Qgd2l0aCB0aGUgaW1w
b3J0IG1hY2hpbmVyeS4gVGhpcyB3YXMgbGFzdCByZXZpc2VkIGZvciBQeXRob24gMy4wIGluIFBF
UAozMTIxLCBidXQgZGlkIG5vdCBzb2x2ZSBhbGwgcHJvYmxlbXMgYXQgdGhlIHRpbWUuIFRoZSBn
b2FsIGlzIHRvIHNvbHZlCmltcG9ydC1yZWxhdGVkIHByb2JsZW1zIGJ5IGJyaW5naW5nIGV4dGVu
c2lvbiBtb2R1bGVzIGNsb3NlciB0byB0aGUgd2F5IFB5dGhvbgptb2R1bGVzIGJlaGF2ZTsgc3Bl
Y2lmaWNhbGx5IHRvIGhvb2sgaW50byB0aGUgTW9kdWxlU3BlYy1iYXNlZCBsb2FkaW5nCm1lY2hh
bmlzbSBpbnRyb2R1Y2VkIGluIFBFUCA0NTEuCgpUaGlzIHByb3Bvc2FsIGRyYXdzIGluc3BpcmF0
aW9uIGZyb20gUHlUeXBlX1NwZWMgb2YgUEVQIDM4NCB0byBhbGxvdyBleHRlbnNpb24KYXV0aG9y
cyB0byBvbmx5IGRlZmluZSBmZWF0dXJlcyB0aGV5IG5lZWQsIGFuZCB0byBhbGxvdyBmdXR1cmUg
YWRkaXRpb25zCnRvIGV4dGVuc2lvbiBtb2R1bGUgZGVjbGFyYXRpb25zLgoKRXh0ZW5zaW9ucyBt
b2R1bGVzIGFyZSBjcmVhdGVkIGluIGEgdHdvLXN0ZXAgcHJvY2VzcywgZml0dGluZyBiZXR0ZXIg
aW50bwp0aGUgTW9kdWxlU3BlYyBhcmNoaXRlY3R1cmUsIHdpdGggcGFyYWxsZWxzIHRvIF9fbmV3
X18gYW5kIF9faW5pdF9fIG9mIGNsYXNzZXMuCgpFeHRlbnNpb24gbW9kdWxlcyBjYW4gc2FmZWx5
IHN0b3JlIGFyYml0cmFyeSBDLWxldmVsIHBlci1tb2R1bGUgc3RhdGUgaW4KdGhlIG1vZHVsZSB0
aGF0IGlzIGNvdmVyZWQgYnkgbm9ybWFsIGdhcmJhZ2UgY29sbGVjdGlvbiBhbmQgc3VwcG9ydHMK
cmVsb2FkaW5nIGFuZCBzdWItaW50ZXJwcmV0ZXJzLgpFeHRlbnNpb24gYXV0aG9ycyBhcmUgZW5j
b3VyYWdlZCB0byB0YWtlIHRoZXNlIGlzc3VlcyBpbnRvIGFjY291bnQKd2hlbiB1c2luZyB0aGUg
bmV3IEFQSS4KClRoZSBwcm9wb3NhbCBhbHNvIGFsbG93cyBleHRlbnNpb24gbW9kdWxlcyB3aXRo
IG5vbi1BU0NJSSBuYW1lcy4KCk5vdCBhbGwgcHJvYmxlbXMgdGFja2xlZCBpbiBQRVAgMzEyMSBh
cmUgc29sdmVkIGluIHRoaXMgcHJvcG9zYWwuCkluIHBhcnRpY3VsYXIsIHByb2JsZW1zIHdpdGgg
cnVuLXRpbWUgbW9kdWxlIGxvb2t1cCAoUHlTdGF0ZV9GaW5kTW9kdWxlKQphcmUgbGVmdCB0byBh
IGZ1dHVyZSBQRVAuCgoKTW90aXZhdGlvbgo9PT09PT09PT09CgpQeXRob24gbW9kdWxlcyBhbmQg
ZXh0ZW5zaW9uIG1vZHVsZXMgYXJlIG5vdCBiZWluZyBzZXQgdXAgaW4gdGhlIHNhbWUgd2F5LgpG
b3IgUHl0aG9uIG1vZHVsZXMsIHRoZSBtb2R1bGUgb2JqZWN0IGlzIGNyZWF0ZWQgYW5kIHNldCB1
cCBmaXJzdCwgdGhlbiB0aGUKbW9kdWxlIGNvZGUgaXMgYmVpbmcgZXhlY3V0ZWQgKFBFUCAzMDIp
LgpBIE1vZHVsZVNwZWMgb2JqZWN0IChQRVAgNDUxKSBpcyB1c2VkIHRvIGhvbGQgaW5mb3JtYXRp
b24gYWJvdXQgdGhlIG1vZHVsZSwKYW5kIHBhc3NlZCB0byB0aGUgcmVsZXZhbnQgaG9va3MuCgpG
b3IgZXh0ZW5zaW9ucyAoaS5lLiBzaGFyZWQgbGlicmFyaWVzKSBhbmQgYnVpbHQtaW4gbW9kdWxl
cywgdGhlIG1vZHVsZQppbml0IGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIHN0cmFpZ2h0IGF3YXkgYW5k
IGRvZXMgYm90aCB0aGUgY3JlYXRpb24gYW5kCmluaXRpYWxpemF0aW9uLiBUaGUgaW5pdGlhbGl6
YXRpb24gZnVuY3Rpb24gaXMgbm90IHBhc3NlZCB0aGUgTW9kdWxlU3BlYywKb3IgYW55IGluZm9y
bWF0aW9uIGl0IGNvbnRhaW5zLCBzdWNoIGFzIHRoZSBfX2ZpbGVfXyBvciBmdWxseS1xdWFsaWZp
ZWQKbmFtZS4gVGhpcyBoaW5kZXJzIHJlbGF0aXZlIGltcG9ydHMgYW5kIHJlc291cmNlIGxvYWRp
bmcuCgpJbiBQeTMsIG1vZHVsZXMgYXJlIGFsc28gbm90IGJlaW5nIGFkZGVkIHRvIHN5cy5tb2R1
bGVzLCB3aGljaCBtZWFucyB0aGF0IGEKKHBvdGVudGlhbGx5IHRyYW5zaXRpdmUpIHJlLWltcG9y
dCBvZiB0aGUgbW9kdWxlIHdpbGwgcmVhbGx5IHRyeSB0byByZS1pbXBvcnQKaXQgYW5kIHRodXMg
cnVuIGludG8gYW4gaW5maW5pdGUgbG9vcCB3aGVuIGl0IGV4ZWN1dGVzIHRoZSBtb2R1bGUgaW5p
dCBmdW5jdGlvbgphZ2Fpbi4gV2l0aG91dCBhY2Nlc3MgdG8gdGhlIGZ1bGx5LXF1YWxpZmllZCBt
b2R1bGUgbmFtZSwgaXQgaXMgbm90IHRyaXZpYWwgdG8KY29ycmVjdGx5IGFkZCB0aGUgbW9kdWxl
IHRvIHN5cy5tb2R1bGVzIGVpdGhlci4KVGhpcyBpcyBzcGVjaWZpY2FsbHkgYSBwcm9ibGVtIGZv
ciBDeXRob24gZ2VuZXJhdGVkIG1vZHVsZXMsIGZvciB3aGljaCBpdCdzCm5vdCB1bmNvbW1vbiB0
aGF0IHRoZSBtb2R1bGUgaW5pdCBjb2RlIGhhcyB0aGUgc2FtZSBsZXZlbCBvZiBjb21wbGV4aXR5
IGFzCnRoYXQgb2YgYW55ICdyZWd1bGFyJyBQeXRob24gbW9kdWxlLiBBbHNvLCB0aGUgbGFjayBv
ZiBfX2ZpbGVfXyBhbmQgX19uYW1lX18KaW5mb3JtYXRpb24gaGluZGVycyB0aGUgY29tcGlsYXRp
b24gb2YgIl9faW5pdF9fLnB5IiBtb2R1bGVzLCBpLmUuIHBhY2thZ2VzLAplc3BlY2lhbGx5IHdo
ZW4gcmVsYXRpdmUgaW1wb3J0cyBhcmUgYmVpbmcgdXNlZCBhdCBtb2R1bGUgaW5pdCB0aW1lLgoK
RnVydGhlcm1vcmUsIHRoZSBtYWpvcml0eSBvZiBjdXJyZW50bHkgZXhpc3RpbmcgZXh0ZW5zaW9u
IG1vZHVsZXMgaGFzCnByb2JsZW1zIHdpdGggc3ViLWludGVycHJldGVyIHN1cHBvcnQgYW5kL29y
IGludGVycHJldGVyIHJlbG9hZGluZywgYW5kLCB3aGlsZQppdCBpcyBwb3NzaWJsZSB3aXRoIHRo
ZSBjdXJyZW50IGluZnJhc3RydWN0dXJlIHRvIHN1cHBvcnQgdGhlc2UKZmVhdHVyZXMsIGl0IGlz
IG5laXRoZXIgZWFzeSBub3IgZWZmaWNpZW50LgpBZGRyZXNzaW5nIHRoZXNlIGlzc3VlcyB3YXMg
dGhlIGdvYWwgb2YgUEVQIDMxMjEsIGJ1dCBtYW55IGV4dGVuc2lvbnMsCmluY2x1ZGluZyBzb21l
IGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LCB0b29rIHRoZSBsZWFzdC1lZmZvcnQgYXBwcm9hY2gK
dG8gcG9ydGluZyB0byBQeXRob24gMywgbGVhdmluZyB0aGVzZSBpc3N1ZXMgdW5yZXNvbHZlZC4K
VGhpcyBQRVAga2VlcHMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdoaWNoIHNob3VsZCByZWR1
Y2UgcHJlc3N1cmUgYW5kIGdpdmUKZXh0ZW5zaW9uIGF1dGhvcnMgYWRlcXVhdGUgdGltZSB0byBj
b25zaWRlciB0aGVzZSBpc3N1ZXMgd2hlbiBwb3J0aW5nLgoKClRoZSBjdXJyZW50IHByb2Nlc3MK
PT09PT09PT09PT09PT09PT09PQoKQ3VycmVudGx5LCBleHRlbnNpb24gYW5kIGJ1aWx0LWluIG1v
ZHVsZXMgZXhwb3J0IGFuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCm5hbWVkICJQeUluaXRfbW9k
dWxlbmFtZSIsIG5hbWVkIGFmdGVyIHRoZSBmaWxlIG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5
LgpUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGJ5IHRoZSBpbXBvcnQgbWFjaGluZXJ5IGFuZCBt
dXN0IHJldHVybiBhIGZ1bGx5CmluaXRpYWxpemVkIG1vZHVsZSBvYmplY3QuClRoZSBmdW5jdGlv
biByZWNlaXZlcyBubyBhcmd1bWVudHMsIHNvIGl0IGhhcyBubyB3YXkgb2Yga25vd2luZyBhYm91
dCBpdHMKaW1wb3J0IGNvbnRleHQuCgpEdXJpbmcgaXRzIGV4ZWN1dGlvbiwgdGhlIG1vZHVsZSBp
bml0IGZ1bmN0aW9uIGNyZWF0ZXMgYSBtb2R1bGUgb2JqZWN0CmJhc2VkIG9uIGEgUHlNb2R1bGVE
ZWYgb2JqZWN0LiBJdCB0aGVuIGNvbnRpbnVlcyB0byBpbml0aWFsaXplIGl0IGJ5IGFkZGluZwph
dHRyaWJ1dGVzIHRvIHRoZSBtb2R1bGUgZGljdCwgY3JlYXRpbmcgdHlwZXMsIGV0Yy4KCkluIHRo
ZSBiYWNrLCB0aGUgc2hhcmVkIGxpYnJhcnkgbG9hZGVyIGtlZXBzIGEgbm90ZSBvZiB0aGUgZnVs
bHkgcXVhbGlmaWVkCm1vZHVsZSBuYW1lIG9mIHRoZSBsYXN0IG1vZHVsZSB0aGF0IGl0IGxvYWRl
ZCwgYW5kIHdoZW4gYSBtb2R1bGUgZ2V0cwpjcmVhdGVkIHRoYXQgaGFzIGEgbWF0Y2hpbmcgbmFt
ZSwgdGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCB0byBkZXRlcm1pbmUKdGhlIGZ1bGx5IHF1
YWxpZmllZCBuYW1lIG9mIHRoZSBtb2R1bGUgb2JqZWN0LiBUaGlzIGlzIG5vdCBlbnRpcmVseSBz
YWZlIGFzIGl0CnJlbGllcyBvbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24gY3JlYXRpbmcgaXRz
IG93biBtb2R1bGUgb2JqZWN0IGZpcnN0LApidXQgdGhpcyBhc3N1bXB0aW9uIHVzdWFsbHkgaG9s
ZHMgaW4gcHJhY3RpY2UuCgoKVGhlIHByb3Bvc2FsCj09PT09PT09PT09PQoKVGhlIGluaXRpYWxp
emF0aW9uIGZ1bmN0aW9uIChQeUluaXRfbW9kdWxlbmFtZSkgd2lsbCBiZSBhbGxvd2VkIHRvIHJl
dHVybgphIHBvaW50ZXIgdG8gYSBQeU1vZHVsZURlZiBvYmplY3QuIFRoZSBpbXBvcnQgbWFjaGlu
ZXJ5IHdpbGwgYmUgaW4gY2hhcmdlCm9mIGNvbnN0cnVjdGluZyB0aGUgbW9kdWxlIG9iamVjdCwg
Y2FsbGluZyBob29rcyBwcm92aWRlZCBpbiB0aGUgUHlNb2R1bGVEZWYKaW4gdGhlIHJlbGV2YW50
IHBoYXNlcyBvZiBpbml0aWFsaXphdGlvbiAoYXMgZGVzY3JpYmVkIGJlbG93KS4KClRoaXMgbXVs
dGktcGhhc2UgaW5pdGlhbGl6YXRpb24gaXMgYW4gYWRkaXRpb25hbCBwb3NzaWJpbGl0eS4gU2lu
Z2xlLXBoYXNlCmluaXRpYWxpemF0aW9uLCB0aGUgY3VycmVudCBwcmFjdGljZSBvZiByZXR1cm5p
bmcgYSBmdWxseSBpbml0aWFsaXplZCBtb2R1bGUKb2JqZWN0LCB3aWxsIHN0aWxsIGJlIGFjY2Vw
dGVkLCBzbyBleGlzdGluZyBjb2RlIHdpbGwgd29yayB1bmNoYW5nZWQsCmluY2x1ZGluZyBiaW5h
cnkgY29tcGF0aWJpbGl0eS4KClRoZSBQeU1vZHVsZURlZiBzdHJ1Y3R1cmUgd2lsbCBiZSBjaGFu
Z2VkIHRvIGNvbnRhaW4gYSBsaXN0IG9mIHNsb3RzLApzaW1pbGFybHkgdG8gUEVQIDM4NCdzIFB5
VHlwZV9TcGVjIGZvciB0eXBlcy4KVG8ga2VlcCBiaW5hcnkgY29tcGF0aWJpbGl0eSwgYW5kIGF2
b2lkIG5lZWRpbmcgdG8gaW50cm9kdWNlIGEgbmV3IHN0cnVjdHVyZQood2hpY2ggd291bGQgaW50
cm9kdWNlIGFkZGl0aW9uYWwgc3VwcG9ydGluZyBmdW5jdGlvbnMgYW5kIHBlci1tb2R1bGUgc3Rv
cmFnZSksCnRoZSBjdXJyZW50bHkgdW51c2VkIG1fcmVsb2FkIHBvaW50ZXIgb2YgUHlNb2R1bGVE
ZWYgd2lsbCBiZSBjaGFuZ2VkIHRvCmhvbGQgdGhlIHNsb3RzLiBUaGUgc3RydWN0dXJlcyBhcmUg
ZGVmaW5lZCBhczo6CgogICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgIGludCBzbG90OwogICAg
ICAgIHZvaWQgKnZhbHVlOwogICAgfSBQeU1vZHVsZURlZl9TbG90OwoKICAgIHR5cGVkZWYgc3Ry
dWN0IFB5TW9kdWxlRGVmIHsKICAgICAgICBQeU1vZHVsZURlZl9CYXNlIG1fYmFzZTsKICAgICAg
ICBjb25zdCBjaGFyKiBtX25hbWU7CiAgICAgICAgY29uc3QgY2hhciogbV9kb2M7CiAgICAgICAg
UHlfc3NpemVfdCBtX3NpemU7CiAgICAgICAgUHlNZXRob2REZWYgKm1fbWV0aG9kczsKICAgICAg
ICBQeU1vZHVsZURlZl9TbG90ICptX3Nsb3RzOyAgLyogY2hhbmdlZCBmcm9tIGBpbnF1aXJ5IG1f
cmVsb2FkO2AgKi8KICAgICAgICB0cmF2ZXJzZXByb2MgbV90cmF2ZXJzZTsKICAgICAgICBpbnF1
aXJ5IG1fY2xlYXI7CiAgICAgICAgZnJlZWZ1bmMgbV9mcmVlOwogICAgfSBQeU1vZHVsZURlZjsK
ClRoZSAqbV9zbG90cyogbWVtYmVyIG11c3QgYmUgZWl0aGVyIE5VTEwsIG9yIHBvaW50IHRvIGFu
IGFycmF5IG9mClB5TW9kdWxlRGVmX1Nsb3Qgc3RydWN0dXJlcywgdGVybWluYXRlZCBieSBhIHNs
b3Qgd2l0aCBpZCBzZXQgdG8gMAooaS5lLiBgYHswLCBOVUxMfWBgKS4KClRvIHNwZWNpZnkgYSBz
bG90LCBhIHVuaXF1ZSBzbG90IElEIG11c3QgYmUgcHJvdmlkZWQuCk5ldyBQeXRob24gdmVyc2lv
bnMgbWF5IGludHJvZHVjZSBuZXcgc2xvdCBJRHMsIGJ1dCBzbG90IElEcyB3aWxsIG5ldmVyIGJl
CnJlY3ljbGVkLiBTbG90cyBtYXkgZ2V0IGRlcHJlY2F0ZWQsIGJ1dCB3aWxsIGNvbnRpbnVlIHRv
IGJlIHN1cHBvcnRlZAp0aHJvdWdob3V0IFB5dGhvbiAzLnguCgpBIHNsb3QncyB2YWx1ZSBwb2lu
dGVyIG1heSBub3QgYmUgTlVMTCwgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2UgaW4gdGhlCnNs
b3QncyBkb2N1bWVudGF0aW9uLgoKVGhlIGZvbGxvd2luZyBzbG90cyBhcmUgY3VycmVudGx5IGF2
YWlsYWJsZSwgYW5kIGRlc2NyaWJlZCBsYXRlcjoKCiogUHlfbW9kX2NyZWF0ZQoqIFB5X21vZF9l
eGVjCgpVbmtub3duIHNsb3QgSURzIHdpbGwgY2F1c2UgdGhlIGltcG9ydCB0byBmYWlsIHdpdGgg
U3lzdGVtRXJyb3IuCgpXaGVuIHVzaW5nIG11bHRpLXBoYXNlIGluaXRpYWxpemF0aW9uLCB0aGUg
Km1fbmFtZSogZmllbGQgb2YgUHlNb2R1bGVEZWYgd2lsbApub3QgYmUgdXNlZCBkdXJpbmcgaW1w
b3J0aW5nOyB0aGUgbW9kdWxlIG5hbWUgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBNb2R1bGVTcGVj
LgoKVG8gcHJldmVudCBjcmFzaGVzIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgaW4gb2xkZXIg
dmVyc2lvbnMgb2YgUHl0aG9uLAp0aGUgUHlNb2R1bGVEZWYgb2JqZWN0IG11c3QgYmUgaW5pdGlh
bGl6ZWQgdXNpbmcgdGhlIG5ld2x5IGFkZGVkClB5TW9kdWxlRGVmX0luaXQgZnVuY3Rpb24uIFRo
aXMgc2V0cyB0aGUgb2JqZWN0IHR5cGUgKHdoaWNoIGNhbm5vdCBiZSBkb25lCnN0YXRpY2FsbHkg
b24gY2VydGFpbiBjb21waWxlcnMpLCByZWZjb3VudCwgYW5kIGludGVybmFsIGJvb2trZWVwaW5n
IGRhdGEKKG1faW5kZXgpLgpGb3IgZXhhbXBsZSwgYW4gZXh0ZW5zaW9uIG1vZHVsZSAiZXhhbXBs
ZSIgd291bGQgYmUgZXhwb3J0ZWQgYXM6OgoKICAgIHN0YXRpYyBQeU1vZHVsZURlZiBleGFtcGxl
X2RlZiA9IHsuLi59CgogICAgUHlNT0RJTklUX0ZVTkMKICAgIFB5SW5pdF9leGFtcGxlKHZvaWQp
CiAgICB7CiAgICAgICAgcmV0dXJuIFB5TW9kdWxlRGVmX0luaXQoJmV4YW1wbGVfZGVmKTsKICAg
IH0KClRoZSBQeU1vZHVsZURlZiBvYmplY3QgbXVzdCBiZSBhdmFpbGFibGUgZm9yIHRoZSBsaWZl
dGltZSBvZiB0aGUgbW9kdWxlIGNyZWF0ZWQKZnJvbSBpdCDigJMgdXN1YWxseSwgaXQgd2lsbCBi
ZSBkZWNsYXJlZCBzdGF0aWNhbGx5LgoKUHNldWRvLWNvZGUgT3ZlcnZpZXcKLS0tLS0tLS0tLS0t
LS0tLS0tLS0KCkhlcmUgaXMgYW4gb3ZlcnZpZXcgb2YgaG93IHRoZSBtb2RpZmllZCBpbXBvcnRl
cnMgd2lsbCBvcGVyYXRlLgpEZXRhaWxzIHN1Y2ggYXMgbG9nZ2luZyBvciBoYW5kbGluZyBvZiBl
cnJvcnMgYW5kIGludmFsaWQgc3RhdGVzCmFyZSBsZWZ0IG91dCwgYW5kIEMgY29kZSBpcyBwcmVz
ZW50ZWQgd2l0aCBhIGNvbmNpc2UgUHl0aG9uLWxpa2Ugc3ludGF4LgoKVGhlIGZyYW1ld29yayB0
aGF0IGNhbGxzIHRoZSBpbXBvcnRlcnMgaXMgZXhwbGFpbmVkIGluIFBFUCA0NTEKWyNwZXAtMDQ1
MS1sb2FkaW5nXV8uCgo6OgoKICAgIGltcG9ydGxpYi9fYm9vdHN0cmFwLnB5OgoKICAgICAgICBj
bGFzcyBCdWlsdGluSW1wb3J0ZXI6CiAgICAgICAgICAgIGRlZiBjcmVhdGVfbW9kdWxlKHNlbGYs
IHNwZWMpOgogICAgICAgICAgICAgICAgbW9kdWxlID0gX2ltcC5jcmVhdGVfYnVpbHRpbihzcGVj
KQoKICAgICAgICAgICAgZGVmIGV4ZWNfbW9kdWxlKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgICAg
ICAgICBfaW1wLmV4ZWNfZHluYW1pYyhtb2R1bGUpCgogICAgICAgICAgICBkZWYgbG9hZF9tb2R1
bGUoc2VsZiwgbmFtZSk6CiAgICAgICAgICAgICAgICAjIHVzZSBhIGJhY2t3YXJkcyBjb21wYXRp
YmlsaXR5IHNoaW0KICAgICAgICAgICAgICAgIF9sb2FkX21vZHVsZV9zaGltKHNlbGYsIG5hbWUp
CgogICAgaW1wb3J0bGliL19ib290c3RyYXBfZXh0ZXJuYWwucHk6CgogICAgICAgIGNsYXNzIEV4
dGVuc2lvbkZpbGVMb2FkZXI6CiAgICAgICAgICAgIGRlZiBjcmVhdGVfbW9kdWxlKHNlbGYsIHNw
ZWMpOgogICAgICAgICAgICAgICAgbW9kdWxlID0gX2ltcC5jcmVhdGVfZHluYW1pYyhzcGVjKQoK
ICAgICAgICAgICAgZGVmIGV4ZWNfbW9kdWxlKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgICAgICAg
ICBfaW1wLmV4ZWNfZHluYW1pYyhtb2R1bGUpCgogICAgICAgICAgICBkZWYgbG9hZF9tb2R1bGUo
c2VsZiwgbmFtZSk6CiAgICAgICAgICAgICAgICAjIHVzZSBhIGJhY2t3YXJkcyBjb21wYXRpYmls
aXR5IHNoaW0KICAgICAgICAgICAgICAgIF9sb2FkX21vZHVsZV9zaGltKHNlbGYsIG5hbWUpCgog
ICAgUHl0aG9uL2ltcG9ydC5jICh0aGUgX2ltcCBtb2R1bGUpOgoKICAgICAgICBkZWYgY3JlYXRl
X2R5bmFtaWMoc3BlYyk6CiAgICAgICAgICAgIG5hbWUgPSBzcGVjLm5hbWUKICAgICAgICAgICAg
cGF0aCA9IHNwZWMub3JpZ2luCgogICAgICAgICAgICAjIEZpbmQgYW4gYWxyZWFkeSBsb2FkZWQg
bW9kdWxlIHRoYXQgdXNlZCBzaW5nbGUtcGhhc2UgaW5pdC4KICAgICAgICAgICAgIyBGb3IgbXVs
dGktcGhhc2UgaW5pdGlhbGl6YXRpb24sIG1vZCBpcyBOVUxMLCBzbyBhIG5ldyBtb2R1bGUKICAg
ICAgICAgICAgIyBpcyBhbHdheXMgY3JlYXRlZC4KICAgICAgICAgICAgbW9kID0gX1B5SW1wb3J0
X0ZpbmRFeHRlbnNpb25PYmplY3QobmFtZSwgbmFtZSkKICAgICAgICAgICAgaWYgbW9kOgogICAg
ICAgICAgICAgICAgcmV0dXJuIG1vZAoKICAgICAgICAgICAgcmV0dXJuIF9QeUltcG9ydF9Mb2Fk
RHluYW1pY01vZHVsZVdpdGhTcGVjKHNwZWMpCgogICAgICAgIGRlZiBleGVjX2R5bmFtaWMobW9k
dWxlKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobW9kdWxlLCB0eXBlcy5Nb2R1bGVU
eXBlKToKICAgICAgICAgICAgICAgICMgbm9uLW1vZHVsZXMgYXJlIHNraXBwZWQgLS0gUHlNb2R1
bGVfR2V0RGVmIGZhaWxzIG9uIHRoZW0KICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAg
ICAgZGVmID0gUHlNb2R1bGVfR2V0RGVmKG1vZHVsZSkKICAgICAgICAgICAgc3RhdGUgPSBQeU1v
ZHVsZV9HZXRTdGF0ZShtb2R1bGUpCiAgICAgICAgICAgIGlmIHN0YXRlIGlzIE5VTEw6CiAgICAg
ICAgICAgICAgICBQeU1vZHVsZV9FeGVjRGVmKG1vZHVsZSwgZGVmKQoKICAgICAgICBkZWYgY3Jl
YXRlX2J1aWx0aW4oc3BlYyk6CiAgICAgICAgICAgIG5hbWUgPSBzcGVjLm5hbWUKCiAgICAgICAg
ICAgICMgRmluZCBhbiBhbHJlYWR5IGxvYWRlZCBtb2R1bGUgdGhhdCB1c2VkIHNpbmdsZS1waGFz
ZSBpbml0LgogICAgICAgICAgICAjIEZvciBtdWx0aS1waGFzZSBpbml0aWFsaXphdGlvbiwgbW9k
IGlzIE5VTEwsIHNvIGEgbmV3IG1vZHVsZQogICAgICAgICAgICAjIGlzIGFsd2F5cyBjcmVhdGVk
LgogICAgICAgICAgICBtb2QgPSBfUHlJbXBvcnRfRmluZEV4dGVuc2lvbk9iamVjdChuYW1lLCBu
YW1lKQogICAgICAgICAgICBpZiBtb2Q6CiAgICAgICAgICAgICAgICByZXR1cm4gbW9kCgogICAg
ICAgICAgICBmb3IgaW5pdG5hbWUsIGluaXRmdW5jIGluIFB5SW1wb3J0X0luaXR0YWI6CiAgICAg
ICAgICAgICAgICBpZiBuYW1lID09IGluaXRuYW1lOgogICAgICAgICAgICAgICAgICAgIG0gPSBp
bml0ZnVuYygpCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShtLCBQeU1vZHVsZURl
Zik6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZiA9IG0KICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIFB5TW9kdWxlX0Zyb21EZWZBbmRTcGVjKGRlZiwgc3BlYykKICAgICAgICAgICAg
ICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjIGZhbGwgYmFjayB0byBzaW5n
bGUtcGhhc2UgaW5pdGlhbGl6YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlID0g
bQogICAgICAgICAgICAgICAgICAgICAgICBfUHlJbXBvcnRfRml4dXBFeHRlbnNpb25PYmplY3Qo
bW9kdWxlLCBuYW1lLCBuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxl
CgogICAgUHl0aG9uL2ltcG9ydGRsLmM6CgogICAgICAgIGRlZiBfUHlJbXBvcnRfTG9hZER5bmFt
aWNNb2R1bGVXaXRoU3BlYyhzcGVjKToKICAgICAgICAgICAgcGF0aCA9IHNwZWMub3JpZ2luCiAg
ICAgICAgICAgIHBhY2thZ2UsIGRvdCwgbmFtZSA9IHNwZWMubmFtZS5ycGFydGl0aW9uKCcuJykK
CiAgICAgICAgICAgICMgc2VlIHRoZSAiTm9uLUFTQ0lJIG1vZHVsZSBuYW1lcyIgc2VjdGlvbiBm
b3IgZXhwb3J0X2hvb2tfbmFtZQogICAgICAgICAgICBob29rX25hbWUgPSBleHBvcnRfaG9va19u
YW1lKG5hbWUpCgogICAgICAgICAgICAjIGNhbGwgcGxhdGZvcm0tc3BlY2lmaWMgZnVuY3Rpb24g
Zm9yIGxvYWRpbmcgZXhwb3J0ZWQgZnVuY3Rpb24KICAgICAgICAgICAgIyBmcm9tIHNoYXJlZCBs
aWJyYXJ5CiAgICAgICAgICAgIGV4cG9ydGZ1bmMgPSBfZmluZF9zaGFyZWRfZnVuY3B0cihob29r
X25hbWUsIHBhdGgpCgogICAgICAgICAgICBtID0gZXhwb3J0ZnVuYygpCiAgICAgICAgICAgIGlm
IGlzaW5zdGFuY2UobSwgUHlNb2R1bGVEZWYpOgogICAgICAgICAgICAgICAgZGVmID0gbQogICAg
ICAgICAgICAgICAgcmV0dXJuIFB5TW9kdWxlX0Zyb21EZWZBbmRTcGVjKGRlZiwgc3BlYykKCiAg
ICAgICAgICAgIG1vZHVsZSA9IG0KCiAgICAgICAgICAgICMgZmFsbCBiYWNrIHRvIHNpbmdsZS1w
aGFzZSBpbml0aWFsaXphdGlvbgogICAgICAgICAgICAuLi4uCgogICAgT2JqZWN0cy9tb2R1bGVv
YmplY3QuYzoKCiAgICAgICAgZGVmIFB5TW9kdWxlX0Zyb21EZWZBbmRTcGVjKGRlZiwgc3BlYyk6
CiAgICAgICAgICAgIG5hbWUgPSBzcGVjLm5hbWUKICAgICAgICAgICAgY3JlYXRlID0gTm9uZQog
ICAgICAgICAgICBmb3Igc2xvdCwgdmFsdWUgaW4gZGVmLm1fc2xvdHM6CiAgICAgICAgICAgICAg
ICBpZiBzbG90ID09IFB5X21vZF9jcmVhdGU6CiAgICAgICAgICAgICAgICAgICAgY3JlYXRlID0g
dmFsdWUKICAgICAgICAgICAgaWYgY3JlYXRlOgogICAgICAgICAgICAgICAgbSA9IGNyZWF0ZShz
cGVjLCBkZWYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtID0gUHlNb2R1bGVf
TmV3KG5hbWUpCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG0sIHR5cGVzLk1vZHVsZVR5cGUp
OgogICAgICAgICAgICAgICAgbS5tZF9zdGF0ZSA9IE5vbmUKICAgICAgICAgICAgICAgIG0ubWRf
ZGVmID0gZGVmCgogICAgICAgICAgICBpZiBkZWYubV9tZXRob2RzOgogICAgICAgICAgICAgICAg
UHlNb2R1bGVfQWRkRnVuY3Rpb25zKG0sIGRlZi5tX21ldGhvZHMpCiAgICAgICAgICAgIGlmIGRl
Zi5tX2RvYzoKICAgICAgICAgICAgICAgIFB5TW9kdWxlX1NldERvY1N0cmluZyhtLCBkZWYubV9k
b2MpCgogICAgICAgIGRlZiBQeU1vZHVsZV9FeGVjRGVmKG1vZHVsZSwgZGVmKToKICAgICAgICAg
ICAgaWYgaXNpbnN0YW5jZShtb2R1bGUsIHR5cGVzLm1vZHVsZV90eXBlKToKICAgICAgICAgICAg
ICAgIGlmIG1vZHVsZS5tZF9zdGF0ZSBpcyBOVUxMOgogICAgICAgICAgICAgICAgICAgICMgYWxs
b2NhdGUgYSBibG9jayBvZiB6ZXJvZWQtb3V0IG1lbW9yeQogICAgICAgICAgICAgICAgICAgIG1v
ZHVsZS5tZF9zdGF0ZSA9IF9hbGxvYyhtb2R1bGUubWRfc2l6ZSkKCiAgICAgICAgICAgIGlmIGRl
Zi5tX3Nsb3RzIGlzIE5VTEw6CiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIGZv
ciBzbG90LCB2YWx1ZSBpbiBkZWYubV9zbG90czoKICAgICAgICAgICAgICAgIGlmIHNsb3QgPT0g
UHlfbW9kX2V4ZWM6CiAgICAgICAgICAgICAgICAgICAgdmFsdWUobW9kdWxlKQoKCk1vZHVsZSBD
cmVhdGlvbiBQaGFzZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkNyZWF0aW9uIG9mIHRoZSBtb2R1
bGUgb2JqZWN0IOKAkyB0aGF0IGlzLCB0aGUgaW1wbGVtZW50YXRpb24gb2YKRXhlY3V0aW9uTG9h
ZGVyLmNyZWF0ZV9tb2R1bGUg4oCTIGlzIGdvdmVybmVkIGJ5IHRoZSBQeV9tb2RfY3JlYXRlIHNs
b3QuCgpUaGUgUHlfbW9kX2NyZWF0ZSBzbG90Ci4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KClRoZSBQ
eV9tb2RfY3JlYXRlIHNsb3QgaXMgdXNlZCB0byBzdXBwb3J0IGN1c3RvbSBtb2R1bGUgc3ViY2xh
c3Nlcy4KVGhlIHZhbHVlIHBvaW50ZXIgbXVzdCBwb2ludCB0byBhIGZ1bmN0aW9uIHdpdGggdGhl
IGZvbGxvd2luZyBzaWduYXR1cmU6OgoKICAgIFB5T2JqZWN0KiAoKlB5TW9kdWxlQ3JlYXRlRnVu
Y3Rpb24pKFB5T2JqZWN0ICpzcGVjLCBQeU1vZHVsZURlZiAqZGVmKQoKVGhlIGZ1bmN0aW9uIHJl
Y2VpdmVzIGEgTW9kdWxlU3BlYyBpbnN0YW5jZSwgYXMgZGVmaW5lZCBpbiBQRVAgNDUxLAphbmQg
dGhlIFB5TW9kdWxlRGVmIHN0cnVjdHVyZS4KSXQgc2hvdWxkIHJldHVybiBhIG5ldyBtb2R1bGUg
b2JqZWN0LCBvciBzZXQgYW4gZXJyb3IKYW5kIHJldHVybiBOVUxMLgoKVGhpcyBmdW5jdGlvbiBp
cyBub3QgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgaW1wb3J0LXJlbGF0ZWQgYXR0cmlidXRlcwpz
cGVjaWZpZWQgaW4gUEVQIDQ1MSBbI3BlcC0wNDUxLWF0dHJpYnV0ZXNdXyAoc3VjaCBhcyBgYF9f
bmFtZV9fYGAgb3IKYGBfX2xvYWRlcl9fYGApIG9uIHRoZSBuZXcgbW9kdWxlLgoKVGhlcmUgaXMg
bm8gcmVxdWlyZW1lbnQgZm9yIHRoZSByZXR1cm5lZCBvYmplY3QgdG8gYmUgYW4gaW5zdGFuY2Ug
b2YKdHlwZXMuTW9kdWxlVHlwZS4gQW55IHR5cGUgY2FuIGJlIHVzZWQsIGFzIGxvbmcgYXMgaXQg
c3VwcG9ydHMgc2V0dGluZyBhbmQKZ2V0dGluZyBhdHRyaWJ1dGVzLCBpbmNsdWRpbmcgYXQgbGVh
c3QgdGhlIGltcG9ydC1yZWxhdGVkIGF0dHJpYnV0ZXMuCkhvd2V2ZXIsIG9ubHkgTW9kdWxlVHlw
ZSBpbnN0YW5jZXMgc3VwcG9ydCBtb2R1bGUtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eQpzdWNoIGFz
IHBlci1tb2R1bGUgc3RhdGUuCgpOb3RlIHRoYXQgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxl
ZCwgdGhlIG1vZHVsZSdzIGVudHJ5IGluIHN5cy5tb2R1bGVzCmlzIG5vdCBwb3B1bGF0ZWQgeWV0
LiBBdHRlbXB0aW5nIHRvIGltcG9ydCB0aGUgc2FtZSBtb2R1bGUgYWdhaW4KKHBvc3NpYmx5IHRy
YW5zaXRpdmVseSksIG1heSBsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AuCkV4dGVuc2lvbiBhdXRo
b3JzIGFyZSBhZHZpc2VkIHRvIGtlZXAgUHlfbW9kX2NyZWF0ZSBtaW5pbWFsLCBhbiBpbiBwYXJ0
aWN1bGFyCnRvIG5vdCBjYWxsIHVzZXIgY29kZSBmcm9tIGl0LgoKTXVsdGlwbGUgUHlfbW9kX2Ny
ZWF0ZSBzbG90cyBtYXkgbm90IGJlIHNwZWNpZmllZC4gSWYgdGhleSBhcmUsIGltcG9ydAp3aWxs
IGZhaWwgd2l0aCBTeXN0ZW1FcnJvci4KCklmIFB5X21vZF9jcmVhdGUgaXMgbm90IHNwZWNpZmll
ZCwgdGhlIGltcG9ydCBtYWNoaW5lcnkgd2lsbCBjcmVhdGUgYSBub3JtYWwKbW9kdWxlIG9iamVj
dCB1c2luZyBQeU1vZHVsZV9OZXcuIFRoZSBuYW1lIGlzIHRha2VuIGZyb20gKnNwZWMqLgoKClBv
c3QtY3JlYXRpb24gc3RlcHMKLi4uLi4uLi4uLi4uLi4uLi4uLgoKSWYgdGhlIFB5X21vZF9jcmVh
dGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0eXBlcy5Nb2R1bGVUeXBlCm9yIGEg
c3ViY2xhc3MgKG9yIGlmIGEgUHlfbW9kX2NyZWF0ZSBzbG90IGlzIG5vdCBwcmVzZW50KSwgdGhl
IGltcG9ydAptYWNoaW5lcnkgd2lsbCBhc3NvY2lhdGUgdGhlIFB5TW9kdWxlRGVmIHdpdGggdGhl
IG1vZHVsZS4KVGhpcyBhbHNvIG1ha2VzIHRoZSBQeU1vZHVsZURlZiBhY2Nlc3NpYmxlIHRvIGV4
ZWN1dGlvbiBwaGFzZSwgdGhlClB5TW9kdWxlX0dldERlZiBmdW5jdGlvbiwgYW5kIGdhcmJhZ2Ug
Y29sbGVjdGlvbiByb3V0aW5lcyAodHJhdmVyc2UsCmNsZWFyLCBmcmVlKS4KCklmIHRoZSBQeV9t
b2RfY3JlYXRlIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIG1vZHVsZSBzdWJjbGFzcywgdGhl
biBtX3NpemUKbXVzdCBiZSAwLCBhbmQgbV90cmF2ZXJzZSwgbV9jbGVhciBhbmQgbV9mcmVlIG11
c3QgYWxsIGJlIE5VTEwuCk90aGVyd2lzZSwgU3lzdGVtRXJyb3IgaXMgcmFpc2VkLgoKQWRkaXRp
b25hbGx5LCBpbml0aWFsIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGluIHRoZSBQeU1vZHVsZURlZiBh
cmUgc2V0IG9uIHRoZQptb2R1bGUgb2JqZWN0LCByZWdhcmRsZXNzIG9mIGl0cyB0eXBlOgoKKiBU
aGUgZG9jc3RyaW5nIGlzIHNldCBmcm9tIG1fZG9jLCBpZiBub24tTlVMTC4KKiBUaGUgbW9kdWxl
J3MgZnVuY3Rpb25zIGFyZSBpbml0aWFsaXplZCBmcm9tIG1fbWV0aG9kcywgaWYgYW55LgoKCk1v
ZHVsZSBFeGVjdXRpb24gUGhhc2UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKTW9kdWxlIGV4ZWN1
dGlvbiAtLSB0aGF0IGlzLCB0aGUgaW1wbGVtZW50YXRpb24gb2YKRXhlY3V0aW9uTG9hZGVyLmV4
ZWNfbW9kdWxlIC0tIGlzIGdvdmVybmVkIGJ5ICJleGVjdXRpb24gc2xvdHMiLgpUaGlzIFBFUCBv
bmx5IGFkZHMgb25lLCBQeV9tb2RfZXhlYywgYnV0IG90aGVycyBtYXkgYmUgYWRkZWQgaW4gdGhl
IGZ1dHVyZS4KClRoZSBleGVjdXRpb24gcGhhc2UgaXMgZG9uZSBvbiB0aGUgUHlNb2R1bGVEZWYg
YXNzb2NpYXRlZCB3aXRoIHRoZSBtb2R1bGUKb2JqZWN0LiBGb3Igb2JqZWN0cyB0aGF0IGFyZSBu
b3QgYSBzdWJjbGFzcyBvZiBQeU1vZHVsZV9UeXBlIChmb3Igd2hpY2gKUHlNb2R1bGVfR2V0RGVm
IHdvdWxkIGZhaWwpLCB0aGUgZXhlY3V0aW9uIHBoYXNlIGlzIHNraXBwZWQuCgpFeGVjdXRpb24g
c2xvdHMgbWF5IGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgYW5kIGFyZSBwcm9jZXNzZWQg
aW4gdGhlIG9yZGVyCnRoZXkgYXBwZWFyIGluIHRoZSBzbG90cyBhcnJheS4KV2hlbiB1c2luZyB0
aGUgZGVmYXVsdCBpbXBvcnQgbWFjaGluZXJ5LCB0aGV5IGFyZSBwcm9jZXNzZWQgYWZ0ZXIKaW1w
b3J0LXJlbGF0ZWQgYXR0cmlidXRlcyBzcGVjaWZpZWQgaW4gUEVQIDQ1MSBbI3BlcC0wNDUxLWF0
dHJpYnV0ZXNdXwooc3VjaCBhcyBgYF9fbmFtZV9fYGAgb3IgYGBfX2xvYWRlcl9fYGApIGFyZSBz
ZXQgYW5kIHRoZSBtb2R1bGUgaXMgYWRkZWQKdG8gc3lzLm1vZHVsZXMuCgoKUHJlLUV4ZWN1dGlv
biBzdGVwcwotLS0tLS0tLS0tLS0tLS0tLS0tCgpCZWZvcmUgcHJvY2Vzc2luZyB0aGUgZXhlY3V0
aW9uIHNsb3RzLCBwZXItbW9kdWxlIHN0YXRlIGlzIGFsbG9jYXRlZCBmb3IgdGhlCm1vZHVsZS4g
RnJvbSB0aGlzIHBvaW50IG9uLCBwZXItbW9kdWxlIHN0YXRlIGlzIGFjY2Vzc2libGUgdGhyb3Vn
aApQeU1vZHVsZV9HZXRTdGF0ZS4KCgpUaGUgUHlfbW9kX2V4ZWMgc2xvdAouLi4uLi4uLi4uLi4u
Li4uLi4uLgoKVGhlIGVudHJ5IGluIHRoaXMgc2xvdCBtdXN0IHBvaW50IHRvIGEgZnVuY3Rpb24g
d2l0aCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZTo6CgogICAgaW50ICgqUHlNb2R1bGVFeGVjRnVu
Y3Rpb24pKFB5T2JqZWN0KiBtb2R1bGUpCgpJdCB3aWxsIGJlIGNhbGxlZCB0byBpbml0aWFsaXpl
IGEgbW9kdWxlLiBVc3VhbGx5LCB0aGlzIGFtb3VudHMgdG8Kc2V0dGluZyB0aGUgbW9kdWxlJ3Mg
aW5pdGlhbCBhdHRyaWJ1dGVzLgpUaGUgIm1vZHVsZSIgYXJndW1lbnQgcmVjZWl2ZXMgdGhlIG1v
ZHVsZSBvYmplY3QgdG8gaW5pdGlhbGl6ZS4KCklmIFB5TW9kdWxlRXhlYyByZXBsYWNlcyB0aGUg
bW9kdWxlJ3MgZW50cnkgaW4gc3lzLm1vZHVsZXMsCnRoZSBuZXcgb2JqZWN0IHdpbGwgYmUgdXNl
ZCBhbmQgcmV0dXJuZWQgYnkgaW1wb3J0bGliIG1hY2hpbmVyeS4KKFRoaXMgbWlycm9ycyB0aGUg
YmVoYXZpb3Igb2YgUHl0aG9uIG1vZHVsZXMuIE5vdGUgdGhhdCBpbXBsZW1lbnRpbmcKUHlfbW9k
X2NyZWF0ZSBpcyB1c3VhbGx5IGEgYmV0dGVyIHNvbHV0aW9uIGZvciB0aGUgdXNlIGNhc2VzIHRo
aXMgc2VydmVzLikKClRoZSBmdW5jdGlvbiBtdXN0IHJldHVybiBgYDBgYCBvbiBzdWNjZXNzLCBv
ciwgb24gZXJyb3IsIHNldCBhbiBleGNlcHRpb24gYW5kCnJldHVybiBgYC0xYGAuCgoKTGVnYWN5
IEluaXQKLS0tLS0tLS0tLS0KClRoZSBiYWNrd2FyZHMtY29tcGF0aWJsZSBzaW5nbGUtcGhhc2Ug
aW5pdGlhbGl6YXRpb24gY29udGludWVzIHRvIGJlIHN1cHBvcnRlZC4KSW4gdGhpcyBzY2hlbWUs
IHRoZSBQeUluaXQgZnVuY3Rpb24gcmV0dXJucyBhIGZ1bGx5IGluaXRpYWxpemVkIG1vZHVsZSBy
YXRoZXIKdGhhbiBhIFB5TW9kdWxlRGVmIG9iamVjdC4KSW4gdGhpcyBjYXNlLCB0aGUgUHlJbml0
IGhvb2sgaW1wbGVtZW50cyB0aGUgY3JlYXRpb24gcGhhc2UsIGFuZCB0aGUgZXhlY3V0aW9uCnBo
YXNlIGlzIGEgbm8tb3AuCgpNb2R1bGVzIHRoYXQgbmVlZCB0byB3b3JrIHVuY2hhbmdlZCBvbiBv
bGRlciB2ZXJzaW9ucyBvZiBQeXRob24gc2hvdWxkIHN0aWNrIHRvCnNpbmdsZS1waGFzZSBpbml0
aWFsaXphdGlvbiwgYmVjYXVzZSB0aGUgYmVuZWZpdHMgaXQgYnJpbmdzIGNhbid0IGJlCmJhY2st
cG9ydGVkLgpIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBtb2R1bGUgdGhhdCBzdXBwb3J0cyBtdWx0
aS1waGFzZSBpbml0aWFsaXphdGlvbiwKYW5kIGZhbGxzIGJhY2sgdG8gc2luZ2xlLXBoYXNlIHdo
ZW4gY29tcGlsZWQgZm9yIGFuIG9sZGVyIHZlcnNpb24gb2YgQ1B5dGhvbi4KSXQgaXMgaW5jbHVk
ZWQgbWFpbmx5IGFzIGFuIGlsbHVzdHJhdGlvbiBvZiB0aGUgY2hhbmdlcyBuZWVkZWQgdG8gZW5h
YmxlCm11bHRpLXBoYXNlIGluaXQ6OgoKICAgICNpbmNsdWRlIDxQeXRob24uaD4KCiAgICBzdGF0
aWMgaW50IHNwYW1fZXhlYyhQeU9iamVjdCAqbW9kdWxlKSB7CiAgICAgICAgUHlNb2R1bGVfQWRk
U3RyaW5nQ29uc3RhbnQobW9kdWxlLCAiZm9vZCIsICJzcGFtIik7CiAgICAgICAgcmV0dXJuIDA7
CiAgICB9CgogICAgI2lmZGVmIFB5X21vZF9leGVjCiAgICBzdGF0aWMgUHlNb2R1bGVEZWZfU2xv
dCBzcGFtX3Nsb3RzW10gPSB7CiAgICAgICAge1B5X21vZF9leGVjLCBzcGFtX2V4ZWN9LAogICAg
ICAgIHswLCBOVUxMfQogICAgfTsKICAgICNlbmRpZgoKICAgIHN0YXRpYyBQeU1vZHVsZURlZiBz
cGFtX2RlZiA9IHsKICAgICAgICBQeU1vZHVsZURlZl9IRUFEX0lOSVQsICAgICAgICAgICAgICAg
ICAgICAgIC8qIG1fYmFzZSAqLwogICAgICAgICJzcGFtIiwgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLyogbV9uYW1lICovCiAgICAgICAgUHlEb2NfU1RSKCJVdGlsaXRpZXMg
Zm9yIGNvb2tpbmcgc3BhbSIpLCAgICAvKiBtX2RvYyAqLwogICAgICAgIDAsICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbV9zaXplICovCiAgICAgICAgTlVMTCwg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtX21ldGhvZHMgKi8KICAg
ICNpZmRlZiBQeV9tb2RfZXhlYwogICAgICAgIHNwYW1fc2xvdHMsICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLyogbV9zbG90cyAqLwogICAgI2Vsc2UKICAgICAgICBOVUxMLAogICAg
I2VuZGlmCiAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvKiBtX3RyYXZlcnNlICovCiAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAvKiBtX2NsZWFyICovCiAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvKiBtX2ZyZWUgKi8KICAgIH07CgogICAgUHlNT0RJTklU
X0ZVTkMKICAgIFB5SW5pdF9zcGFtKHZvaWQpIHsKICAgICNpZmRlZiBQeV9tb2RfZXhlYwogICAg
ICAgIHJldHVybiBQeU1vZHVsZURlZl9Jbml0KCZzcGFtX2RlZik7CiAgICAjZWxzZQogICAgICAg
IFB5T2JqZWN0ICptb2R1bGU7CiAgICAgICAgbW9kdWxlID0gUHlNb2R1bGVfQ3JlYXRlKCZzcGFt
X2RlZik7CiAgICAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKICAgICAgICBp
ZiAoc3BhbV9leGVjKG1vZHVsZSkgIT0gMCkgewogICAgICAgICAgICBQeV9ERUNSRUYobW9kdWxl
KTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtb2R1
bGU7CiAgICAjZW5kaWYKICAgIH0KCgpCdWlsdC1JbiBtb2R1bGVzCi0tLS0tLS0tLS0tLS0tLS0K
CkFueSBleHRlbnNpb24gbW9kdWxlIGNhbiBiZSB1c2VkIGFzIGEgYnVpbHQtaW4gbW9kdWxlIGJ5
IGxpbmtpbmcgaXQgaW50bwp0aGUgZXhlY3V0YWJsZSwgYW5kIGluY2x1ZGluZyBpdCBpbiB0aGUg
aW5pdHRhYiAoZWl0aGVyIGF0IHJ1bnRpbWUgd2l0aApQeUltcG9ydF9BcHBlbmRJbml0dGFiLCBv
ciBhdCBjb25maWd1cmF0aW9uIHRpbWUsIHVzaW5nIHRvb2xzIGxpa2UgKmZyZWV6ZSopLgoKVG8g
a2VlcCB0aGlzIHBvc3NpYmlsaXR5LCBhbGwgY2hhbmdlcyB0byBleHRlbnNpb24gbW9kdWxlIGxv
YWRpbmcgaW50cm9kdWNlZAppbiB0aGlzIFBFUCB3aWxsIGFsc28gYXBwbHkgdG8gYnVpbHQtaW4g
bW9kdWxlcy4KVGhlIG9ubHkgZXhjZXB0aW9uIGlzIG5vbi1BU0NJSSBtb2R1bGUgbmFtZXMsIGV4
cGxhaW5lZCBiZWxvdy4KCgpTdWJpbnRlcnByZXRlcnMgYW5kIEludGVycHJldGVyIFJlbG9hZGlu
ZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRXh0ZW5zaW9ucyB1
c2luZyB0aGUgbmV3IGluaXRpYWxpemF0aW9uIHNjaGVtZSBhcmUgZXhwZWN0ZWQgdG8gc3VwcG9y
dApzdWJpbnRlcnByZXRlcnMgYW5kIG11bHRpcGxlIFB5X0luaXRpYWxpemUvUHlfRmluYWxpemUg
Y3ljbGVzIGNvcnJlY3RseSwKYXZvaWRpbmcgdGhlIGlzc3VlcyBtZW50aW9uZWQgaW4gUHl0aG9u
IGRvY3VtZW50YXRpb24gWyNzdWJpbnRlcnByZXRlci1kb2NzXV8uClRoZSBtZWNoYW5pc20gaXMg
ZGVzaWduZWQgdG8gbWFrZSB0aGlzIGVhc3ksIGJ1dCBjYXJlIGlzIHN0aWxsIHJlcXVpcmVkCm9u
IHRoZSBwYXJ0IG9mIHRoZSBleHRlbnNpb24gYXV0aG9yLgpObyB1c2VyLWRlZmluZWQgZnVuY3Rp
b25zLCBtZXRob2RzLCBvciBpbnN0YW5jZXMgbWF5IGxlYWsgdG8gZGlmZmVyZW50CmludGVycHJl
dGVycy4KVG8gYWNoaWV2ZSB0aGlzLCBhbGwgbW9kdWxlLWxldmVsIHN0YXRlIHNob3VsZCBiZSBr
ZXB0IGluIGVpdGhlciB0aGUgbW9kdWxlCmRpY3QsIG9yIGluIHRoZSBtb2R1bGUgb2JqZWN0J3Mg
c3RvcmFnZSByZWFjaGFibGUgYnkgUHlNb2R1bGVfR2V0U3RhdGUuCkEgc2ltcGxlIHJ1bGUgb2Yg
dGh1bWIgaXM6IERvIG5vdCBkZWZpbmUgYW55IHN0YXRpYyBkYXRhLCBleGNlcHQgYnVpbHQtaW4g
dHlwZXMKd2l0aCBubyBtdXRhYmxlIG9yIHVzZXItc2V0dGFibGUgY2xhc3MgYXR0cmlidXRlcy4K
CgpGdW5jdGlvbnMgaW5jb21wYXRpYmxlIHdpdGggbXVsdGktcGhhc2UgaW5pdGlhbGl6YXRpb24K
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpU
aGUgUHlNb2R1bGVfQ3JlYXRlIGZ1bmN0aW9uIHdpbGwgZmFpbCB3aGVuIHVzZWQgb24gYSBQeU1v
ZHVsZURlZiBzdHJ1Y3R1cmUKd2l0aCBhIG5vbi1OVUxMICptX3Nsb3RzKiBwb2ludGVyLgpUaGUg
ZnVuY3Rpb24gZG9lc24ndCBoYXZlIGFjY2VzcyB0byB0aGUgTW9kdWxlU3BlYyBvYmplY3QgbmVj
ZXNzYXJ5IGZvcgptdWx0aS1waGFzZSBpbml0aWFsaXphdGlvbi4KClRoZSBQeVN0YXRlX0ZpbmRN
b2R1bGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gTlVMTCwgYW5kIFB5U3RhdGVfQWRkTW9kdWxlCmFu
ZCBQeVN0YXRlX1JlbW92ZU1vZHVsZSB3aWxsIGFsc28gZmFpbCBvbiBtb2R1bGVzIHdpdGggbm9u
LU5VTEwgKm1fc2xvdHMqLgpQeVN0YXRlIHJlZ2lzdHJhdGlvbiBpcyBkaXNhYmxlZCBiZWNhdXNl
IG11bHRpcGxlIG1vZHVsZSBvYmplY3RzIG1heSBiZSBjcmVhdGVkCmZyb20gdGhlIHNhbWUgUHlN
b2R1bGVEZWYuCgoKTW9kdWxlIHN0YXRlIGFuZCBDLWxldmVsIGNhbGxiYWNrcwotLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpEdWUgdG8gdGhlIHVuYXZhaWxhYmlsaXR5IG9mIFB5
U3RhdGVfRmluZE1vZHVsZSwgYW55IGZ1bmN0aW9uIHRoYXQgbmVlZHMgYWNjZXNzCnRvIG1vZHVs
ZS1sZXZlbCBzdGF0ZSAoaW5jbHVkaW5nIGZ1bmN0aW9ucywgY2xhc3NlcyBvciBleGNlcHRpb25z
IGRlZmluZWQgYXQKdGhlIG1vZHVsZSBsZXZlbCkgbXVzdCByZWNlaXZlIGEgcmVmZXJlbmNlIHRv
IHRoZSBtb2R1bGUgb2JqZWN0IChvciB0aGUKcGFydGljdWxhciBvYmplY3QgaXQgbmVlZHMpLCBl
aXRoZXIgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KVGhpcyBpcyBjdXJyZW50bHkgZGlmZmljdWx0
IGluIHR3byBzaXR1YXRpb25zOgoKKiBNZXRob2RzIG9mIGNsYXNzZXMsIHdoaWNoIHJlY2VpdmUg
YSByZWZlcmVuY2UgdG8gdGhlIGNsYXNzLCBidXQgbm90IHRvCiAgdGhlIGNsYXNzJ3MgbW9kdWxl
CiogTGlicmFyaWVzIHdpdGggQy1sZXZlbCBjYWxsYmFja3MsIHVubGVzcyB0aGUgY2FsbGJhY2tz
IGNhbiByZWNlaXZlIGN1c3RvbQogIGRhdGEgc2V0IGF0IGNhbGxiYWNrIHJlZ2lzdHJhdGlvbgoK
Rml4aW5nIHRoZXNlIGNhc2VzIGlzIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mIHRoaXMgUEVQLCBi
dXQgd2lsbCBiZSBuZWVkZWQgZm9yCnRoZSBuZXcgbWVjaGFuaXNtIHRvIGJlIHVzZWZ1bCB0byBh
bGwgbW9kdWxlcy4gUHJvcGVyIGZpeGVzIGhhdmUgYmVlbiBkaXNjdXNzZWQKb24gdGhlIGltcG9y
dC1zaWcgbWFpbGluZyBsaXN0IFsjZmluZG1vZHVsZS1kaXNjdXNzaW9uXV8uCgpBcyBhIHJ1bGUg
b2YgdGh1bWIsIG1vZHVsZXMgdGhhdCByZWx5IG9uIFB5U3RhdGVfRmluZE1vZHVsZSBhcmUsIGF0
IHRoZSBtb21lbnQsCm5vdCBnb29kIGNhbmRpZGF0ZXMgZm9yIHBvcnRpbmcgdG8gdGhlIG5ldyBt
ZWNoYW5pc20uCgoKTmV3IEZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tCgpBIG5ldyBmdW5jdGlvbiBh
bmQgbWFjcm8gaW1wbGVtZW50aW5nIHRoZSBtb2R1bGUgY3JlYXRpb24gcGhhc2Ugd2lsbCBiZSBh
ZGRlZC4KVGhlc2UgYXJlIHNpbWlsYXIgdG8gUHlNb2R1bGVfQ3JlYXRlIGFuZCBQeU1vZHVsZV9D
cmVhdGUyLCBleGNlcHQgdGhleQp0YWtlIGFuIGFkZGl0aW9uYWwgTW9kdWxlU3BlYyBhcmd1bWVu
dCwgYW5kIGhhbmRsZSBtb2R1bGUgZGVmaW5pdGlvbnMgd2l0aApub24tTlVMTCBzbG90czo6Cgog
ICAgUHlPYmplY3QgKiBQeU1vZHVsZV9Gcm9tRGVmQW5kU3BlYyhQeU1vZHVsZURlZiAqZGVmLCBQ
eU9iamVjdCAqc3BlYykKICAgIFB5T2JqZWN0ICogUHlNb2R1bGVfRnJvbURlZkFuZFNwZWMyKFB5
TW9kdWxlRGVmICpkZWYsIFB5T2JqZWN0ICpzcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaW50IG1vZHVsZV9hcGlfdmVyc2lvbikKCkEgbmV3IGZ1bmN0aW9uIGlt
cGxlbWVudGluZyB0aGUgbW9kdWxlIGV4ZWN1dGlvbiBwaGFzZSB3aWxsIGJlIGFkZGVkLgpUaGlz
IGFsbG9jYXRlcyBwZXItbW9kdWxlIHN0YXRlIChpZiBub3QgYWxsb2NhdGVkIGFscmVhZHkpLCBh
bmQgKmFsd2F5cyoKcHJvY2Vzc2VzIGV4ZWN1dGlvbiBzbG90cy4gVGhlIGltcG9ydCBtYWNoaW5l
cnkgY2FsbHMgdGhpcyBtZXRob2Qgd2hlbgphIG1vZHVsZSBpcyBleGVjdXRlZCwgdW5sZXNzIHRo
ZSBtb2R1bGUgaXMgYmVpbmcgcmVsb2FkZWQ6OgoKICAgIFB5QVBJX0ZVTkMoaW50KSBQeU1vZHVs
ZV9FeGVjRGVmKFB5T2JqZWN0ICptb2R1bGUsIFB5TW9kdWxlRGVmICpkZWYpCgpBbm90aGVyIGZ1
bmN0aW9uIHdpbGwgYmUgaW50cm9kdWNlZCB0byBpbml0aWFsaXplIGEgUHlNb2R1bGVEZWYgb2Jq
ZWN0LgpUaGlzIGlkZW1wb3RlbnQgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIHR5cGUsIHJlZmNvdW50
LCBhbmQgbW9kdWxlIGluZGV4LgpJdCByZXR1cm5zIGl0cyBhcmd1bWVudCBjYXN0IHRvIFB5T2Jq
ZWN0Kiwgc28gaXQgY2FuIGJlIHJldHVybmVkIGRpcmVjdGx5CmZyb20gYSBQeUluaXQgZnVuY3Rp
b246OgoKICAgIFB5T2JqZWN0ICogUHlNb2R1bGVEZWZfSW5pdChQeU1vZHVsZURlZiAqKTsKCkFk
ZGl0aW9uYWxseSwgdHdvIGhlbHBlcnMgd2lsbCBiZSBhZGRlZCBmb3Igc2V0dGluZyB0aGUgZG9j
c3RyaW5nIGFuZAptZXRob2RzIG9uIGEgbW9kdWxlOjoKCiAgICBpbnQgUHlNb2R1bGVfU2V0RG9j
U3RyaW5nKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKikKICAgIGludCBQeU1vZHVsZV9BZGRGdW5j
dGlvbnMoUHlPYmplY3QgKiwgUHlNZXRob2REZWYgKikKCgpFeHBvcnQgSG9vayBOYW1lCi0tLS0t
LS0tLS0tLS0tLS0KCkFzIHBvcnRhYmxlIEMgaWRlbnRpZmllcnMgYXJlIGxpbWl0ZWQgdG8gQVND
SUksIG1vZHVsZSBuYW1lcwptdXN0IGJlIGVuY29kZWQgdG8gZm9ybSB0aGUgUHlJbml0IGhvb2sg
bmFtZS4KCkZvciBBU0NJSSBtb2R1bGUgbmFtZXMsIHRoZSBpbXBvcnQgaG9vayBpcyBuYW1lZApQ
eUluaXRfPG1vZHVsZW5hbWU+LCB3aGVyZSA8bW9kdWxlbmFtZT4gaXMgdGhlIG5hbWUgb2YgdGhl
IG1vZHVsZS4KCkZvciBtb2R1bGUgbmFtZXMgY29udGFpbmluZyBub24tQVNDSUkgY2hhcmFjdGVy
cywgdGhlIGltcG9ydCBob29rIGlzIG5hbWVkClB5SW5pdFVfPGVuY29kZWRuYW1lPiwgd2hlcmUg
dGhlIG5hbWUgaXMgZW5jb2RlZCB1c2luZyBDUHl0aG9uJ3MKInB1bnljb2RlIiBlbmNvZGluZyAo
UHVueWNvZGUgWyNyZmMtMzQ5Ml1fIHdpdGggYSBsb3dlcmNhc2Ugc3VmZml4KSwKd2l0aCBoeXBo
ZW5zICgiLSIpIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmVzICgiXyIpLgoKCkluIFB5dGhvbjo6Cgog
ICAgZGVmIGV4cG9ydF9ob29rX25hbWUobmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBz
dWZmaXggPSBiJ18nICsgbmFtZS5lbmNvZGUoJ2FzY2lpJykKICAgICAgICBleGNlcHQgVW5pY29k
ZUVuY29kZUVycm9yOgogICAgICAgICAgICBzdWZmaXggPSBiJ1VfJyArIG5hbWUuZW5jb2RlKCdw
dW55Y29kZScpLnJlcGxhY2UoYictJywgYidfJykKICAgICAgICByZXR1cm4gYidQeUluaXQnICsg
c3VmZml4CgpFeGFtcGxlczoKCj09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT0KTW9k
dWxlIG5hbWUgICAgSW5pdCBob29rIG5hbWUKPT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09
PT09PQpzcGFtICAgICAgICAgICBQeUluaXRfc3BhbQpsYW7EjW3DrXQgICAgICAgIFB5SW5pdFVf
bGFubXRfMnNhNnQK44K544OR44OgICAgICAgICAgIFB5SW5pdFVfemNrNWIyYgo9PT09PT09PT09
PT09ICA9PT09PT09PT09PT09PT09PT09CgpGb3IgbW9kdWxlcyB3aXRoIG5vbi1BU0NJSSBuYW1l
cywgc2luZ2xlLXBoYXNlIGluaXRpYWxpemF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCgpJbiB0aGUg
aW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIFBFUCwgYnVpbHQtaW4gbW9kdWxlcyB3aXRo
IG5vbi1BU0NJSQpuYW1lcyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQuCgoKTW9kdWxlIFJlbG9hZGlu
ZwotLS0tLS0tLS0tLS0tLS0tCgpSZWxvYWRpbmcgYW4gZXh0ZW5zaW9uIG1vZHVsZSB1c2luZyBp
bXBvcnRsaWIucmVsb2FkKCkgd2lsbCBjb250aW51ZSB0bwpoYXZlIG5vIGVmZmVjdCwgZXhjZXB0
IHJlLXNldHRpbmcgaW1wb3J0LXJlbGF0ZWQgYXR0cmlidXRlcy4KCkR1ZSB0byBsaW1pdGF0aW9u
cyBpbiBzaGFyZWQgbGlicmFyeSBsb2FkaW5nIChib3RoIGRsb3BlbiBvbiBQT1NJWCBhbmQKTG9h
ZE1vZHVsZUV4IG9uIFdpbmRvd3MpLCBpdCBpcyBub3QgZ2VuZXJhbGx5IHBvc3NpYmxlIHRvIGxv
YWQKYSBtb2RpZmllZCBsaWJyYXJ5IGFmdGVyIGl0IGhhcyBjaGFuZ2VkIG9uIGRpc2suCgpVc2Ug
Y2FzZXMgZm9yIHJlbG9hZGluZyBvdGhlciB0aGFuIHRyeWluZyBvdXQgYSBuZXcgdmVyc2lvbiBv
ZiB0aGUgbW9kdWxlCmFyZSB0b28gcmFyZSB0byByZXF1aXJlIGFsbCBtb2R1bGUgYXV0aG9ycyB0
byBrZWVwIHJlbG9hZGluZyBpbiBtaW5kLgpJZiByZWxvYWQtbGlrZSBmdW5jdGlvbmFsaXR5IGlz
IG5lZWRlZCwgYXV0aG9ycyBjYW4gZXhwb3J0IGEgZGVkaWNhdGVkCmZ1bmN0aW9uIGZvciBpdC4K
CgpNdWx0aXBsZSBtb2R1bGVzIGluIG9uZSBsaWJyYXJ5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KClRvIHN1cHBvcnQgbXVsdGlwbGUgUHl0aG9uIG1vZHVsZXMgaW4gb25lIHNoYXJl
ZCBsaWJyYXJ5LCB0aGUgbGlicmFyeSBjYW4KZXhwb3J0IGFkZGl0aW9uYWwgUHlJbml0KiBzeW1i
b2xzIGJlc2lkZXMgdGhlIG9uZSB0aGF0IGNvcnJlc3BvbmRzCnRvIHRoZSBsaWJyYXJ5J3MgZmls
ZW5hbWUuCgpOb3RlIHRoYXQgdGhpcyBtZWNoYW5pc20gY2FuIGN1cnJlbnRseSBvbmx5IGJlIHVz
ZWQgdG8gKmxvYWQqIGV4dHJhIG1vZHVsZXMsCmJ1dCBub3QgdG8gKmZpbmQqIHRoZW0uIChUaGlz
IGlzIGEgbGltaXRhdGlvbiBvZiB0aGUgbG9hZGVyIG1lY2hhbmlzbSwKd2hpY2ggdGhpcyBQRVAg
ZG9lcyBub3QgdHJ5IHRvIG1vZGlmeS4pClRvIHdvcmsgYXJvdW5kIHRoZSBsYWNrIG9mIGEgc3Vp
dGFibGUgZmluZGVyLCBjb2RlIGxpa2UgdGhlIGZvbGxvd2luZwpjYW4gYmUgdXNlZDo6CgogICAg
aW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkKICAgIGltcG9ydCBpbXBvcnRsaWIudXRpbAogICAg
bG9hZGVyID0gaW1wb3J0bGliLm1hY2hpbmVyeS5FeHRlbnNpb25GaWxlTG9hZGVyKG5hbWUsIHBh
dGgpCiAgICBzcGVjID0gaW1wb3J0bGliLnV0aWwuc3BlY19mcm9tX2xvYWRlcihuYW1lLCBsb2Fk
ZXIpCiAgICBtb2R1bGUgPSBpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjKHNwZWMpCiAg
ICBsb2FkZXIuZXhlY19tb2R1bGUobW9kdWxlKQogICAgcmV0dXJuIG1vZHVsZQoKT24gcGxhdGZv
cm1zIHRoYXQgc3VwcG9ydCBzeW1ib2xpYyBsaW5rcywgdGhlc2UgbWF5IGJlIHVzZWQgdG8gaW5z
dGFsbCBvbmUKbGlicmFyeSB1bmRlciBtdWx0aXBsZSBuYW1lcywgZXhwb3NpbmcgYWxsIGV4cG9y
dGVkIG1vZHVsZXMgdG8gbm9ybWFsCmltcG9ydCBtYWNoaW5lcnkuCgoKVGVzdGluZyBhbmQgaW5p
dGlhbCBpbXBsZW1lbnRhdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
CkZvciB0ZXN0aW5nLCBhIG5ldyBidWlsdC1pbiBtb2R1bGUgYGBfdGVzdG11bHRpcGhhc2VgYCB3
aWxsIGJlIGNyZWF0ZWQuClRoZSBsaWJyYXJ5IHdpbGwgZXhwb3J0IHNldmVyYWwgYWRkaXRpb25h
bCBtb2R1bGVzIHVzaW5nIHRoZSBtZWNoYW5pc20KZGVzY3JpYmVkIGluICJNdWx0aXBsZSBtb2R1
bGVzIGluIG9uZSBsaWJyYXJ5Ii4KClRoZSBgYF90ZXN0Y2FwaWBgIG1vZHVsZSB3aWxsIGJlIHVu
Y2hhbmdlZCwgYW5kIHdpbGwgdXNlIHNpbmdsZS1waGFzZQppbml0aWFsaXphdGlvbiBpbmRlZmlu
aXRlbHkgKG9yIHVudGlsIGl0IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQpLgoKVGhlIGBgYXJyYXlg
YCBhbmQgYGB4eCpgYCBtb2R1bGVzIHdpbGwgYmUgY29udmVydGVkIHRvIHVzZSBtdWx0aS1waGFz
ZQppbml0aWFsaXphdGlvbiBhcyBwYXJ0IG9mIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgoK
ClN1bW1hcnkgb2YgQVBJIENoYW5nZXMgYW5kIEFkZGl0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KCk5ldyBmdW5jdGlvbnM6CgoqIFB5TW9kdWxlX0Zyb21EZWZBbmRT
cGVjIChtYWNybykKKiBQeU1vZHVsZV9Gcm9tRGVmQW5kU3BlYzIKKiBQeU1vZHVsZV9FeGVjRGVm
CiogUHlNb2R1bGVfU2V0RG9jU3RyaW5nCiogUHlNb2R1bGVfQWRkRnVuY3Rpb25zCiogUHlNb2R1
bGVEZWZfSW5pdAoKTmV3IG1hY3JvczoKCiogUHlfbW9kX2NyZWF0ZQoqIFB5X21vZF9leGVjCgpO
ZXcgdHlwZXM6CgoqIFB5TW9kdWxlRGVmX1R5cGUgd2lsbCBiZSBleHBvc2VkCgpOZXcgc3RydWN0
dXJlczoKCiogUHlNb2R1bGVEZWZfU2xvdAoKUHlNb2R1bGVEZWYubV9yZWxvYWQgY2hhbmdlcyB0
byBQeU1vZHVsZURlZi5tX3Nsb3RzLgoKVGhlIGludGVybmFsIGBgX2ltcGBgIG1vZHVsZSB3aWxs
IGhhdmUgYmFja3dhcmRzIGluY29tcGF0aWJsZSBjaGFuZ2VzOgpgYGNyZWF0ZV9idWlsdGluYGAs
IGBgY3JlYXRlX2R5bmFtaWNgYCwgYW5kIGBgZXhlY19keW5hbWljYGAgd2lsbCBiZSBhZGRlZDsK
YGBpbml0X2J1aWx0aW5gYCwgYGBsb2FkX2R5bmFtaWNgYCB3aWxsIGJlIHJlbW92ZWQuCgpUaGUg
dW5kb2N1bWVudGVkIGZ1bmN0aW9ucyBgYGltcC5sb2FkX2R5bmFtaWNgYCBhbmQgYGBpbXAuaW5p
dF9idWlsdGluYGAgd2lsbApiZSByZXBsYWNlZCBieSBiYWNrd2FyZHMtY29tcGF0aWJsZSBzaGlt
cy4KCgpQb3NzaWJsZSBGdXR1cmUgRXh0ZW5zaW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09
PQoKVGhlIHNsb3RzIG1lY2hhbmlzbSwgaW5zcGlyZWQgYnkgUHlUeXBlX1Nsb3QgZnJvbSBQRVAg
Mzg0LAphbGxvd3MgbGF0ZXIgZXh0ZW5zaW9ucy4KClNvbWUgZXh0ZW5zaW9uIG1vZHVsZXMgZXhw
b3J0cyBtYW55IGNvbnN0YW50czsgZm9yIGV4YW1wbGUgX3NzbCBoYXMKYSBsb25nIGxpc3Qgb2Yg
Y2FsbHMgaW4gdGhlIGZvcm06OgoKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTU0xf
RVJST1JfWkVST19SRVRVUk4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUFlfU1NMX0VS
Uk9SX1pFUk9fUkVUVVJOKTsKCkNvbnZlcnRpbmcgdGhpcyB0byBhIGRlY2xhcmF0aXZlIGxpc3Qs
IHNpbWlsYXIgdG8gUHlNZXRob2REZWYsCndvdWxkIHJlZHVjZSBib2lsZXJwbGF0ZSwgYW5kIHBy
b3ZpZGUgZnJlZSBlcnJvci1jaGVja2luZyB3aGljaAppcyBvZnRlbiBtaXNzaW5nLgoKU3RyaW5n
IGNvbnN0YW50cyBhbmQgdHlwZXMgY2FuIGJlIGhhbmRsZWQgc2ltaWxhcmx5LgooTm90ZSB0aGF0
IG5vbi1kZWZhdWx0IGJhc2VzIGZvciB0eXBlcyBjYW5ub3QgYmUgcG9ydGFibHkgc3BlY2lmaWVk
CnN0YXRpY2FsbHk7IHRoaXMgY2FzZSB3b3VsZCBuZWVkIGEgUHlfbW9kX2V4ZWMgZnVuY3Rpb24g
dGhhdCBydW5zCmJlZm9yZSB0aGUgc2xvdHMgYXJlIGFkZGVkLiBUaGUgZnJlZSBlcnJvci1jaGVj
a2luZyB3b3VsZCBzdGlsbCBiZQpiZW5lZmljaWFsLCB0aG91Z2guKQoKQW5vdGhlciBwb3NzaWJp
bGl0eSBpcyBwcm92aWRpbmcgYSAibWFpbiIgZnVuY3Rpb24gdGhhdCB3b3VsZCBiZSBydW4Kd2hl
biB0aGUgbW9kdWxlIGlzIGdpdmVuIHRvIFB5dGhvbidzIC1tIHN3aXRjaC4KRm9yIHRoaXMgdG8g
d29yaywgdGhlIHJ1bnB5IG1vZHVsZSB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQgdG8gdGFrZQph
ZHZhbnRhZ2Ugb2YgTW9kdWxlU3BlYy1iYXNlZCBsb2FkaW5nIGludHJvZHVjZWQgaW4gUEVQIDQ1
MS4KQWxzbywgaXQgd2lsbCBiZSBuZWNlc3NhcnkgdG8gYWRkIGEgbWVjaGFuaXNtIGZvciBzZXR0
aW5nIHVwIGEgbW9kdWxlCmFjY29yZGluZyB0byBzbG90cyBpdCB3YXNuJ3Qgb3JpZ2luYWxseSBk
ZWZpbmVkIHdpdGguCgoKSW1wbGVtZW50YXRpb24KPT09PT09PT09PT09PT0KCldvcmstaW4tcHJv
Z3Jlc3MgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluIGEgR2l0aHViIHJlcG9zaXRvcnkg
WyNnaC1yZXBvXV87CmEgcGF0Y2hzZXQgaXMgYXQgWyNnaC1wYXRjaF1fLgoKClByZXZpb3VzIEFw
cHJvYWNoZXMKPT09PT09PT09PT09PT09PT09PQoKU3RlZmFuIEJlaG5lbCdzIGluaXRpYWwgcHJv
dG8tUEVQIFsjc3RlZmFuc19wcm90b3BlcF1fCmhhZCBhICJQeUluaXRfbW9kdWxlbmFtZSIgaG9v
ayB0aGF0IHdvdWxkIGNyZWF0ZSBhIG1vZHVsZSBjbGFzcywKd2hvc2UgYGBfX2luaXRfX2BgIHdv
dWxkIGJlIHRoZW4gY2FsbGVkIHRvIGNyZWF0ZSB0aGUgbW9kdWxlLgpUaGlzIHByb3Bvc2FsIGRp
ZCBub3QgY29ycmVzcG9uZCB0byB0aGUgKHRoZW4gbm9uZXhpc3RlbnQpIFBFUCA0NTEsCndoZXJl
IG1vZHVsZSBjcmVhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gaXMgYnJva2VuIGludG8gZGlzdGlu
Y3Qgc3RlcHMuCkl0IGFsc28gZGlkIG5vdCBzdXBwb3J0IGxvYWRpbmcgYW4gZXh0ZW5zaW9uIGlu
dG8gcHJlLWV4aXN0aW5nIG1vZHVsZSBvYmplY3RzLgoKTmljayBDb2dobGFuIHByb3Bvc2VkICJD
cmVhdGUiIGFuZCAiRXhlYyIgaG9va3MsIGFuZCB3cm90ZSBhIHByb3RvdHlwZQppbXBsZW1lbnRh
dGlvbiBbI25pY2tzLXByb3RvdHlwZV1fLgpBdCB0aGlzIHRpbWUgUEVQIDQ1MSB3YXMgc3RpbGwg
bm90IGltcGxlbWVudGVkLCBzbyB0aGUgcHJvdG90eXBlCmRvZXMgbm90IHVzZSBNb2R1bGVTcGVj
LgoKVGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBQRVAgdXNlZCBDcmVhdGUgYW5kIEV4ZWMg
aG9va3MsIGFuZCBhbGxvd2VkCmxvYWRpbmcgaW50byBhcmJpdHJhcnkgcHJlLWNvbnN0cnVjdGVk
IG9iamVjdHMgd2l0aCBFeGVjIGhvb2suClRoZSBwcm9wb3NhbCBtYWRlIGV4dGVuc2lvbiBtb2R1
bGUgaW5pdGlhbGl6YXRpb24gY2xvc2VyIHRvIGhvdyBQeXRob24gbW9kdWxlcwphcmUgaW5pdGlh
bGl6ZWQsIGJ1dCBpdCB3YXMgbGF0ZXIgcmVjb2duaXplZCB0aGF0IHRoaXMgaXNuJ3QgYW4gaW1w
b3J0YW50IGdvYWwuClRoZSBjdXJyZW50IFBFUCBkZXNjcmliZXMgYSBzaW1wbGVyIHNvbHV0aW9u
LgoKQSBmdXJ0aGVyIGl0ZXJhdGlvbiB1c2VkIGEgIlB5TW9kdWxlRXhwb3J0IiBob29rIGFzIGFu
IGFsdGVybmF0aXZlIHRvIFB5SW5pdCwKd2hlcmUgUHlJbml0IHdhcyB1c2VkIGZvciBleGlzdGlu
ZyBzY2hlbWUsIGFuZCBQeU1vZHVsZUV4cG9ydCBmb3IgbXVsdGktcGhhc2UuCkhvd2V2ZXIsIG5v
dCBiZWluZyBhYmxlIHRvIGRldGVybWluZSB0aGUgaG9vayBuYW1lIGJhc2VkIG9uIG1vZHVsZSBu
YW1lCmNvbXBsaWNhdGVkIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIFB5SW1wb3J0X0luaXR0YWIg
YnkgdG9vbHMgbGlrZSBmcmVlemUuCktlZXBpbmcgb25seSB0aGUgUHlJbml0IGhvb2sgbmFtZSwg
ZXZlbiBpZiBpdCdzIG5vdCBlbnRpcmVseSBhcHByb3ByaWF0ZSBmb3IKZXhwb3J0aW5nIGEgZGVm
aW5pdGlvbiwgeWllbGRlZCBhIG11Y2ggc2ltcGxlciBzb2x1dGlvbi4KCgpSZWZlcmVuY2VzCj09
PT09PT09PT0KCi4uIFsjcGVwLTA0NTEtYXR0cmlidXRlc10KICAgaHR0cHM6Ly93d3cucHl0aG9u
Lm9yZy9kZXYvcGVwcy9wZXAtMDQ1MS8jYXR0cmlidXRlcwoKLi4gWyNzdGVmYW5zX3Byb3RvcGVw
XQogICBodHRwczovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDEzLUF1
Z3VzdC8xMjgwODcuaHRtbAoKLi4gWyNuaWNrcy1wcm90b3R5cGVdCiAgIGh0dHBzOi8vbWFpbC5w
eXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMTMtQXVndXN0LzEyODEwMS5odG1sCgou
LiBbI3JmYy0zNDkyXQogICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyCgouLiBb
I2doLXJlcG9dCiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmN1a291L2NweXRob24vY29tbWl0cy9w
ZXA0ODkKCi4uIFsjZ2gtcGF0Y2hdCiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmN1a291L2NweXRo
b24vY29tcGFyZS9tYXN0ZXIuLi5lbmN1a291OnBlcDQ4OS5wYXRjaAoKLi4gWyNmaW5kbW9kdWxl
LWRpc2N1c3Npb25dCiAgIGh0dHBzOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9pbXBvcnQt
c2lnLzIwMTUtQXByaWwvMDAwOTU5Lmh0bWwKCi4uIFsjcGVwLTA0NTEtbG9hZGluZ10KICAgaHR0
cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ1MS8jaG93LWxvYWRpbmctd2lsbC13
b3JrXQoKLi4gWyNzdWJpbnRlcnByZXRlci1kb2NzXQogICBodHRwczovL2RvY3MucHl0aG9uLm9y
Zy8zL2MtYXBpL2luaXQuaHRtbCNzdWItaW50ZXJwcmV0ZXItc3VwcG9ydAoKCkNvcHlyaWdodAo9
PT09PT09PT0KClRoaXMgZG9jdW1lbnQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9t
YWluLgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbXBv
cnQtU0lHIG1haWxpbmcgbGlzdApJbXBvcnQtU0lHQHB5dGhvbi5vcmcKaHR0cHM6Ly9tYWlsLnB5
dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9pbXBvcnQtc2lnCg==