pop up windows

Steven J Abner <[email protected]> Thu, 13 Feb 2025 14:37:05 -0500
Newsgroups gmane.comp.freedesktop.xcb
Message-ID <[email protected]>
--=-vuDi7qU9XqprIoS/tjas
Content-Type: text/plain; charset=us-ascii; format=flowed

 Hoping xcb can help. I am attaching demo file to clarify. I broke down 
original as much as I could with minimalist debug code. Can send more 
if needed.
 I don't have a LFS system to test on, but my guess it will work like 
it should. The 2 systems tested on have the WM of 'GNOME Shell' and 
'Compiz'.
 GNOME Shell will not focus out nor provide info on 'root' window to 
unmap or destroy pop up. Compiz on parent of transient does get focus 
out signal but only half way does it, visually provides a partial 
background look, but doesn't background. You can still move or resize 
while popup is foreground.
 I've tried both ICCCM and EWM suggestions and in multiple 
combinations, even silly stuff like setting parent to override-redirect 
when popup is mapped.
 Thing I haven't tried are using wmctrl to get PID, to get FD for 
interception of WMs.
 My hope is looking at demo, someone can spot what I'm doing wrong.
 Please, please look. Without this working I can't do combo buttons, 
menus, context menus, etc. Found older code of a tutorial that had this 
problem. Really looks silly moving window with menus off on their own. 
They should disappear when button pressed on title bar. GNOME Shell 
gets that right, where Compiz gets root window right.
 Steve

gcc -ansi -pedantic -Wall -Wno-unknown-pragmas -g -o xpop xpop.c -lxcb 
&& gdb xpop


--=-vuDi7qU9XqprIoS/tjas
Content-Type: text/x-csrc
Content-Disposition: attachment; filename=xpop.c
Content-Transfer-Encoding: base64

