com gtk/php-gtk: dos -> nix line endings: win32/confutils.js

[email protected] (David Soria Parra) Tue, 20 Sep 2005 02:17:53 +0000
Newsgroups php.gtk.cvs
Message-ID <[email protected]>
--d3048ba218c2fc8b349b9b852af27b48caac49fd
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

Commit:    464741f5c911c5f59564f3aa4565cb456a8884aa=0AAuthor:    Steph Fox =
<[email protected]>         Tue, 20 Sep 2005 02:17:53 +0000=0AParents:   a64b442=
8416deaf93684d760ce9c6d9ab3493ea7=0ABranches:  master=0A=0ALink:       http=
://git.php.net/?p=3Dgtk/php-gtk.git;a=3Dcommitdiff;h=3D464741f5c911c5f59564=
f3aa4565cb456a8884aa=0A=0ALog:=0Ados -> nix line endings=0A=0AChanged paths=
:=0A  M  win32/confutils.js=0A=0A
--d3048ba218c2fc8b349b9b852af27b48caac49fd
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="diff_464741f5c911c5f59564f3aa4565cb456a8884aa.txt"

NDY0NzQxZjVjOTExYzVmNTk1NjRmM2FhNDU2NWNiNDU2YTg4ODRhYQpkaWZmIC0tZ2l0IGEvd2lu
MzIvY29uZnV0aWxzLmpzIGIvd2luMzIvY29uZnV0aWxzLmpzCmluZGV4IGU1OWJlN2MuLmZkNWJm
YWMgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvbmZ1dGlscy5qcworKysgYi93aW4zMi9jb25mdXRpbHMu
anMKQEAgLTEsMTIxOSArMSwxMjE5IEBACi0vLyBVdGlscyBmb3IgY29uZmlndXJlIHNjcmlwdA0K
LS8qDQotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi0gIHwgUEhQLUdUSyBWZXJzaW9uIDIgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSAgKy0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0rDQotICB8IENvcHlyaWdodCAoYykgMTk5Ny0yMDA1IFRoZSBQSFAgR3JvdXAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLSAgfCBUaGlz
IHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNl
LCAgICAgICB8DQotICB8IHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUg
ZmlsZSBMSUNFTlNFLCBhbmQgaXMgICAgICAgIHwNCi0gIHwgYXZhaWxhYmxlIHRocm91Z2ggdGhl
IHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgdXJsOiAgICAgICAgICAgfA0KLSAgfCBo
dHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0LiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB8DQotICB8IElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBQ
SFAgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0byAgIHwNCi0gIHwgb2J0YWluIGl0IHRocm91Z2gg
dGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8gICAgICAgICAgfA0KLSAg
fCBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1lZGlhdGVseS4g
ICAgICAgICAgICAgICB8DQotICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi0gIHwgQXV0aG9yOiBXZXogRnVy
bG9uZyA8d2V6QHRoZWJyYWlucm9vbS5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0K
LSAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0rDQotKi8NCi0NCi0vLyAkSWQ6IGNvbmZ1dGlscy5qcyx2IDEuNyAy
MDA1LTA5LTEzIDE3OjAyOjEwIHNmb3ggRXhwICQNCi0NCi0vKiBzZXQgdmFycyAqLw0KLXZhciBT
VERPVVQgPSBXU2NyaXB0LlN0ZE91dDsNCi12YXIgU1RERVJSID0gV1NjcmlwdC5TdGRFcnI7DQot
dmFyIFdzaFNoZWxsID0gV1NjcmlwdC5DcmVhdGVPYmplY3QoIldTY3JpcHQuU2hlbGwiKTsNCi12
YXIgRlNPID0gV1NjcmlwdC5DcmVhdGVPYmplY3QoIlNjcmlwdGluZy5GaWxlU3lzdGVtT2JqZWN0
Iik7DQotdmFyIE1GTyA9IG51bGw7DQotdmFyIFNZU1RFTV9EUklWRSA9IFdzaFNoZWxsLkVudmly
b25tZW50KCJQcm9jZXNzIikuSXRlbSgiU3lzdGVtRHJpdmUiKTsNCi12YXIgUFJPR1JBTV9GSUxF
UyA9IFdzaFNoZWxsLkVudmlyb25tZW50KCJQcm9jZXNzIikuSXRlbSgiUHJvZ3JhbUZpbGVzIik7
DQotDQotaWYgKFBST0dSQU1fRklMRVMgPT0gbnVsbCkgew0KLQlQUk9HUkFNX0ZJTEVTID0gIkM6
XFxQcm9ncmFtIEZpbGVzIjsNCi19DQotDQotdmFyIENXRCA9IFdzaFNoZWxsLkN1cnJlbnREaXJl
Y3Rvcnk7DQotDQotaWYgKHR5cGVvZihDV0QpID09ICJ1bmRlZmluZWQiKSB7DQotCUNXRCA9IEZT
Ty5HZXRQYXJlbnRGb2xkZXJOYW1lKEZTTy5HZXRBYnNvbHV0ZVBhdGhOYW1lKCJidWlsZGNvbmYu
YmF0IikpOw0KLX0NCi0NCi1jb25maWd1cmVfYXJncyA9IG5ldyBBcnJheSgpOw0KLWNvbmZpZ3Vy
ZV9zdWJzdCA9IFdTY3JpcHQuQ3JlYXRlT2JqZWN0KCJTY3JpcHRpbmcuRGljdGlvbmFyeSIpOw0K
LQ0KLWNvbmZpZ3VyZV9oZHIgPSBXU2NyaXB0LkNyZWF0ZU9iamVjdCgiU2NyaXB0aW5nLkRpY3Rp
b25hcnkiKTsNCi1idWlsZF9kaXJzID0gbmV3IEFycmF5KCk7DQotDQotZXh0ZW5zaW9uX2luY2x1
ZGVfY29kZSA9ICIiOw0KLWV4dGVuc2lvbl9tb2R1bGVfcHRycyA9ICIiOw0KLQ0KLS8qIGZ1bmN0
aW9ucyAqLw0KLQ0KLWZ1bmN0aW9uIGNvdW50X2dlbmVyYXRlZF9maWxlcygpIHsNCi0NCi0JdmFy
IGRpciA9IEZTTy5HZXRGb2xkZXIoImV4dC9ndGsrIik7DQotCXZhciBjb3VudCA9IDA7DQotDQot
CWl0ZXIgPSBuZXcgRW51bWVyYXRvcihkaXIuRmlsZXMpOw0KLQluYW1lID0gIiI7DQotDQotCWZv
ciAoOyAhaXRlci5hdEVuZCgpOyBpdGVyLm1vdmVOZXh0KCkpIHsNCi0JCW5hbWUgPSBGU08uR2V0
RmlsZU5hbWUoaXRlci5pdGVtKCkpOw0KLQkJaWYgKG5hbWUubWF0Y2gobmV3IFJlZ0V4cCgiZ2Vu
XyIpKSkgew0KLQkJCWNvdW50Kys7DQotCQl9DQotCX0NCi0JcmV0dXJuIGNvdW50Ow0KLX0NCi0N
Ci1mdW5jdGlvbiBnZW5lcmF0ZV9zb3VyY2UoKSB7DQotDQotCXZhciBjb3VudCA9IGNvdW50X2dl
bmVyYXRlZF9maWxlcygpOw0KLQ0KLQlpZiAoY291bnQgPCA4KSB7DQotCQlpZiAoIUZTTy5GaWxl
RXhpc3RzKCJ3aW4zMlxcdGVtcC5iYXQiKSkgew0KLQkJCVNUREVSUi5Xcml0ZUxpbmUoIlJ1biBi
dWlsZGNvbmYgZmlyc3QgLSB0aGUgc291cmNlIGZpbGUgZ2VuZXJhdG9yIGlzIG1pc3NpbmciKTsN
Ci0JCQlXU2NyaXB0LlF1aXQoMTApOw0KLQkJfSBlbHNlIHsNCi0JCQlXc2hTaGVsbC5SdW4oIndp
bjMyXFx0ZW1wIiwgMCk7DQotCQl9DQotCX0NCi0JcmV0dXJuOw0KLX0NCi0NCi1mdW5jdGlvbiBj
aGVja19nZW5lcmF0aW9uKCkgew0KLQ0KLQl2YXIgY291bnQgPSBjb3VudF9nZW5lcmF0ZWRfZmls
ZXMoKTsNCi0NCi0JaWYgKGNvdW50IDwgOCkgew0KLQkJU1RET1VULldyaXRlTGluZSgiV2FpdGlu
ZyBmb3Igc291cmNlIGZpbGVzIHRvIGdlbmVyYXRlLi4uIik7DQotCQlXU2NyaXB0LlNsZWVwKDM1
MDApOw0KLQkJY2hlY2tfZ2VuZXJhdGlvbigpOw0KLQl9DQotCXJldHVybjsNCi19DQotDQotZnVu
Y3Rpb24gZ2V0X3ZlcnNpb25fbnVtYmVycygpIHsNCi0NCi0JLyogcGljayB1cCB0aGUgdmVyc2lv
biBmcm9tIG1haW4vcGhwX2d0ay5oICovDQotCXZhciB2aW4gPSBmaWxlX2dldF9jb250ZW50cygi
bWFpblxccGhwX2d0ay5oIik7DQotCXZhciB2ZXJzaW9uLCB2ZXJzaW9uX3N0cmluZ3MsIG1ham9y
LCBtaW5vciwgZGV0YWlscywgcmVsZWFzZSwgc3VidmVyc2lvbl9zdHJpbmdzLCBleHRyYSA9ICIi
Ow0KLQ0KLQlpZiAodmluLm1hdGNoKG5ldyBSZWdFeHAoIlBIUF9HVEtfVkVSU0lPTiBcIihbXlwi
XSspXCIiKSkpIHsNCi0JCXZlcnNpb24gPSBSZWdFeHAuJDE7DQotCQl2ZXJzaW9uX3N0cmluZ3Mg
PSB2ZXJzaW9uLnNwbGl0KCIuIik7DQotDQotCQltYWpvciA9IHZlcnNpb25fc3RyaW5nc1swXTsN
Ci0JCW1pbm9yID0gdmVyc2lvbl9zdHJpbmdzWzFdOw0KLQkJZGV0YWlscyA9IHZlcnNpb25fc3Ry
aW5nc1syXTsNCi0NCi0JCWlmIChkZXRhaWxzLmluZGV4T2YoIi0iKSA9PSAtMSkgew0KLQkJCXJl
bGVhc2UgPSBkZXRhaWxzOw0KLQkJfSBlbHNlIHsNCi0JCQlzdWJ2ZXJzaW9uX3N0cmluZ3MgPSBk
ZXRhaWxzLnNwbGl0KCItIik7DQotCQkJcmVsZWFzZSA9IHN1YnZlcnNpb25fc3RyaW5nc1swXTsN
Ci0JCQlleHRyYSA9ICItIiArIHN1YnZlcnNpb25fc3RyaW5nc1sxXTsNCi0JCX0NCi0JfQ0KLQ0K
LQl2YXIgdmZpbGUgPSBGU08uQ3JlYXRlVGV4dEZpbGUoIm1haW4vcGhwX2d0a192ZXJzaW9uLmgi
LCB0cnVlKTsNCi0JdmZpbGUuV3JpdGVMaW5lKCIvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxs
eSBnZW5lcmF0ZWQgZHVyaW5nIHdpbjMyIGNvbmZpZ3VyYXRpb24gKi8iKTsNCi0JdmZpbGUuV3Jp
dGVMaW5lKCIvKiBFZGl0IHBocF9ndGsuaCB0byBjaGFuZ2UgdGhlIHZlcnNpb24gbnVtYmVyICov
Iik7DQotCXZmaWxlLldyaXRlTGluZSgiI2RlZmluZSBQSFBfR1RLX01BSk9SX1ZFUlNJT04gIiAr
IG1ham9yKTsNCi0JdmZpbGUuV3JpdGVMaW5lKCIjZGVmaW5lIFBIUF9HVEtfTUlOT1JfVkVSU0lP
TiAiICsgbWlub3IpOw0KLQl2ZmlsZS5Xcml0ZUxpbmUoIiNkZWZpbmUgUEhQX0dUS19SRUxFQVNF
X1ZFUlNJT04gIiArIHJlbGVhc2UpOw0KLQl2ZmlsZS5Xcml0ZUxpbmUoIiNkZWZpbmUgUEhQX0dU
S19FWFRSQV9WRVJTSU9OIFwiIiArIGV4dHJhICsgIlwiIik7DQotDQotCURFRklORSgnUEhQX0dU
S19WRVJTSU9OX1NUUklORycsIHZlcnNpb24pOw0KLX0NCi0NCi1mdW5jdGlvbiBjb25kZW5zZV9w
YXRoKHBhdGgpIHsNCi0NCi0JcGF0aCA9IEZTTy5HZXRBYnNvbHV0ZVBhdGhOYW1lKHBhdGgpOw0K
LQ0KLQlpZiAocGF0aC5zdWJzdHIoMCwgQ1dELmxlbmd0aCkudG9Mb3dlckNhc2UoKQ0KLQkJCT09
IENXRC50b0xvd2VyQ2FzZSgpICYmDQotCQkJKHBhdGguY2hhckNvZGVBdChDV0QubGVuZ3RoKSA9
PSA5MiB8fCBwYXRoLmNoYXJDb2RlQXQoQ1dELmxlbmd0aCkgPT0gNDcpKSB7DQotCQlyZXR1cm4g
cGF0aC5zdWJzdHIoQ1dELmxlbmd0aCArIDEpOw0KLQl9DQotDQotCXZhciBhID0gQ1dELnNwbGl0
KCJcXCIpOw0KLQl2YXIgYiA9IHBhdGguc3BsaXQoIlxcIik7DQotCXZhciBpLCBqOw0KLQ0KLQlm
b3IgKGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykgew0KLQkJaWYgKGFbaV0udG9Mb3dlckNhc2Uo
KSA9PSBiW2ldLnRvTG93ZXJDYXNlKCkpDQotCQkJY29udGludWU7DQotCQlpZiAoaSA+IDApIHsN
Ci0JCQkvKiBmaXJzdCBkaWZmZXJlbmNlIGZvdW5kICovDQotCQkJcGF0aCA9ICIiOw0KLQkJCWZv
ciAoaiA9IDA7IGogPCBhLmxlbmd0aCAtIGk7IGorKykgew0KLQkJCQlwYXRoICs9ICIuLlxcIjsN
Ci0JCQl9DQotCQkJZm9yIChqID0gaTsgaiA8IGIubGVuZ3RoOyBqKyspIHsNCi0JCQkJcGF0aCAr
PSBiW2pdOw0KLQkJCQlpZiAoaiA8IGIubGVuZ3RoIC0gMSkNCi0JCQkJCXBhdGggKz0gIlxcIjsN
Ci0JCQl9DQotCQkJcmV0dXJuIHBhdGg7DQotCQl9DQotCQkvKiBvbiBhIGRpZmZlcmVudCBkcml2
ZSAqLw0KLQkJYnJlYWs7DQotCX0NCi0NCi0JcmV0dXJuIHBhdGg7DQotfQ0KLQ0KLWZ1bmN0aW9u
IENvbmZpZ3VyZUFyZyh0eXBlLCBvcHRuYW1lLCBoZWxwdGV4dCwgZGVmdmFsKSB7DQotDQotCXZh
ciBvcHB0eXBlID0gdHlwZSA9PSAiZW5hYmxlIiA/ICJkaXNhYmxlIiA6ICJ3aXRob3V0IjsNCi0N
Ci0JaWYgKGRlZnZhbCA9PSAieWVzIiB8fCBkZWZ2YWwgPT0gInllcyxzaGFyZWQiKSB7DQotCQl0
aGlzLmFyZyA9ICItLSIgKyBvcHB0eXBlICsgIi0iICsgb3B0bmFtZTsNCi0JCXRoaXMuaW1wYXJn
ID0gIi0tIiArIHR5cGUgKyAiLSIgKyBvcHRuYW1lOw0KLQl9IGVsc2Ugew0KLQkJdGhpcy5hcmcg
PSAiLS0iICsgdHlwZSArICItIiArIG9wdG5hbWU7DQotCQl0aGlzLmltcGFyZyA9ICItLSIgKyBv
cHB0eXBlICsgIi0iICsgb3B0bmFtZTsNCi0JfQ0KLQ0KLQl0aGlzLm9wdG5hbWUgPSBvcHRuYW1l
Ow0KLQl0aGlzLmhlbHB0ZXh0ID0gaGVscHRleHQ7DQotCXRoaXMuZGVmdmFsID0gZGVmdmFsOw0K
LQl0aGlzLnN5bXZhbCA9IG9wdG5hbWUudG9VcHBlckNhc2UoKS5yZXBsYWNlKG5ldyBSZWdFeHAo
Ii0iLCAiZyIpLCAiXyIpOw0KLQl0aGlzLnNlZW4gPSBmYWxzZTsNCi0JdGhpcy5hcmd2YWwgPSBk
ZWZ2YWw7DQotfQ0KLQ0KLWZ1bmN0aW9uIGFuYWx5emVfYXJnKGFyZ3ZhbCkgew0KLQ0KLQl2YXIg
cmV0ID0gbmV3IEFycmF5KCk7DQotCXZhciBzaGFyZWQgPSBmYWxzZTsNCi0NCi0JaWYgKGFyZ3Zh
bCA9PSAic2hhcmVkIikgew0KLQkJc2hhcmVkID0gdHJ1ZTsNCi0JCWFyZ3ZhbCA9ICJ5ZXMiOw0K
LQl9IGVsc2UgaWYgKGFyZ3ZhbCA9PSBudWxsKSB7DQotCQkvKiBub3RoaW5nICovDQotCX0gZWxz
ZSBpZiAoYXJnX21hdGNoID0gYXJndmFsLm1hdGNoKG5ldyBSZWdFeHAoIl5zaGFyZWQsKC4qKSIp
KSkgew0KLQkJc2hhcmVkID0gdHJ1ZTsNCi0JCWFyZ3ZhbCA9IGFyZ19tYXRjaFsxXTsNCi0JfSBl
bHNlIGlmIChhcmdfbWF0Y2ggPSBhcmd2YWwubWF0Y2gobmV3IFJlZ0V4cCgiXiguKiksc2hhcmVk
JCIpKSkgew0KLQkJc2hhcmVkID0gdHJ1ZTsNCi0JCWFyZ3ZhbCA9IGFyZ19tYXRjaFsxXTsNCi0J
fQ0KLQ0KLQlyZXRbMF0gPSBzaGFyZWQ7DQotCXJldFsxXSA9IGFyZ3ZhbDsNCi0JcmV0dXJuIHJl
dDsNCi19DQotDQotZnVuY3Rpb24gY29uZl9wcm9jZXNzX2FyZ3MoKSB7DQotDQotCXZhciBpLCBq
Ow0KLQl2YXIgY29uZmlndXJlX2hlbHBfbW9kZSA9IGZhbHNlOw0KLQl2YXIgYW5hbHl6ZWQgPSBm
YWxzZTsNCi0JdmFyIG5pY2UgPSAiY3NjcmlwdCAvbm9sb2dvIGNvbmZpZ3VyZS5qcyAiOw0KLQl2
YXIgZGlzYWJsZV9hbGwgPSBmYWxzZTsNCi0NCi0JYXJncyA9IFdTY3JpcHQuQXJndW1lbnRzOw0K
LQlmb3IgKGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgew0KLQkJYXJnID0gYXJncyhpKTsN
Ci0JCW5pY2UgKz0gJyAiJyArIGFyZyArICciJzsNCi0JCWlmIChhcmcgPT0gIi0taGVscCIpIHsN
Ci0JCQljb25maWd1cmVfaGVscF9tb2RlID0gdHJ1ZTsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWlm
IChhcmcgPT0gIi0tZGlzYWJsZS1hbGwiKSB7DQotCQkJZGlzYWJsZV9hbGwgPSB0cnVlOw0KLQkJ
CWNvbnRpbnVlOw0KLQkJfQ0KLQ0KLQkJLy8gSWYgaXQgaXMgLS1mb289YmFyLCBzcGxpdCBvbiB0
aGUgZXF1YWxzIHNpZ24NCi0JCWFyZyA9IGFyZy5zcGxpdCgiPSIsIDIpOw0KLQkJYXJnbmFtZSA9
IGFyZ1swXTsNCi0JCWlmIChhcmcubGVuZ3RoID4gMSkgew0KLQkJCWFyZ3ZhbCA9IGFyZ1sxXTsN
Ci0JCX0gZWxzZSB7DQotCQkJYXJndmFsID0gbnVsbDsNCi0JCX0NCi0NCi0JCS8vIEZpbmQgdGhl
IGFyZw0KLQkJZm91bmQgPSBmYWxzZTsNCi0JCWZvciAoaiA9IDA7IGogPCBjb25maWd1cmVfYXJn
cy5sZW5ndGg7IGorKykgew0KLQkJCWlmIChhcmduYW1lID09IGNvbmZpZ3VyZV9hcmdzW2pdLmlt
cGFyZyB8fCBhcmduYW1lID09IGNvbmZpZ3VyZV9hcmdzW2pdLmFyZykgew0KLQkJCQlmb3VuZCA9
IHRydWU7DQotDQotCQkJCWFyZyA9IGNvbmZpZ3VyZV9hcmdzW2pdOw0KLQkJCQlhcmcuc2VlbiA9
IHRydWU7DQotDQotCQkJCWFuYWx5emVkID0gYW5hbHl6ZV9hcmcoYXJndmFsKTsNCi0JCQkJc2hh
cmVkID0gYW5hbHl6ZWRbMF07DQotCQkJCWFyZ3ZhbCA9IGFuYWx5emVkWzFdOw0KLQ0KLQkJCQlp
ZiAoYXJnbmFtZSA9PSBhcmcuaW1wYXJnKSB7DQotCQkJCQkvKiB3ZSBtYXRjaGVkIHRoZSBpbXBs
aWNpdCwgb3IgZGVmYXVsdCBhcmcgKi8NCi0JCQkJCWlmIChhcmd2YWwgPT0gbnVsbCkgew0KLQkJ
CQkJCWFyZ3ZhbCA9IGFyZy5kZWZ2YWw7DQotCQkJCQl9DQotCQkJCX0gZWxzZSB7DQotCQkJCQkv
KiB3ZSBtYXRjaGVkIHRoZSBub24tZGVmYXVsdCBhcmcgKi8NCi0JCQkJCWlmIChhcmd2YWwgPT0g
bnVsbCkgew0KLQkJCQkJCWFyZ3ZhbCA9IGFyZy5kZWZ2YWwgPT0gIm5vIiA/ICJ5ZXMiIDogIm5v
IjsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJYXJnLmFyZ3ZhbCA9IGFyZ3ZhbDsNCi0J
CQkJZXZhbCgiUEhQX0dUS18iICsgYXJnLnN5bXZhbCArICIgPSBhcmd2YWw7Iik7DQotCQkJCWV2
YWwoIlBIUF9HVEtfIiArIGFyZy5zeW12YWwgKyAiX1NIQVJFRCA9IHNoYXJlZDsiKTsNCi0JCQkJ
YnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKCFmb3VuZCkgew0KLQkJCVNUREVSUi5Xcml0ZUxp
bmUoIlVua25vd24gb3B0aW9uICIgKyBhcmduYW1lKQ0KLQkJCVNUREVSUi5Xcml0ZUxpbmUoIlBs
ZWFzZSB0cnkgY29uZmlndXJlLmpzIC0taGVscCBmb3IgYSBsaXN0IG9mIHZhbGlkIG9wdGlvbnMi
KTsNCi0JCQlXU2NyaXB0LlF1aXQoMik7DQotCQl9DQotCX0NCi0NCi0JaWYgKGNvbmZpZ3VyZV9o
ZWxwX21vZGUpIHsNCi0JCVNURE9VVC5Xcml0ZUJsYW5rTGluZXMoMSk7DQotCQlTVERPVVQuV3Jp
dGVMaW5lKCIgIFRoZXJlIGFyZSBubyBQSFAtR1RLIGV4dGVuc2lvbnMgYXZhaWxhYmxlIGF0IHBy
ZXNlbnQuIik7DQotCQlTVERPVVQuV3JpdGVCbGFua0xpbmVzKDEpOw0KLQ0KLQkJLy8gTWVhc3Vy
ZSB3aWR0aCB0byBwcmV0dHktcHJpbnQgdGhlIG91dHB1dA0KLQkJbWF4X3dpZHRoID0gMDsNCi0J
CWZvciAoaSA9IDA7IGkgPCBjb25maWd1cmVfYXJncy5sZW5ndGg7IGkrKykgew0KLQkJCWFyZyA9
IGNvbmZpZ3VyZV9hcmdzW2ldOw0KLQkJCWlmIChhcmcuYXJnLmxlbmd0aCA+IG1heF93aWR0aCkg
ew0KLQkJCQltYXhfd2lkdGggPSBhcmcuYXJnLmxlbmd0aDsNCi0JCQl9DQotCQl9DQotDQotCQlm
b3IgKGkgPSAwOyBpIDwgY29uZmlndXJlX2FyZ3MubGVuZ3RoOyBpKyspIHsNCi0JCQlhcmcgPSBj
b25maWd1cmVfYXJnc1tpXTsNCi0NCi0JCQluID0gbWF4X3dpZHRoIC0gYXJnLmFyZy5sZW5ndGg7
DQotCQkJcGFkID0gIiAgICI7DQotCQkJZm9yIChqID0gMDsgaiA8IG47IGorKykgew0KLQkJCQlw
YWQgKz0gIiAiOw0KLQkJCX0NCi0JCQlTVERPVVQuV3JpdGVMaW5lKCIgICIgKyBhcmcuYXJnICsg
cGFkICsgd29yZF93cmFwX2FuZF9pbmRlbnQobWF4X3dpZHRoICsgNSwgYXJnLmhlbHB0ZXh0KSk7
DQotCQl9DQotCQlXU2NyaXB0LlF1aXQoMSk7DQotDQotCX0gZWxzZSB7IC8vIG5vdCAtLWhlbHAN
Ci0NCi0JCWdlbmVyYXRlX3NvdXJjZSgpOw0KLQl9DQotDQotCS8vIE5vdyBzZXQgYW55IGRlZmF1
bHRzIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIG91dCBlYXJsaWVyDQotCWZvciAoaSA9IDA7IGkgPCBj
b25maWd1cmVfYXJncy5sZW5ndGg7IGkrKykgew0KLQkJYXJnID0gY29uZmlndXJlX2FyZ3NbaV07
DQotCQlpZiAoYXJnLnNlZW4pDQotCQkJY29udGludWU7DQotCQlhbmFseXplZCA9IGFuYWx5emVf
YXJnKGFyZy5kZWZ2YWwpOw0KLQkJc2hhcmVkID0gYW5hbHl6ZWRbMF07DQotCQlhcmd2YWwgPSBh
bmFseXplZFsxXTsNCi0NCi0JCWlmIChkaXNhYmxlX2FsbCkgew0KLQkJCWFyZ3ZhbCA9ICJubyI7
DQotCQkJc2hhcmVkID0gZmFsc2U7DQotCQl9DQotDQotCQlldmFsKCJQSFBfR1RLXyIgKyBhcmcu
c3ltdmFsICsgIiA9IGFyZ3ZhbDsiKTsNCi0JCWV2YWwoIlBIUF9HVEtfIiArIGFyZy5zeW12YWwg
KyAiX1NIQVJFRCA9IHNoYXJlZDsiKTsNCi0JfQ0KLQ0KLQlNRk8gPSBGU08uQ3JlYXRlVGV4dEZp
bGUoIk1ha2VmaWxlLm9iamVjdHMiLCB0cnVlKTsNCi0NCi0JU1RET1VULldyaXRlQmxhbmtMaW5l
cygxKTsNCi0JU1RET1VULldyaXRlTGluZSgiU2F2aW5nIGNvbmZpZ3VyZSBvcHRpb25zIHRvIGNv
bmZpZ3VyZS5iYXQiKTsNCi0JdmFyIG5pY2VmaWxlID0gRlNPLkNyZWF0ZVRleHRGaWxlKCJjb25m
aWd1cmUuYmF0IiwgdHJ1ZSk7DQotCW5pY2VmaWxlLldyaXRlTGluZShuaWNlKTsNCi0JbmljZWZp
bGUuQ2xvc2UoKTsNCi0NCi0JQUNfREVGSU5FKCdDT05GSUdVUkVfQ09NTUFORCcsIG5pY2UpOw0K
LX0NCi0NCi1mdW5jdGlvbiBmaW5kX3BhdHRlcm5faW5fcGF0aChwYXR0ZXJuLCBwYXRoKSB7DQot
DQotCWlmIChwYXRoID09IG51bGwpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQl2YXIg
ZGlycyA9IHBhdGguc3BsaXQoJzsnKTsNCi0JdmFyIGk7DQotCXZhciBpdGVtczsNCi0NCi0JZm9y
IChpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsNCi0JCWl0ZW1zID0gZ2xvYihkaXJzW2ld
ICsgIlxcIiArIHBhdHRlcm4pOw0KLQkJaWYgKGl0ZW1zKSB7DQotCQkJcmV0dXJuIGNvbmRlbnNl
X3BhdGgoaXRlbXNbMF0pOw0KLQkJfQ0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotDQotZnVu
Y3Rpb24gQVJHX1dJVEgob3B0bmFtZSwgaGVscHRleHQsIGRlZnZhbCkgew0KLQ0KLQljb25maWd1
cmVfYXJnc1tjb25maWd1cmVfYXJncy5sZW5ndGhdID0gbmV3IENvbmZpZ3VyZUFyZygid2l0aCIs
IG9wdG5hbWUsIGhlbHB0ZXh0LCBkZWZ2YWwpOw0KLX0NCi0NCi1mdW5jdGlvbiBBUkdfRU5BQkxF
KG9wdG5hbWUsIGhlbHB0ZXh0LCBkZWZ2YWwpIHsNCi0NCi0JY29uZmlndXJlX2FyZ3NbY29uZmln
dXJlX2FyZ3MubGVuZ3RoXSA9IG5ldyBDb25maWd1cmVBcmcoImVuYWJsZSIsIG9wdG5hbWUsIGhl
bHB0ZXh0LCBkZWZ2YWwpOw0KLX0NCi0NCi1mdW5jdGlvbiBERUZJTkUobmFtZSwgdmFsdWUpIHsN
Ci0NCi0JaWYgKGNvbmZpZ3VyZV9zdWJzdC5FeGlzdHMobmFtZSkpIHsNCi0JCWNvbmZpZ3VyZV9z
dWJzdC5SZW1vdmUobmFtZSk7DQotCX0NCi0JY29uZmlndXJlX3N1YnN0LkFkZChuYW1lLCB2YWx1
ZSk7DQotfQ0KLQ0KLWZ1bmN0aW9uIEFDX0RFRklORShuYW1lLCB2YWx1ZSwgY29tbWVudCwgcXVv
dGUpIHsNCi0NCi0JaWYgKHF1b3RlID09IG51bGwpIHsNCi0JCXF1b3RlID0gdHJ1ZTsNCi0JfQ0K
LQlpZiAocXVvdGUgJiYgdHlwZW9mKHZhbHVlKSA9PSAic3RyaW5nIikgew0KLQkJdmFsdWUgPSAn
IicgKyB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoJyhbIlxcXFxdKScsICJnIiksICdcXCQxJykg
KyAnIic7DQotCX0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID09IDApIHsNCi0JCXZhbHVlID0gJyIi
JzsNCi0JfQ0KLQl2YXIgaXRlbSA9IG5ldyBBcnJheSh2YWx1ZSwgY29tbWVudCk7DQotCWlmIChj
b25maWd1cmVfaGRyLkV4aXN0cyhuYW1lKSkgew0KLQkJdmFyIG9yaWdfaXRlbSA9IGNvbmZpZ3Vy
ZV9oZHIuSXRlbShuYW1lKTsNCi0JCVNURE9VVC5Xcml0ZUxpbmUoIkFDX0RFRklORVsiICsgbmFt
ZSArICJdPSIgKyB2YWx1ZSArICI6IGlzIGFscmVhZHkgZGVmaW5lZCB0byAiICsgaXRlbVswXSk7
DQotCX0gZWxzZSB7DQotCQljb25maWd1cmVfaGRyLkFkZChuYW1lLCBpdGVtKTsNCi0JfQ0KLX0N
Ci0NCi1mdW5jdGlvbiBQQVRIX1BST0cocHJvZ25hbWUsIGFkZGl0aW9uYWxfcGF0aHMsIHN5bWJv
bCkgew0KLQ0KLQl2YXIgZXhlOw0KLQl2YXIgcGxhY2U7DQotCXZhciBjeWdfcGF0aCA9IFBIUF9H
VEtfQ1lHV0lOICsgIlxcYmluOyIgKyBQSFBfR1RLX0NZR1dJTiArICJcXHVzclxcbG9jYWxcXGJp
biI7DQotDQotCWV4ZSA9IHByb2duYW1lICsgIi5leGUiOw0KLQ0KLQlpZiAoYWRkaXRpb25hbF9w
YXRocyA9PSBudWxsKSB7DQotCQlhZGRpdGlvbmFsX3BhdGhzID0gY3lnX3BhdGg7DQotCX0gZWxz
ZSB7DQotCQlhZGRpdGlvbmFsX3BhdGhzICs9ICI7IiArIGN5Z19wYXRoOw0KLQl9DQotDQotCXBs
YWNlID0gc2VhcmNoX3BhdGhzKGV4ZSwgYWRkaXRpb25hbF9wYXRocywgIlBBVEgiKTsNCi0NCi0J
aWYgKHBsYWNlID09IHRydWUpIHsNCi0JCXBsYWNlID0gZXhlOw0KLQl9IGVsc2UgaWYgKHBsYWNl
ICE9IGZhbHNlKSB7DQotDQotCQlpZiAocGxhY2UubGFzdEluZGV4T2YoIlxcIikgIT0gcGxhY2Uu
bGVuZ3RoIC0gMSkgew0KLQkJCXBsYWNlICs9ICJcXCI7DQotCQl9DQotDQotCQlwbGFjZSA9IHBs
YWNlICsgZXhlOw0KLQ0KLQkJaWYgKHBsYWNlLmluZGV4T2YoIiAiKSkgew0KLQkJCXBsYWNlID0g
JyInICsgcGxhY2UgKyAnIic7DQotCQl9DQotCX0NCi0NCi0JaWYgKHBsYWNlKSB7DQotCQlpZiAo
c3ltYm9sID09IG51bGwpIHsNCi0JCQlzeW1ib2wgPSBwcm9nbmFtZS50b1VwcGVyQ2FzZSgpOw0K
LQkJfQ0KLQkJREVGSU5FKHN5bWJvbCwgcGxhY2UpOw0KLQl9DQotCXJldHVybiBwbGFjZTsNCi19
DQotDQotZnVuY3Rpb24gQ0hFQ0tfTElCKGxpYm5hbWVzLCB0YXJnZXQsIHBhdGhfdG9fY2hlY2ss
IGNvbW1vbl9uYW1lKSB7DQotDQotCVNURE9VVC5Xcml0ZSgiQ2hlY2tpbmcgZm9yICIgKyBsaWJu
YW1lcyArICIgLi4uICIpOw0KLQ0KLQlpZiAoY29tbW9uX25hbWUgPT0gbnVsbCAmJiB0YXJnZXQg
IT0gbnVsbCkgew0KLQkJY29tbW9uX25hbWUgPSB0YXJnZXQ7DQotCX0NCi0NCi0JaWYgKHBhdGhf
dG9fY2hlY2sgPT0gbnVsbCkgew0KLQkJcGF0aF90b19jaGVjayA9ICIiOw0KLQl9DQotDQotCS8v
IGlmIHRoZXkgc3BlY2lmaWVkIGEgY29tbW9uIG5hbWUgZm9yIHRoZSBwYWNrYWdlIHRoYXQgY29u
dGFpbnMNCi0JLy8gdGhlIGxpYnJhcnksIHRhZyBzb21lIHVzZWZ1bCBkZWZhdWx0cyBvbiB0byB0
aGUgZW5kIG9mIHRoZQ0KLQkvLyBwYXRoIHRvIGJlIHNlYXJjaGVkDQotCWlmIChjb21tb25fbmFt
ZSAhPSBudWxsKSB7DQotCQlwYXRoX3RvX2NoZWNrICs9ICI7Li5cXCIgKyBjb21tb25fbmFtZSAr
ICIqIjsNCi0JfQ0KLQ0KLQkvLyBEZXRlcm1pbmUgdGFyZ2V0IGZvciBidWlsZCBmbGFncw0KLQlp
ZiAodGFyZ2V0ID09IG51bGwpIHsNCi0JCXRhcmdldCA9ICIiOw0KLQl9IGVsc2Ugew0KLQkJdGFy
Z2V0ID0gIl8iICsgdGFyZ2V0LnRvVXBwZXJDYXNlKCkucmVwbGFjZShuZXcgUmVnRXhwKCItIiwg
ImciKSwgIl8iKTsNCi0JfQ0KLQ0KLQkvLyBFeHBhbmQgcGF0aCB0byBpbmNsdWRlIGdlbmVyYWwg
ZGlycw0KLQlwYXRoX3RvX2NoZWNrICs9ICI7IiArIHBocF91c3VhbF9saWJfc3VzcGVjdHM7DQot
DQotCS8vIEl0IGlzIGNvbW1vbiBwcmFjdGljZSB0byBwdXQgbGlicyB1bmRlciBvbmUgb2YgdGhl
c2UgZGlyIG5hbWVzDQotCXZhciBzdWJkaXJzID0gbmV3IEFycmF5KFBIUF9HVEtfREVCVUcgPT0g
InllcyIgPyAiRGVidWciIDogIlJlbGVhc2UiLCAibGliIiwgImxpYnMiLCAibGliZXhlYyIpOw0K
LQ0KLQkvLyBsaWJuYW1lcyBjYW4gYmUgOyBzZXBhcmF0ZWQgbGlzdCBvZiBhY2NlcHRlZCBsaWJy
YXJ5IG5hbWVzDQotCWxpYm5hbWVzID0gbGlibmFtZXMuc3BsaXQoJzsnKTsNCi0NCi0JdmFyIGks
IGosIGssIGxpYm5hbWU7DQotCXZhciBsb2NhdGlvbiA9IGZhbHNlOw0KLQl2YXIgcGF0aCA9IHBh
dGhfdG9fY2hlY2suc3BsaXQoJzsnKTsNCi0JDQotCWZvciAoaSA9IDA7IGkgPCBsaWJuYW1lcy5s
ZW5ndGg7IGkrKykgew0KLQkJbGlibmFtZSA9IGxpYm5hbWVzW2ldOw0KLQ0KLQkJZm9yIChrID0g
MDsgayA8IHBhdGgubGVuZ3RoOyBrKyspIHsNCi0JCQlsb2NhdGlvbiA9IGdsb2IocGF0aFtrXSAr
ICJcXCIgKyBsaWJuYW1lKTsNCi0JCQlpZiAobG9jYXRpb24pIHsNCi0JCQkJbG9jYXRpb24gPSBs
b2NhdGlvblswXTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWZvciAoaiA9IDA7IGogPCBzdWJk
aXJzLmxlbmd0aDsgaisrKSB7DQotCQkJCWxvY2F0aW9uID0gZ2xvYihwYXRoW2tdICsgIlxcIiAr
IHN1YmRpcnNbal0gKyAiXFwiICsgbGlibmFtZSk7DQotCQkJCWlmIChsb2NhdGlvbikgew0KLQkJ
CQkJbG9jYXRpb24gPSBsb2NhdGlvblswXTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0K
LQkJCWlmIChsb2NhdGlvbikNCi0JCQkJYnJlYWs7DQotCQl9DQotDQotCQlpZiAobG9jYXRpb24p
IHsNCi0JCQlsb2NhdGlvbiA9IGNvbmRlbnNlX3BhdGgobG9jYXRpb24pOw0KLQkJCXZhciBsaWJk
aXIgPSBGU08uR2V0UGFyZW50Rm9sZGVyTmFtZShsb2NhdGlvbik7DQotCQkJbGlibmFtZSA9IEZT
Ty5HZXRGaWxlTmFtZShsb2NhdGlvbik7DQotCQkJQUREX0ZMQUcoIkxERkxBR1MiICsgdGFyZ2V0
LCAnL2xpYnBhdGg6IicgKyBsaWJkaXIgKyAnIiAnKTsNCi0JCQlBRERfRkxBRygiTElCUyIgKyB0
YXJnZXQsIGxpYm5hbWUpOw0KLQ0KLQkJCVNURE9VVC5Xcml0ZUxpbmUoCWxvY2F0aW9uKTsNCi0N
Ci0JCQlyZXR1cm4gbG9jYXRpb247DQotCQl9DQotDQotCQkvLyBDaGVjayBpbiB0aGVpciBzdGFu
ZGFyZCBsaWIgcGF0aA0KLQkJbG9jYXRpb24gPSBmaW5kX3BhdHRlcm5faW5fcGF0aChsaWJuYW1l
LCBXc2hTaGVsbC5FbnZpcm9ubWVudCgiUHJvY2VzcyIpLkl0ZW0oIkxJQiIpKTsNCi0NCi0JCWlm
IChsb2NhdGlvbikgew0KLQkJCWxvY2F0aW9uID0gY29uZGVuc2VfcGF0aChsb2NhdGlvbik7DQot
CQkJbGlibmFtZSA9IEZTTy5HZXRGaWxlTmFtZShsb2NhdGlvbik7DQotCQkJQUREX0ZMQUcoIkxJ
QlMiICsgdGFyZ2V0LCBsaWJuYW1lKTsNCi0NCi0JCQlTVERPVVQuV3JpdGVMaW5lKCIJPGluIExJ
QiBwYXRoPiAiICsgbGlibmFtZSk7DQotCQkJcmV0dXJuIGxvY2F0aW9uOw0KLQkJfQ0KLQl9DQot
DQotCVNURE9VVC5Xcml0ZUxpbmUoIgk8bm90IGZvdW5kPiIpOw0KLQ0KLQlyZXR1cm4gZmFsc2U7
DQotfQ0KLQ0KLWZ1bmN0aW9uIENIRUNLX0hFQURFUihoZWFkZXJfbmFtZSwgcGF0aF90b19jaGVj
aykgew0KLQ0KLQl2YXIgcGF0aCA9IHNlYXJjaF9wYXRocyhoZWFkZXJfbmFtZSwgcGF0aF90b19j
aGVjaywgIklOQ0xVREUiKTsNCi0NCi0JaWYgKCFwYXRoKSB7DQotCQlFUlJPUigiQWJvcnRpbmcg
Y29uZmlndXJlIHByb2Nlc3MiKTsNCi0JfQ0KLQ0KLQlyZXR1cm4gcGF0aDsNCi19DQotDQotLy8g
dXNlIHRoaXMgZm9yIHZlcnNpb24gY2hlY2tpbmcNCi1mdW5jdGlvbiBHUkVQX0hFQURFUihoZWFk
ZXJfbmFtZSwgcmVnZXgsIHBhdGhfdG9fY2hlY2spIHsNCi0NCi0JdmFyIGMgPSBmYWxzZTsNCi0N
Ci0JaWYgKEZTTy5GaWxlRXhpc3RzKHBhdGhfdG9fY2hlY2sgKyAiXFwiICsgaGVhZGVyX25hbWUp
KSB7DQotCQljID0gZmlsZV9nZXRfY29udGVudHMocGF0aF90b19jaGVjayArICJcXCIgKyBoZWFk
ZXJfbmFtZSk7DQotCX0NCi0NCi0JaWYgKCFjKSB7DQotCQkvKiBsb29rIGluIHRoZSBpbmNsdWRl
IHBhdGggKi8NCi0NCi0JCXZhciBwID0gc2VhcmNoX3BhdGhzKGhlYWRlcl9uYW1lLCBwYXRoX3Rv
X2NoZWNrLCAiSU5DTFVERSIpOw0KLQ0KLQkJaWYgKHR5cGVvZihwKSA9PSAic3RyaW5nIikgew0K
LQkJCWMgPSBmaWxlX2dldF9jb250ZW50cyhwKTsNCi0JCX0NCi0NCi0JCWlmICghYykgew0KLQkJ
CXJldHVybiBmYWxzZTsNCi0JCX0NCi0JfQ0KLQ0KLQlpZiAodHlwZW9mKHJlZ2V4KSA9PSAic3Ry
aW5nIikgew0KLQkJcmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4KTsNCi0JfQ0KLQ0KLQlpZiAoYy5t
YXRjaChyZWdleCkpIHsNCi0JCS8qIGNhbGxlciBjYW4gbm93IHVzZSBSZWdFeHAuJDEgZXRjLiB0
byBnZXQgYXQgcGF0dGVybnMgKi8NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCXJldHVybiBmYWxz
ZTsNCi19DQotDQotZnVuY3Rpb24gQ0hFQ0tfSEVBREVSX0FERF9JTkNMVURFKGhlYWRlcl9uYW1l
LCBmbGFnX25hbWUsIHBhdGhfdG9fY2hlY2ssIHVzZV9lbnYsIGFkZF9kaXJfcGFydCwgYWRkX3Rv
X2ZsYWdfb25seSkgew0KLQ0KLQl2YXIgZGlyX3BhcnRfdG9fYWRkID0gIiI7DQotDQotCWlmICh1
c2VfZW52ID09IG51bGwpIHsNCi0JCXVzZV9lbnYgPSB0cnVlOw0KLQl9DQotDQotCS8vIGlmIHRy
dWUsIGFkZCB0aGUgZGlyIHBhcnQgb2YgdGhlIGhlYWRlcl9uYW1lIHRvIHRoZSBpbmNsdWRlIHBh
dGgNCi0JaWYgKGFkZF9kaXJfcGFydCA9PSBudWxsKSB7DQotCQlhZGRfZGlyX3BhcnQgPSBmYWxz
ZTsNCi0JfSBlbHNlIGlmIChhZGRfZGlyX3BhcnQpIHsNCi0JCXZhciBiYXNlbmFtZSA9IEZTTy5H
ZXRGaWxlTmFtZShoZWFkZXJfbmFtZSk7DQotCQlkaXJfcGFydF90b19hZGQgPSAiXFwiICsgaGVh
ZGVyX25hbWUuc3Vic3RyKDAsIGhlYWRlcl9uYW1lLmxlbmd0aCAtIGJhc2VuYW1lLmxlbmd0aCAt
IDEpOw0KLQl9DQotDQotCWlmIChwYXRoX3RvX2NoZWNrID09IG51bGwpIHsNCi0JCXBhdGhfdG9f
Y2hlY2sgPSBwaHBfdXN1YWxfaW5jbHVkZV9zdXNwZWN0czsNCi0JfSBlbHNlIHsNCi0JCXBhdGhf
dG9fY2hlY2sgKz0gIjsiICsgcGhwX3VzdWFsX2luY2x1ZGVfc3VzcGVjdHM7DQotCX0NCi0JDQot
CXZhciBwID0gc2VhcmNoX3BhdGhzKGhlYWRlcl9uYW1lLCBwYXRoX3RvX2NoZWNrLCB1c2VfZW52
ID8gIklOQ0xVREUiIDogbnVsbCk7DQotCXZhciBoYXZlID0gMDsNCi0JdmFyIHN5bTsNCi0NCi0J
aWYgKHR5cGVvZihwKSA9PSAic3RyaW5nIikgew0KLQkJQUREX0ZMQUcoZmxhZ19uYW1lLCAnL0kg
IicgKyBwICsgZGlyX3BhcnRfdG9fYWRkICsgJyIgJyk7DQotCX0NCi0NCi0JaGF2ZSA9IHAgPyAx
IDogMA0KLQ0KLQlzeW0gPSBoZWFkZXJfbmFtZS50b1VwcGVyQ2FzZSgpOw0KLQlzeW0gPSBzeW0u
cmVwbGFjZShuZXcgUmVnRXhwKCJbXFxcXC9cLi1dIiwgImciKSwgIl8iKTsNCi0NCi0JaWYgKHR5
cGVvZihhZGRfdG9fZmxhZ19vbmx5KSA9PSAidW5kZWZpbmVkIiAmJg0KLQkJCWZsYWdfbmFtZS5t
YXRjaChuZXcgUmVnRXhwKCJeQ0ZMQUdTXyguKikkIikpKSB7DQotCQlhZGRfdG9fZmxhZ19vbmx5
ID0gdHJ1ZTsNCi0JfQ0KLQ0KLQlpZiAodHlwZW9mKGFkZF90b19mbGFnX29ubHkpICE9ICJ1bmRl
ZmluZWQiKSB7DQotCQlBRERfRkxBRyhmbGFnX25hbWUsICIvRCBIQVZFXyIgKyBzeW0gKyAiPSIg
KyBoYXZlKTsNCi0JfSBlbHNlIHsNCi0JCUFDX0RFRklORSgiSEFWRV8iICsgc3ltLCBoYXZlLCAi
aGF2ZSB0aGUgIiArIGhlYWRlcl9uYW1lICsgIiBoZWFkZXIgZmlsZSIpOw0KLQl9DQotDQotCXJl
dHVybiBwOw0KLX0NCi0NCi0vKiBBZGQgYSBkZXBlbmRlbmN5LCBzbyB0aGF0IFBIUC1HVEsgaXMg
YnVpbHQgYmVmb3JlIGFueSBvZiBpdHMgZXh0ZW5zaW9ucyAqLw0KLWZ1bmN0aW9uIEFERF9FWFRF
TlNJT05fREVQKGV4dG5hbWUsIGRlcGVuZHNvbiwgb3B0aW9uYWwpIHsNCi0NCi0JdmFyIEVYVCA9
IGV4dG5hbWUudG9VcHBlckNhc2UoKTsNCi0JdmFyIERFUCA9IGRlcGVuZHNvbi50b1VwcGVyQ2Fz
ZSgpOw0KLQl2YXIgZGVwX3ByZXNlbnQgPSBmYWxzZTsNCi0JdmFyIGRlcF9zaGFyZWQgPSBmYWxz
ZTsNCi0NCi0JdHJ5IHsNCi0JCWRlcF9wcmVzZW50ID0gZXZhbCgiUEhQX0dUS18iICsgREVQKTsN
Ci0JCWRlcF9zaGFyZWQgPSBldmFsKCJQSFBfR1RLXyIgKyBERVAgKyAiX1NIQVJFRCIpOw0KLQl9
IGNhdGNoIChlKSB7DQotCQlkZXBfcHJlc2VudCA9ICJubyI7DQotCQlkZXBfc2hhcmVkID0gZmFs
c2U7DQotCX0NCi0JDQotCWlmIChvcHRpb25hbCkgew0KLQkJaWYgKGRlcF9wcmVzZW50ID09ICJu
byIpDQotCQkJcmV0dXJuOw0KLQl9DQotDQotCXZhciBleHRfc2hhcmVkID0gZXZhbCgiUEhQX0dU
S18iICsgRVhUICsgIl9TSEFSRUQiKTsNCi0NCi0JaWYgKGRlcF9zaGFyZWQpIHsNCi0JCUFERF9G
TEFHKCJMREZMQUdTXyIgKyBFWFQsICIvbGlicGF0aDokKEJVSUxEX0RJUikiKTsNCi0JCUFERF9G
TEFHKCJMSUJTXyIgKyBFWFQsICJwaHBfIiArIGRlcGVuZHNvbiArICIubGliIik7DQotCQlBRERf
RkxBRygiREVQU18iICsgRVhULCAiJChCVUlMRF9ESVIpXFxwaHBfIiArIGRlcGVuZHNvbiArICIu
bGliIik7DQotCX0NCi19DQotDQotZnVuY3Rpb24gRVhURU5TSU9OKGV4dG5hbWUsIGZpbGVfbGlz
dCwgc2hhcmVkLCBjZmxhZ3MsIGRsbG5hbWUsIG9ial9kaXIpIHsNCi0NCi0JdmFyIG9ianMgPSBu
dWxsOw0KLQl2YXIgRVhUID0gZXh0bmFtZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UobmV3IFJlZ0V4
cCgiLSIsICJnIiksICJfIik7DQotCXZhciBleHRuYW1lX2Zvcl9wcmludGluZzsNCi0NCi0JaWYg
KHNoYXJlZCA9PSBudWxsKSB7DQotCQlldmFsKCJzaGFyZWQgPSBQSFBfR1RLXyIgKyBFWFQgKyAi
X1NIQVJFRDsiKTsNCi0JfQ0KLQ0KLQlpZiAoY2ZsYWdzID09IG51bGwpIHsNCi0JCWNmbGFncyA9
ICIiOw0KLQl9DQotDQotCWlmICh0eXBlb2Yob2JqX2RpcikgPT0gInVuZGVmaW5lZCIpIHsNCi0N
Ci0JCWV4dG5hbWVfZm9yX3ByaW50aW5nID0gY29uZmlndXJlX21vZHVsZV9kaXJuYW1lOw0KLQ0K
LQl9IGVsc2Ugew0KLQ0KLQkJZXh0bmFtZV9mb3JfcHJpbnRpbmcgPSBjb25maWd1cmVfbW9kdWxl
X2Rpcm5hbWUgKyAiICh2aWEgIiArIG9ial9kaXIgKyAiKSI7DQotCX0NCi0NCi0JU1RET1VULldy
aXRlTGluZSgiRW5hYmxpbmcgZXh0ZW5zaW9uICIgKyBleHRuYW1lX2Zvcl9wcmludGluZyArICIg
W3NoYXJlZF0iKTsNCi0JY2ZsYWdzID0gIi9EIENPTVBJTEVfRExfIiArIEVYVCArICIyIC9EICIg
KyBFWFQgKyAiX0VYUE9SVFM9MSIgKyBjZmxhZ3M7DQotDQotCU1GTy5Xcml0ZUJsYW5rTGluZXMo
MSk7DQotCU1GTy5Xcml0ZUxpbmUoIiMgb2JqZWN0cyBmb3IgRVhUICIgKyBleHRuYW1lKTsNCi0J
TUZPLldyaXRlQmxhbmtMaW5lcygxKTsNCi0NCi0JQUREX1NPVVJDRVMoY29uZmlndXJlX21vZHVs
ZV9kaXJuYW1lLCBmaWxlX2xpc3QsIGV4dG5hbWUsIG9ial9kaXIpOw0KLQ0KLQlNRk8uV3JpdGVC
bGFua0xpbmVzKDEpOw0KLQ0KLQkvLyBQSFAtR1RLIGFuZCBpdHMgZXh0ZW5zaW9ucyBhcmUgYWx3
YXlzIGJ1aWx0IGFzIHNoYXJlZA0KLQ0KLQlpZiAoZGxsbmFtZSA9PSBudWxsKSB7DQotCQlpZiAo
ZXh0bmFtZSA9PSAncGhwLWd0aycpIHsNCi0JCQlkbGxuYW1lID0gZXh0bmFtZSArICIyLmRsbCI7
DQotCQl9IGVsc2Ugew0KLQkJCWRsbG5hbWUgPSAicGhwX2d0a18iICsgZXh0bmFtZSArICIuZGxs
IjsNCi0JCX0NCi0JfQ0KLQl2YXIgbGlibmFtZSA9IGRsbG5hbWUuc3Vic3RyaW5nKDAsIGRsbG5h
bWUubGVuZ3RoLTQpICsgIi5saWIiOw0KLQl2YXIgbGQgPSAiQCQoTEQpIjsNCi0NCi0JcmVzbmFt
ZSA9IGdlbmVyYXRlX3ZlcnNpb25faW5mb19yZXNvdXJjZShkbGxuYW1lLCBjb25maWd1cmVfbW9k
dWxlX2Rpcm5hbWUpOw0KLQ0KLQlNRk8uV3JpdGVMaW5lKCIkKEJVSUxEX0RJUilcXCQoUEhQR1RL
RExMKTogJCgiICsgRVhUICsgIl9HTE9CQUxfT0JKUykgJChQSFBHVEtETExfUkVTKSIpOw0KLQlN
Rk8uV3JpdGVMaW5lKCJcdCIgKyBsZCArICIgL291dDokKEJVSUxEX0RJUilcXCQoUEhQR1RLRExM
KSAkKCIgKyBFWFQgKyAiX0xERkxBR1MpICQoTERGTEFHUykgJCgiICsgRVhUICsgIl9HTE9CQUxf
T0JKUykgJChMSUJTXyIgKyBFWFQgKyAiKSAkKExJQlMpICQoUEhQR1RLRExMX1JFUykiKTsNCi0J
TUZPLldyaXRlQmxhbmtMaW5lcygxKTsNCi0NCi0JTUZPLldyaXRlTGluZShkbGxuYW1lICsgIjog
JChCVUlMRF9ESVIpXFwiICsgZGxsbmFtZSk7DQotCU1GTy5Xcml0ZUxpbmUoIlx0QGVjaG8gRVhU
ICIgKyBleHRuYW1lICsgIiBidWlsZCBjb21wbGV0ZSIpOw0KLQlNRk8uV3JpdGVCbGFua0xpbmVz
KDEpOw0KLQ0KLQlBRERfRkxBRygiQ0ZMQUdTXyIgKyBFWFQsIGNmbGFncyk7DQotfQ0KLQ0KLWZ1
bmN0aW9uIEFERF9TT1VSQ0VTKGRpciwgZmlsZV9saXN0LCB0YXJnZXQsIG9ial9kaXIpIHsNCi0N
Ci0JdmFyIGk7DQotCXZhciB0djsNCi0JdmFyIHNyYywgb2JqLCBzeW0sIGZsYWdzOw0KLQ0KLQlp
ZiAodGFyZ2V0ID09IG51bGwpIHsNCi0JCXRhcmdldCA9ICJwaHAiOw0KLQl9DQotDQotCXN5bSA9
IHRhcmdldC50b1VwcGVyQ2FzZSgpLnJlcGxhY2UobmV3IFJlZ0V4cCgiLSIsICJnIiksICJfIikg
KyAiX0dMT0JBTF9PQkpTIjsNCi0JZmxhZ3MgPSAiQ0ZMQUdTXyIgKyB0YXJnZXQudG9VcHBlckNh
c2UoKS5yZXBsYWNlKG5ldyBSZWdFeHAoIi0iLCAiZyIpLCAiXyIpOw0KLQ0KLQlpZiAoY29uZmln
dXJlX3N1YnN0LkV4aXN0cyhzeW0pKSB7DQotCQl0diA9IGNvbmZpZ3VyZV9zdWJzdC5JdGVtKHN5
bSk7DQotCX0gZWxzZSB7DQotCQl0diA9ICIiOw0KLQl9DQotDQotCWZpbGVfbGlzdCA9IGZpbGVf
bGlzdC5zcGxpdChuZXcgUmVnRXhwKCJcXHMrIikpOw0KLQlmaWxlX2xpc3Quc29ydCgpOw0KLQ0K
LQl2YXIgcmUgPSBuZXcgUmVnRXhwKCJcLlthLXowLTlBLVpdKyQiKTsNCi0NCi0JZGlyID0gZGly
LnJlcGxhY2UobmV3IFJlZ0V4cCgiLyIsICJnIiksICJcXCIpOw0KLQl2YXIgb2Jqc19saW5lID0g
IiI7DQotCXZhciBzcmNzX2xpbmUgPSAiIjsNCi0NCi0JdmFyIHN1Yl9idWlsZCA9ICIkKEJVSUxE
X0RJUilcXCI7DQotDQotCS8qIGlmIG1vZHVsZSBkaXIgaXMgbm90IGEgY2hpbGQgb2YgdGhlIG1h
aW4gc291cmNlIGRpciwNCi0JICogd2UgbmVlZCB0byB0d2VhayBpdDsgd2Ugc2hvdWxkIGhhdmUg
ZGV0ZWN0ZWQgc3VjaCBhDQotCSAqIGNhc2UgaW4gY29uZGVuc2VfcGF0aCBhbmQgcmV3cml0dGVu
IHRoZSBwYXRoIHRvDQotCSAqIGJlIHJlbGF0aXZlLg0KLQkgKiBUaGlzIHByb2JhYmx5IGJyZWFr
cyBmb3Igbm9uLXNpYmxpbmcgZGlycyAqLw0KLQlpZiAob2JqX2RpciA9PSBudWxsKSB7DQotCQl2
YXIgYnVpbGRfZGlyID0gZGlyLnJlcGxhY2UobmV3IFJlZ0V4cCgiXi4uXFxcXCIpLCAiIik7DQot
CQl2YXIgbWFuZ2xlX2RpciA9IGJ1aWxkX2Rpci5yZXBsYWNlKG5ldyBSZWdFeHAoIltcXFxcLy4r
LV0iLCAiZyIpLCAiXyIpOw0KLQkJdmFyIGJkX2ZsYWdzX25hbWUgPSAiQ0ZMQUdTX0JEXyIgKyBt
YW5nbGVfZGlyLnRvVXBwZXJDYXNlKCk7DQotCX0NCi0JZWxzZSB7DQotCQl2YXIgYnVpbGRfZGly
ID0gb2JqX2Rpci5yZXBsYWNlKG5ldyBSZWdFeHAoIl4uLlxcXFwiKSwgIiIpOw0KLQkJdmFyIG1h
bmdsZV9kaXIgPSBidWlsZF9kaXIucmVwbGFjZShuZXcgUmVnRXhwKCJbXFxcXC8uKy1dIiwgImci
KSwgIl8iKTsNCi0JCXZhciBiZF9mbGFnc19uYW1lID0gIkNGTEFHU19CRF8iICsgbWFuZ2xlX2Rp
ci50b1VwcGVyQ2FzZSgpOw0KLQl9DQotCQ0KLQl2YXIgZGlycyA9IGJ1aWxkX2Rpci5zcGxpdCgi
XFwiKTsNCi0JdmFyIGksIGQgPSAiIjsNCi0JZm9yIChpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBp
KyspIHsNCi0JCWQgKz0gZGlyc1tpXTsNCi0JCWJ1aWxkX2RpcnNbYnVpbGRfZGlycy5sZW5ndGhd
ID0gZDsNCi0JCWQgKz0gIlxcIjsNCi0JfQ0KLQlzdWJfYnVpbGQgKz0gZDsNCi0NCi0NCi0JREVG
SU5FKGJkX2ZsYWdzX25hbWUsICIgL0ZkIiArIHN1Yl9idWlsZCArICIgL0ZwIiArIHN1Yl9idWls
ZCArICIgL0ZSIiArIHN1Yl9idWlsZCk7DQotDQotCWZvciAoaSBpbiBmaWxlX2xpc3QpIHsNCi0J
CXNyYyA9IGZpbGVfbGlzdFtpXTsNCi0JCW9iaiA9IHNyYy5yZXBsYWNlKHJlLCAiLm9iaiIpOw0K
LQkJdHYgKz0gIiAiICsgc3ViX2J1aWxkICsgb2JqOw0KLQ0KLQkJTUZPLldyaXRlTGluZShzdWJf
YnVpbGQgKyBvYmogKyAiOiAiICsgZGlyICsgIlxcIiArIHNyYyk7DQotCQlNRk8uV3JpdGVMaW5l
KCJcdEAkKENDKSAkKCIgKyBmbGFncyArICIpICQoQ0ZMQUdTKSAkKCIgKyBiZF9mbGFnc19uYW1l
ICsgIikgL2MgIiArIGRpciArICJcXCIgKyBzcmMgKyAiIC9GbyIgKyBzdWJfYnVpbGQgKyBvYmop
Ow0KLQl9DQotDQotCURFRklORShzeW0sIHR2KTsNCi19DQotDQotZnVuY3Rpb24gQUREX0ZMQUco
bmFtZSwgZmxhZ3MsIHRhcmdldCkgew0KLQ0KLQlpZiAodGFyZ2V0ICE9IG51bGwpIHsNCi0JCW5h
bWUgPSB0YXJnZXQudG9VcHBlckNhc2UoKSArICJfIiArIG5hbWU7DQotCX0NCi0JaWYgKGNvbmZp
Z3VyZV9zdWJzdC5FeGlzdHMobmFtZSkpIHsNCi0JCXZhciBjdXJyX2ZsYWdzID0gY29uZmlndXJl
X3N1YnN0Lkl0ZW0obmFtZSk7DQotDQotCQlpZiAoY3Vycl9mbGFncy5pbmRleE9mKGZsYWdzKSA+
PSAwKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlmbGFncyA9IGN1cnJfZmxhZ3MgKyAi
ICIgKyBmbGFnczsNCi0JCWNvbmZpZ3VyZV9zdWJzdC5SZW1vdmUobmFtZSk7DQotCX0NCi0JY29u
ZmlndXJlX3N1YnN0LkFkZChuYW1lLCBmbGFncyk7DQotfQ0KLQ0KLWZ1bmN0aW9uIGdldF9kZWZp
bmUobmFtZSkgew0KLQ0KLQlyZXR1cm4gY29uZmlndXJlX3N1YnN0Lkl0ZW0obmFtZSk7DQotfQ0K
LQ0KLWZ1bmN0aW9uIEVSUk9SKG1zZykgew0KLQ0KLQlTVERFUlIuV3JpdGVMaW5lKCJFUlJPUjog
IiArIG1zZyk7DQotCVdTY3JpcHQuUXVpdCgzKTsNCi19DQotDQotZnVuY3Rpb24gV0FSTklORyht
c2cpIHsNCi0NCi0JU1RERVJSLldyaXRlTGluZSgiV0FSTklORzogIiArIG1zZyk7DQotCVNUREVS
Ui5Xcml0ZUJsYW5rTGluZXMoMSk7DQotfQ0KLQ0KLS8qIFNlYXJjaGVzIGEgc2V0IG9mIHBhdGhz
IGZvciBhIGZpbGU7IHJldHVybnMgdGhlIGRpciBpbiB3aGljaCB0aGUgZmlsZSB3YXMgZm91bmQs
IHRydWUgaWYgaXQNCi13YXMgZm91bmQgaW4gdGhlIGRlZmF1bHQgZW52IHBhdGgsIG9yIGZhbHNl
IGlmIGl0IHdhcyBub3QgZm91bmQgYXQgYWxsLiBlbnZfbmFtZSBpcyB0aGUgb3B0aW9uYWwNCi1u
YW1lIG9mIGFuIGVudiB2YXIgc3BlY2lmeWluZyB0aGUgZGVmYXVsdCBwYXRoIHRvIHNlYXJjaCAq
Lw0KLWZ1bmN0aW9uIHNlYXJjaF9wYXRocyh0aGluZ190b19maW5kLCBleHBsaWNpdF9wYXRoLCBl
bnZfbmFtZSkgew0KLQ0KLQl2YXIgaSwgZm91bmQgPSBmYWxzZSwgcGxhY2UgPSBmYWxzZSwgZmls
ZSwgZW52Ow0KLQ0KLQlTVERPVVQuV3JpdGUoIkNoZWNraW5nIGZvciAiICsgdGhpbmdfdG9fZmlu
ZCArICIgLi4uICIpOw0KLQ0KLQlpZiAodGhpbmdfdG9fZmluZC5sZW5ndGggPCA2KSB7DQotCQlT
VERPVVQuV3JpdGUoIgkiKTsNCi0JfQ0KLQ0KLQl0aGluZ190b19maW5kID0gdGhpbmdfdG9fZmlu
ZC5yZXBsYWNlKG5ldyBSZWdFeHAoIi8iLCAiZyIpLCAiXFwiKTsNCi0NCi0JaWYgKGV4cGxpY2l0
X3BhdGggIT0gbnVsbCkgew0KLQkJaWYgKHR5cGVvZihleHBsaWNpdF9wYXRoKSA9PSAic3RyaW5n
Iikgew0KLQkJCWV4cGxpY2l0X3BhdGggPSBleHBsaWNpdF9wYXRoLnNwbGl0KCI7Iik7DQotCQl9
DQotDQotCQlmb3IgKGkgPSAwOyBpIDwgZXhwbGljaXRfcGF0aC5sZW5ndGg7IGkrKykgew0KLQkJ
CWZpbGUgPSBnbG9iKGV4cGxpY2l0X3BhdGhbaV0gKyAiXFwiICsgdGhpbmdfdG9fZmluZCk7DQot
CQkJaWYgKGZpbGUpIHsNCi0JCQkJZm91bmQgPSB0cnVlOw0KLQkJCQlwbGFjZSA9IGZpbGVbMF07
DQotCQkJCXBsYWNlID0gcGxhY2Uuc3Vic3RyKDAsIHBsYWNlLmxlbmd0aCAtIHRoaW5nX3RvX2Zp
bmQubGVuZ3RoIC0gMSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlpZiAo
IWZvdW5kICYmIGVudl9uYW1lICE9IG51bGwpIHsNCi0JCWVudiA9IFdzaFNoZWxsLkVudmlyb25t
ZW50KCJQcm9jZXNzIikuSXRlbShlbnZfbmFtZSk7DQotCQllbnYgPSBlbnYuc3BsaXQoIjsiKTsN
Ci0JCWZvciAoaSA9IDA7IGkgPCBlbnYubGVuZ3RoOyBpKyspIHsNCi0JCQlmaWxlID0gZ2xvYihl
bnZbaV0gKyAiXFwiICsgdGhpbmdfdG9fZmluZCk7DQotCQkJaWYgKGZpbGUpIHsNCi0JCQkJZm91
bmQgPSB0cnVlOw0KLQkJCQlwbGFjZSA9IHRydWU7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0N
Ci0JfQ0KLQ0KLQlpZiAoZm91bmQgJiYgcGxhY2UgPT0gdHJ1ZSkgew0KLQkJU1RET1VULldyaXRl
TGluZSgiCTxpbiBkZWZhdWx0IHBhdGg+Iik7DQotCX0gZWxzZSBpZiAoZm91bmQpIHsNCi0JCVNU
RE9VVC5Xcml0ZUxpbmUoIgkiICsgcGxhY2UpOw0KLQl9IGVsc2Ugew0KLQkJU1RET1VULldyaXRl
TGluZSgiCTxub3QgZm91bmQ+Iik7DQotCX0NCi0JcmV0dXJuIHBsYWNlOw0KLX0NCi0NCi1mdW5j
dGlvbiB3b3JkX3dyYXBfYW5kX2luZGVudChpbmRlbnQsIHRleHQsIGxpbmVfc3VmZml4LCBpbmRl
bnRfY2hhcikgew0KLQ0KLQlpZiAodGV4dCA9PSBudWxsKSB7DQotCQlyZXR1cm4gIiI7DQotCX0N
Ci0NCi0JdmFyIHdvcmRzID0gdGV4dC5zcGxpdChuZXcgUmVnRXhwKCJcXHMrIiwgImciKSk7DQot
CXZhciBpID0gMDsNCi0JdmFyIHJldF90ZXh0ID0gIiI7DQotCXZhciB0aGlzX2xpbmUgPSAiIjsN
Ci0JdmFyIHQ7DQotCXZhciBzcGFjZSA9ICIiOw0KLQl2YXIgbGluZXMgPSAwOw0KLQ0KLQlpZiAo
bGluZV9zdWZmaXggPT0gbnVsbCkgew0KLQkJbGluZV9zdWZmaXggPSAiIjsNCi0JfQ0KLQ0KLQlp
ZiAoaW5kZW50X2NoYXIgPT0gbnVsbCkgew0KLQkJaW5kZW50X2NoYXIgPSAiICI7DQotCX0NCi0N
Ci0JZm9yIChpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7DQotCQlzcGFjZSArPSBpbmRlbnRfY2hh
cjsNCi0JfQ0KLQkNCi0JZm9yIChpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7DQotCQlp
ZiAodGhpc19saW5lLmxlbmd0aCkgew0KLQkJCXQgPSB0aGlzX2xpbmUgKyAiICIgKyB3b3Jkc1tp
XTsNCi0JCX0gZWxzZSB7DQotCQkJdCA9IHdvcmRzW2ldOw0KLQkJfQ0KLQ0KLQkJaWYgKHQubGVu
Z3RoICsgaW5kZW50ID4gNzgpIHsNCi0JCQlpZiAobGluZXMrKykgew0KLQkJCQlyZXRfdGV4dCAr
PSBzcGFjZTsNCi0JCQl9DQotCQkJcmV0X3RleHQgKz0gdGhpc19saW5lICsgbGluZV9zdWZmaXgg
KyAiXHJcbiI7DQotCQkJdGhpc19saW5lID0gIiI7DQotCQl9DQotDQotCQlpZiAodGhpc19saW5l
Lmxlbmd0aCkgew0KLQkJCXRoaXNfbGluZSArPSAiICIgKyB3b3Jkc1tpXTsNCi0JCX0gZWxzZSB7
DQotCQkJdGhpc19saW5lID0gd29yZHNbaV07DQotCQl9DQotCX0NCi0NCi0JaWYgKHRoaXNfbGlu
ZS5sZW5ndGgpIHsNCi0JCWlmIChsaW5lcykNCi0JCQlyZXRfdGV4dCArPSBzcGFjZTsNCi0JCXJl
dF90ZXh0ICs9IHRoaXNfbGluZTsNCi0JfQ0KLQ0KLQlyZXR1cm4gcmV0X3RleHQ7DQotfQ0KLQ0K
LWZ1bmN0aW9uIGZpbGVfZ2V0X2NvbnRlbnRzKGZpbGVuYW1lKSB7DQotDQotCXZhciBmLCBjOw0K
LQ0KLQl0cnkgew0KLQkJZiA9IEZTTy5PcGVuVGV4dEZpbGUoZmlsZW5hbWUsIDEpOw0KLQkJYyA9
IGYuUmVhZEFsbCgpOw0KLQkJZi5DbG9zZSgpOw0KLQkJcmV0dXJuIGM7DQotCX0gY2F0Y2ggKGUp
IHsNCi0JCVNURE9VVC5Xcml0ZUxpbmUoIlByb2JsZW0gcmVhZGluZyAiICsgZmlsZW5hbWUpOw0K
LQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KLQ0KLWZ1bmN0aW9uIGdlbmVyYXRlX2ZpbGVzKCkg
ew0KLQ0KLQl2YXIgaSwgZGlyLCBiZCwgbGFzdDsNCi0NCi0JU1RET1VULldyaXRlQmxhbmtMaW5l
cygxKTsNCi0JU1RET1VULldyaXRlTGluZSgiQ3JlYXRpbmcgYnVpbGQgZGlycy4uLiIpOw0KLQlk
aXIgPSBnZXRfZGVmaW5lKCJCVUlMRF9ESVIiKTsNCi0JYnVpbGRfZGlycy5zb3J0KCk7DQotCWxh
c3QgPSBudWxsOw0KLQ0KLQlpZiAoIUZTTy5Gb2xkZXJFeGlzdHMoZGlyKSkgew0KLQkJRlNPLkNy
ZWF0ZUZvbGRlcihkaXIpOw0KLQl9DQotCQ0KLQlmb3IgKGkgPSAwOyBpIDwgYnVpbGRfZGlycy5s
ZW5ndGg7IGkrKykgew0KLQkJYmQgPSBGU08uQnVpbGRQYXRoKGRpciwgYnVpbGRfZGlyc1tpXSk7
DQotCQlpZiAoYmQgPT0gbGFzdCkgew0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJbGFzdCA9IGJk
Ow0KLQkJQUREX0ZMQUcoIkJVSUxEX0RJUlNfU1VCIiwgYmQpOw0KLQkJaWYgKCFGU08uRm9sZGVy
RXhpc3RzKGJkKSkgew0KLQkJCUZTTy5DcmVhdGVGb2xkZXIoYmQpOw0KLQkJfQ0KLQl9DQotDQot
CVNURE9VVC5Xcml0ZUxpbmUoIkdlbmVyYXRpbmcgc291cmNlIGZpbGVzIC0gdGhpcyBtYXkgdGFr
ZSBhIGZldyBzZWNvbmRzIik7DQotCVdTY3JpcHQuU2xlZXAoMzUwMCk7DQotCWNoZWNrX2dlbmVy
YXRpb24oKTsNCi0JZ2VuZXJhdGVfbWFrZWZpbGUoKTsNCi0NCi0JU1RET1VULldyaXRlTGluZSgi
RG9uZS4iKTsNCi0JU1RET1VULldyaXRlQmxhbmtMaW5lcygxKTsNCi0JU1RET1VULldyaXRlTGlu
ZSgiVHlwZSAnbm1ha2UnIHRvIGJ1aWxkIFBIUC1HVEsiKTsNCi19DQotDQotZnVuY3Rpb24gZ2Vu
ZXJhdGVfbWFrZWZpbGUoKSB7DQotDQotCU1GTy5DbG9zZSgpOyAvLyBNYWtlZmlsZS5vYmplY3Rz
IGlzIG5vdyBjb21wbGV0ZQ0KLQl2YXIgTUYgPSBGU08uQ3JlYXRlVGV4dEZpbGUoIk1ha2VmaWxl
IiwgdHJ1ZSk7DQotCVNURE9VVC5Xcml0ZUxpbmUoIkdlbmVyYXRpbmcgTWFrZWZpbGUiKTsNCi0N
Ci0JTUYuV3JpdGVMaW5lKCIjIEdlbmVyYXRlZCBieSBjb25maWd1cmUuanMiKTsNCi0JTUYuV3Jp
dGVCbGFua0xpbmVzKDEpOw0KLQ0KLQkvKiBzcGl0IG91dCB2YXJpYWJsZSBkZWZpbml0aW9ucyAq
Lw0KLQl2YXIga2V5cyA9IChuZXcgVkJBcnJheShjb25maWd1cmVfc3Vic3QuS2V5cygpKSkudG9B
cnJheSgpOw0KLQl2YXIgaTsNCi0NCi0JZm9yIChpIGluIGtleXMpIHsNCi0JCS8qIFRoZSB0cmFp
bGluZyBzcGFjZSBpcyBuZWVkZWQgdG8gcHJldmVudCB0aGUgdHJhaWxpbmcgYmFja3NsYXNoIHRo
YXQgaXMgcGFydCBvZg0KLQkJdGhlIGJ1aWxkIGRpciBmbGFncyAoQ0ZMQUdTX0JEX1hYWCkgZnJv
bSBiZWluZyBzZWVuIGFzIGEgbGluZSBjb250aW51YXRpb24gY2hhcmFjdGVyICovDQotCQlNRi5X
cml0ZUxpbmUoa2V5c1tpXSArICI9IiArIGNvbmZpZ3VyZV9zdWJzdC5JdGVtKGtleXNbaV0pICsg
IiAiKTsNCi0JfQ0KLQ0KLQlNRi5Xcml0ZUJsYW5rTGluZXMoMSk7DQotCU1GLldyaXRlTGluZSgi
YWxsOiAkKEJVSUxEX0RJUilcXCQoUEhQR1RLRExMKSIpOw0KLQlNRi5Xcml0ZUxpbmUoImJ1aWxk
X2RpcnM6ICQoQlVJTERfRElSKSAkKEJVSUxEX0RJUlNfU1VCKSIpOw0KLQlNRi5Xcml0ZUJsYW5r
TGluZXMoMSk7DQotDQotCVRGID0gRlNPLk9wZW5UZXh0RmlsZSgiTWFrZWZpbGUub2JqZWN0cyIs
IDEpOw0KLQlNRi5Xcml0ZShURi5SZWFkQWxsKCkpOw0KLQlURi5DbG9zZSgpOw0KLQ0KLQlNRi5D
bG9zZSgpOw0KLQ0KLQlGU08uRGVsZXRlRmlsZSgiTWFrZWZpbGUub2JqZWN0cyIpOw0KLQkvL0ZT
Ty5EZWxldGVGaWxlKCJ3aW4zMlxcdGVtcC5iYXQiKTsNCi19DQotDQotZnVuY3Rpb24gY29weV9h
bmRfc3Vic3Qoc3JjbmFtZSwgZGVzdG5hbWUsIHN1YnN0X2FycmF5KSB7DQotDQotCWlmICghRlNP
LkZpbGVFeGlzdHMoc3JjbmFtZSkpIHsNCi0JCXNyY25hbWUgPSBjb25maWd1cmVfbW9kdWxlX2Rp
cm5hbWUgKyAiXFwiICsgc3JjbmFtZTsNCi0JCWRlc3RuYW1lID0gY29uZmlndXJlX21vZHVsZV9k
aXJuYW1lICsgIlxcIiArIGRlc3RuYW1lOw0KLQl9DQotDQotCXZhciBjb250ZW50ID0gZmlsZV9n
ZXRfY29udGVudHMoc3JjbmFtZSk7DQotCXZhciBpOw0KLQ0KLQlmb3IgKGkgPSAwOyBpIDwgc3Vi
c3RfYXJyYXkubGVuZ3RoOyBpKz0yKSB7DQotCQl2YXIgcmUgPSBzdWJzdF9hcnJheVtpXTsNCi0J
CXZhciByZXAgPSBzdWJzdF9hcnJheVtpKzFdOw0KLQ0KLQkJY29udGVudCA9IGNvbnRlbnQucmVw
bGFjZShyZSwgcmVwKTsNCi0JfQ0KLQ0KLQl2YXIgZiA9IEZTTy5DcmVhdGVUZXh0RmlsZShkZXN0
bmFtZSwgdHJ1ZSk7DQotCWYuV3JpdGUoY29udGVudCk7DQotCWYuQ2xvc2UoKTsNCi19DQotDQot
Ly8gZ2xvYiB1c2luZyBzaW1wbGUgZmlsZW5hbWUgd2lsZGNhcmRzOyByZXR1cm5zIGFuIGFycmF5
IG9mIG1hdGNoZXMgZm91bmQgaW4gdGhlIGZpbGVzeXN0ZW0NCi1mdW5jdGlvbiBnbG9iKHBhdGhf
cGF0dGVybikgew0KLQ0KLQl2YXIgcGF0aF9wYXJ0cyA9IHBhdGhfcGF0dGVybi5yZXBsYWNlKG5l
dyBSZWdFeHAoIi8iLCAiZyIpLCAiXFwiKS5zcGxpdCgiXFwiKTsNCi0JdmFyIHA7DQotCXZhciBi
YXNlID0gIiI7DQotCXZhciBpc19wYXRfcmUgPSAvXCovOw0KLQ0KLQlpZiAoRlNPLkZpbGVFeGlz
dHMocGF0aF9wYXR0ZXJuKSkgew0KLQkJcmV0dXJuIG5ldyBBcnJheShwYXRoX3BhdHRlcm4pOw0K
LQl9DQotCQ0KLQkvLyBmaXJzdCwgYnVpbGQgYXMgbXVjaCBhcyBwb3NzaWJsZSB0aGF0IGRvZXNu
J3QgaGF2ZSBhIHBhdHRlcm4NCi0JZm9yIChwID0gMDsgcCA8IHBhdGhfcGFydHMubGVuZ3RoOyBw
KyspIHsNCi0JCWlmIChwYXRoX3BhcnRzW3BdLm1hdGNoKGlzX3BhdF9yZSkpDQotCQkJYnJlYWs7
DQotCQlpZiAocCkNCi0JCQliYXNlICs9ICJcXCI7DQotCQliYXNlICs9IHBhdGhfcGFydHNbcF07
CQ0KLQl9DQotDQotCXJldHVybiBfaW5uZXJfZ2xvYihiYXNlLCBwLCBwYXRoX3BhcnRzKTsNCi19
DQotDQotZnVuY3Rpb24gX2lubmVyX2dsb2IoYmFzZSwgcCwgcGFydHMpIHsNCi0NCi0JdmFyIHBh
dCA9IHBhcnRzW3BdOw0KLQl2YXIgZnVsbF9uYW1lID0gYmFzZSArICJcXCIgKyBwYXQ7DQotCXZh
ciByZSA9IG51bGw7DQotCXZhciBpdGVtcyA9IG51bGw7DQotDQotCWlmIChwID09IHBhcnRzLmxl
bmd0aCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCWlmIChGU08uRmlsZUV4aXN0cyhm
dWxsX25hbWUpKSB7DQotCQlpZiAocCA8IHBhcnRzLmxlbmd0aCAtIDEpIHsNCi0JCQkvLyB3ZSBk
aWRuJ3QgcmVhY2ggdGhlIGZ1bGwgZXh0ZW50IG9mIHRoZSBwYXR0ZXJuDQotCQkJcmV0dXJuIGZh
bHNlOw0KLQkJfQ0KLQkJcmV0dXJuIG5ldyBBcnJheShmdWxsX25hbWUpOw0KLQl9DQotDQotCWlm
IChGU08uRm9sZGVyRXhpc3RzKGZ1bGxfbmFtZSkgJiYgcCA9PSBwYXJ0cy5sZW5ndGggLSAxKSB7
DQotCQkvLyB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybjsgbm8gbmVlZCB0
byByZWN1cnNlDQotCQlyZXR1cm4gbmV3IEFycmF5KGZ1bGxfbmFtZSk7DQotCX0NCi0NCi0JLy8g
Q29udmVydCB0aGUgcGF0dGVybiBpbnRvIGEgcmVnZXhwDQotCXJlID0gbmV3IFJlZ0V4cCgiXiIg
KyBwYXQucmVwbGFjZSgvXC4vZywgJ1xcLicpLnJlcGxhY2UoL1wqL2csICcuKicpLnJlcGxhY2Uo
L1w/L2csICcuJykgKyAiJCIsICJpIik7DQotDQotCWl0ZW1zID0gbmV3IEFycmF5KCk7DQotDQot
CWlmICghRlNPLkZvbGRlckV4aXN0cyhiYXNlKSkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQot
DQotCXZhciBmb2xkZXIgPSBGU08uR2V0Rm9sZGVyKGJhc2UpOw0KLQl2YXIgZmMgPSBudWxsOw0K
LQl2YXIgc3ViaXRlbXMgPSBudWxsOw0KLQl2YXIgaXRlbV9uYW1lID0gbnVsbDsNCi0JdmFyIGo7
DQotDQotCWZjID0gbmV3IEVudW1lcmF0b3IoZm9sZGVyLlN1YkZvbGRlcnMpOw0KLQlmb3IgKDsg
IWZjLmF0RW5kKCk7IGZjLm1vdmVOZXh0KCkpIHsNCi0JCWl0ZW1fbmFtZSA9IEZTTy5HZXRGaWxl
TmFtZShmYy5pdGVtKCkpOw0KLQ0KLQkJaWYgKGl0ZW1fbmFtZS5tYXRjaChyZSkpIHsNCi0JCQkv
LyBnb3QgYSBtYXRjaDsgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4sIGp1c3Qg
YWRkIHRoZXNlDQotCQkJLy8gdGhpbmdzIHRvIHRoZSBpdGVtcyBhcnJheQ0KLQkJCWlmIChwID09
IHBhcnRzLmxlbmd0aCAtIDEpIHsNCi0JCQkJaXRlbXNbaXRlbXMubGVuZ3RoXSA9IGZjLml0ZW0o
KTsNCi0JCQl9IGVsc2Ugew0KLQkJCQkvLyB3ZSBzaG91bGQgcmVjdXJzZSBhbmQgZG8gbW9yZSBt
YXRjaGVzDQotCQkJCXN1Yml0ZW1zID0gX2lubmVyX2dsb2IoYmFzZSArICJcXCIgKyBpdGVtX25h
bWUsIHAgKyAxLCBwYXJ0cyk7DQotCQkJCWlmIChzdWJpdGVtcykgew0KLQkJCQkJZm9yIChqID0g
MDsgaiA8IHN1Yml0ZW1zLmxlbmd0aDsgaisrKSB7DQotCQkJCQkJaXRlbXNbaXRlbXMubGVuZ3Ro
XSA9IHN1Yml0ZW1zW2pdOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQot
CS8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLCB3ZSBzaG91bGQgbWF0Y2gg
ZmlsZXMgdG9vDQotCWlmIChwID09IHBhcnRzLmxlbmd0aCAtIDEpIHsNCi0JCWZjID0gbmV3IEVu
dW1lcmF0b3IoZm9sZGVyLkZpbGVzKTsNCi0JCWZvciAoOyAhZmMuYXRFbmQoKTsgZmMubW92ZU5l
eHQoKSkgew0KLQkJCWl0ZW1fbmFtZSA9IEZTTy5HZXRGaWxlTmFtZShmYy5pdGVtKCkpOw0KLQkJ
CWlmIChpdGVtX25hbWUubWF0Y2gocmUpKSB7DQotCQkJCWl0ZW1zW2l0ZW1zLmxlbmd0aF0gPSBm
Yy5pdGVtKCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCWlmIChpdGVtcy5sZW5ndGggPT0gMCkN
Ci0JCXJldHVybiBmYWxzZTsNCi0NCi0JcmV0dXJuIGl0ZW1zOw0KLX0NCi0NCi0vKiBFbWl0cyBy
dWxlIHRvIGdlbmVyYXRlIHZlcnNpb24gaW5mbyBmb3IgYW4gZXh0ZW5zaW9uLg0KLVJldHVybnMg
dGhlIG5hbWUgb2YgdGhlIC5yZXMgZmlsZSB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkICovDQotZnVu
Y3Rpb24gZ2VuZXJhdGVfdmVyc2lvbl9pbmZvX3Jlc291cmNlKG1ha2VmaWxldGFyZ2V0LCBjcmVk
aXRzcGF0aCkgew0KLQ0KLQkvLyBtYWtlZmlsZXRhcmdldCBpcyBwaHAtZ3RrLmRsbA0KLQkvLyBj
cmVkaXRzcGF0aCBpcyBleHRcZ3RrKw0KLQ0KLQl2YXIgcmVzbmFtZSA9IG1ha2VmaWxldGFyZ2V0
ICsgIi5yZXMiOw0KLQl2YXIgcmVzX2Rlc2MgPSAiUEhQLUdUSyBTY3JpcHQgSW50ZXJwcmV0ZXIi
Ow0KLQl2YXIgcmVzX3Byb2RfbmFtZSA9ICJQSFAtR1RLIjsNCi0JdmFyIGNyZWRpdHM7DQotCXZh
ciB0aGFua3MgPSAiVGhhbmtzIHRvIEFuZHJlaSBabWlldnNraSI7DQotCXZhciBsb2dvID0gIiI7
DQotDQotCWlmIChGU08uRmlsZUV4aXN0cyhjcmVkaXRzcGF0aCArICcvQ1JFRElUUycpKSB7DQot
CQljcmVkaXRzID0gRlNPLk9wZW5UZXh0RmlsZShjcmVkaXRzcGF0aCArICcvQ1JFRElUUycsIDEp
Ow0KLQkJcmVzX2Rlc2MgPSBjcmVkaXRzLlJlYWRMaW5lKCk7DQotCQl0cnkgew0KLQkJCXRoYW5r
cyA9IGNyZWRpdHMuUmVhZExpbmUoKTsNCi0JCX0gY2F0Y2ggKGUpIHsNCi0JCQl0aGFua3MgPSBu
dWxsOw0KLQkJfQ0KLQkJaWYgKHRoYW5rcyA9PSBudWxsKSB7DQotCQkJdGhhbmtzID0gIiI7DQot
CQl9IGVsc2Ugew0KLQkJCXRoYW5rcyA9ICJUaGFua3MgdG8gIiArIHRoYW5rczsNCi0JCX0NCi0J
CWNyZWRpdHMuQ2xvc2UoKTsNCi0JfQ0KLQ0KLQlNRk8uV3JpdGVMaW5lKCJQSFBHVEtETExfUkVT
PSQoQlVJTERfRElSKVxcJChQSFBHVEtETEwpLnJlcyIpOw0KLQlNRk8uV3JpdGVCbGFua0xpbmVz
KDEpOw0KLQ0KLQlpZiAobWFrZWZpbGV0YXJnZXQubWF0Y2gobmV3IFJlZ0V4cCgiXFwuZXhlJCIp
KSkgew0KLQkJbG9nbyA9ICIgL0QgV0FOVF9MT0dPIjsNCi0JfQ0KLQkNCi0JTUZPLldyaXRlTGlu
ZSgiJChQSFBHVEtETExfUkVTKTogd2luMzJcXHRlbXBsYXRlLnJjIik7DQotCU1GTy5Xcml0ZUxp
bmUoIlx0JChSQykgL2ZvICQoUEhQR1RLRExMX1JFUykiICsgbG9nbyArICcgL0QgRklMRV9ERVND
UklQVElPTj0iXFwiJyArIHJlc19kZXNjICsgJ1xcIiIgL0QgRklMRV9OQU1FPSJcXCIkKFBIUEdU
S0RMTClcXCIiIC9EIFBST0RVQ1RfTkFNRT0iXFwiJyArIHJlc19wcm9kX25hbWUgKyAnXFwiIiAv
RCBUSEFOS1NfR1VZUz0iXFwiJyArIHRoYW5rcyArICdcXCIiIHdpbjMyXFx0ZW1wbGF0ZS5yYycp
Ow0KLQlNRk8uV3JpdGVCbGFua0xpbmVzKDEpOw0KLQkNCi0JcmV0dXJuIHJlc25hbWU7DQotfQ0K
LQ0KLS8qIGV4ZWN1dGUgYSBjb21tYW5kIGFuZCByZXR1cm4gdGhlIG91dHB1dCBhcyBhIHN0cmlu
ZyAqLw0KLWZ1bmN0aW9uIGV4ZWN1dGUoY29tbWFuZF9saW5lKSB7DQotCXZhciBlID0gV3NoU2hl
bGwuRXhlYyhjb21tYW5kX2xpbmUpOw0KLQl2YXIgcmV0ID0gIiI7DQotDQotCXJldCA9IGUuU3Rk
T3V0LlJlYWRBbGwoKTsNCi0NCi0JcmV0dXJuIHJldDsNCi19DQotDQotLy8gV2hpY2ggdmVyc2lv
biBvZiB0aGUgY29tcGlsZXIgZG8gd2UgaGF2ZT8NCi1mdW5jdGlvbiBwcm9iZV9tc3ZjX2NvbXBp
bGVyX3ZlcnNpb24oQ0wpIHsNCi0NCi0JLy8gdHJpY2t5IGVzY2FwZXMgdG8gZ2V0IHN0ZGVyciBy
ZWRpcmVjdGlvbiB0byB3b3JrDQotCXZhciBiYW5uZXIgPSBleGVjdXRlKCdjbWQgL2MgIiInICsg
Q0wgKyAnIiAyPiYxIicpOw0KLQ0KLQlpZiAoYmFubmVyLm1hdGNoKC8oXGQrKVwuKFxkKylcLihc
ZCspKFwuKFxkKykpPy8pKSB7DQotCQlyZXR1cm4gUmVnRXhwLiQxOw0KLQl9DQotCXJldHVybiAw
Ow0KLX0NCi0NCi0vLyBQb2tlIGFyb3VuZCBmb3Igc29tZSBoZWFkZXJzDQotZnVuY3Rpb24gcHJv
YmVfYmFzaWNfaGVhZGVycygpDQotew0KLQl2YXIgcDsNCi0NCi0JaWYgKFBIUF9HVEtfUEhQX0JV
SUxEICE9ICJubyIpIHsNCi0JCXBocF91c3VhbF9pbmNsdWRlX3N1c3BlY3RzICs9ICI7IiArIFBI
UF9HVEtfUEhQX0JVSUxEICsgIlxcaW5jbHVkZSI7DQotCQlwaHBfdXN1YWxfbGliX3N1c3BlY3Rz
ICs9ICI7IiArIFBIUF9HVEtfUEhQX0JVSUxEICsgIlxcbGliIjsNCi0JfQ0KLQ0KLQkvLyBoYWNr
IHRvIGNhdGNoIGNvbW1vbiBsb2NhdGlvbiBvZiBsaWJzDQotCWlmICh0eXBlb2YocCkgPT0gInN0
cmluZyIpIHsNCi0JCXAgPSBwLnJlcGxhY2UobmV3IFJlZ0V4cCgiaW5jbHVkZSQiKSwgImxpYiIp
Ow0KLQkJQUREX0ZMQUcoIkxERkxBR1MiLCAnL2xpYnBhdGg6IicgKyBwICsgJyIgJyk7DQotCQlw
aHBfdXN1YWxfbGliX3N1c3BlY3RzICs9ICI7IiArIHA7DQotCX0NCi19DQotDQotLyogbm9uLWZ1
bmN0aW9ucyAqLw0KLQ0KLWlmICghRlNPLkZpbGVFeGlzdHMoImJ1aWxkY29uZi5iYXQiKSkgew0K
LQlTVERFUlIuV3JpdGVMaW5lKCJNdXN0IGJlIHJ1biBmcm9tIHRoZSByb290IG9mIHRoZSBQSFAt
R1RLIHNvdXJjZSIpOw0KLQlXU2NyaXB0LlF1aXQoMTApOw0KLX0NCisvLyBVdGlscyBmb3IgY29u
ZmlndXJlIHNjcmlwdAorLyoKKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwgUEhQLUdUSyBWZXJzaW9u
IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAor
ICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSsKKyAgfCBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNSBUaGUgUEhQIEdy
b3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICstLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwor
ICB8IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDMuMCBvZiB0aGUgUEhQ
IGxpY2Vuc2UsICAgICAgIHwKKyAgfCB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2Ug
aW4gdGhlIGZpbGUgTElDRU5TRSwgYW5kIGlzICAgICAgICB8CisgIHwgYXZhaWxhYmxlIHRocm91
Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgdXJsOiAgICAgICAgICAgfAor
ICB8IGh0dHA6Ly93d3cucGhwLm5ldC9saWNlbnNlLzNfMC50eHQuICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHwKKyAgfCBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0
aGUgUEhQIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8gICB8CisgIHwgb2J0YWluIGl0IHRocm91
Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhIG5vdGUgdG8gICAgICAgICAgfAor
ICB8IGxpY2Vuc2VAcGhwLm5ldCBzbyB3ZSBjYW4gbWFpbCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5
LiAgICAgICAgICAgICAgIHwKKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwgQXV0aG9yOiBXZXogRnVy
bG9uZyA8d2V6QHRoZWJyYWlucm9vbS5jb20+ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAor
ICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSsKKyovCisKKy8vICRJZDogY29uZnV0aWxzLmpzLHYgMS44IDIwMDUt
MDktMjAgMDI6MTc6NTMgc2ZveCBFeHAgJAorCisvKiBzZXQgdmFycyAqLwordmFyIFNURE9VVCA9
IFdTY3JpcHQuU3RkT3V0OwordmFyIFNUREVSUiA9IFdTY3JpcHQuU3RkRXJyOwordmFyIFdzaFNo
ZWxsID0gV1NjcmlwdC5DcmVhdGVPYmplY3QoIldTY3JpcHQuU2hlbGwiKTsKK3ZhciBGU08gPSBX
U2NyaXB0LkNyZWF0ZU9iamVjdCgiU2NyaXB0aW5nLkZpbGVTeXN0ZW1PYmplY3QiKTsKK3ZhciBN
Rk8gPSBudWxsOwordmFyIFNZU1RFTV9EUklWRSA9IFdzaFNoZWxsLkVudmlyb25tZW50KCJQcm9j
ZXNzIikuSXRlbSgiU3lzdGVtRHJpdmUiKTsKK3ZhciBQUk9HUkFNX0ZJTEVTID0gV3NoU2hlbGwu
RW52aXJvbm1lbnQoIlByb2Nlc3MiKS5JdGVtKCJQcm9ncmFtRmlsZXMiKTsKKworaWYgKFBST0dS
QU1fRklMRVMgPT0gbnVsbCkgeworCVBST0dSQU1fRklMRVMgPSAiQzpcXFByb2dyYW0gRmlsZXMi
OworfQorCit2YXIgQ1dEID0gV3NoU2hlbGwuQ3VycmVudERpcmVjdG9yeTsKKworaWYgKHR5cGVv
ZihDV0QpID09ICJ1bmRlZmluZWQiKSB7CisJQ1dEID0gRlNPLkdldFBhcmVudEZvbGRlck5hbWUo
RlNPLkdldEFic29sdXRlUGF0aE5hbWUoImJ1aWxkY29uZi5iYXQiKSk7Cit9CisKK2NvbmZpZ3Vy
ZV9hcmdzID0gbmV3IEFycmF5KCk7Citjb25maWd1cmVfc3Vic3QgPSBXU2NyaXB0LkNyZWF0ZU9i
amVjdCgiU2NyaXB0aW5nLkRpY3Rpb25hcnkiKTsKKworY29uZmlndXJlX2hkciA9IFdTY3JpcHQu
Q3JlYXRlT2JqZWN0KCJTY3JpcHRpbmcuRGljdGlvbmFyeSIpOworYnVpbGRfZGlycyA9IG5ldyBB
cnJheSgpOworCitleHRlbnNpb25faW5jbHVkZV9jb2RlID0gIiI7CitleHRlbnNpb25fbW9kdWxl
X3B0cnMgPSAiIjsKKworLyogZnVuY3Rpb25zICovCisKK2Z1bmN0aW9uIGNvdW50X2dlbmVyYXRl
ZF9maWxlcygpIHsKKworCXZhciBkaXIgPSBGU08uR2V0Rm9sZGVyKCJleHQvZ3RrKyIpOworCXZh
ciBjb3VudCA9IDA7CisKKwlpdGVyID0gbmV3IEVudW1lcmF0b3IoZGlyLkZpbGVzKTsKKwluYW1l
ID0gIiI7CisKKwlmb3IgKDsgIWl0ZXIuYXRFbmQoKTsgaXRlci5tb3ZlTmV4dCgpKSB7CisJCW5h
bWUgPSBGU08uR2V0RmlsZU5hbWUoaXRlci5pdGVtKCkpOworCQlpZiAobmFtZS5tYXRjaChuZXcg
UmVnRXhwKCJnZW5fIikpKSB7CisJCQljb3VudCsrOworCQl9CisJfQorCXJldHVybiBjb3VudDsK
K30KKworZnVuY3Rpb24gZ2VuZXJhdGVfc291cmNlKCkgeworCisJdmFyIGNvdW50ID0gY291bnRf
Z2VuZXJhdGVkX2ZpbGVzKCk7CisKKwlpZiAoY291bnQgPCA4KSB7CisJCWlmICghRlNPLkZpbGVF
eGlzdHMoIndpbjMyXFx0ZW1wLmJhdCIpKSB7CisJCQlTVERFUlIuV3JpdGVMaW5lKCJSdW4gYnVp
bGRjb25mIGZpcnN0IC0gdGhlIHNvdXJjZSBmaWxlIGdlbmVyYXRvciBpcyBtaXNzaW5nIik7CisJ
CQlXU2NyaXB0LlF1aXQoMTApOworCQl9IGVsc2UgeworCQkJV3NoU2hlbGwuUnVuKCJ3aW4zMlxc
dGVtcCIsIDApOworCQl9CisJfQorCXJldHVybjsKK30KKworZnVuY3Rpb24gY2hlY2tfZ2VuZXJh
dGlvbigpIHsKKworCXZhciBjb3VudCA9IGNvdW50X2dlbmVyYXRlZF9maWxlcygpOworCisJaWYg
KGNvdW50IDwgOCkgeworCQlTVERPVVQuV3JpdGVMaW5lKCJXYWl0aW5nIGZvciBzb3VyY2UgZmls
ZXMgdG8gZ2VuZXJhdGUuLi4iKTsKKwkJV1NjcmlwdC5TbGVlcCgzNTAwKTsKKwkJY2hlY2tfZ2Vu
ZXJhdGlvbigpOworCX0KKwlyZXR1cm47Cit9CisKK2Z1bmN0aW9uIGdldF92ZXJzaW9uX251bWJl
cnMoKSB7CisKKwkvKiBwaWNrIHVwIHRoZSB2ZXJzaW9uIGZyb20gbWFpbi9waHBfZ3RrLmggKi8K
Kwl2YXIgdmluID0gZmlsZV9nZXRfY29udGVudHMoIm1haW5cXHBocF9ndGsuaCIpOworCXZhciB2
ZXJzaW9uLCB2ZXJzaW9uX3N0cmluZ3MsIG1ham9yLCBtaW5vciwgZGV0YWlscywgcmVsZWFzZSwg
c3VidmVyc2lvbl9zdHJpbmdzLCBleHRyYSA9ICIiOworCisJaWYgKHZpbi5tYXRjaChuZXcgUmVn
RXhwKCJQSFBfR1RLX1ZFUlNJT04gXCIoW15cIl0rKVwiIikpKSB7CisJCXZlcnNpb24gPSBSZWdF
eHAuJDE7CisJCXZlcnNpb25fc3RyaW5ncyA9IHZlcnNpb24uc3BsaXQoIi4iKTsKKworCQltYWpv
ciA9IHZlcnNpb25fc3RyaW5nc1swXTsKKwkJbWlub3IgPSB2ZXJzaW9uX3N0cmluZ3NbMV07CisJ
CWRldGFpbHMgPSB2ZXJzaW9uX3N0cmluZ3NbMl07CisKKwkJaWYgKGRldGFpbHMuaW5kZXhPZigi
LSIpID09IC0xKSB7CisJCQlyZWxlYXNlID0gZGV0YWlsczsKKwkJfSBlbHNlIHsKKwkJCXN1YnZl
cnNpb25fc3RyaW5ncyA9IGRldGFpbHMuc3BsaXQoIi0iKTsKKwkJCXJlbGVhc2UgPSBzdWJ2ZXJz
aW9uX3N0cmluZ3NbMF07CisJCQlleHRyYSA9ICItIiArIHN1YnZlcnNpb25fc3RyaW5nc1sxXTsK
KwkJfQorCX0KKworCXZhciB2ZmlsZSA9IEZTTy5DcmVhdGVUZXh0RmlsZSgibWFpbi9waHBfZ3Rr
X3ZlcnNpb24uaCIsIHRydWUpOworCXZmaWxlLldyaXRlTGluZSgiLyogVGhpcyBmaWxlIGlzIGF1
dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyB3aW4zMiBjb25maWd1cmF0aW9uICovIik7CisJ
dmZpbGUuV3JpdGVMaW5lKCIvKiBFZGl0IHBocF9ndGsuaCB0byBjaGFuZ2UgdGhlIHZlcnNpb24g
bnVtYmVyICovIik7CisJdmZpbGUuV3JpdGVMaW5lKCIjZGVmaW5lIFBIUF9HVEtfTUFKT1JfVkVS
U0lPTiAiICsgbWFqb3IpOworCXZmaWxlLldyaXRlTGluZSgiI2RlZmluZSBQSFBfR1RLX01JTk9S
X1ZFUlNJT04gIiArIG1pbm9yKTsKKwl2ZmlsZS5Xcml0ZUxpbmUoIiNkZWZpbmUgUEhQX0dUS19S
RUxFQVNFX1ZFUlNJT04gIiArIHJlbGVhc2UpOworCXZmaWxlLldyaXRlTGluZSgiI2RlZmluZSBQ
SFBfR1RLX0VYVFJBX1ZFUlNJT04gXCIiICsgZXh0cmEgKyAiXCIiKTsKKworCURFRklORSgnUEhQ
X0dUS19WRVJTSU9OX1NUUklORycsIHZlcnNpb24pOworfQorCitmdW5jdGlvbiBjb25kZW5zZV9w
YXRoKHBhdGgpIHsKKworCXBhdGggPSBGU08uR2V0QWJzb2x1dGVQYXRoTmFtZShwYXRoKTsKKwor
CWlmIChwYXRoLnN1YnN0cigwLCBDV0QubGVuZ3RoKS50b0xvd2VyQ2FzZSgpCisJCQk9PSBDV0Qu
dG9Mb3dlckNhc2UoKSAmJgorCQkJKHBhdGguY2hhckNvZGVBdChDV0QubGVuZ3RoKSA9PSA5MiB8
fCBwYXRoLmNoYXJDb2RlQXQoQ1dELmxlbmd0aCkgPT0gNDcpKSB7CisJCXJldHVybiBwYXRoLnN1
YnN0cihDV0QubGVuZ3RoICsgMSk7CisJfQorCisJdmFyIGEgPSBDV0Quc3BsaXQoIlxcIik7CisJ
dmFyIGIgPSBwYXRoLnNwbGl0KCJcXCIpOworCXZhciBpLCBqOworCisJZm9yIChpID0gMDsgaSA8
IGIubGVuZ3RoOyBpKyspIHsKKwkJaWYgKGFbaV0udG9Mb3dlckNhc2UoKSA9PSBiW2ldLnRvTG93
ZXJDYXNlKCkpCisJCQljb250aW51ZTsKKwkJaWYgKGkgPiAwKSB7CisJCQkvKiBmaXJzdCBkaWZm
ZXJlbmNlIGZvdW5kICovCisJCQlwYXRoID0gIiI7CisJCQlmb3IgKGogPSAwOyBqIDwgYS5sZW5n
dGggLSBpOyBqKyspIHsKKwkJCQlwYXRoICs9ICIuLlxcIjsKKwkJCX0KKwkJCWZvciAoaiA9IGk7
IGogPCBiLmxlbmd0aDsgaisrKSB7CisJCQkJcGF0aCArPSBiW2pdOworCQkJCWlmIChqIDwgYi5s
ZW5ndGggLSAxKQorCQkJCQlwYXRoICs9ICJcXCI7CisJCQl9CisJCQlyZXR1cm4gcGF0aDsKKwkJ
fQorCQkvKiBvbiBhIGRpZmZlcmVudCBkcml2ZSAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4g
cGF0aDsKK30KKworZnVuY3Rpb24gQ29uZmlndXJlQXJnKHR5cGUsIG9wdG5hbWUsIGhlbHB0ZXh0
LCBkZWZ2YWwpIHsKKworCXZhciBvcHB0eXBlID0gdHlwZSA9PSAiZW5hYmxlIiA/ICJkaXNhYmxl
IiA6ICJ3aXRob3V0IjsKKworCWlmIChkZWZ2YWwgPT0gInllcyIgfHwgZGVmdmFsID09ICJ5ZXMs
c2hhcmVkIikgeworCQl0aGlzLmFyZyA9ICItLSIgKyBvcHB0eXBlICsgIi0iICsgb3B0bmFtZTsK
KwkJdGhpcy5pbXBhcmcgPSAiLS0iICsgdHlwZSArICItIiArIG9wdG5hbWU7CisJfSBlbHNlIHsK
KwkJdGhpcy5hcmcgPSAiLS0iICsgdHlwZSArICItIiArIG9wdG5hbWU7CisJCXRoaXMuaW1wYXJn
ID0gIi0tIiArIG9wcHR5cGUgKyAiLSIgKyBvcHRuYW1lOworCX0KKworCXRoaXMub3B0bmFtZSA9
IG9wdG5hbWU7CisJdGhpcy5oZWxwdGV4dCA9IGhlbHB0ZXh0OworCXRoaXMuZGVmdmFsID0gZGVm
dmFsOworCXRoaXMuc3ltdmFsID0gb3B0bmFtZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UobmV3IFJl
Z0V4cCgiLSIsICJnIiksICJfIik7CisJdGhpcy5zZWVuID0gZmFsc2U7CisJdGhpcy5hcmd2YWwg
PSBkZWZ2YWw7Cit9CisKK2Z1bmN0aW9uIGFuYWx5emVfYXJnKGFyZ3ZhbCkgeworCisJdmFyIHJl
dCA9IG5ldyBBcnJheSgpOworCXZhciBzaGFyZWQgPSBmYWxzZTsKKworCWlmIChhcmd2YWwgPT0g
InNoYXJlZCIpIHsKKwkJc2hhcmVkID0gdHJ1ZTsKKwkJYXJndmFsID0gInllcyI7CisJfSBlbHNl
IGlmIChhcmd2YWwgPT0gbnVsbCkgeworCQkvKiBub3RoaW5nICovCisJfSBlbHNlIGlmIChhcmdf
bWF0Y2ggPSBhcmd2YWwubWF0Y2gobmV3IFJlZ0V4cCgiXnNoYXJlZCwoLiopIikpKSB7CisJCXNo
YXJlZCA9IHRydWU7CisJCWFyZ3ZhbCA9IGFyZ19tYXRjaFsxXTsKKwl9IGVsc2UgaWYgKGFyZ19t
YXRjaCA9IGFyZ3ZhbC5tYXRjaChuZXcgUmVnRXhwKCJeKC4qKSxzaGFyZWQkIikpKSB7CisJCXNo
YXJlZCA9IHRydWU7CisJCWFyZ3ZhbCA9IGFyZ19tYXRjaFsxXTsKKwl9CisKKwlyZXRbMF0gPSBz
aGFyZWQ7CisJcmV0WzFdID0gYXJndmFsOworCXJldHVybiByZXQ7Cit9CisKK2Z1bmN0aW9uIGNv
bmZfcHJvY2Vzc19hcmdzKCkgeworCisJdmFyIGksIGo7CisJdmFyIGNvbmZpZ3VyZV9oZWxwX21v
ZGUgPSBmYWxzZTsKKwl2YXIgYW5hbHl6ZWQgPSBmYWxzZTsKKwl2YXIgbmljZSA9ICJjc2NyaXB0
IC9ub2xvZ28gY29uZmlndXJlLmpzICI7CisJdmFyIGRpc2FibGVfYWxsID0gZmFsc2U7CisKKwlh
cmdzID0gV1NjcmlwdC5Bcmd1bWVudHM7CisJZm9yIChpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBp
KyspIHsKKwkJYXJnID0gYXJncyhpKTsKKwkJbmljZSArPSAnICInICsgYXJnICsgJyInOworCQlp
ZiAoYXJnID09ICItLWhlbHAiKSB7CisJCQljb25maWd1cmVfaGVscF9tb2RlID0gdHJ1ZTsKKwkJ
CWJyZWFrOworCQl9CisJCWlmIChhcmcgPT0gIi0tZGlzYWJsZS1hbGwiKSB7CisJCQlkaXNhYmxl
X2FsbCA9IHRydWU7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIElmIGl0IGlzIC0tZm9vPWJh
ciwgc3BsaXQgb24gdGhlIGVxdWFscyBzaWduCisJCWFyZyA9IGFyZy5zcGxpdCgiPSIsIDIpOwor
CQlhcmduYW1lID0gYXJnWzBdOworCQlpZiAoYXJnLmxlbmd0aCA+IDEpIHsKKwkJCWFyZ3ZhbCA9
IGFyZ1sxXTsKKwkJfSBlbHNlIHsKKwkJCWFyZ3ZhbCA9IG51bGw7CisJCX0KKworCQkvLyBGaW5k
IHRoZSBhcmcKKwkJZm91bmQgPSBmYWxzZTsKKwkJZm9yIChqID0gMDsgaiA8IGNvbmZpZ3VyZV9h
cmdzLmxlbmd0aDsgaisrKSB7CisJCQlpZiAoYXJnbmFtZSA9PSBjb25maWd1cmVfYXJnc1tqXS5p
bXBhcmcgfHwgYXJnbmFtZSA9PSBjb25maWd1cmVfYXJnc1tqXS5hcmcpIHsKKwkJCQlmb3VuZCA9
IHRydWU7CisKKwkJCQlhcmcgPSBjb25maWd1cmVfYXJnc1tqXTsKKwkJCQlhcmcuc2VlbiA9IHRy
dWU7CisKKwkJCQlhbmFseXplZCA9IGFuYWx5emVfYXJnKGFyZ3ZhbCk7CisJCQkJc2hhcmVkID0g
YW5hbHl6ZWRbMF07CisJCQkJYXJndmFsID0gYW5hbHl6ZWRbMV07CisKKwkJCQlpZiAoYXJnbmFt
ZSA9PSBhcmcuaW1wYXJnKSB7CisJCQkJCS8qIHdlIG1hdGNoZWQgdGhlIGltcGxpY2l0LCBvciBk
ZWZhdWx0IGFyZyAqLworCQkJCQlpZiAoYXJndmFsID09IG51bGwpIHsKKwkJCQkJCWFyZ3ZhbCA9
IGFyZy5kZWZ2YWw7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvKiB3ZSBtYXRjaGVkIHRo
ZSBub24tZGVmYXVsdCBhcmcgKi8KKwkJCQkJaWYgKGFyZ3ZhbCA9PSBudWxsKSB7CisJCQkJCQlh
cmd2YWwgPSBhcmcuZGVmdmFsID09ICJubyIgPyAieWVzIiA6ICJubyI7CisJCQkJCX0KKwkJCQl9
CisJCQkJCisJCQkJYXJnLmFyZ3ZhbCA9IGFyZ3ZhbDsKKwkJCQlldmFsKCJQSFBfR1RLXyIgKyBh
cmcuc3ltdmFsICsgIiA9IGFyZ3ZhbDsiKTsKKwkJCQlldmFsKCJQSFBfR1RLXyIgKyBhcmcuc3lt
dmFsICsgIl9TSEFSRUQgPSBzaGFyZWQ7Iik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYg
KCFmb3VuZCkgeworCQkJU1RERVJSLldyaXRlTGluZSgiVW5rbm93biBvcHRpb24gIiArIGFyZ25h
bWUpCisJCQlTVERFUlIuV3JpdGVMaW5lKCJQbGVhc2UgdHJ5IGNvbmZpZ3VyZS5qcyAtLWhlbHAg
Zm9yIGEgbGlzdCBvZiB2YWxpZCBvcHRpb25zIik7CisJCQlXU2NyaXB0LlF1aXQoMik7CisJCX0K
Kwl9CisKKwlpZiAoY29uZmlndXJlX2hlbHBfbW9kZSkgeworCQlTVERPVVQuV3JpdGVCbGFua0xp
bmVzKDEpOworCQlTVERPVVQuV3JpdGVMaW5lKCIgIFRoZXJlIGFyZSBubyBQSFAtR1RLIGV4dGVu
c2lvbnMgYXZhaWxhYmxlIGF0IHByZXNlbnQuIik7CisJCVNURE9VVC5Xcml0ZUJsYW5rTGluZXMo
MSk7CisKKwkJLy8gTWVhc3VyZSB3aWR0aCB0byBwcmV0dHktcHJpbnQgdGhlIG91dHB1dAorCQlt
YXhfd2lkdGggPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlndXJlX2FyZ3MubGVuZ3RoOyBp
KyspIHsKKwkJCWFyZyA9IGNvbmZpZ3VyZV9hcmdzW2ldOworCQkJaWYgKGFyZy5hcmcubGVuZ3Ro
ID4gbWF4X3dpZHRoKSB7CisJCQkJbWF4X3dpZHRoID0gYXJnLmFyZy5sZW5ndGg7CisJCQl9CisJ
CX0KKworCQlmb3IgKGkgPSAwOyBpIDwgY29uZmlndXJlX2FyZ3MubGVuZ3RoOyBpKyspIHsKKwkJ
CWFyZyA9IGNvbmZpZ3VyZV9hcmdzW2ldOworCisJCQluID0gbWF4X3dpZHRoIC0gYXJnLmFyZy5s
ZW5ndGg7CisJCQlwYWQgPSAiICAgIjsKKwkJCWZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKwkJ
CQlwYWQgKz0gIiAiOworCQkJfQorCQkJU1RET1VULldyaXRlTGluZSgiICAiICsgYXJnLmFyZyAr
IHBhZCArIHdvcmRfd3JhcF9hbmRfaW5kZW50KG1heF93aWR0aCArIDUsIGFyZy5oZWxwdGV4dCkp
OworCQl9CisJCVdTY3JpcHQuUXVpdCgxKTsKKworCX0gZWxzZSB7IC8vIG5vdCAtLWhlbHAKKwor
CQlnZW5lcmF0ZV9zb3VyY2UoKTsKKwl9CisKKwkvLyBOb3cgc2V0IGFueSBkZWZhdWx0cyB3ZSBt
aWdodCBoYXZlIG1pc3NlZCBvdXQgZWFybGllcgorCWZvciAoaSA9IDA7IGkgPCBjb25maWd1cmVf
YXJncy5sZW5ndGg7IGkrKykgeworCQlhcmcgPSBjb25maWd1cmVfYXJnc1tpXTsKKwkJaWYgKGFy
Zy5zZWVuKQorCQkJY29udGludWU7CisJCWFuYWx5emVkID0gYW5hbHl6ZV9hcmcoYXJnLmRlZnZh
bCk7CisJCXNoYXJlZCA9IGFuYWx5emVkWzBdOworCQlhcmd2YWwgPSBhbmFseXplZFsxXTsKKwor
CQlpZiAoZGlzYWJsZV9hbGwpIHsKKwkJCWFyZ3ZhbCA9ICJubyI7CisJCQlzaGFyZWQgPSBmYWxz
ZTsKKwkJfQorCisJCWV2YWwoIlBIUF9HVEtfIiArIGFyZy5zeW12YWwgKyAiID0gYXJndmFsOyIp
OworCQlldmFsKCJQSFBfR1RLXyIgKyBhcmcuc3ltdmFsICsgIl9TSEFSRUQgPSBzaGFyZWQ7Iik7
CisJfQorCisJTUZPID0gRlNPLkNyZWF0ZVRleHRGaWxlKCJNYWtlZmlsZS5vYmplY3RzIiwgdHJ1
ZSk7CisKKwlTVERPVVQuV3JpdGVCbGFua0xpbmVzKDEpOworCVNURE9VVC5Xcml0ZUxpbmUoIlNh
dmluZyBjb25maWd1cmUgb3B0aW9ucyB0byBjb25maWd1cmUuYmF0Iik7CisJdmFyIG5pY2VmaWxl
ID0gRlNPLkNyZWF0ZVRleHRGaWxlKCJjb25maWd1cmUuYmF0IiwgdHJ1ZSk7CisJbmljZWZpbGUu
V3JpdGVMaW5lKG5pY2UpOworCW5pY2VmaWxlLkNsb3NlKCk7CisKKwlBQ19ERUZJTkUoJ0NPTkZJ
R1VSRV9DT01NQU5EJywgbmljZSk7Cit9CisKK2Z1bmN0aW9uIGZpbmRfcGF0dGVybl9pbl9wYXRo
KHBhdHRlcm4sIHBhdGgpIHsKKworCWlmIChwYXRoID09IG51bGwpIHsKKwkJcmV0dXJuIGZhbHNl
OworCX0KKworCXZhciBkaXJzID0gcGF0aC5zcGxpdCgnOycpOworCXZhciBpOworCXZhciBpdGVt
czsKKworCWZvciAoaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgaSsrKSB7CisJCWl0ZW1zID0gZ2xv
YihkaXJzW2ldICsgIlxcIiArIHBhdHRlcm4pOworCQlpZiAoaXRlbXMpIHsKKwkJCXJldHVybiBj
b25kZW5zZV9wYXRoKGl0ZW1zWzBdKTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK2Z1
bmN0aW9uIEFSR19XSVRIKG9wdG5hbWUsIGhlbHB0ZXh0LCBkZWZ2YWwpIHsKKworCWNvbmZpZ3Vy
ZV9hcmdzW2NvbmZpZ3VyZV9hcmdzLmxlbmd0aF0gPSBuZXcgQ29uZmlndXJlQXJnKCJ3aXRoIiwg
b3B0bmFtZSwgaGVscHRleHQsIGRlZnZhbCk7Cit9CisKK2Z1bmN0aW9uIEFSR19FTkFCTEUob3B0
bmFtZSwgaGVscHRleHQsIGRlZnZhbCkgeworCisJY29uZmlndXJlX2FyZ3NbY29uZmlndXJlX2Fy
Z3MubGVuZ3RoXSA9IG5ldyBDb25maWd1cmVBcmcoImVuYWJsZSIsIG9wdG5hbWUsIGhlbHB0ZXh0
LCBkZWZ2YWwpOworfQorCitmdW5jdGlvbiBERUZJTkUobmFtZSwgdmFsdWUpIHsKKworCWlmIChj
b25maWd1cmVfc3Vic3QuRXhpc3RzKG5hbWUpKSB7CisJCWNvbmZpZ3VyZV9zdWJzdC5SZW1vdmUo
bmFtZSk7CisJfQorCWNvbmZpZ3VyZV9zdWJzdC5BZGQobmFtZSwgdmFsdWUpOworfQorCitmdW5j
dGlvbiBBQ19ERUZJTkUobmFtZSwgdmFsdWUsIGNvbW1lbnQsIHF1b3RlKSB7CisKKwlpZiAocXVv
dGUgPT0gbnVsbCkgeworCQlxdW90ZSA9IHRydWU7CisJfQorCWlmIChxdW90ZSAmJiB0eXBlb2Yo
dmFsdWUpID09ICJzdHJpbmciKSB7CisJCXZhbHVlID0gJyInICsgdmFsdWUucmVwbGFjZShuZXcg
UmVnRXhwKCcoWyJcXFxcXSknLCAiZyIpLCAnXFwkMScpICsgJyInOworCX0gZWxzZSBpZiAodmFs
dWUubGVuZ3RoID09IDApIHsKKwkJdmFsdWUgPSAnIiInOworCX0KKwl2YXIgaXRlbSA9IG5ldyBB
cnJheSh2YWx1ZSwgY29tbWVudCk7CisJaWYgKGNvbmZpZ3VyZV9oZHIuRXhpc3RzKG5hbWUpKSB7
CisJCXZhciBvcmlnX2l0ZW0gPSBjb25maWd1cmVfaGRyLkl0ZW0obmFtZSk7CisJCVNURE9VVC5X
cml0ZUxpbmUoIkFDX0RFRklORVsiICsgbmFtZSArICJdPSIgKyB2YWx1ZSArICI6IGlzIGFscmVh
ZHkgZGVmaW5lZCB0byAiICsgaXRlbVswXSk7CisJfSBlbHNlIHsKKwkJY29uZmlndXJlX2hkci5B
ZGQobmFtZSwgaXRlbSk7CisJfQorfQorCitmdW5jdGlvbiBQQVRIX1BST0cocHJvZ25hbWUsIGFk
ZGl0aW9uYWxfcGF0aHMsIHN5bWJvbCkgeworCisJdmFyIGV4ZTsKKwl2YXIgcGxhY2U7CisJdmFy
IGN5Z19wYXRoID0gUEhQX0dUS19DWUdXSU4gKyAiXFxiaW47IiArIFBIUF9HVEtfQ1lHV0lOICsg
IlxcdXNyXFxsb2NhbFxcYmluIjsKKworCWV4ZSA9IHByb2duYW1lICsgIi5leGUiOworCisJaWYg
KGFkZGl0aW9uYWxfcGF0aHMgPT0gbnVsbCkgeworCQlhZGRpdGlvbmFsX3BhdGhzID0gY3lnX3Bh
dGg7CisJfSBlbHNlIHsKKwkJYWRkaXRpb25hbF9wYXRocyArPSAiOyIgKyBjeWdfcGF0aDsKKwl9
CisKKwlwbGFjZSA9IHNlYXJjaF9wYXRocyhleGUsIGFkZGl0aW9uYWxfcGF0aHMsICJQQVRIIik7
CisKKwlpZiAocGxhY2UgPT0gdHJ1ZSkgeworCQlwbGFjZSA9IGV4ZTsKKwl9IGVsc2UgaWYgKHBs
YWNlICE9IGZhbHNlKSB7CisKKwkJaWYgKHBsYWNlLmxhc3RJbmRleE9mKCJcXCIpICE9IHBsYWNl
Lmxlbmd0aCAtIDEpIHsKKwkJCXBsYWNlICs9ICJcXCI7CisJCX0KKworCQlwbGFjZSA9IHBsYWNl
ICsgZXhlOworCisJCWlmIChwbGFjZS5pbmRleE9mKCIgIikpIHsKKwkJCXBsYWNlID0gJyInICsg
cGxhY2UgKyAnIic7CisJCX0KKwl9CisKKwlpZiAocGxhY2UpIHsKKwkJaWYgKHN5bWJvbCA9PSBu
dWxsKSB7CisJCQlzeW1ib2wgPSBwcm9nbmFtZS50b1VwcGVyQ2FzZSgpOworCQl9CisJCURFRklO
RShzeW1ib2wsIHBsYWNlKTsKKwl9CisJcmV0dXJuIHBsYWNlOworfQorCitmdW5jdGlvbiBDSEVD
S19MSUIobGlibmFtZXMsIHRhcmdldCwgcGF0aF90b19jaGVjaywgY29tbW9uX25hbWUpIHsKKwor
CVNURE9VVC5Xcml0ZSgiQ2hlY2tpbmcgZm9yICIgKyBsaWJuYW1lcyArICIgLi4uICIpOworCisJ
aWYgKGNvbW1vbl9uYW1lID09IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpIHsKKwkJY29tbW9uX25h
bWUgPSB0YXJnZXQ7CisJfQorCisJaWYgKHBhdGhfdG9fY2hlY2sgPT0gbnVsbCkgeworCQlwYXRo
X3RvX2NoZWNrID0gIiI7CisJfQorCisJLy8gaWYgdGhleSBzcGVjaWZpZWQgYSBjb21tb24gbmFt
ZSBmb3IgdGhlIHBhY2thZ2UgdGhhdCBjb250YWlucworCS8vIHRoZSBsaWJyYXJ5LCB0YWcgc29t
ZSB1c2VmdWwgZGVmYXVsdHMgb24gdG8gdGhlIGVuZCBvZiB0aGUKKwkvLyBwYXRoIHRvIGJlIHNl
YXJjaGVkCisJaWYgKGNvbW1vbl9uYW1lICE9IG51bGwpIHsKKwkJcGF0aF90b19jaGVjayArPSAi
Oy4uXFwiICsgY29tbW9uX25hbWUgKyAiKiI7CisJfQorCisJLy8gRGV0ZXJtaW5lIHRhcmdldCBm
b3IgYnVpbGQgZmxhZ3MKKwlpZiAodGFyZ2V0ID09IG51bGwpIHsKKwkJdGFyZ2V0ID0gIiI7CisJ
fSBlbHNlIHsKKwkJdGFyZ2V0ID0gIl8iICsgdGFyZ2V0LnRvVXBwZXJDYXNlKCkucmVwbGFjZShu
ZXcgUmVnRXhwKCItIiwgImciKSwgIl8iKTsKKwl9CisKKwkvLyBFeHBhbmQgcGF0aCB0byBpbmNs
dWRlIGdlbmVyYWwgZGlycworCXBhdGhfdG9fY2hlY2sgKz0gIjsiICsgcGhwX3VzdWFsX2xpYl9z
dXNwZWN0czsKKworCS8vIEl0IGlzIGNvbW1vbiBwcmFjdGljZSB0byBwdXQgbGlicyB1bmRlciBv
bmUgb2YgdGhlc2UgZGlyIG5hbWVzCisJdmFyIHN1YmRpcnMgPSBuZXcgQXJyYXkoUEhQX0dUS19E
RUJVRyA9PSAieWVzIiA/ICJEZWJ1ZyIgOiAiUmVsZWFzZSIsICJsaWIiLCAibGlicyIsICJsaWJl
eGVjIik7CisKKwkvLyBsaWJuYW1lcyBjYW4gYmUgOyBzZXBhcmF0ZWQgbGlzdCBvZiBhY2NlcHRl
ZCBsaWJyYXJ5IG5hbWVzCisJbGlibmFtZXMgPSBsaWJuYW1lcy5zcGxpdCgnOycpOworCisJdmFy
IGksIGosIGssIGxpYm5hbWU7CisJdmFyIGxvY2F0aW9uID0gZmFsc2U7CisJdmFyIHBhdGggPSBw
YXRoX3RvX2NoZWNrLnNwbGl0KCc7Jyk7CisJCisJZm9yIChpID0gMDsgaSA8IGxpYm5hbWVzLmxl
bmd0aDsgaSsrKSB7CisJCWxpYm5hbWUgPSBsaWJuYW1lc1tpXTsKKworCQlmb3IgKGsgPSAwOyBr
IDwgcGF0aC5sZW5ndGg7IGsrKykgeworCQkJbG9jYXRpb24gPSBnbG9iKHBhdGhba10gKyAiXFwi
ICsgbGlibmFtZSk7CisJCQlpZiAobG9jYXRpb24pIHsKKwkJCQlsb2NhdGlvbiA9IGxvY2F0aW9u
WzBdOworCQkJCWJyZWFrOworCQkJfQorCQkJZm9yIChqID0gMDsgaiA8IHN1YmRpcnMubGVuZ3Ro
OyBqKyspIHsKKwkJCQlsb2NhdGlvbiA9IGdsb2IocGF0aFtrXSArICJcXCIgKyBzdWJkaXJzW2pd
ICsgIlxcIiArIGxpYm5hbWUpOworCQkJCWlmIChsb2NhdGlvbikgeworCQkJCQlsb2NhdGlvbiA9
IGxvY2F0aW9uWzBdOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAobG9jYXRpb24p
CisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAobG9jYXRpb24pIHsKKwkJCWxvY2F0aW9uID0gY29u
ZGVuc2VfcGF0aChsb2NhdGlvbik7CisJCQl2YXIgbGliZGlyID0gRlNPLkdldFBhcmVudEZvbGRl
ck5hbWUobG9jYXRpb24pOworCQkJbGlibmFtZSA9IEZTTy5HZXRGaWxlTmFtZShsb2NhdGlvbik7
CisJCQlBRERfRkxBRygiTERGTEFHUyIgKyB0YXJnZXQsICcvbGlicGF0aDoiJyArIGxpYmRpciAr
ICciICcpOworCQkJQUREX0ZMQUcoIkxJQlMiICsgdGFyZ2V0LCBsaWJuYW1lKTsKKworCQkJU1RE
T1VULldyaXRlTGluZSgJbG9jYXRpb24pOworCisJCQlyZXR1cm4gbG9jYXRpb247CisJCX0KKwor
CQkvLyBDaGVjayBpbiB0aGVpciBzdGFuZGFyZCBsaWIgcGF0aAorCQlsb2NhdGlvbiA9IGZpbmRf
cGF0dGVybl9pbl9wYXRoKGxpYm5hbWUsIFdzaFNoZWxsLkVudmlyb25tZW50KCJQcm9jZXNzIiku
SXRlbSgiTElCIikpOworCisJCWlmIChsb2NhdGlvbikgeworCQkJbG9jYXRpb24gPSBjb25kZW5z
ZV9wYXRoKGxvY2F0aW9uKTsKKwkJCWxpYm5hbWUgPSBGU08uR2V0RmlsZU5hbWUobG9jYXRpb24p
OworCQkJQUREX0ZMQUcoIkxJQlMiICsgdGFyZ2V0LCBsaWJuYW1lKTsKKworCQkJU1RET1VULldy
aXRlTGluZSgiCTxpbiBMSUIgcGF0aD4gIiArIGxpYm5hbWUpOworCQkJcmV0dXJuIGxvY2F0aW9u
OworCQl9CisJfQorCisJU1RET1VULldyaXRlTGluZSgiCTxub3QgZm91bmQ+Iik7CisKKwlyZXR1
cm4gZmFsc2U7Cit9CisKK2Z1bmN0aW9uIENIRUNLX0hFQURFUihoZWFkZXJfbmFtZSwgcGF0aF90
b19jaGVjaykgeworCisJdmFyIHBhdGggPSBzZWFyY2hfcGF0aHMoaGVhZGVyX25hbWUsIHBhdGhf
dG9fY2hlY2ssICJJTkNMVURFIik7CisKKwlpZiAoIXBhdGgpIHsKKwkJRVJST1IoIkFib3J0aW5n
IGNvbmZpZ3VyZSBwcm9jZXNzIik7CisJfQorCisJcmV0dXJuIHBhdGg7Cit9CisKKy8vIHVzZSB0
aGlzIGZvciB2ZXJzaW9uIGNoZWNraW5nCitmdW5jdGlvbiBHUkVQX0hFQURFUihoZWFkZXJfbmFt
ZSwgcmVnZXgsIHBhdGhfdG9fY2hlY2spIHsKKworCXZhciBjID0gZmFsc2U7CisKKwlpZiAoRlNP
LkZpbGVFeGlzdHMocGF0aF90b19jaGVjayArICJcXCIgKyBoZWFkZXJfbmFtZSkpIHsKKwkJYyA9
IGZpbGVfZ2V0X2NvbnRlbnRzKHBhdGhfdG9fY2hlY2sgKyAiXFwiICsgaGVhZGVyX25hbWUpOwor
CX0KKworCWlmICghYykgeworCQkvKiBsb29rIGluIHRoZSBpbmNsdWRlIHBhdGggKi8KKworCQl2
YXIgcCA9IHNlYXJjaF9wYXRocyhoZWFkZXJfbmFtZSwgcGF0aF90b19jaGVjaywgIklOQ0xVREUi
KTsKKworCQlpZiAodHlwZW9mKHApID09ICJzdHJpbmciKSB7CisJCQljID0gZmlsZV9nZXRfY29u
dGVudHMocCk7CisJCX0KKworCQlpZiAoIWMpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0K
KworCWlmICh0eXBlb2YocmVnZXgpID09ICJzdHJpbmciKSB7CisJCXJlZ2V4ID0gbmV3IFJlZ0V4
cChyZWdleCk7CisJfQorCisJaWYgKGMubWF0Y2gocmVnZXgpKSB7CisJCS8qIGNhbGxlciBjYW4g
bm93IHVzZSBSZWdFeHAuJDEgZXRjLiB0byBnZXQgYXQgcGF0dGVybnMgKi8KKwkJcmV0dXJuIHRy
dWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworZnVuY3Rpb24gQ0hFQ0tfSEVBREVSX0FERF9J
TkNMVURFKGhlYWRlcl9uYW1lLCBmbGFnX25hbWUsIHBhdGhfdG9fY2hlY2ssIHVzZV9lbnYsIGFk
ZF9kaXJfcGFydCwgYWRkX3RvX2ZsYWdfb25seSkgeworCisJdmFyIGRpcl9wYXJ0X3RvX2FkZCA9
ICIiOworCisJaWYgKHVzZV9lbnYgPT0gbnVsbCkgeworCQl1c2VfZW52ID0gdHJ1ZTsKKwl9CisK
KwkvLyBpZiB0cnVlLCBhZGQgdGhlIGRpciBwYXJ0IG9mIHRoZSBoZWFkZXJfbmFtZSB0byB0aGUg
aW5jbHVkZSBwYXRoCisJaWYgKGFkZF9kaXJfcGFydCA9PSBudWxsKSB7CisJCWFkZF9kaXJfcGFy
dCA9IGZhbHNlOworCX0gZWxzZSBpZiAoYWRkX2Rpcl9wYXJ0KSB7CisJCXZhciBiYXNlbmFtZSA9
IEZTTy5HZXRGaWxlTmFtZShoZWFkZXJfbmFtZSk7CisJCWRpcl9wYXJ0X3RvX2FkZCA9ICJcXCIg
KyBoZWFkZXJfbmFtZS5zdWJzdHIoMCwgaGVhZGVyX25hbWUubGVuZ3RoIC0gYmFzZW5hbWUubGVu
Z3RoIC0gMSk7CisJfQorCisJaWYgKHBhdGhfdG9fY2hlY2sgPT0gbnVsbCkgeworCQlwYXRoX3Rv
X2NoZWNrID0gcGhwX3VzdWFsX2luY2x1ZGVfc3VzcGVjdHM7CisJfSBlbHNlIHsKKwkJcGF0aF90
b19jaGVjayArPSAiOyIgKyBwaHBfdXN1YWxfaW5jbHVkZV9zdXNwZWN0czsKKwl9CisJCisJdmFy
IHAgPSBzZWFyY2hfcGF0aHMoaGVhZGVyX25hbWUsIHBhdGhfdG9fY2hlY2ssIHVzZV9lbnYgPyAi
SU5DTFVERSIgOiBudWxsKTsKKwl2YXIgaGF2ZSA9IDA7CisJdmFyIHN5bTsKKworCWlmICh0eXBl
b2YocCkgPT0gInN0cmluZyIpIHsKKwkJQUREX0ZMQUcoZmxhZ19uYW1lLCAnL0kgIicgKyBwICsg
ZGlyX3BhcnRfdG9fYWRkICsgJyIgJyk7CisJfQorCisJaGF2ZSA9IHAgPyAxIDogMAorCisJc3lt
ID0gaGVhZGVyX25hbWUudG9VcHBlckNhc2UoKTsKKwlzeW0gPSBzeW0ucmVwbGFjZShuZXcgUmVn
RXhwKCJbXFxcXC9cLi1dIiwgImciKSwgIl8iKTsKKworCWlmICh0eXBlb2YoYWRkX3RvX2ZsYWdf
b25seSkgPT0gInVuZGVmaW5lZCIgJiYKKwkJCWZsYWdfbmFtZS5tYXRjaChuZXcgUmVnRXhwKCJe
Q0ZMQUdTXyguKikkIikpKSB7CisJCWFkZF90b19mbGFnX29ubHkgPSB0cnVlOworCX0KKworCWlm
ICh0eXBlb2YoYWRkX3RvX2ZsYWdfb25seSkgIT0gInVuZGVmaW5lZCIpIHsKKwkJQUREX0ZMQUco
ZmxhZ19uYW1lLCAiL0QgSEFWRV8iICsgc3ltICsgIj0iICsgaGF2ZSk7CisJfSBlbHNlIHsKKwkJ
QUNfREVGSU5FKCJIQVZFXyIgKyBzeW0sIGhhdmUsICJoYXZlIHRoZSAiICsgaGVhZGVyX25hbWUg
KyAiIGhlYWRlciBmaWxlIik7CisJfQorCisJcmV0dXJuIHA7Cit9CisKKy8qIEFkZCBhIGRlcGVu
ZGVuY3ksIHNvIHRoYXQgUEhQLUdUSyBpcyBidWlsdCBiZWZvcmUgYW55IG9mIGl0cyBleHRlbnNp
b25zICovCitmdW5jdGlvbiBBRERfRVhURU5TSU9OX0RFUChleHRuYW1lLCBkZXBlbmRzb24sIG9w
dGlvbmFsKSB7CisKKwl2YXIgRVhUID0gZXh0bmFtZS50b1VwcGVyQ2FzZSgpOworCXZhciBERVAg
PSBkZXBlbmRzb24udG9VcHBlckNhc2UoKTsKKwl2YXIgZGVwX3ByZXNlbnQgPSBmYWxzZTsKKwl2
YXIgZGVwX3NoYXJlZCA9IGZhbHNlOworCisJdHJ5IHsKKwkJZGVwX3ByZXNlbnQgPSBldmFsKCJQ
SFBfR1RLXyIgKyBERVApOworCQlkZXBfc2hhcmVkID0gZXZhbCgiUEhQX0dUS18iICsgREVQICsg
Il9TSEFSRUQiKTsKKwl9IGNhdGNoIChlKSB7CisJCWRlcF9wcmVzZW50ID0gIm5vIjsKKwkJZGVw
X3NoYXJlZCA9IGZhbHNlOworCX0KKwkKKwlpZiAob3B0aW9uYWwpIHsKKwkJaWYgKGRlcF9wcmVz
ZW50ID09ICJubyIpCisJCQlyZXR1cm47CisJfQorCisJdmFyIGV4dF9zaGFyZWQgPSBldmFsKCJQ
SFBfR1RLXyIgKyBFWFQgKyAiX1NIQVJFRCIpOworCisJaWYgKGRlcF9zaGFyZWQpIHsKKwkJQURE
X0ZMQUcoIkxERkxBR1NfIiArIEVYVCwgIi9saWJwYXRoOiQoQlVJTERfRElSKSIpOworCQlBRERf
RkxBRygiTElCU18iICsgRVhULCAicGhwXyIgKyBkZXBlbmRzb24gKyAiLmxpYiIpOworCQlBRERf
RkxBRygiREVQU18iICsgRVhULCAiJChCVUlMRF9ESVIpXFxwaHBfIiArIGRlcGVuZHNvbiArICIu
bGliIik7CisJfQorfQorCitmdW5jdGlvbiBFWFRFTlNJT04oZXh0bmFtZSwgZmlsZV9saXN0LCBz
aGFyZWQsIGNmbGFncywgZGxsbmFtZSwgb2JqX2RpcikgeworCisJdmFyIG9ianMgPSBudWxsOwor
CXZhciBFWFQgPSBleHRuYW1lLnRvVXBwZXJDYXNlKCkucmVwbGFjZShuZXcgUmVnRXhwKCItIiwg
ImciKSwgIl8iKTsKKwl2YXIgZXh0bmFtZV9mb3JfcHJpbnRpbmc7CisKKwlpZiAoc2hhcmVkID09
IG51bGwpIHsKKwkJZXZhbCgic2hhcmVkID0gUEhQX0dUS18iICsgRVhUICsgIl9TSEFSRUQ7Iik7
CisJfQorCisJaWYgKGNmbGFncyA9PSBudWxsKSB7CisJCWNmbGFncyA9ICIiOworCX0KKworCWlm
ICh0eXBlb2Yob2JqX2RpcikgPT0gInVuZGVmaW5lZCIpIHsKKworCQlleHRuYW1lX2Zvcl9wcmlu
dGluZyA9IGNvbmZpZ3VyZV9tb2R1bGVfZGlybmFtZTsKKworCX0gZWxzZSB7CisKKwkJZXh0bmFt
ZV9mb3JfcHJpbnRpbmcgPSBjb25maWd1cmVfbW9kdWxlX2Rpcm5hbWUgKyAiICh2aWEgIiArIG9i
al9kaXIgKyAiKSI7CisJfQorCisJU1RET1VULldyaXRlTGluZSgiRW5hYmxpbmcgZXh0ZW5zaW9u
ICIgKyBleHRuYW1lX2Zvcl9wcmludGluZyArICIgW3NoYXJlZF0iKTsKKwljZmxhZ3MgPSAiL0Qg
Q09NUElMRV9ETF8iICsgRVhUICsgIjIgL0QgIiArIEVYVCArICJfRVhQT1JUUz0xIiArIGNmbGFn
czsKKworCU1GTy5Xcml0ZUJsYW5rTGluZXMoMSk7CisJTUZPLldyaXRlTGluZSgiIyBvYmplY3Rz
IGZvciBFWFQgIiArIGV4dG5hbWUpOworCU1GTy5Xcml0ZUJsYW5rTGluZXMoMSk7CisKKwlBRERf
U09VUkNFUyhjb25maWd1cmVfbW9kdWxlX2Rpcm5hbWUsIGZpbGVfbGlzdCwgZXh0bmFtZSwgb2Jq
X2Rpcik7CisKKwlNRk8uV3JpdGVCbGFua0xpbmVzKDEpOworCisJLy8gUEhQLUdUSyBhbmQgaXRz
IGV4dGVuc2lvbnMgYXJlIGFsd2F5cyBidWlsdCBhcyBzaGFyZWQKKworCWlmIChkbGxuYW1lID09
IG51bGwpIHsKKwkJaWYgKGV4dG5hbWUgPT0gJ3BocC1ndGsnKSB7CisJCQlkbGxuYW1lID0gZXh0
bmFtZSArICIyLmRsbCI7CisJCX0gZWxzZSB7CisJCQlkbGxuYW1lID0gInBocF9ndGtfIiArIGV4
dG5hbWUgKyAiLmRsbCI7CisJCX0KKwl9CisJdmFyIGxpYm5hbWUgPSBkbGxuYW1lLnN1YnN0cmlu
ZygwLCBkbGxuYW1lLmxlbmd0aC00KSArICIubGliIjsKKwl2YXIgbGQgPSAiQCQoTEQpIjsKKwor
CXJlc25hbWUgPSBnZW5lcmF0ZV92ZXJzaW9uX2luZm9fcmVzb3VyY2UoZGxsbmFtZSwgY29uZmln
dXJlX21vZHVsZV9kaXJuYW1lKTsKKworCU1GTy5Xcml0ZUxpbmUoIiQoQlVJTERfRElSKVxcJChQ
SFBHVEtETEwpOiAkKCIgKyBFWFQgKyAiX0dMT0JBTF9PQkpTKSAkKFBIUEdUS0RMTF9SRVMpIik7
CisJTUZPLldyaXRlTGluZSgiXHQiICsgbGQgKyAiIC9vdXQ6JChCVUlMRF9ESVIpXFwkKFBIUEdU
S0RMTCkgJCgiICsgRVhUICsgIl9MREZMQUdTKSAkKExERkxBR1MpICQoIiArIEVYVCArICJfR0xP
QkFMX09CSlMpICQoTElCU18iICsgRVhUICsgIikgJChMSUJTKSAkKFBIUEdUS0RMTF9SRVMpIik7
CisJTUZPLldyaXRlQmxhbmtMaW5lcygxKTsKKworCU1GTy5Xcml0ZUxpbmUoZGxsbmFtZSArICI6
ICQoQlVJTERfRElSKVxcIiArIGRsbG5hbWUpOworCU1GTy5Xcml0ZUxpbmUoIlx0QGVjaG8gRVhU
ICIgKyBleHRuYW1lICsgIiBidWlsZCBjb21wbGV0ZSIpOworCU1GTy5Xcml0ZUJsYW5rTGluZXMo
MSk7CisKKwlBRERfRkxBRygiQ0ZMQUdTXyIgKyBFWFQsIGNmbGFncyk7Cit9CisKK2Z1bmN0aW9u
IEFERF9TT1VSQ0VTKGRpciwgZmlsZV9saXN0LCB0YXJnZXQsIG9ial9kaXIpIHsKKworCXZhciBp
OworCXZhciB0djsKKwl2YXIgc3JjLCBvYmosIHN5bSwgZmxhZ3M7CisKKwlpZiAodGFyZ2V0ID09
IG51bGwpIHsKKwkJdGFyZ2V0ID0gInBocCI7CisJfQorCisJc3ltID0gdGFyZ2V0LnRvVXBwZXJD
YXNlKCkucmVwbGFjZShuZXcgUmVnRXhwKCItIiwgImciKSwgIl8iKSArICJfR0xPQkFMX09CSlMi
OworCWZsYWdzID0gIkNGTEFHU18iICsgdGFyZ2V0LnRvVXBwZXJDYXNlKCkucmVwbGFjZShuZXcg
UmVnRXhwKCItIiwgImciKSwgIl8iKTsKKworCWlmIChjb25maWd1cmVfc3Vic3QuRXhpc3RzKHN5
bSkpIHsKKwkJdHYgPSBjb25maWd1cmVfc3Vic3QuSXRlbShzeW0pOworCX0gZWxzZSB7CisJCXR2
ID0gIiI7CisJfQorCisJZmlsZV9saXN0ID0gZmlsZV9saXN0LnNwbGl0KG5ldyBSZWdFeHAoIlxc
cysiKSk7CisJZmlsZV9saXN0LnNvcnQoKTsKKworCXZhciByZSA9IG5ldyBSZWdFeHAoIlwuW2Et
ejAtOUEtWl0rJCIpOworCisJZGlyID0gZGlyLnJlcGxhY2UobmV3IFJlZ0V4cCgiLyIsICJnIiks
ICJcXCIpOworCXZhciBvYmpzX2xpbmUgPSAiIjsKKwl2YXIgc3Jjc19saW5lID0gIiI7CisKKwl2
YXIgc3ViX2J1aWxkID0gIiQoQlVJTERfRElSKVxcIjsKKworCS8qIGlmIG1vZHVsZSBkaXIgaXMg
bm90IGEgY2hpbGQgb2YgdGhlIG1haW4gc291cmNlIGRpciwKKwkgKiB3ZSBuZWVkIHRvIHR3ZWFr
IGl0OyB3ZSBzaG91bGQgaGF2ZSBkZXRlY3RlZCBzdWNoIGEKKwkgKiBjYXNlIGluIGNvbmRlbnNl
X3BhdGggYW5kIHJld3JpdHRlbiB0aGUgcGF0aCB0bworCSAqIGJlIHJlbGF0aXZlLgorCSAqIFRo
aXMgcHJvYmFibHkgYnJlYWtzIGZvciBub24tc2libGluZyBkaXJzICovCisJaWYgKG9ial9kaXIg
PT0gbnVsbCkgeworCQl2YXIgYnVpbGRfZGlyID0gZGlyLnJlcGxhY2UobmV3IFJlZ0V4cCgiXi4u
XFxcXCIpLCAiIik7CisJCXZhciBtYW5nbGVfZGlyID0gYnVpbGRfZGlyLnJlcGxhY2UobmV3IFJl
Z0V4cCgiW1xcXFwvListXSIsICJnIiksICJfIik7CisJCXZhciBiZF9mbGFnc19uYW1lID0gIkNG
TEFHU19CRF8iICsgbWFuZ2xlX2Rpci50b1VwcGVyQ2FzZSgpOworCX0KKwllbHNlIHsKKwkJdmFy
IGJ1aWxkX2RpciA9IG9ial9kaXIucmVwbGFjZShuZXcgUmVnRXhwKCJeLi5cXFxcIiksICIiKTsK
KwkJdmFyIG1hbmdsZV9kaXIgPSBidWlsZF9kaXIucmVwbGFjZShuZXcgUmVnRXhwKCJbXFxcXC8u
Ky1dIiwgImciKSwgIl8iKTsKKwkJdmFyIGJkX2ZsYWdzX25hbWUgPSAiQ0ZMQUdTX0JEXyIgKyBt
YW5nbGVfZGlyLnRvVXBwZXJDYXNlKCk7CisJfQorCQorCXZhciBkaXJzID0gYnVpbGRfZGlyLnNw
bGl0KCJcXCIpOworCXZhciBpLCBkID0gIiI7CisJZm9yIChpID0gMDsgaSA8IGRpcnMubGVuZ3Ro
OyBpKyspIHsKKwkJZCArPSBkaXJzW2ldOworCQlidWlsZF9kaXJzW2J1aWxkX2RpcnMubGVuZ3Ro
XSA9IGQ7CisJCWQgKz0gIlxcIjsKKwl9CisJc3ViX2J1aWxkICs9IGQ7CisKKworCURFRklORShi
ZF9mbGFnc19uYW1lLCAiIC9GZCIgKyBzdWJfYnVpbGQgKyAiIC9GcCIgKyBzdWJfYnVpbGQgKyAi
IC9GUiIgKyBzdWJfYnVpbGQpOworCisJZm9yIChpIGluIGZpbGVfbGlzdCkgeworCQlzcmMgPSBm
aWxlX2xpc3RbaV07CisJCW9iaiA9IHNyYy5yZXBsYWNlKHJlLCAiLm9iaiIpOworCQl0diArPSAi
ICIgKyBzdWJfYnVpbGQgKyBvYmo7CisKKwkJTUZPLldyaXRlTGluZShzdWJfYnVpbGQgKyBvYmog
KyAiOiAiICsgZGlyICsgIlxcIiArIHNyYyk7CisJCU1GTy5Xcml0ZUxpbmUoIlx0QCQoQ0MpICQo
IiArIGZsYWdzICsgIikgJChDRkxBR1MpICQoIiArIGJkX2ZsYWdzX25hbWUgKyAiKSAvYyAiICsg
ZGlyICsgIlxcIiArIHNyYyArICIgL0ZvIiArIHN1Yl9idWlsZCArIG9iaik7CisJfQorCisJREVG
SU5FKHN5bSwgdHYpOworfQorCitmdW5jdGlvbiBBRERfRkxBRyhuYW1lLCBmbGFncywgdGFyZ2V0
KSB7CisKKwlpZiAodGFyZ2V0ICE9IG51bGwpIHsKKwkJbmFtZSA9IHRhcmdldC50b1VwcGVyQ2Fz
ZSgpICsgIl8iICsgbmFtZTsKKwl9CisJaWYgKGNvbmZpZ3VyZV9zdWJzdC5FeGlzdHMobmFtZSkp
IHsKKwkJdmFyIGN1cnJfZmxhZ3MgPSBjb25maWd1cmVfc3Vic3QuSXRlbShuYW1lKTsKKworCQlp
ZiAoY3Vycl9mbGFncy5pbmRleE9mKGZsYWdzKSA+PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwkJ
CisJCWZsYWdzID0gY3Vycl9mbGFncyArICIgIiArIGZsYWdzOworCQljb25maWd1cmVfc3Vic3Qu
UmVtb3ZlKG5hbWUpOworCX0KKwljb25maWd1cmVfc3Vic3QuQWRkKG5hbWUsIGZsYWdzKTsKK30K
KworZnVuY3Rpb24gZ2V0X2RlZmluZShuYW1lKSB7CisKKwlyZXR1cm4gY29uZmlndXJlX3N1YnN0
Lkl0ZW0obmFtZSk7Cit9CisKK2Z1bmN0aW9uIEVSUk9SKG1zZykgeworCisJU1RERVJSLldyaXRl
TGluZSgiRVJST1I6ICIgKyBtc2cpOworCVdTY3JpcHQuUXVpdCgzKTsKK30KKworZnVuY3Rpb24g
V0FSTklORyhtc2cpIHsKKworCVNUREVSUi5Xcml0ZUxpbmUoIldBUk5JTkc6ICIgKyBtc2cpOwor
CVNUREVSUi5Xcml0ZUJsYW5rTGluZXMoMSk7Cit9CisKKy8qIFNlYXJjaGVzIGEgc2V0IG9mIHBh
dGhzIGZvciBhIGZpbGU7IHJldHVybnMgdGhlIGRpciBpbiB3aGljaCB0aGUgZmlsZSB3YXMgZm91
bmQsIHRydWUgaWYgaXQKK3dhcyBmb3VuZCBpbiB0aGUgZGVmYXVsdCBlbnYgcGF0aCwgb3IgZmFs
c2UgaWYgaXQgd2FzIG5vdCBmb3VuZCBhdCBhbGwuIGVudl9uYW1lIGlzIHRoZSBvcHRpb25hbAor
bmFtZSBvZiBhbiBlbnYgdmFyIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgcGF0aCB0byBzZWFyY2gg
Ki8KK2Z1bmN0aW9uIHNlYXJjaF9wYXRocyh0aGluZ190b19maW5kLCBleHBsaWNpdF9wYXRoLCBl
bnZfbmFtZSkgeworCisJdmFyIGksIGZvdW5kID0gZmFsc2UsIHBsYWNlID0gZmFsc2UsIGZpbGUs
IGVudjsKKworCVNURE9VVC5Xcml0ZSgiQ2hlY2tpbmcgZm9yICIgKyB0aGluZ190b19maW5kICsg
IiAuLi4gIik7CisKKwlpZiAodGhpbmdfdG9fZmluZC5sZW5ndGggPCA2KSB7CisJCVNURE9VVC5X
cml0ZSgiCSIpOworCX0KKworCXRoaW5nX3RvX2ZpbmQgPSB0aGluZ190b19maW5kLnJlcGxhY2Uo
bmV3IFJlZ0V4cCgiLyIsICJnIiksICJcXCIpOworCisJaWYgKGV4cGxpY2l0X3BhdGggIT0gbnVs
bCkgeworCQlpZiAodHlwZW9mKGV4cGxpY2l0X3BhdGgpID09ICJzdHJpbmciKSB7CisJCQlleHBs
aWNpdF9wYXRoID0gZXhwbGljaXRfcGF0aC5zcGxpdCgiOyIpOworCQl9CisKKwkJZm9yIChpID0g
MDsgaSA8IGV4cGxpY2l0X3BhdGgubGVuZ3RoOyBpKyspIHsKKwkJCWZpbGUgPSBnbG9iKGV4cGxp
Y2l0X3BhdGhbaV0gKyAiXFwiICsgdGhpbmdfdG9fZmluZCk7CisJCQlpZiAoZmlsZSkgeworCQkJ
CWZvdW5kID0gdHJ1ZTsKKwkJCQlwbGFjZSA9IGZpbGVbMF07CisJCQkJcGxhY2UgPSBwbGFjZS5z
dWJzdHIoMCwgcGxhY2UubGVuZ3RoIC0gdGhpbmdfdG9fZmluZC5sZW5ndGggLSAxKTsKKwkJCQli
cmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghZm91bmQgJiYgZW52X25hbWUgIT0gbnVsbCkg
eworCQllbnYgPSBXc2hTaGVsbC5FbnZpcm9ubWVudCgiUHJvY2VzcyIpLkl0ZW0oZW52X25hbWUp
OworCQllbnYgPSBlbnYuc3BsaXQoIjsiKTsKKwkJZm9yIChpID0gMDsgaSA8IGVudi5sZW5ndGg7
IGkrKykgeworCQkJZmlsZSA9IGdsb2IoZW52W2ldICsgIlxcIiArIHRoaW5nX3RvX2ZpbmQpOwor
CQkJaWYgKGZpbGUpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJcGxhY2UgPSB0cnVlOworCQkJ
CWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGZvdW5kICYmIHBsYWNlID09IHRydWUpIHsK
KwkJU1RET1VULldyaXRlTGluZSgiCTxpbiBkZWZhdWx0IHBhdGg+Iik7CisJfSBlbHNlIGlmIChm
b3VuZCkgeworCQlTVERPVVQuV3JpdGVMaW5lKCIJIiArIHBsYWNlKTsKKwl9IGVsc2UgeworCQlT
VERPVVQuV3JpdGVMaW5lKCIJPG5vdCBmb3VuZD4iKTsKKwl9CisJcmV0dXJuIHBsYWNlOworfQor
CitmdW5jdGlvbiB3b3JkX3dyYXBfYW5kX2luZGVudChpbmRlbnQsIHRleHQsIGxpbmVfc3VmZml4
LCBpbmRlbnRfY2hhcikgeworCisJaWYgKHRleHQgPT0gbnVsbCkgeworCQlyZXR1cm4gIiI7CisJ
fQorCisJdmFyIHdvcmRzID0gdGV4dC5zcGxpdChuZXcgUmVnRXhwKCJcXHMrIiwgImciKSk7CisJ
dmFyIGkgPSAwOworCXZhciByZXRfdGV4dCA9ICIiOworCXZhciB0aGlzX2xpbmUgPSAiIjsKKwl2
YXIgdDsKKwl2YXIgc3BhY2UgPSAiIjsKKwl2YXIgbGluZXMgPSAwOworCisJaWYgKGxpbmVfc3Vm
Zml4ID09IG51bGwpIHsKKwkJbGluZV9zdWZmaXggPSAiIjsKKwl9CisKKwlpZiAoaW5kZW50X2No
YXIgPT0gbnVsbCkgeworCQlpbmRlbnRfY2hhciA9ICIgIjsKKwl9CisKKwlmb3IgKGkgPSAwOyBp
IDwgaW5kZW50OyBpKyspIHsKKwkJc3BhY2UgKz0gaW5kZW50X2NoYXI7CisJfQorCQorCWZvciAo
aSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykgeworCQlpZiAodGhpc19saW5lLmxlbmd0aCkg
eworCQkJdCA9IHRoaXNfbGluZSArICIgIiArIHdvcmRzW2ldOworCQl9IGVsc2UgeworCQkJdCA9
IHdvcmRzW2ldOworCQl9CisKKwkJaWYgKHQubGVuZ3RoICsgaW5kZW50ID4gNzgpIHsKKwkJCWlm
IChsaW5lcysrKSB7CisJCQkJcmV0X3RleHQgKz0gc3BhY2U7CisJCQl9CisJCQlyZXRfdGV4dCAr
PSB0aGlzX2xpbmUgKyBsaW5lX3N1ZmZpeCArICJcclxuIjsKKwkJCXRoaXNfbGluZSA9ICIiOwor
CQl9CisKKwkJaWYgKHRoaXNfbGluZS5sZW5ndGgpIHsKKwkJCXRoaXNfbGluZSArPSAiICIgKyB3
b3Jkc1tpXTsKKwkJfSBlbHNlIHsKKwkJCXRoaXNfbGluZSA9IHdvcmRzW2ldOworCQl9CisJfQor
CisJaWYgKHRoaXNfbGluZS5sZW5ndGgpIHsKKwkJaWYgKGxpbmVzKQorCQkJcmV0X3RleHQgKz0g
c3BhY2U7CisJCXJldF90ZXh0ICs9IHRoaXNfbGluZTsKKwl9CisKKwlyZXR1cm4gcmV0X3RleHQ7
Cit9CisKK2Z1bmN0aW9uIGZpbGVfZ2V0X2NvbnRlbnRzKGZpbGVuYW1lKSB7CisKKwl2YXIgZiwg
YzsKKworCXRyeSB7CisJCWYgPSBGU08uT3BlblRleHRGaWxlKGZpbGVuYW1lLCAxKTsKKwkJYyA9
IGYuUmVhZEFsbCgpOworCQlmLkNsb3NlKCk7CisJCXJldHVybiBjOworCX0gY2F0Y2ggKGUpIHsK
KwkJU1RET1VULldyaXRlTGluZSgiUHJvYmxlbSByZWFkaW5nICIgKyBmaWxlbmFtZSk7CisJCXJl
dHVybiBmYWxzZTsKKwl9Cit9CisKK2Z1bmN0aW9uIGdlbmVyYXRlX2ZpbGVzKCkgeworCisJdmFy
IGksIGRpciwgYmQsIGxhc3Q7CisKKwlTVERPVVQuV3JpdGVCbGFua0xpbmVzKDEpOworCVNURE9V
VC5Xcml0ZUxpbmUoIkNyZWF0aW5nIGJ1aWxkIGRpcnMuLi4iKTsKKwlkaXIgPSBnZXRfZGVmaW5l
KCJCVUlMRF9ESVIiKTsKKwlidWlsZF9kaXJzLnNvcnQoKTsKKwlsYXN0ID0gbnVsbDsKKworCWlm
ICghRlNPLkZvbGRlckV4aXN0cyhkaXIpKSB7CisJCUZTTy5DcmVhdGVGb2xkZXIoZGlyKTsKKwl9
CisJCisJZm9yIChpID0gMDsgaSA8IGJ1aWxkX2RpcnMubGVuZ3RoOyBpKyspIHsKKwkJYmQgPSBG
U08uQnVpbGRQYXRoKGRpciwgYnVpbGRfZGlyc1tpXSk7CisJCWlmIChiZCA9PSBsYXN0KSB7CisJ
CQljb250aW51ZTsKKwkJfQorCQlsYXN0ID0gYmQ7CisJCUFERF9GTEFHKCJCVUlMRF9ESVJTX1NV
QiIsIGJkKTsKKwkJaWYgKCFGU08uRm9sZGVyRXhpc3RzKGJkKSkgeworCQkJRlNPLkNyZWF0ZUZv
bGRlcihiZCk7CisJCX0KKwl9CisKKwlTVERPVVQuV3JpdGVMaW5lKCJHZW5lcmF0aW5nIHNvdXJj
ZSBmaWxlcyAtIHRoaXMgbWF5IHRha2UgYSBmZXcgc2Vjb25kcyIpOworCVdTY3JpcHQuU2xlZXAo
MzUwMCk7CisJY2hlY2tfZ2VuZXJhdGlvbigpOworCWdlbmVyYXRlX21ha2VmaWxlKCk7CisKKwlT
VERPVVQuV3JpdGVMaW5lKCJEb25lLiIpOworCVNURE9VVC5Xcml0ZUJsYW5rTGluZXMoMSk7CisJ
U1RET1VULldyaXRlTGluZSgiVHlwZSAnbm1ha2UnIHRvIGJ1aWxkIFBIUC1HVEsiKTsKK30KKwor
ZnVuY3Rpb24gZ2VuZXJhdGVfbWFrZWZpbGUoKSB7CisKKwlNRk8uQ2xvc2UoKTsgLy8gTWFrZWZp
bGUub2JqZWN0cyBpcyBub3cgY29tcGxldGUKKwl2YXIgTUYgPSBGU08uQ3JlYXRlVGV4dEZpbGUo
Ik1ha2VmaWxlIiwgdHJ1ZSk7CisJU1RET1VULldyaXRlTGluZSgiR2VuZXJhdGluZyBNYWtlZmls
ZSIpOworCisJTUYuV3JpdGVMaW5lKCIjIEdlbmVyYXRlZCBieSBjb25maWd1cmUuanMiKTsKKwlN
Ri5Xcml0ZUJsYW5rTGluZXMoMSk7CisKKwkvKiBzcGl0IG91dCB2YXJpYWJsZSBkZWZpbml0aW9u
cyAqLworCXZhciBrZXlzID0gKG5ldyBWQkFycmF5KGNvbmZpZ3VyZV9zdWJzdC5LZXlzKCkpKS50
b0FycmF5KCk7CisJdmFyIGk7CisKKwlmb3IgKGkgaW4ga2V5cykgeworCQkvKiBUaGUgdHJhaWxp
bmcgc3BhY2UgaXMgbmVlZGVkIHRvIHByZXZlbnQgdGhlIHRyYWlsaW5nIGJhY2tzbGFzaCB0aGF0
IGlzIHBhcnQgb2YKKwkJdGhlIGJ1aWxkIGRpciBmbGFncyAoQ0ZMQUdTX0JEX1hYWCkgZnJvbSBi
ZWluZyBzZWVuIGFzIGEgbGluZSBjb250aW51YXRpb24gY2hhcmFjdGVyICovCisJCU1GLldyaXRl
TGluZShrZXlzW2ldICsgIj0iICsgY29uZmlndXJlX3N1YnN0Lkl0ZW0oa2V5c1tpXSkgKyAiICIp
OworCX0KKworCU1GLldyaXRlQmxhbmtMaW5lcygxKTsKKwlNRi5Xcml0ZUxpbmUoImFsbDogJChC
VUlMRF9ESVIpXFwkKFBIUEdUS0RMTCkiKTsKKwlNRi5Xcml0ZUxpbmUoImJ1aWxkX2RpcnM6ICQo
QlVJTERfRElSKSAkKEJVSUxEX0RJUlNfU1VCKSIpOworCU1GLldyaXRlQmxhbmtMaW5lcygxKTsK
KworCVRGID0gRlNPLk9wZW5UZXh0RmlsZSgiTWFrZWZpbGUub2JqZWN0cyIsIDEpOworCU1GLldy
aXRlKFRGLlJlYWRBbGwoKSk7CisJVEYuQ2xvc2UoKTsKKworCU1GLkNsb3NlKCk7CisKKwlGU08u
RGVsZXRlRmlsZSgiTWFrZWZpbGUub2JqZWN0cyIpOworCS8vRlNPLkRlbGV0ZUZpbGUoIndpbjMy
XFx0ZW1wLmJhdCIpOworfQorCitmdW5jdGlvbiBjb3B5X2FuZF9zdWJzdChzcmNuYW1lLCBkZXN0
bmFtZSwgc3Vic3RfYXJyYXkpIHsKKworCWlmICghRlNPLkZpbGVFeGlzdHMoc3JjbmFtZSkpIHsK
KwkJc3JjbmFtZSA9IGNvbmZpZ3VyZV9tb2R1bGVfZGlybmFtZSArICJcXCIgKyBzcmNuYW1lOwor
CQlkZXN0bmFtZSA9IGNvbmZpZ3VyZV9tb2R1bGVfZGlybmFtZSArICJcXCIgKyBkZXN0bmFtZTsK
Kwl9CisKKwl2YXIgY29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKHNyY25hbWUpOworCXZhciBp
OworCisJZm9yIChpID0gMDsgaSA8IHN1YnN0X2FycmF5Lmxlbmd0aDsgaSs9MikgeworCQl2YXIg
cmUgPSBzdWJzdF9hcnJheVtpXTsKKwkJdmFyIHJlcCA9IHN1YnN0X2FycmF5W2krMV07CisKKwkJ
Y29udGVudCA9IGNvbnRlbnQucmVwbGFjZShyZSwgcmVwKTsKKwl9CisKKwl2YXIgZiA9IEZTTy5D
cmVhdGVUZXh0RmlsZShkZXN0bmFtZSwgdHJ1ZSk7CisJZi5Xcml0ZShjb250ZW50KTsKKwlmLkNs
b3NlKCk7Cit9CisKKy8vIGdsb2IgdXNpbmcgc2ltcGxlIGZpbGVuYW1lIHdpbGRjYXJkczsgcmV0
dXJucyBhbiBhcnJheSBvZiBtYXRjaGVzIGZvdW5kIGluIHRoZSBmaWxlc3lzdGVtCitmdW5jdGlv
biBnbG9iKHBhdGhfcGF0dGVybikgeworCisJdmFyIHBhdGhfcGFydHMgPSBwYXRoX3BhdHRlcm4u
cmVwbGFjZShuZXcgUmVnRXhwKCIvIiwgImciKSwgIlxcIikuc3BsaXQoIlxcIik7CisJdmFyIHA7
CisJdmFyIGJhc2UgPSAiIjsKKwl2YXIgaXNfcGF0X3JlID0gL1wqLzsKKworCWlmIChGU08uRmls
ZUV4aXN0cyhwYXRoX3BhdHRlcm4pKSB7CisJCXJldHVybiBuZXcgQXJyYXkocGF0aF9wYXR0ZXJu
KTsKKwl9CisJCisJLy8gZmlyc3QsIGJ1aWxkIGFzIG11Y2ggYXMgcG9zc2libGUgdGhhdCBkb2Vz
bid0IGhhdmUgYSBwYXR0ZXJuCisJZm9yIChwID0gMDsgcCA8IHBhdGhfcGFydHMubGVuZ3RoOyBw
KyspIHsKKwkJaWYgKHBhdGhfcGFydHNbcF0ubWF0Y2goaXNfcGF0X3JlKSkKKwkJCWJyZWFrOwor
CQlpZiAocCkKKwkJCWJhc2UgKz0gIlxcIjsKKwkJYmFzZSArPSBwYXRoX3BhcnRzW3BdOwkKKwl9
CisKKwlyZXR1cm4gX2lubmVyX2dsb2IoYmFzZSwgcCwgcGF0aF9wYXJ0cyk7Cit9CisKK2Z1bmN0
aW9uIF9pbm5lcl9nbG9iKGJhc2UsIHAsIHBhcnRzKSB7CisKKwl2YXIgcGF0ID0gcGFydHNbcF07
CisJdmFyIGZ1bGxfbmFtZSA9IGJhc2UgKyAiXFwiICsgcGF0OworCXZhciByZSA9IG51bGw7CisJ
dmFyIGl0ZW1zID0gbnVsbDsKKworCWlmIChwID09IHBhcnRzLmxlbmd0aCkgeworCQlyZXR1cm4g
ZmFsc2U7CisJfQorCisJaWYgKEZTTy5GaWxlRXhpc3RzKGZ1bGxfbmFtZSkpIHsKKwkJaWYgKHAg
PCBwYXJ0cy5sZW5ndGggLSAxKSB7CisJCQkvLyB3ZSBkaWRuJ3QgcmVhY2ggdGhlIGZ1bGwgZXh0
ZW50IG9mIHRoZSBwYXR0ZXJuCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIG5ldyBB
cnJheShmdWxsX25hbWUpOworCX0KKworCWlmIChGU08uRm9sZGVyRXhpc3RzKGZ1bGxfbmFtZSkg
JiYgcCA9PSBwYXJ0cy5sZW5ndGggLSAxKSB7CisJCS8vIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5k
IG9mIHRoZSBwYXR0ZXJuOyBubyBuZWVkIHRvIHJlY3Vyc2UKKwkJcmV0dXJuIG5ldyBBcnJheShm
dWxsX25hbWUpOworCX0KKworCS8vIENvbnZlcnQgdGhlIHBhdHRlcm4gaW50byBhIHJlZ2V4cAor
CXJlID0gbmV3IFJlZ0V4cCgiXiIgKyBwYXQucmVwbGFjZSgvXC4vZywgJ1xcLicpLnJlcGxhY2Uo
L1wqL2csICcuKicpLnJlcGxhY2UoL1w/L2csICcuJykgKyAiJCIsICJpIik7CisKKwlpdGVtcyA9
IG5ldyBBcnJheSgpOworCisJaWYgKCFGU08uRm9sZGVyRXhpc3RzKGJhc2UpKSB7CisJCXJldHVy
biBmYWxzZTsKKwl9CisKKwl2YXIgZm9sZGVyID0gRlNPLkdldEZvbGRlcihiYXNlKTsKKwl2YXIg
ZmMgPSBudWxsOworCXZhciBzdWJpdGVtcyA9IG51bGw7CisJdmFyIGl0ZW1fbmFtZSA9IG51bGw7
CisJdmFyIGo7CisKKwlmYyA9IG5ldyBFbnVtZXJhdG9yKGZvbGRlci5TdWJGb2xkZXJzKTsKKwlm
b3IgKDsgIWZjLmF0RW5kKCk7IGZjLm1vdmVOZXh0KCkpIHsKKwkJaXRlbV9uYW1lID0gRlNPLkdl
dEZpbGVOYW1lKGZjLml0ZW0oKSk7CisKKwkJaWYgKGl0ZW1fbmFtZS5tYXRjaChyZSkpIHsKKwkJ
CS8vIGdvdCBhIG1hdGNoOyBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiwganVz
dCBhZGQgdGhlc2UKKwkJCS8vIHRoaW5ncyB0byB0aGUgaXRlbXMgYXJyYXkKKwkJCWlmIChwID09
IHBhcnRzLmxlbmd0aCAtIDEpIHsKKwkJCQlpdGVtc1tpdGVtcy5sZW5ndGhdID0gZmMuaXRlbSgp
OworCQkJfSBlbHNlIHsKKwkJCQkvLyB3ZSBzaG91bGQgcmVjdXJzZSBhbmQgZG8gbW9yZSBtYXRj
aGVzCisJCQkJc3ViaXRlbXMgPSBfaW5uZXJfZ2xvYihiYXNlICsgIlxcIiArIGl0ZW1fbmFtZSwg
cCArIDEsIHBhcnRzKTsKKwkJCQlpZiAoc3ViaXRlbXMpIHsKKwkJCQkJZm9yIChqID0gMDsgaiA8
IHN1Yml0ZW1zLmxlbmd0aDsgaisrKSB7CisJCQkJCQlpdGVtc1tpdGVtcy5sZW5ndGhdID0gc3Vi
aXRlbXNbal07CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvLyBpZiB3ZSBhcmUg
YXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiwgd2Ugc2hvdWxkIG1hdGNoIGZpbGVzIHRvbworCWlm
IChwID09IHBhcnRzLmxlbmd0aCAtIDEpIHsKKwkJZmMgPSBuZXcgRW51bWVyYXRvcihmb2xkZXIu
RmlsZXMpOworCQlmb3IgKDsgIWZjLmF0RW5kKCk7IGZjLm1vdmVOZXh0KCkpIHsKKwkJCWl0ZW1f
bmFtZSA9IEZTTy5HZXRGaWxlTmFtZShmYy5pdGVtKCkpOworCQkJaWYgKGl0ZW1fbmFtZS5tYXRj
aChyZSkpIHsKKwkJCQlpdGVtc1tpdGVtcy5sZW5ndGhdID0gZmMuaXRlbSgpOworCQkJfQorCQl9
CisJfQorCisJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1
cm4gaXRlbXM7Cit9CisKKy8qIEVtaXRzIHJ1bGUgdG8gZ2VuZXJhdGUgdmVyc2lvbiBpbmZvIGZv
ciBhbiBleHRlbnNpb24uCitSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSAucmVzIGZpbGUgdGhhdCB3
aWxsIGJlIGdlbmVyYXRlZCAqLworZnVuY3Rpb24gZ2VuZXJhdGVfdmVyc2lvbl9pbmZvX3Jlc291
cmNlKG1ha2VmaWxldGFyZ2V0LCBjcmVkaXRzcGF0aCkgeworCisJLy8gbWFrZWZpbGV0YXJnZXQg
aXMgcGhwLWd0ay5kbGwKKwkvLyBjcmVkaXRzcGF0aCBpcyBleHRcZ3RrKworCisJdmFyIHJlc25h
bWUgPSBtYWtlZmlsZXRhcmdldCArICIucmVzIjsKKwl2YXIgcmVzX2Rlc2MgPSAiUEhQLUdUSyBT
Y3JpcHQgSW50ZXJwcmV0ZXIiOworCXZhciByZXNfcHJvZF9uYW1lID0gIlBIUC1HVEsiOworCXZh
ciBjcmVkaXRzOworCXZhciB0aGFua3MgPSAiVGhhbmtzIHRvIEFuZHJlaSBabWlldnNraSI7CisJ
dmFyIGxvZ28gPSAiIjsKKworCWlmIChGU08uRmlsZUV4aXN0cyhjcmVkaXRzcGF0aCArICcvQ1JF
RElUUycpKSB7CisJCWNyZWRpdHMgPSBGU08uT3BlblRleHRGaWxlKGNyZWRpdHNwYXRoICsgJy9D
UkVESVRTJywgMSk7CisJCXJlc19kZXNjID0gY3JlZGl0cy5SZWFkTGluZSgpOworCQl0cnkgewor
CQkJdGhhbmtzID0gY3JlZGl0cy5SZWFkTGluZSgpOworCQl9IGNhdGNoIChlKSB7CisJCQl0aGFu
a3MgPSBudWxsOworCQl9CisJCWlmICh0aGFua3MgPT0gbnVsbCkgeworCQkJdGhhbmtzID0gIiI7
CisJCX0gZWxzZSB7CisJCQl0aGFua3MgPSAiVGhhbmtzIHRvICIgKyB0aGFua3M7CisJCX0KKwkJ
Y3JlZGl0cy5DbG9zZSgpOworCX0KKworCU1GTy5Xcml0ZUxpbmUoIlBIUEdUS0RMTF9SRVM9JChC
VUlMRF9ESVIpXFwkKFBIUEdUS0RMTCkucmVzIik7CisJTUZPLldyaXRlQmxhbmtMaW5lcygxKTsK
KworCWlmIChtYWtlZmlsZXRhcmdldC5tYXRjaChuZXcgUmVnRXhwKCJcXC5leGUkIikpKSB7CisJ
CWxvZ28gPSAiIC9EIFdBTlRfTE9HTyI7CisJfQorCQorCU1GTy5Xcml0ZUxpbmUoIiQoUEhQR1RL
RExMX1JFUyk6IHdpbjMyXFx0ZW1wbGF0ZS5yYyIpOworCU1GTy5Xcml0ZUxpbmUoIlx0JChSQykg
L2ZvICQoUEhQR1RLRExMX1JFUykiICsgbG9nbyArICcgL0QgRklMRV9ERVNDUklQVElPTj0iXFwi
JyArIHJlc19kZXNjICsgJ1xcIiIgL0QgRklMRV9OQU1FPSJcXCIkKFBIUEdUS0RMTClcXCIiIC9E
IFBST0RVQ1RfTkFNRT0iXFwiJyArIHJlc19wcm9kX25hbWUgKyAnXFwiIiAvRCBUSEFOS1NfR1VZ
Uz0iXFwiJyArIHRoYW5rcyArICdcXCIiIHdpbjMyXFx0ZW1wbGF0ZS5yYycpOworCU1GTy5Xcml0
ZUJsYW5rTGluZXMoMSk7CisJCisJcmV0dXJuIHJlc25hbWU7Cit9CisKKy8qIGV4ZWN1dGUgYSBj
b21tYW5kIGFuZCByZXR1cm4gdGhlIG91dHB1dCBhcyBhIHN0cmluZyAqLworZnVuY3Rpb24gZXhl
Y3V0ZShjb21tYW5kX2xpbmUpIHsKKwl2YXIgZSA9IFdzaFNoZWxsLkV4ZWMoY29tbWFuZF9saW5l
KTsKKwl2YXIgcmV0ID0gIiI7CisKKwlyZXQgPSBlLlN0ZE91dC5SZWFkQWxsKCk7CisKKwlyZXR1
cm4gcmV0OworfQorCisvLyBXaGljaCB2ZXJzaW9uIG9mIHRoZSBjb21waWxlciBkbyB3ZSBoYXZl
PworZnVuY3Rpb24gcHJvYmVfbXN2Y19jb21waWxlcl92ZXJzaW9uKENMKSB7CisKKwkvLyB0cmlj
a3kgZXNjYXBlcyB0byBnZXQgc3RkZXJyIHJlZGlyZWN0aW9uIHRvIHdvcmsKKwl2YXIgYmFubmVy
ID0gZXhlY3V0ZSgnY21kIC9jICIiJyArIENMICsgJyIgMj4mMSInKTsKKworCWlmIChiYW5uZXIu
bWF0Y2goLyhcZCspXC4oXGQrKVwuKFxkKykoXC4oXGQrKSk/LykpIHsKKwkJcmV0dXJuIFJlZ0V4
cC4kMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8vIFBva2UgYXJvdW5kIGZvciBzb21lIGhlYWRl
cnMKK2Z1bmN0aW9uIHByb2JlX2Jhc2ljX2hlYWRlcnMoKQoreworCXZhciBwOworCisJaWYgKFBI
UF9HVEtfUEhQX0JVSUxEICE9ICJubyIpIHsKKwkJcGhwX3VzdWFsX2luY2x1ZGVfc3VzcGVjdHMg
Kz0gIjsiICsgUEhQX0dUS19QSFBfQlVJTEQgKyAiXFxpbmNsdWRlIjsKKwkJcGhwX3VzdWFsX2xp
Yl9zdXNwZWN0cyArPSAiOyIgKyBQSFBfR1RLX1BIUF9CVUlMRCArICJcXGxpYiI7CisJfQorCisJ
Ly8gaGFjayB0byBjYXRjaCBjb21tb24gbG9jYXRpb24gb2YgbGlicworCWlmICh0eXBlb2YocCkg
PT0gInN0cmluZyIpIHsKKwkJcCA9IHAucmVwbGFjZShuZXcgUmVnRXhwKCJpbmNsdWRlJCIpLCAi
bGliIik7CisJCUFERF9GTEFHKCJMREZMQUdTIiwgJy9saWJwYXRoOiInICsgcCArICciICcpOwor
CQlwaHBfdXN1YWxfbGliX3N1c3BlY3RzICs9ICI7IiArIHA7CisJfQorfQorCisvKiBub24tZnVu
Y3Rpb25zICovCisKK2lmICghRlNPLkZpbGVFeGlzdHMoImJ1aWxkY29uZi5iYXQiKSkgeworCVNU
REVSUi5Xcml0ZUxpbmUoIk11c3QgYmUgcnVuIGZyb20gdGhlIHJvb3Qgb2YgdGhlIFBIUC1HVEsg
c291cmNlIik7CisJV1NjcmlwdC5RdWl0KDEwKTsKK30=

--d3048ba218c2fc8b349b9b852af27b48caac49fd--