I2luY2x1ZGUgPHhjYi94Y2IuaD4gIC8qIGhhcyBjb3JyZWN0IHN5cy90eXBlcyAqLwojaW5jbHVk
ZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNs
dWRlIDxzdGRib29sLmg+CiNpbmNsdWRlIDxpbnR0eXBlcy5oPgojaW5jbHVkZSA8bGltaXRzLmg+
CiNpbmNsdWRlIDxwb2xsLmg+CgovKiBnY2MgLWFuc2kgLXBlZGFudGljIC1XYWxsIC1Xbm8tdW5r
bm93bi1wcmFnbWFzIC1nIC1vIHhwb3AgeHBvcC5jIC1seGNiICovCgp0eXBlZGVmIHN0cnVjdCBf
UGh4SW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaHhJbnRlcmZhY2U7CnR5
cGVkZWYgc3RydWN0IF9QaHhSZWN0YW5nbGUgeyBpbnQxNl90IHgsIHksIHcsIGg7IH0gICAgIFBo
eFJlY3RhbmdsZTsKCmJvb2wgICAgICAgICAgX3dpbmRvd19pc190cmFuc2llbnQoeGNiX3dpbmRv
d190IHdpbmRvdyk7CnhjYl93aW5kb3dfdCAgdWlfZHJvcGRvd25fY3JlYXRlKFBoeFJlY3Rhbmds
ZSBjb25maWd1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3df
dCB0cmFuc2llbnRfZm9yX3dpbmRvdyk7CgoKeGNiX2Nvbm5lY3Rpb25fdCAgICAgKmNvbm5lY3Rp
b24gPSBOVUxMOwp4Y2JfYXRvbV90IFdNX1BST1RPQ09MUzsKeGNiX2F0b21fdCBXTV9ERUxFVEVf
V0lORE9XOwoKc3RydWN0IF9QaHhJbnRlcmZhY2UgewogYm9vbCAgICAgICAgICBtYXBwZWQ7CiBQ
aHhSZWN0YW5nbGUgIG1ldGVfYm94OwogeGNiX3dpbmRvd190ICB3aW5kb3c7Cn0gaWZhY2UwID0g
eyBmYWxzZSwgezB9LCAwIH0sIGlmYWNlMSA9IHsgZmFsc2UsIHswfSwgMCB9OwoKYm9vbCBTQklU
X0ZPQ1VTX0NMSUNLID0gZmFsc2U7CmJvb2wgU0JJVF9SRUxFQVNFX0lHTk9SRSA9IGZhbHNlOwpQ
aHhJbnRlcmZhY2UgKmhhc19mb2N1cyA9IE5VTEw7CgojaWYgKF9fU1REQ19WRVJTSU9OX18gPD0g
MTk5OTAxTCkKICNkZWZpbmUgUkVDVEFOR0xFKGEsYixjLGQsZSkgXAogIGEueCA9IGIsIGEueSA9
IGMsIGEudyA9IGQsIGEuaCA9IGUKI2Vsc2UKICNkZWZpbmUgUkVDVEFOR0xFKGEsYixjLGQsZSkg
XAogIGEgPSAoUGh4UmVjdGFuZ2xlKXsgYiwgYywgZCwgZSB9CiNlbmRpZgoKUGh4SW50ZXJmYWNl
ICoKX2ludGVyZmFjZV9mb3IoeGNiX3dpbmRvd190IHdpbmRvdykgewogIGlmIChpZmFjZTAud2lu
ZG93ID09IHdpbmRvdykKICAgIHJldHVybiAmaWZhY2UwOwogIHJldHVybiAmaWZhY2UxOwp9Cgpz
dGF0aWMgYm9vbApfZXZlbnRfbW91c2UoeGNiX2dlbmVyaWNfZXZlbnRfdCAqbnZ0KSB7CgogIGJv
b2wgbG9jdXMgPSAoKG52dC0+cmVzcG9uc2VfdHlwZSAmICh1aW50OF90KX4weDgwKSA9PSBYQ0Jf
QlVUVE9OX1BSRVNTKTsKICB4Y2JfYnV0dG9uX3ByZXNzX2V2ZW50X3QgKm1vdXNlID0gKHhjYl9i
dXR0b25fcHJlc3NfZXZlbnRfdCopbnZ0OwogIFBoeEludGVyZmFjZSAqaWZhY2UgPSBfaW50ZXJm
YWNlX2Zvcihtb3VzZS0+ZXZlbnQpOwoKICBpZiAoIWxvY3VzKSB7CiAgICAgIC8qIGZpcnN0IGNs
aWNrIGluIHVuZm9jdXNlZCB3aW5kb3cgdXNlZCB0byBicmluZyBBQk9WRSBhbmQgZm9jdXMgKi8K
ICAgIGlmIChTQklUX0ZPQ1VTX0NMSUNLKSB7CiAgICAgIFNCSVRfRk9DVVNfQ0xJQ0sgPSBmYWxz
ZTsKICAgICAgcHJpbnRmKCIgICAgICAgJWQsIFNCSVRfRk9DVVNfQ0xJQ0sgcmVzZXQuXG4iLCBp
ZmFjZS0+d2luZG93KTsKICAgICAgU0JJVF9SRUxFQVNFX0lHTk9SRSA9IGZhbHNlOwogICAgICBw
cmludGYoIiAgICAgICAlZCwgU0JJVF9SRUxFQVNFX0lHTk9SRSByZXNldC5cbiIsIGlmYWNlLT53
aW5kb3cpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgICAgLyogY29kZSBmb3IgYnV0dG9u
IHJlbGVhc2UsIGRyYWcgY2FzZXMgKi8KICAgICAgLyogY2FzZXMgd2hlcmUgYnV0dG9uIHJlbGVh
c2Ugc2hvdWxkIGJlIGlnbm9yZWQuICovCiAgICBpZiAoU0JJVF9SRUxFQVNFX0lHTk9SRSkgewog
ICAgICBTQklUX1JFTEVBU0VfSUdOT1JFID0gZmFsc2U7CiAgICAgIHByaW50ZigiICAgICAgICVk
LCBTQklUX1JFTEVBU0VfSUdOT1JFIHJlc2V0LlxuIiwgaWZhY2UtPndpbmRvdyk7CiAgICAgIHJl
dHVybiB0cnVlOwogICAgfQogICAgICAvKiBjb2RlIGZvciBidXR0b24gcmVsZWFzZSwgbm9uLWRy
YWcgcmVsYXRlZCAqLwogIH0gZWxzZSB7CiAgICBpZiAoaGFzX2ZvY3VzLT53aW5kb3cgIT0gbW91
c2UtPmV2ZW50KSB7CiAgICAgIHhjYl91bm1hcF93aW5kb3coY29ubmVjdGlvbiwgaWZhY2UxLndp
bmRvdyk7CiAgICAgIGlmYWNlMS5tYXBwZWQgPSBmYWxzZTsKICAgICAgU0JJVF9SRUxFQVNFX0lH
Tk9SRSA9IHRydWU7CiAgICAgIHByaW50ZigiICAgICAgICVkLCBTQklUX1JFTEVBU0VfSUdOT1JF
IHNldC5cbiIsIGlmYWNlMC53aW5kb3cpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgICAg
LyogY29kZSBmb3IgYnV0dG9uIHByZXNzICovCiAgICAgIC8qIFN0b3AgcHJvY2Vzc2luZyBtb3Vz
ZSwgd2FzIHdpbmRvdyBiZWluZyBmb2N1c2VkIGJ5IGNsaWNrIGluIGNvbnRlbnQuICovCiAgICBp
ZiAoU0JJVF9GT0NVU19DTElDSykgewogICAgICBwdXRzKCIgaWdub3JlIGJ1dHRvbiBwcmVzcyBT
QklUX0ZPQ1VTX0NMSUNLIik7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgICAgLyogYnV0
dG9uIHByZXNzIGluIGZvY3VzZWQgY29udGVudCAqLwogICAgaWYgKCFpZmFjZTEubWFwcGVkKSB7
CiAgICAgIGlmIChpZmFjZTEud2luZG93ID09IDApIHsKICAgICAgICB1aW50MzJfdCB2YWx1ZXNb
Ml07CiAgICAgICAgUGh4UmVjdGFuZ2xlIHB1cF9ib3ggPSB7IDc1LCA3NSwgMjUwLCAyNTAgfTsK
ICAgICAgICBpZmFjZTEud2luZG93ID0gdWlfZHJvcGRvd25fY3JlYXRlKHB1cF9ib3gsIGlmYWNl
LT53aW5kb3cpOwogICAgICAgIHZhbHVlc1swXSA9IHB1cF9ib3gueCArIGlmYWNlMC5tZXRlX2Jv
eC54OwogICAgICAgIHZhbHVlc1sxXSA9IHB1cF9ib3gueSArIGlmYWNlMC5tZXRlX2JveC55Owog
ICAgICAgIHhjYl9jb25maWd1cmVfd2luZG93KGNvbm5lY3Rpb24sIGlmYWNlMS53aW5kb3csCiAg
ICAgICAgICAgICAgICAgICAgIFhDQl9DT05GSUdfV0lORE9XX1ggfCBYQ0JfQ09ORklHX1dJTkRP
V19ZLCB2YWx1ZXMpOwogICAgICAgIHhjYl9tYXBfd2luZG93KGNvbm5lY3Rpb24sIGlmYWNlMS53
aW5kb3cpOwogICAgICAgIGlmYWNlMS5tYXBwZWQgPSB0cnVlOwogICAgICAgIFNCSVRfUkVMRUFT
RV9JR05PUkUgPSB0cnVlOwogICAgICAgIHByaW50ZigiICAgICAgICVkLCBTQklUX1JFTEVBU0Vf
SUdOT1JFIHNldC5cbiIsIGlmYWNlMC53aW5kb3cpOwogICAgICB9IGVsc2UgewogICAgICAgIHVp
bnQzMl90IHZhbHVlc1syXTsKICAgICAgICBQaHhSZWN0YW5nbGUgcHVwX2JveCA9IHsgNzUsIDc1
LCAyNTAsIDI1MCB9OwogICAgICAgIHZhbHVlc1swXSA9IHB1cF9ib3gueCArIGlmYWNlMC5tZXRl
X2JveC54OwogICAgICAgIHZhbHVlc1sxXSA9IHB1cF9ib3gueSArIGlmYWNlMC5tZXRlX2JveC55
OwogICAgICAgIHhjYl9jb25maWd1cmVfd2luZG93KGNvbm5lY3Rpb24sIGlmYWNlMS53aW5kb3cs
CiAgICAgICAgICAgICAgICAgICAgIFhDQl9DT05GSUdfV0lORE9XX1ggfCBYQ0JfQ09ORklHX1dJ
TkRPV19ZLCB2YWx1ZXMpOwogICAgICAgIHhjYl9tYXBfd2luZG93KGNvbm5lY3Rpb24sIGlmYWNl
MS53aW5kb3cpOwogICAgICAgIGlmYWNlMS5tYXBwZWQgPSB0cnVlOwogICAgICAgIFNCSVRfUkVM
RUFTRV9JR05PUkUgPSB0cnVlOwogICAgICAgIHByaW50ZigiICAgICAgICVkLCBTQklUX1JFTEVB
U0VfSUdOT1JFIHNldC5cbiIsIGlmYWNlMC53aW5kb3cpOwogICAgICB9CiAgICB9CiAgfQogICAg
LyogY29tbW9uIG1vdXNlIGNvZGUgKi8KICByZXR1cm4gdHJ1ZTsKfQoKc3RhdGljIGJvb2wKX2V2
ZW50X2ZvY3VzKHhjYl9nZW5lcmljX2V2ZW50X3QgKm52dCkgewoKICBib29sIGxvY3VzID0gKChu
dnQtPnJlc3BvbnNlX3R5cGUgJiAodWludDhfdCl+MHg4MCkgPT0gWENCX0ZPQ1VTX0lOKTsKICB4
Y2JfZm9jdXNfaW5fZXZlbnRfdCAqZm9jdXMgPSAoeGNiX2ZvY3VzX2luX2V2ZW50X3QqKW52dDsK
CiAgaWYgKGxvY3VzKSB7CiAgICB4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVfdCBjMAogICAgICA9
IHhjYl9xdWVyeV9wb2ludGVyKGNvbm5lY3Rpb24sIGZvY3VzLT5ldmVudCk7CiAgICB4Y2JfcXVl
cnlfcG9pbnRlcl9yZXBseV90ICpyMAogICAgICA9IHhjYl9xdWVyeV9wb2ludGVyX3JlcGx5KGNv
bm5lY3Rpb24sIGMwLCBOVUxMKTsKICAgIGlmICggKHIwLT53aW5feCA+PSAwKSAmJiAocjAtPndp
bl94IDwgaWZhY2UwLm1ldGVfYm94LncpCiAgICAgICAgJiYgKHIwLT53aW5feSA+PSAwKSAmJiAo
cjAtPndpbl95IDwgaWZhY2UwLm1ldGVfYm94LmgpICkgewogICAgICBpZiAoKHIwLT5tYXNrICYg
WENCX0tFWV9CVVRfTUFTS19CVVRUT05fMSkgIT0gMCkgewogICAgICAgIFNCSVRfRk9DVVNfQ0xJ
Q0sgPSB0cnVlOwogICAgICAgIHByaW50ZigiICAgICAgICVkLCBTQklUX0ZPQ1VTX0NMSUNLIHNl
dC5cbiIsIGZvY3VzLT5ldmVudCk7CiAgICAgIH0KICAgIH0KICAgIGZyZWUocjApOwogICAgaGFz
X2ZvY3VzID0gX2ludGVyZmFjZV9mb3IoZm9jdXMtPmV2ZW50KTsKICB9IGVsc2UgewogICAgaWYg
KCAoX3dpbmRvd19pc190cmFuc2llbnQoZm9jdXMtPmV2ZW50KSkgJiYgKGlmYWNlMS5tYXBwZWQp
ICkgewogICAgICB4Y2JfdW5tYXBfd2luZG93KGNvbm5lY3Rpb24sIGlmYWNlMS53aW5kb3cpOwog
ICAgICBpZmFjZTEubWFwcGVkID0gZmFsc2U7CiAgICB9CiAgICBoYXNfZm9jdXMgPSBOVUxMOwog
IH0KICByZXR1cm4gdHJ1ZTsKfQoKYm9vbApfZXZlbnRfZXhwb3NlKHhjYl9nZW5lcmljX2V2ZW50
X3QgKm52dCkgewogIHJldHVybiB0cnVlOwp9CnN0YXRpYyBib29sCl9ldmVudF9jb25maWd1cmUo
eGNiX2dlbmVyaWNfZXZlbnRfdCAqbnZ0KSB7CgogIHhjYl9jb25maWd1cmVfbm90aWZ5X2V2ZW50
X3QgKmNvbmZpZ3VyZQogICAgPSAoeGNiX2NvbmZpZ3VyZV9ub3RpZnlfZXZlbnRfdCopbnZ0Owog
IHhjYl93aW5kb3dfdCB3aW5kb3cgPSBjb25maWd1cmUtPmV2ZW50OwogIFBoeEludGVyZmFjZSAq
aWZhY2UgPSBfaW50ZXJmYWNlX2Zvcih3aW5kb3cpOwoKICBpZiAoKih1aW50NjRfdCopJmlmYWNl
LT5tZXRlX2JveC54ID09ICoodWludDY0X3QqKSZjb25maWd1cmUtPngpCiAgICByZXR1cm4gdHJ1
ZTsKCiAgICAvKiBEbyBpbnRlcm5hbCBjb25maWd1cmF0aW9uICovCgogICAgLyogU2V0IG1ldGVf
Ym94IGlmIG1vdmUgb2NjdXJyZWQgKi8KICBpZiAoKGNvbmZpZ3VyZS0+eCB8IGNvbmZpZ3VyZS0+
eSkgIT0gMCkgewogICAgaWYgKCAoaWZhY2UtPm1ldGVfYm94LnggIT0gY29uZmlndXJlLT54KQog
ICAgICAgIHx8IChpZmFjZS0+bWV0ZV9ib3gueSAhPSBjb25maWd1cmUtPnkpICkgewogICAgICAg
IC8qIE5lZWRlZCwgaWYgd2FudCBhY2N1cmF0ZSBwb3NpdGlvbmluZy4gV00gaXMgdW5yZWxpYWJs
ZSAqLwogICAgICB4Y2Jfc2NyZWVuX3QgKnNjcmVlbgogICAgICAgID0geGNiX3NldHVwX3Jvb3Rz
X2l0ZXJhdG9yKHhjYl9nZXRfc2V0dXAoY29ubmVjdGlvbikpLmRhdGE7CiAgICAgIHhjYl90cmFu
c2xhdGVfY29vcmRpbmF0ZXNfcmVwbHlfdCAqY2ZnCiAgICAgICAgPSB4Y2JfdHJhbnNsYXRlX2Nv
b3JkaW5hdGVzX3JlcGx5KGNvbm5lY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgeGNi
X3RyYW5zbGF0ZV9jb29yZGluYXRlcyhjb25uZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHdpbmRvdywgc2NyZWVuLT5yb290LCAwLCAwKSwgTlVMTCk7CiAgICAg
IGlmYWNlLT5tZXRlX2JveC54ID0gY2ZnLT5kc3RfeDsKICAgICAgaWZhY2UtPm1ldGVfYm94Lnkg
PSBjZmctPmRzdF95OwogICAgICBmcmVlKGNmZyk7CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9
CgpzdGF0aWMgaW50MzJfdApfcHJvY2Vzc190aW1lcnModm9pZCkgewogIHJldHVybiBJTlRfTUFY
Owp9CgpzdGF0aWMgYm9vbApfcHJvY2Vzc19ldmVudCh4Y2JfZ2VuZXJpY19ldmVudF90ICpudnQp
IHsKCiAgc3dpdGNoIChudnQtPnJlc3BvbnNlX3R5cGUgJiAodWludDhfdCl+MHg4MCkgewoKICAg
IGNhc2UgWENCX0tFWV9QUkVTUzogICAgICAgICAgIC8qIHJlc3BvbnNlX3R5cGUgMiAqLwogICAg
Y2FzZSBYQ0JfS0VZX1JFTEVBU0U6IHsgICAgICAgLyogcmVzcG9uc2VfdHlwZSAzICovCiAgICAg
IGJyZWFrOwogICAgfQoKICAgIGNhc2UgWENCX0JVVFRPTl9QUkVTUzogICAgICAgIC8qIHJlc3Bv
bnNlX3R5cGUgNCAqLwogICAgY2FzZSBYQ0JfQlVUVE9OX1JFTEVBU0U6IHsgICAgLyogcmVzcG9u
c2VfdHlwZSA1ICovCiAgICAgIF9ldmVudF9tb3VzZShudnQpOwogICAgICBicmVhazsKICAgIH0K
CiAgICBjYXNlIFhDQl9NT1RJT05fTk9USUZZOiB7ICAgICAvKiByZXNwb25zZV90eXBlIDYgKi8K
ICAgIGNhc2UgWENCX0VOVEVSX05PVElGWTogICAgICAgIC8qIHJlc3BvbnNlX3R5cGUgNyAqLwog
ICAgY2FzZSBYQ0JfTEVBVkVfTk9USUZZOiAgICAgICAgLyogcmVzcG9uc2VfdHlwZSA4ICovCiAg
ICAgIGJyZWFrOwogICAgfQoKICAgIGNhc2UgWENCX0ZPQ1VTX0lOOiAgICAgICAgICAgIC8qIHJl
c3BvbnNlX3R5cGUgOSAqLwogICAgY2FzZSBYQ0JfRk9DVVNfT1VUOiB7ICAgICAgICAgLyogcmVz
cG9uc2VfdHlwZSAxMCAqLwogICAgICBfZXZlbnRfZm9jdXMobnZ0KTsKICAgICAgYnJlYWs7CiAg
ICB9CgogICAgY2FzZSBYQ0JfRVhQT1NFOiB7ICAgICAgICAgICAgLyogcmVzcG9uc2VfdHlwZSAx
MiAqLwogICAgICBicmVhazsKICAgIH0KCiAgICBjYXNlIFhDQl9WSVNJQklMSVRZX05PVElGWTog
eyAvKiByZXNwb25zZV90eXBlIDE1ICovCiAgICAgIHhjYl92aXNpYmlsaXR5X25vdGlmeV9ldmVu
dF90ICpzZWVuCiAgICAgICAgPSAoeGNiX3Zpc2liaWxpdHlfbm90aWZ5X2V2ZW50X3QqKW52dDsK
ICAgICAgaWYgKF93aW5kb3dfaXNfdHJhbnNpZW50KHNlZW4tPndpbmRvdykpIHsKICAgICAgICB4
Y2Jfc2V0X2lucHV0X2ZvY3VzKGNvbm5lY3Rpb24sIFhDQl9JTlBVVF9GT0NVU19QQVJFTlQsCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vlbi0+d2luZG93LCBYQ0JfQ1VSUkVO
VF9USU1FKTsKICAgICAgfQogICAgICBicmVhazsKICAgIH0KCiAgICBjYXNlIFhDQl9ERVNUUk9Z
X05PVElGWTogeyAgICAvKiByZXNwb25zZV90eXBlIDE3ICovCiAgICAgICAgLyogYXNzdW1lIGEg
a2lsbCwgZGVsZXRlIGFsbCB3aW5kb3dzIChkbyB0aGVpciB0aGluZykKICAgICAgICAgICBzZW5k
IGZhbHNlIHRvIGV4aXQgbG9vcCAqLwogICAgICB4Y2JfZGVzdHJveV9ub3RpZnlfZXZlbnRfdCAq
ZGVzdHJveQogICAgICAgID0gKHhjYl9kZXN0cm95X25vdGlmeV9ldmVudF90KiludnQ7CiAgICAg
ICBpZiAoIV93aW5kb3dfaXNfdHJhbnNpZW50KGRlc3Ryb3ktPndpbmRvdykpIHsKICAgICAgICBm
cmVlKG52dCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGJyZWFrOwogICAg
fQogICAgICAvKiB0aGVzZSA0IGJlY2F1c2Ugb2YgWENCX0VWRU5UX01BU0tfU1RSVUNUVVJFX05P
VElGWSAqLwogICAgY2FzZSBYQ0JfVU5NQVBfTk9USUZZOiB7ICAgICAgLyogcmVzcG9uc2VfdHlw
ZSAxOCAqLwogICAgY2FzZSBYQ0JfTUFQX05PVElGWTogICAgICAgICAgLyogcmVzcG9uc2VfdHlw
ZSAxOSAqLwogICAgICBicmVhazsKICAgIH0KICAgIGNhc2UgWENCX1JFUEFSRU5UX05PVElGWTog
eyAgIC8qIHJlc3BvbnNlX3R5cGUgMjEgKi8KICAgICAgICAvKiBwb3NpdGlvbiBhZnRlciBtYXAs
IHRvIGRlc2lnbiB1c2VyIHJlcXVlc3RlZCBvZiB3aW5kb3cKICAgICAgICAgKiBzZXQgb25jZSBh
bmQgd2hlbiB3aW5kb3cgbWFuYWdlciBhc2tzIHRvIHJlcGFyZW50CiAgICAgICAgICogZG9udCBu
ZWVkIGR1cmluZyBpY29uL2RlaWNvbmlmeQogICAgICAgICAqIGRvZXNudCBzdG9wIFdNIGNvbmZp
Z3VyZXMsIGJ1dCB3aWxsIGJlIHNlbnQgYWZ0ZXIgbWFwIG5vdGlmeSAqLwogICAgICB4Y2JfcmVw
YXJlbnRfbm90aWZ5X2V2ZW50X3QgKnJwCiAgICAgICAgPSAoeGNiX3JlcGFyZW50X25vdGlmeV9l
dmVudF90KiludnQ7CiAgICAgIFBoeEludGVyZmFjZSAqaWZhY2UgPSBfaW50ZXJmYWNlX2Zvcihy
cC0+d2luZG93KTsKICAgICAgdWludDMyX3QgdmFsdWVzWzJdOwogICAgICB2YWx1ZXNbMF0gPSBp
ZmFjZS0+bWV0ZV9ib3gueDsKICAgICAgdmFsdWVzWzFdID0gaWZhY2UtPm1ldGVfYm94Lnk7CiAg
ICAgIHhjYl9jb25maWd1cmVfd2luZG93KGNvbm5lY3Rpb24sIGlmYWNlLT53aW5kb3csCiAgICAg
ICAgICAgICAgICAgICBYQ0JfQ09ORklHX1dJTkRPV19YIHwgWENCX0NPTkZJR19XSU5ET1dfWSwg
dmFsdWVzKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIFhDQl9DT05GSUdVUkVfTk9USUZZ
OiB7ICAvKiByZXNwb25zZV90eXBlIDIyICovCiAgICAgIF9ldmVudF9jb25maWd1cmUobnZ0KTsK
ICAgICAgYnJlYWs7CiAgICB9CgogICAgY2FzZSBYQ0JfUFJPUEVSVFlfTk9USUZZOiB7ICAgLyog
cmVzcG9uc2VfdHlwZSAyOCAqLwogICAgY2FzZSBYQ0JfU0VMRUNUSU9OX0NMRUFSOiAgICAgLyog
cmVzcG9uc2VfdHlwZSAyOSAqLwogICAgY2FzZSBYQ0JfU0VMRUNUSU9OX1JFUVVFU1Q6ICAgLyog
cmVzcG9uc2VfdHlwZSAzMCAqLwogICAgY2FzZSBYQ0JfU0VMRUNUSU9OX05PVElGWTogICAgLyog
cmVzcG9uc2VfdHlwZSAzMSAqLwogICAgICBicmVhazsKICAgIH0KCiAgICBjYXNlIFhDQl9DTElF
TlRfTUVTU0FHRTogeyAgICAvKiByZXNwb25zZV90eXBlIDMzICovCiAgICAgIHhjYl9jbGllbnRf
bWVzc2FnZV9ldmVudF90ICpjbQogICAgICAgID0gKHhjYl9jbGllbnRfbWVzc2FnZV9ldmVudF90
KiludnQ7CiAgICAgIGlmIChjbS0+dHlwZSAhPSBXTV9QUk9UT0NPTFMpICBnb3RvIHJlcG9ydDsK
ICAgICAgaWYgKF93aW5kb3dfaXNfdHJhbnNpZW50KGNtLT53aW5kb3cpKSB7CiAgICAgICAgcHV0
cygidW5leHBlY3RlZCIpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpZmFjZTEud2luZG93
ICE9IDApIHsKICAgICAgICAgIHhjYl91bm1hcF93aW5kb3coY29ubmVjdGlvbiwgaWZhY2UxLndp
bmRvdyk7CiAgICAgICAgICB4Y2JfZGVzdHJveV93aW5kb3coY29ubmVjdGlvbiwgaWZhY2UxLndp
bmRvdyk7CiAgICAgICAgfQogICAgICAgIHhjYl91bm1hcF93aW5kb3coY29ubmVjdGlvbiwgaWZh
Y2UwLndpbmRvdyk7CiAgICAgICAgeGNiX2Rlc3Ryb3lfd2luZG93KGNvbm5lY3Rpb24sIGlmYWNl
MC53aW5kb3cpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgfQoKICAgIGRlZmF1bHQ6CiAgICAg
IGlmIChudnQtPnJlc3BvbnNlX3R5cGUgPT0gMCkgewogICAgICAgIHhjYl9nZW5lcmljX2Vycm9y
X3QgKmVyciA9ICh4Y2JfZ2VuZXJpY19lcnJvcl90KiludnQ7CiAgICAgICAgcHJpbnRmKCJlcnJv
cjogJSJQUkl1OCJcbiIsIGVyci0+ZXJyb3JfY29kZSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0K
cmVwb3J0OgogICAgICAgIC8qIFVua25vd24gZXZlbnQgdHlwZSwgdXNlIHRvIHRyYWNrIGNvZGlu
ZyBwcm9ibGVtcyAqLwogICAgICBwcmludGYoIlVua25vd24gZXZlbnQ6ICUiUFJJdTgiXG4iLCBu
dnQtPnJlc3BvbnNlX3R5cGUpOwogICAgICBicmVhazsKCiAgfSAvKiBlbmQgc3dpdGNoKHJlc3Bv
bnNlX3R5cGUpICovCiAgICAvKiBudnQgbm8gbG9uZ2VyIG5lZWRlZCAqLwogIGZyZWUobnZ0KTsK
ICAgIC8qIGNyaXRpY2FsISBvdGhlcndpc2Ugd29udCBwcm9jZXNzIGFueXRoaW5nIGRvbmUgKi8K
ICB4Y2JfZmx1c2goY29ubmVjdGlvbik7CiAgcmV0dXJuIHRydWU7Cn0KCnN0YXRpYyB2b2lkCnhj
Yl9tYWluKHZvaWQpIHsKCiAgICAvKiBzZXQgYWxsIGJlZm9yZSB0aHJvdWdoIHRvIFhzZXJ2ZXIg
Ki8KICB4Y2JfZmx1c2goY29ubmVjdGlvbik7CgogIGRvIHsKICAgIGludCB0aW1lb3V0OwogICAg
eGNiX2dlbmVyaWNfZXZlbnRfdCAqZXZlbnQ7CiAgICB3aGlsZSAoKGV2ZW50ID0geGNiX3BvbGxf
Zm9yX2V2ZW50KGNvbm5lY3Rpb24pKSAhPSBOVUxMKQogICAgICAgIC8qIF9wcm9jZXNzX2V2ZW50
KCkgcmV0dXJucyAncnVubmluZycgZm9yIG1haW4gbG9vcC4gKi8KICAgICAgaWYgKF9wcm9jZXNz
X2V2ZW50KGV2ZW50KSA9PSBmYWxzZSkgIGdvdG8gY2xlYW51cDsKICAgIGRvIHsKICAgICAgICAv
KiBfcHJvY2Vzc190aW1lcnMoKSBydW5zIGFueSB0aW1lcnMgdGhhdCBhcmUgaW1tZWRpYXRlbHkg
cGVuZGluZywKICAgICAgICAgICBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25k
cyB1bnRpbCB0aGUgbmV4dCB0aW1lcgogICAgICAgICAgIGluIHRoZSBxdWV1ZSBpcyByZWFkeS4K
ICAgICAgICAgICBfcHJvY2Vzc190aW1lcnMoKSByZXR1cm5zIElOVF9NQVggaWYgdGhlcmUgYXJl
IG5vIHRpbWVycy4gKi8KICAgICAgICAvKiBfcHJvY2Vzc190aW1lcnMoKSBhbHNvIHJlbW92ZXMg
ZnJvbSB0aW1lb3V0IGl0cyBydW4gdGltZS4gKi8KICAgICAgdGltZW91dCA9IF9wcm9jZXNzX3Rp
bWVycygpOwogICAgICBpZiAoKGV2ZW50ID0geGNiX3BvbGxfZm9yX3F1ZXVlZF9ldmVudChjb25u
ZWN0aW9uKSkgPT0gTlVMTCkgIGJyZWFrOwogICAgICAgIGlmIChfcHJvY2Vzc19ldmVudChldmVu
dCkgPT0gZmFsc2UpICBnb3RvIGNsZWFudXA7CiAgICB9IHdoaWxlICgxKTsKICAgIGlmICh0aW1l
b3V0ID4gNikgewogICAgICBzdHJ1Y3QgcG9sbGZkIHBmZFsxXTsKICAgICAgcGZkLT5mZCA9IHhj
Yl9nZXRfZmlsZV9kZXNjcmlwdG9yKGNvbm5lY3Rpb24pOwogICAgICBwZmQtPmV2ZW50cyA9IFBP
TExJTjsKICAgICAgcGZkLT5yZXZlbnRzID0gUE9MTE9VVDsKICAgICAgcG9sbChwZmQsIDEsIHRp
bWVvdXQpOwogICAgfQogIH0gd2hpbGUgKDEpOwogICAgLyogcmVjZWl2ZWQgWENCX0RFU1RST1lf
Tk9USUZZICovCmNsZWFudXA6CiAgcmV0dXJuOwp9Cgp2b2lkCnVpX3dpbmRvd19uYW1lKHhjYl93
aW5kb3dfdCB3aW5kb3cpIHsKCiAgeGNiX2ludGVybl9hdG9tX2Nvb2tpZV90IGNvb2tpZQogICAg
PSB4Y2JfaW50ZXJuX2F0b20oY29ubmVjdGlvbiwgMSwgNywgIldNX05BTUUiKTsKICB4Y2JfaW50
ZXJuX2F0b21fcmVwbHlfdCAqcmVwbHkKICAgID0geGNiX2ludGVybl9hdG9tX3JlcGx5KGNvbm5l
Y3Rpb24sIGNvb2tpZSwgTlVMTCk7CiAgeGNiX2ludGVybl9hdG9tX2Nvb2tpZV90IGNvb2tpZTIK
ICAgID0geGNiX2ludGVybl9hdG9tKGNvbm5lY3Rpb24sIDAsIDYsICJTVFJJTkciKTsKICB4Y2Jf
aW50ZXJuX2F0b21fcmVwbHlfdCAqcmVwbHkyCiAgICA9IHhjYl9pbnRlcm5fYXRvbV9yZXBseShj
b25uZWN0aW9uLCBjb29raWUyLCBOVUxMKTsKCiAgY2hhciB0aXRsZVsxNl07CiAgc3ByaW50Zih0
aXRsZSwgIiVkIiwgd2luZG93KTsKICB4Y2JfY2hhbmdlX3Byb3BlcnR5KGNvbm5lY3Rpb24sIFhD
Ql9QUk9QX01PREVfUkVQTEFDRSwgd2luZG93LAogICAgICAgICAgICAgICAgICAgICAgIHJlcGx5
LT5hdG9tLCByZXBseTItPmF0b20sIDgsCiAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHRp
dGxlKSwgdGl0bGUpOwogIGZyZWUocmVwbHkpOwogIGZyZWUocmVwbHkyKTsKfQoKYm9vbApfd2lu
ZG93X2lzX3RyYW5zaWVudCh4Y2Jfd2luZG93X3Qgd2luZG93KSB7CgogIHhjYl9nZXRfcHJvcGVy
dHlfY29va2llX3QgY29va2llCiAgICA9IHhjYl9nZXRfcHJvcGVydHkoY29ubmVjdGlvbiwgMCwg
d2luZG93LAogICAgICAgICAgICAgICAgICAgICAgIFhDQl9BVE9NX1dNX1RSQU5TSUVOVF9GT1Is
IFhDQl9BVE9NX1dJTkRPVywgMCwgMSk7CiAgeGNiX2dldF9wcm9wZXJ0eV9yZXBseV90ICpyZXBs
eQogICAgPSB4Y2JfZ2V0X3Byb3BlcnR5X3JlcGx5KGNvbm5lY3Rpb24sIGNvb2tpZSwgTlVMTCk7
CiAgYm9vbCB0cmFuc2llbnQgPSBmYWxzZTsKICBpZiAocmVwbHkgIT0gTlVMTCkgewogICAgaWYg
KCAocmVwbHktPnR5cGUgPT0gWENCX0FUT01fV0lORE9XKQogICAgICAgICYmIChyZXBseS0+Zm9y
bWF0ID09IDMyKQogICAgICAgICYmIChyZXBseS0+bGVuZ3RoICE9IDApICkgewogICAgICB0cmFu
c2llbnQgPSB0cnVlOwogICAgfQogICAgZnJlZShyZXBseSk7CiAgfQogIHJldHVybiB0cmFuc2ll
bnQ7Cn0KCnN0YXRpYyB2b2lkCl93aW5kb3dfZXZlbnRfZGVsZXRlKHhjYl9jb25uZWN0aW9uX3Qg
KmNvbm5lY3Rpb24sIHhjYl93aW5kb3dfdCB3aW5kb3cpIHsKCiAgICAvKiBhbGxvdyBkZWxldGUg
d2luZG93IHNvIGNhbiBxdWl0IGFwcGxpY2F0aW9uLiBBdm9pZCBeQy4gKi8KICB4Y2JfY2hhbmdl
X3Byb3BlcnR5KGNvbm5lY3Rpb24sIFhDQl9QUk9QX01PREVfUkVQTEFDRSwgd2luZG93LAogICAg
ICAgICAgICAgICAgICAgICAgV01fUFJPVE9DT0xTLCBYQ0JfQVRPTV9BVE9NLCAzMiwgMSwKICAg
ICAgICAgICAgICAgICAgICAgICZXTV9ERUxFVEVfV0lORE9XKTsKfQoKc3RhdGljIHhjYl93aW5k
b3dfdApfd2luZG93X2NyZWF0ZShQaHhSZWN0YW5nbGUgY29uZmlndXJlKSB7CgogIHhjYl9zY3Jl
ZW5fdCAqc2NyZWVuOwogIHhjYl93aW5kb3dfdCB3aW5kb3c7CiAgdWludDMyX3QgbWFzazsKICB1
aW50MzJfdCB2YWx1ZXNbMl07CgogIGlmIChjb25uZWN0aW9uID09IE5VTEwpIHsKICAgIHhjYl9p
bnRlcm5fYXRvbV9jb29raWVfdCBjMCwgYzE7CiAgICB4Y2JfaW50ZXJuX2F0b21fcmVwbHlfdCAq
cjAsICpyMTsKICAgIGNvbm5lY3Rpb24gPSB4Y2JfY29ubmVjdChOVUxMLCBOVUxMKTsKICAgIGMw
ID0geGNiX2ludGVybl9hdG9tKGNvbm5lY3Rpb24sIDAsIDEyLCAiV01fUFJPVE9DT0xTIik7CiAg
ICBjMSA9IHhjYl9pbnRlcm5fYXRvbShjb25uZWN0aW9uLCAwLCAxNiwgIldNX0RFTEVURV9XSU5E
T1ciKTsKICAgIHIwID0geGNiX2ludGVybl9hdG9tX3JlcGx5KGNvbm5lY3Rpb24sIGMwLCBOVUxM
KTsKICAgIHIxID0geGNiX2ludGVybl9hdG9tX3JlcGx5KGNvbm5lY3Rpb24sIGMxLCBOVUxMKTsK
ICAgIFdNX1BST1RPQ09MUyAgICAgPSByMC0+YXRvbTsgIGZyZWUoKHZvaWQqKXIwKTsKICAgIFdN
X0RFTEVURV9XSU5ET1cgPSByMS0+YXRvbTsgIGZyZWUoKHZvaWQqKXIxKTsKICB9CiAgICAvKiBH
ZXQgdGhlIGZpcnN0IHNjcmVlbiAqLwogIHNjcmVlbiA9IHhjYl9zZXR1cF9yb290c19pdGVyYXRv
cih4Y2JfZ2V0X3NldHVwKGNvbm5lY3Rpb24pKS5kYXRhOwogICAgLyogQ3JlYXRlIHRoZSB3aW5k
b3cgKi8KICB3aW5kb3cgPSB4Y2JfZ2VuZXJhdGVfaWQoY29ubmVjdGlvbik7CgogIG1hc2sgICAg
ICA9IFhDQl9DV19CQUNLX1BJWEVMIHwgWENCX0NXX0VWRU5UX01BU0s7CiAgdmFsdWVzWzBdID0g
c2NyZWVuLT53aGl0ZV9waXhlbDsKICB2YWx1ZXNbMV0gPSBYQ0JfRVZFTlRfTUFTS19FWFBPU1VS
RSAgICAgICB8IFhDQl9FVkVOVF9NQVNLX0JVVFRPTl9QUkVTUyAgIHwKICAgICAgICAgICAgICBY
Q0JfRVZFTlRfTUFTS19CVVRUT05fUkVMRUFTRSB8IFhDQl9FVkVOVF9NQVNLX1BPSU5URVJfTU9U
SU9OIHwKICAgICAgICAgICAgICBYQ0JfRVZFTlRfTUFTS19FTlRFUl9XSU5ET1cgICB8IFhDQl9F
VkVOVF9NQVNLX0xFQVZFX1dJTkRPVyAgIHwKICAgICAgICAgICAgICBYQ0JfRVZFTlRfTUFTS19L
RVlfUFJFU1MgICAgICB8IFhDQl9FVkVOVF9NQVNLX0tFWV9SRUxFQVNFICAgIHwKICAgICAgICAg
ICAgICBYQ0JfRVZFTlRfTUFTS19GT0NVU19DSEFOR0UgICB8IFhDQl9FVkVOVF9NQVNLX1NUUlVD
VFVSRV9OT1RJRlkgfAogICAgICAgICAgICAgIFhDQl9FVkVOVF9NQVNLX1ZJU0lCSUxJVFlfQ0hB
TkdFOwoKICAgIC8qIGlnbm9yZXMgeCwgeSwgYm9yZGVyX3dpZHRoICh2aXJ1cykgKi8KICB4Y2Jf
Y3JlYXRlX3dpbmRvdyhjb25uZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHNjcmVlbi0+cm9v
dF9kZXB0aCwgICAgICAgICAgICAvKiBkZXB0aCAgICAgICAgICAqLwogICAgICAgICAgICAgICAg
ICAgIHdpbmRvdywgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZW5lcmF0ZWQgaWQgICAqLwog
ICAgICAgICAgICAgICAgICAgIHNjcmVlbi0+cm9vdCwgICAgICAgICAgICAgICAgICAvKiBwYXJl
bnQgd2luZG93ICAqLwogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZS54LCAgICAgICAgICAg
ICAgICAgICAvKiB4LCB5ICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3Vy
ZS55LAogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZS53LCAgICAgICAgICAgICAgICAgICAv
KiB3aWR0aCwgaGVpZ2h0ICAqLwogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZS5oLAogICAg
ICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBib3JkZXJf
d2lkdGggICAqLwogICAgICAgICAgICAgICAgICAgIFhDQl9XSU5ET1dfQ0xBU1NfSU5QVVRfT1VU
UFVULCAvKiBjbGFzcyAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIHNjcmVlbi0+cm9v
dF92aXN1YWwsICAgICAgICAgICAvKiB2aXN1YWwgICAgICAgICAqLwogICAgICAgICAgICAgICAg
ICAgIG1hc2ssIHZhbHVlcyk7ICAgICAgICAgICAgICAgICAvKiBtYXNrcyAqLwogIF93aW5kb3df
ZXZlbnRfZGVsZXRlKGNvbm5lY3Rpb24sIHdpbmRvdyk7CiAgcmV0dXJuIHdpbmRvdzsKfQoKeGNi
X3dpbmRvd190CnVpX3dpbmRvd19jcmVhdGUoUGh4UmVjdGFuZ2xlIGNvbmZpZ3VyZSkgewoKICB4
Y2Jfd2luZG93X3Qgd2luZG93ID0gX3dpbmRvd19jcmVhdGUoY29uZmlndXJlKTsKICBpZiAod2lu
ZG93ID09IDApICByZXR1cm4gMDsKCiAgaWZhY2UwLm1ldGVfYm94ID0gY29uZmlndXJlOwogIGlm
YWNlMC53aW5kb3cgPSB3aW5kb3c7CiAgcmV0dXJuIHdpbmRvdzsKfQoKeGNiX3dpbmRvd190CnVp
X2Ryb3Bkb3duX2NyZWF0ZShQaHhSZWN0YW5nbGUgY29uZmlndXJlLCB4Y2Jfd2luZG93X3QgdHJh
bnNpZW50X2Zvcl93aW5kb3cpIHsKCiAgdWludDMyX3QgdmFsdWVzW10gPSB7ICB0cnVlICB9Owog
IHhjYl93aW5kb3dfdCB3aW5kb3cgPSBfd2luZG93X2NyZWF0ZShjb25maWd1cmUpOwogIGlmICh3
aW5kb3cgPT0gMCkgIHJldHVybiAwOwoKICB4Y2JfY2hhbmdlX3dpbmRvd19hdHRyaWJ1dGVzKGNv
bm5lY3Rpb24sIHdpbmRvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhDQl9DV19P
VkVSUklERV9SRURJUkVDVCwgdmFsdWVzKTsKCiAgeGNiX2NoYW5nZV9wcm9wZXJ0eShjb25uZWN0
aW9uLCBYQ0JfUFJPUF9NT0RFX1JFUExBQ0UsIHdpbmRvdywKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBYQ0JfQVRPTV9XTV9UUkFOU0lFTlRfRk9SLCBYQ0JfQVRPTV9XSU5ET1csIDMyLAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICZ0cmFuc2llbnRfZm9yX3dpbmRvdyk7Cgog
IGlmYWNlMS5tZXRlX2JveCA9IGNvbmZpZ3VyZTsKICBpZmFjZTEud2luZG93ID0gd2luZG93Owog
IHJldHVybiB3aW5kb3c7Cn0KCgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Cgog
IHhjYl93aW5kb3dfdCB3aW5kb3c7CgogICAgLyogd2luZG93IHNpemUgYW5kIHBvc2l0aW9uICov
CiAgUGh4UmVjdGFuZ2xlIGNvbmZpZ3VyZSA9IHsgODAwLCAyMDAsIDMwMCwgMjAwIH07CgogICAg
LyogQSAndG9wbW9zdCcgZGVjb3JhdGVkIHdpbmRvdyAqLwogIHdpbmRvdyA9IHVpX3dpbmRvd19j
cmVhdGUoY29uZmlndXJlKTsKICBpZiAod2luZG93ID09IDApICBleGl0KEVYSVRfRkFJTFVSRSk7
CgogIHVpX3dpbmRvd19uYW1lKHdpbmRvdyk7CgogICAgLyogTWFwIHRoZSB3aW5kb3cgb24gdGhl
IHNjcmVlbiAqLwogIHhjYl9tYXBfd2luZG93KGNvbm5lY3Rpb24sIHdpbmRvdyk7CiAgaWZhY2Uw
Lm1hcHBlZCA9IHRydWU7CgogICAgLyogUnVuIGV2ZW50IGxvb3AgKi8KICB4Y2JfbWFpbigpOwoK
ICByZXR1cm4gRVhJVF9TVUNDRVNTOwp9Ci==

--=-vuDi7qU9XqprIoS/tjas--