A Recommendation On Transparent IDLE (with code)
17317302007 <[email protected]> Fri, 6 Nov 2020 20:02:23 +0800
| Newsgroups | gmane.comp.python.idle |
|---|---|
| Message-ID | <[email protected]> |
--mailmaster-5fa53b4f_0_29 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWw+DQo8aGVhZD4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSdDb250ZW50LVR5cGUnIGNvbnRl bnQ9J3RleHQvaHRtbDsgY2hhcnNldD1VVEYtOCc+DQo8L2hlYWQ+DQo8Ym9keT4NCjxzdHlsZT4N CiAgICBmb250ew0KICAgICAgICBsaW5lLWhlaWdodDogMS42Ow0KICAgIH0NCiAgICB1bCxvbHsN CiAgICAgICAgcGFkZGluZy1sZWZ0OiAyMHB4Ow0KICAgICAgICBsaXN0LXN0eWxlLXBvc2l0aW9u OiBpbnNpZGU7DQogICAgfQ0KPC9zdHlsZT4NCjxkaXYgc3R5bGUgPSAnZm9udC1mYW1pbHk65b6u 6L2v6ZuF6buRLFZlcmRhbmEsJnF1b3Q7TWljcm9zb2Z0IFlhaGVpJnF1b3Q7LFNpbVN1bixzYW5z LXNlcmlmO2ZvbnQtc2l6ZToxNHB4OyBsaW5lLWhlaWdodDoxLjY7Jz4NCiAgICA8ZGl2ID48L2Rp dj48ZGl2PgogICAgPGRpdj4KICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgPGJyPgogICAgICAg IDwvc3Bhbj4KICAgIDwvZGl2PgogICAgPGRpdj5Db29sIElETEUgRGV2ZWxvcGVycyw8L2Rpdj48 ZGl2Pjxicj48L2Rpdj48ZGl2PkkgYW0gc29tZSBsaXR0bGUgdXNlciB3aG8gbG92ZXMgSURMRSAo eEQpLiBXaGVuIEkgd2FzIHRha2luZyBvbmxpbmUgY291cnNlcywgSSB0aG91Z2h0IGl0IGlzIGJl dHRlciBpZiBJIGNhbiB1c2UgYSBoYWxmLXRyYW5zcGFyZW50IHdpbmRvdyB0byBwcm9ncmFtLCB3 aGlsZSBoYXZpbmcgc291cmNlcyBvciB0ZWFjaGVycycgY29kZXMgaW4gdGhlIGJhY2tncm91bmQu Jm5ic3A7PC9kaXY+PGRpdj4oYnR3IEkgdXNlIHRoZSAiUHl0aG9uIDMuNi42ICh2My42LjY6NGNm MWY1NGViNywgSnVuIDI3IDIwMTgsIDAzOjM3OjAzKSBbTVNDIHYuMTkwMCA2NCBiaXQgKEFNRDY0 KV0gb24gd2luMzIiIGFuZCBJIGRvIG5vdCBrbm93IGlmIHRoYXQgZmVhdHVyZSBpcyBhbHJlYWR5 IHRoZXJlIGluIG5ld2VyIHZlcnNpb25zLik8L2Rpdj48ZGl2PkZvciB0aGF0IHJlYXNvbiwgSSB5 ZWV0ZWQgdGhyb3VnaCB0aGUgY29kZSBhbmQgYWRkZWQgYW4gIkFscGhhIiB0YWIgb24gdGhlIG1l bnUgdG8gY2hhbmdlIHRoZSB0cmFuc3BhcmVuY3kgb2YgdGhlIGVkaXRvciwgYmVpbmcgbm9vYmlm aWVkIGJ5IG15c2VsZiAoeWVhaCBJJ20gYSBub29iKS48L2Rpdj48ZGl2PkFjdHVhbGx5IEkganVz dCBtYWRlIGxpdHRsZSBjaGFuZ2VzIHRvIHRoZSBjb2RlLi4uPC9kaXY+PGRpdj48YnI+PC9kaXY+ PGRpdj5UaGFua3MgZm9yIG1ha2luZyB0aGlzIElETEUgcHVyZSBQeXRob24gc28gSSBoYXZlIHRo ZSBjaGFuY2UgdG8gZG8gdGhpcyE8L2Rpdj48ZGl2PnRoZSBlZGl0b3IucHkgaXMgYXR0YWNoZWQg YmVsb3chPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5TaW5jZXJlbHksPC9kaXY+PGRpdj5Ub21t eWVldG9vIHRoZSBOb29iPC9kaXY+CiAgICA8ZGl2IGlkPSJudGVzLXBjbWFjLXNpZ25hdHVyZSIg c3R5bGU9ImZvbnQtZmFtaWx5Oiflvq7ova/pm4Xpu5EnIj4KICAgICAKICAgIDxkaXYgc3R5bGU9 ImZvbnQtc2l6ZToxNHB4OyBwYWRkaW5nOiAwOyAgbWFyZ2luOjA7bGluZS1oZWlnaHQ6MTRweDsi PjxkaXYgc3R5bGU9InBhZGRpbmctYm90dG9tOjZweDttYXJnaW4tYm90dG9tOjEwcHg7Ym9yZGVy LWJvdHRvbToxcHggc29saWQgI2U2ZTZlNjtkaXNwbGF5OmlubGluZS1ibG9jazsiPjxicj48L2Rp dj48L2Rpdj4KIDwvZGl2Pgo8L2Rpdj48IS0t8J+YgC0tPg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0 bWw+ --mailmaster-5fa53b4f_0_29 Content-Type: text/plain; name="editor.py" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="editor.py" aW1wb3J0IGltcG9ydGxpYi5hYmMNCmltcG9ydCBpbXBvcnRsaWIudXRpbA0KaW1wb3J0IG9zDQpp bXBvcnQgcGxhdGZvcm0NCmltcG9ydCByZQ0KaW1wb3J0IHN0cmluZw0KaW1wb3J0IHN5cw0KaW1w b3J0IHRva2VuaXplDQppbXBvcnQgdHJhY2ViYWNrDQppbXBvcnQgd2ViYnJvd3Nlcg0KDQpmcm9t IHRraW50ZXIgaW1wb3J0ICoNCmZyb20gdGtpbnRlci50dGsgaW1wb3J0IFNjcm9sbGJhcg0KaW1w b3J0IHRraW50ZXIuc2ltcGxlZGlhbG9nIGFzIHRrU2ltcGxlRGlhbG9nDQppbXBvcnQgdGtpbnRl ci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveA0KDQpmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9y dCBpZGxlQ29uZg0KZnJvbSBpZGxlbGliIGltcG9ydCBjb25maWdkaWFsb2cNCmZyb20gaWRsZWxp YiBpbXBvcnQgZ3JlcA0KZnJvbSBpZGxlbGliIGltcG9ydCBoZWxwDQpmcm9tIGlkbGVsaWIgaW1w b3J0IGhlbHBfYWJvdXQNCmZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4DQpmcm9tIGlkbGVsaWIu bXVsdGljYWxsIGltcG9ydCBNdWx0aUNhbGxDcmVhdG9yDQpmcm9tIGlkbGVsaWIgaW1wb3J0IHB5 cGFyc2UNCmZyb20gaWRsZWxpYiBpbXBvcnQgcXVlcnkNCmZyb20gaWRsZWxpYiBpbXBvcnQgcmVw bGFjZQ0KZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2gNCmZyb20gaWRsZWxpYiBpbXBvcnQgd2lu ZG93cw0KDQojIFRoZSBkZWZhdWx0IHRhYiBzZXR0aW5nIGZvciBhIFRleHQgd2lkZ2V0LCBpbiBh dmVyYWdlLXdpZHRoIGNoYXJhY3RlcnMuDQpUS19UQUJXSURUSF9ERUZBVUxUID0gOA0KX3B5X3Zl cnNpb24gPSAnICglcyknICUgcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKQ0KZGFyd2luID0gc3lz LnBsYXRmb3JtID09ICdkYXJ3aW4nDQoNCmRlZiBfc3BoaW54X3ZlcnNpb24oKToNCiAgICAiRm9y bWF0IHN5cy52ZXJzaW9uX2luZm8gdG8gcHJvZHVjZSB0aGUgU3BoaW54IHZlcnNpb24gc3RyaW5n IHVzZWQgdG8gaW5zdGFsbCB0aGUgY2htIGRvY3MiDQogICAgbWFqb3IsIG1pbm9yLCBtaWNybywg bGV2ZWwsIHNlcmlhbCA9IHN5cy52ZXJzaW9uX2luZm8NCiAgICByZWxlYXNlID0gJyVzJXMnICUg KG1ham9yLCBtaW5vcikNCiAgICByZWxlYXNlICs9ICclcycgJSAobWljcm8sKQ0KICAgIGlmIGxl dmVsID09ICdjYW5kaWRhdGUnOg0KICAgICAgICByZWxlYXNlICs9ICdyYyVzJyAlIChzZXJpYWws KQ0KICAgIGVsaWYgbGV2ZWwgIT0gJ2ZpbmFsJzoNCiAgICAgICAgcmVsZWFzZSArPSAnJXMlcycg JSAobGV2ZWxbMF0sIHNlcmlhbCkNCiAgICByZXR1cm4gcmVsZWFzZQ0KDQoNCmNsYXNzIEVkaXRv cldpbmRvdyhvYmplY3QpOg0KICAgIGZyb20gaWRsZWxpYi5wZXJjb2xhdG9yIGltcG9ydCBQZXJj b2xhdG9yDQogICAgZnJvbSBpZGxlbGliLmNvbG9yaXplciBpbXBvcnQgQ29sb3JEZWxlZ2F0b3Is IGNvbG9yX2NvbmZpZw0KICAgIGZyb20gaWRsZWxpYi51bmRvIGltcG9ydCBVbmRvRGVsZWdhdG9y DQogICAgZnJvbSBpZGxlbGliLmlvbWVudSBpbXBvcnQgSU9CaW5kaW5nLCBlbmNvZGluZw0KICAg IGZyb20gaWRsZWxpYiBpbXBvcnQgbWFpbm1lbnUNCiAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRv cGxldmVsLCBFdmVudFR5cGUNCiAgICBmcm9tIGlkbGVsaWIuc3RhdHVzYmFyIGltcG9ydCBNdWx0 aVN0YXR1c0Jhcg0KICAgIGZyb20gaWRsZWxpYi5hdXRvY29tcGxldGUgaW1wb3J0IEF1dG9Db21w bGV0ZQ0KICAgIGZyb20gaWRsZWxpYi5hdXRvZXhwYW5kIGltcG9ydCBBdXRvRXhwYW5kDQogICAg ZnJvbSBpZGxlbGliLmNhbGx0aXBzIGltcG9ydCBDYWxsVGlwcw0KICAgIGZyb20gaWRsZWxpYi5j b2RlY29udGV4dCBpbXBvcnQgQ29kZUNvbnRleHQNCiAgICBmcm9tIGlkbGVsaWIucGFyYWdyYXBo IGltcG9ydCBGb3JtYXRQYXJhZ3JhcGgNCiAgICBmcm9tIGlkbGVsaWIucGFyZW5tYXRjaCBpbXBv cnQgUGFyZW5NYXRjaA0KICAgIGZyb20gaWRsZWxpYi5yc3RyaXAgaW1wb3J0IFJzdHJpcEV4dGVu c2lvbg0KICAgIGZyb20gaWRsZWxpYi56b29taGVpZ2h0IGltcG9ydCBab29tSGVpZ2h0DQoNCiAg ICBmaWxlc3lzdGVtZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkgICMgZm9y IGZpbGUgbmFtZXMNCiAgICBoZWxwX3VybCA9IE5vbmUNCg0KICAgIGRlZiBfX2luaXRfXyhzZWxm LCBmbGlzdD1Ob25lLCBmaWxlbmFtZT1Ob25lLCBrZXk9Tm9uZSwgcm9vdD1Ob25lKToNCiAgICAg ICAgIyBEZWxheSBpbXBvcnQ6IHJ1bnNjcmlwdCBpbXBvcnRzIHB5c2hlbGwgaW1wb3J0cyBFZGl0 b3JXaW5kb3cuDQogICAgICAgIGZyb20gaWRsZWxpYi5ydW5zY3JpcHQgaW1wb3J0IFNjcmlwdEJp bmRpbmcNCg0KICAgICAgICBpZiBFZGl0b3JXaW5kb3cuaGVscF91cmwgaXMgTm9uZToNCiAgICAg ICAgICAgIGRvY2hvbWUgPSAgb3MucGF0aC5qb2luKHN5cy5iYXNlX3ByZWZpeCwgJ0RvYycsICdp bmRleC5odG1sJykNCiAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5jb3VudCgnbGludXgnKToN CiAgICAgICAgICAgICAgICAjIGxvb2sgZm9yIGh0bWwgZG9jcyBpbiBhIGNvdXBsZSBvZiBzdGFu ZGFyZCBwbGFjZXMNCiAgICAgICAgICAgICAgICBweXZlciA9ICdweXRob24tZG9jcy0nICsgJyVz LiVzLiVzJyAlIHN5cy52ZXJzaW9uX2luZm9bOjNdDQogICAgICAgICAgICAgICAgaWYgb3MucGF0 aC5pc2RpcignL3Zhci93d3cvaHRtbC9weXRob24vJyk6ICAjICJweXRob24yIiBycG0NCiAgICAg ICAgICAgICAgICAgICAgZG9jaG9tZSA9ICcvdmFyL3d3dy9odG1sL3B5dGhvbi9pbmRleC5odG1s Jw0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGJhc2VwYXRoID0g Jy91c3Ivc2hhcmUvZG9jLycgICMgc3RhbmRhcmQgbG9jYXRpb24NCiAgICAgICAgICAgICAgICAg ICAgZG9jaG9tZSA9IG9zLnBhdGguam9pbihiYXNlcGF0aCwgcHl2ZXIsDQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RvYycsICdpbmRleC5odG1sJykNCiAgICAg ICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnd2luJzoNCiAgICAgICAgICAgICAgICBj aG1maWxlID0gb3MucGF0aC5qb2luKHN5cy5iYXNlX3ByZWZpeCwgJ0RvYycsDQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uJXMuY2htJyAlIF9zcGhpbnhfdmVy c2lvbigpKQ0KICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNobWZpbGUpOg0KICAg ICAgICAgICAgICAgICAgICBkb2Nob21lID0gY2htZmlsZQ0KICAgICAgICAgICAgZWxpZiBzeXMu cGxhdGZvcm0gPT0gJ2Rhcndpbic6DQogICAgICAgICAgICAgICAgIyBkb2N1bWVudGF0aW9uIG1h eSBiZSBzdG9yZWQgaW5zaWRlIGEgcHl0aG9uIGZyYW1ld29yaw0KICAgICAgICAgICAgICAgIGRv Y2hvbWUgPSBvcy5wYXRoLmpvaW4oc3lzLmJhc2VfcHJlZml4LA0KICAgICAgICAgICAgICAgICAg ICAgICAgJ1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL0RvY3VtZW50YXRpb24vaW5kZXguaHRtbCcp DQogICAgICAgICAgICBkb2Nob21lID0gb3MucGF0aC5ub3JtcGF0aChkb2Nob21lKQ0KICAgICAg ICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZG9jaG9tZSk6DQogICAgICAgICAgICAgICAgRWRpdG9y V2luZG93LmhlbHBfdXJsID0gZG9jaG9tZQ0KICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9y bSA9PSAnZGFyd2luJzoNCiAgICAgICAgICAgICAgICAgICAgIyBTYWZhcmkgcmVxdWlyZXMgcmVh bCBmaWxlOi1VUkxzDQogICAgICAgICAgICAgICAgICAgIEVkaXRvcldpbmRvdy5oZWxwX3VybCA9 ICdmaWxlOi8vJyArIEVkaXRvcldpbmRvdy5oZWxwX3VybA0KICAgICAgICAgICAgZWxzZToNCiAg ICAgICAgICAgICAgICBFZGl0b3JXaW5kb3cuaGVscF91cmwgPSAoImh0dHBzOi8vZG9jcy5weXRo b24ub3JnLyVkLiVkLyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg JSBzeXMudmVyc2lvbl9pbmZvWzoyXSkNCiAgICAgICAgc2VsZi5mbGlzdCA9IGZsaXN0DQogICAg ICAgIHJvb3QgPSByb290IG9yIGZsaXN0LnJvb3QNCiAgICAgICAgc2VsZi5yb290ID0gcm9vdA0K ICAgICAgICBzZWxmLm1lbnViYXIgPSBNZW51KHJvb3QpDQogICAgICAgIHNlbGYudG9wID0gdG9w ID0gd2luZG93cy5MaXN0ZWRUb3BsZXZlbChyb290LCBtZW51PXNlbGYubWVudWJhcikNCiAgICAg ICAgaWYgZmxpc3Q6DQogICAgICAgICAgICBzZWxmLnRraW50ZXJfdmFycyA9IGZsaXN0LnZhcnMN CiAgICAgICAgICAgICNzZWxmLnRvcC5pbnN0YW5jZV9kaWN0IG1ha2VzIGZsaXN0LmludmVyc2Vk aWN0IGF2YWlsYWJsZSB0bw0KICAgICAgICAgICAgI2NvbmZpZ2RpYWxvZy5weSBzbyBpdCBjYW4g YWNjZXNzIGFsbCBFZGl0b3JXaW5kb3cgaW5zdGFuY2VzDQogICAgICAgICAgICBzZWxmLnRvcC5p bnN0YW5jZV9kaWN0ID0gZmxpc3QuaW52ZXJzZWRpY3QNCiAgICAgICAgZWxzZToNCiAgICAgICAg ICAgIHNlbGYudGtpbnRlcl92YXJzID0ge30gICMga2V5czogVGtpbnRlciBldmVudCBuYW1lcw0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZXM6IFRraW50ZXIgdmFy aWFibGUgaW5zdGFuY2VzDQogICAgICAgICAgICBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0ID0ge30N CiAgICAgICAgc2VsZi5yZWNlbnRfZmlsZXNfcGF0aCA9IG9zLnBhdGguam9pbigNCiAgICAgICAg ICAgICAgICBpZGxlQ29uZi51c2VyZGlyLCAncmVjZW50LWZpbGVzLmxzdCcpDQoNCiAgICAgICAg c2VsZi5wcm9tcHRfbGFzdF9saW5lID0gJycgICMgT3ZlcnJpZGUgaW4gUHlTaGVsbA0KICAgICAg ICBzZWxmLnRleHRfZnJhbWUgPSB0ZXh0X2ZyYW1lID0gRnJhbWUodG9wKQ0KICAgICAgICBzZWxm LnZiYXIgPSB2YmFyID0gU2Nyb2xsYmFyKHRleHRfZnJhbWUsIG5hbWU9J3ZiYXInKQ0KICAgICAg ICBzZWxmLndpZHRoID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0VkaXRvcldpbmRvdycs DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywgdHlwZT0n aW50JykNCiAgICAgICAgdGV4dF9vcHRpb25zID0gew0KICAgICAgICAgICAgICAgICduYW1lJzog J3RleHQnLA0KICAgICAgICAgICAgICAgICdwYWR4JzogNSwNCiAgICAgICAgICAgICAgICAnd3Jh cCc6ICdub25lJywNCiAgICAgICAgICAgICAgICAnaGlnaGxpZ2h0dGhpY2tuZXNzJzogMCwNCiAg ICAgICAgICAgICAgICAnd2lkdGgnOiBzZWxmLndpZHRoLA0KICAgICAgICAgICAgICAgICd0YWJz dHlsZSc6ICd3b3JkcHJvY2Vzc29yJywgICMgbmV3IGluIDguNQ0KICAgICAgICAgICAgICAgICdo ZWlnaHQnOiBpZGxlQ29uZi5HZXRPcHRpb24oDQogICAgICAgICAgICAgICAgICAgICAgICAnbWFp bicsICdFZGl0b3JXaW5kb3cnLCAnaGVpZ2h0JywgdHlwZT0naW50JyksDQogICAgICAgICAgICAg ICAgfQ0KICAgICAgICBzZWxmLnRleHQgPSB0ZXh0ID0gTXVsdGlDYWxsQ3JlYXRvcihUZXh0KSh0 ZXh0X2ZyYW1lLCAqKnRleHRfb3B0aW9ucykNCiAgICAgICAgc2VsZi50b3AuZm9jdXNlZF93aWRn ZXQgPSBzZWxmLnRleHQNCg0KICAgICAgICBzZWxmLmNyZWF0ZW1lbnViYXIoKQ0KICAgICAgICBz ZWxmLmFwcGx5X2JpbmRpbmdzKCkNCg0KICAgICAgICBzZWxmLnRvcC5wcm90b2NvbCgiV01fREVM RVRFX1dJTkRPVyIsIHNlbGYuY2xvc2UpDQogICAgICAgIHNlbGYudG9wLmJpbmQoIjw8Y2xvc2Ut d2luZG93Pj4iLCBzZWxmLmNsb3NlX2V2ZW50KQ0KICAgICAgICBpZiBtYWNvc3guaXNBcXVhVGso KToNCiAgICAgICAgICAgICMgQ29tbWFuZC1XIG9uIGVkaXRvcndpbmRvd3MgZG9lc24ndCB3b3Jr IHdpdGhvdXQgdGhpcy4NCiAgICAgICAgICAgIHRleHQuYmluZCgnPDxjbG9zZS13aW5kb3c+Pics IHNlbGYuY2xvc2VfZXZlbnQpDQogICAgICAgICAgICAjIFNvbWUgT1MgWCBzeXN0ZW1zIGhhdmUg b25seSBvbmUgbW91c2UgYnV0dG9uLCBzbyB1c2UNCiAgICAgICAgICAgICMgY29udHJvbC1jbGlj ayBmb3IgcG9wdXAgY29udGV4dCBtZW51cyB0aGVyZS4gRm9yIHR3bw0KICAgICAgICAgICAgIyBi dXR0b25zLCBBcXVhVGsgZGVmaW5lcyA8Mj4gYXMgdGhlIHJpZ2h0IGJ1dHRvbiwgbm90IDwzPi4N CiAgICAgICAgICAgIHRleHQuYmluZCgiPENvbnRyb2wtQnV0dG9uLTE+IixzZWxmLnJpZ2h0X21l bnVfZXZlbnQpDQogICAgICAgICAgICB0ZXh0LmJpbmQoIjwyPiIsIHNlbGYucmlnaHRfbWVudV9l dmVudCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgICMgRWxzZXdoZXJlLCB1c2UgcmlnaHQt Y2xpY2sgZm9yIHBvcHVwIG1lbnVzLg0KICAgICAgICAgICAgdGV4dC5iaW5kKCI8Mz4iLHNlbGYu cmlnaHRfbWVudV9ldmVudCkNCiAgICAgICAgdGV4dC5iaW5kKCc8TW91c2VXaGVlbD4nLCBzZWxm Lm1vdXNlc2Nyb2xsKQ0KICAgICAgICB0ZXh0LmJpbmQoJzxCdXR0b24tND4nLCBzZWxmLm1vdXNl c2Nyb2xsKQ0KICAgICAgICB0ZXh0LmJpbmQoJzxCdXR0b24tNT4nLCBzZWxmLm1vdXNlc2Nyb2xs KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8Y3V0Pj4iLCBzZWxmLmN1dCkNCiAgICAgICAgdGV4dC5i aW5kKCI8PGNvcHk+PiIsIHNlbGYuY29weSkNCiAgICAgICAgdGV4dC5iaW5kKCI8PHBhc3RlPj4i LCBzZWxmLnBhc3RlKQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8Y2VudGVyLWluc2VydD4+Iiwgc2Vs Zi5jZW50ZXJfaW5zZXJ0X2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8aGVscD4+Iiwgc2Vs Zi5oZWxwX2RpYWxvZykNCiAgICAgICAgdGV4dC5iaW5kKCI8PHB5dGhvbi1kb2NzPj4iLCBzZWxm LnB5dGhvbl9kb2NzKQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8YWJvdXQtaWRsZT4+Iiwgc2VsZi5h Ym91dF9kaWFsb2cpDQogICAgICAgIHRleHQuYmluZCgiPDxvcGVuLWNvbmZpZy1kaWFsb2c+PiIs IHNlbGYuY29uZmlnX2RpYWxvZykNCiAgICAgICAgdGV4dC5iaW5kKCI8PG9wZW4tbW9kdWxlPj4i LCBzZWxmLm9wZW5fbW9kdWxlX2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8ZG8tbm90aGlu Zz4+IiwgbGFtYmRhIGV2ZW50OiAiYnJlYWsiKQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8c2VsZWN0 LWFsbD4+Iiwgc2VsZi5zZWxlY3RfYWxsKQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8cmVtb3ZlLXNl bGVjdGlvbj4+Iiwgc2VsZi5yZW1vdmVfc2VsZWN0aW9uKQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8 ZmluZD4+Iiwgc2VsZi5maW5kX2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8ZmluZC1hZ2Fp bj4+Iiwgc2VsZi5maW5kX2FnYWluX2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8ZmluZC1p bi1maWxlcz4+Iiwgc2VsZi5maW5kX2luX2ZpbGVzX2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQo Ijw8ZmluZC1zZWxlY3Rpb24+PiIsIHNlbGYuZmluZF9zZWxlY3Rpb25fZXZlbnQpDQogICAgICAg IHRleHQuYmluZCgiPDxyZXBsYWNlPj4iLCBzZWxmLnJlcGxhY2VfZXZlbnQpDQogICAgICAgIHRl eHQuYmluZCgiPDxnb3RvLWxpbmU+PiIsIHNlbGYuZ290b19saW5lX2V2ZW50KQ0KICAgICAgICB0 ZXh0LmJpbmQoIjw8c21hcnQtYmFja3NwYWNlPj4iLHNlbGYuc21hcnRfYmFja3NwYWNlX2V2ZW50 KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8bmV3bGluZS1hbmQtaW5kZW50Pj4iLHNlbGYubmV3bGlu ZV9hbmRfaW5kZW50X2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8c21hcnQtaW5kZW50Pj4i LHNlbGYuc21hcnRfaW5kZW50X2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8aW5kZW50LXJl Z2lvbj4+IixzZWxmLmluZGVudF9yZWdpb25fZXZlbnQpDQogICAgICAgIHRleHQuYmluZCgiPDxk ZWRlbnQtcmVnaW9uPj4iLHNlbGYuZGVkZW50X3JlZ2lvbl9ldmVudCkNCiAgICAgICAgdGV4dC5i aW5kKCI8PGNvbW1lbnQtcmVnaW9uPj4iLHNlbGYuY29tbWVudF9yZWdpb25fZXZlbnQpDQogICAg ICAgIHRleHQuYmluZCgiPDx1bmNvbW1lbnQtcmVnaW9uPj4iLHNlbGYudW5jb21tZW50X3JlZ2lv bl9ldmVudCkNCiAgICAgICAgdGV4dC5iaW5kKCI8PHRhYmlmeS1yZWdpb24+PiIsc2VsZi50YWJp ZnlfcmVnaW9uX2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8dW50YWJpZnktcmVnaW9uPj4i LHNlbGYudW50YWJpZnlfcmVnaW9uX2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8dG9nZ2xl LXRhYnM+PiIsc2VsZi50b2dnbGVfdGFic19ldmVudCkNCiAgICAgICAgdGV4dC5iaW5kKCI8PGNo YW5nZS1pbmRlbnR3aWR0aD4+IixzZWxmLmNoYW5nZV9pbmRlbnR3aWR0aF9ldmVudCkNCiAgICAg ICAgdGV4dC5iaW5kKCI8TGVmdD4iLCBzZWxmLm1vdmVfYXRfZWRnZV9pZl9zZWxlY3Rpb24oMCkp DQogICAgICAgIHRleHQuYmluZCgiPFJpZ2h0PiIsIHNlbGYubW92ZV9hdF9lZGdlX2lmX3NlbGVj dGlvbigxKSkNCiAgICAgICAgdGV4dC5iaW5kKCI8PGRlbC13b3JkLWxlZnQ+PiIsIHNlbGYuZGVs X3dvcmRfbGVmdCkNCiAgICAgICAgdGV4dC5iaW5kKCI8PGRlbC13b3JkLXJpZ2h0Pj4iLCBzZWxm LmRlbF93b3JkX3JpZ2h0KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8YmVnaW5uaW5nLW9mLWxpbmU+ PiIsIHNlbGYuaG9tZV9jYWxsYmFjaykNCiAgICAgICAgdGV4dC5iaW5kKCI8PGFscGhhLTA+PiIs IGxhbWJkYSBldmVudDogc2VsZi50b3AuYXR0cmlidXRlcygiLWFscGhhIiwxKSkNCiAgICAgICAg dGV4dC5iaW5kKCI8PGFscGhhLTE+PiIsIGxhbWJkYSBldmVudDogc2VsZi50b3AuYXR0cmlidXRl cygiLWFscGhhIiwwLjgpKQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8YWxwaGEtMj4+IiwgbGFtYmRh IGV2ZW50OiBzZWxmLnRvcC5hdHRyaWJ1dGVzKCItYWxwaGEiLDAuNikpDQogICAgICAgIHRleHQu YmluZCgiPDxhbHBoYS0zPj4iLCBsYW1iZGEgZXZlbnQ6IHNlbGYudG9wLmF0dHJpYnV0ZXMoIi1h bHBoYSIsMC40KSkNCiAgICAgICAgIyBIZXJlIGFyZSB0aGUgYWRkZWQgYWxwaGFzLCBsYW1iZGEg d2FzIHVzZWQgZm9yIGNvbnZlbmllbmNlDQoNCiAgICAgICAgaWYgZmxpc3Q6DQogICAgICAgICAg ICBmbGlzdC5pbnZlcnNlZGljdFtzZWxmXSA9IGtleQ0KICAgICAgICAgICAgaWYga2V5Og0KICAg ICAgICAgICAgICAgIGZsaXN0LmRpY3Rba2V5XSA9IHNlbGYNCiAgICAgICAgICAgIHRleHQuYmlu ZCgiPDxvcGVuLW5ldy13aW5kb3c+PiIsIHNlbGYubmV3X2NhbGxiYWNrKQ0KICAgICAgICAgICAg dGV4dC5iaW5kKCI8PGNsb3NlLWFsbC13aW5kb3dzPj4iLCBzZWxmLmZsaXN0LmNsb3NlX2FsbF9j YWxsYmFjaykNCiAgICAgICAgICAgIHRleHQuYmluZCgiPDxvcGVuLWNsYXNzLWJyb3dzZXI+PiIs IHNlbGYub3Blbl9tb2R1bGVfYnJvd3NlcikNCiAgICAgICAgICAgIHRleHQuYmluZCgiPDxvcGVu LXBhdGgtYnJvd3Nlcj4+Iiwgc2VsZi5vcGVuX3BhdGhfYnJvd3NlcikNCiAgICAgICAgICAgIHRl eHQuYmluZCgiPDxvcGVuLXR1cnRsZS1kZW1vPj4iLCBzZWxmLm9wZW5fdHVydGxlX2RlbW8pDQoN CiAgICAgICAgc2VsZi5zZXRfc3RhdHVzX2JhcigpDQogICAgICAgIHZiYXJbJ2NvbW1hbmQnXSA9 IHNlbGYuaGFuZGxlX3l2aWV3DQogICAgICAgIHZiYXIucGFjayhzaWRlPVJJR0hULCBmaWxsPVkp DQogICAgICAgIHRleHRbJ3lzY3JvbGxjb21tYW5kJ10gPSB2YmFyLnNldA0KICAgICAgICB0ZXh0 Wydmb250J10gPSBpZGxlQ29uZi5HZXRGb250KHNlbGYucm9vdCwgJ21haW4nLCAnRWRpdG9yV2lu ZG93JykNCiAgICAgICAgdGV4dF9mcmFtZS5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RILCBleHBh bmQ9MSkNCiAgICAgICAgdGV4dC5wYWNrKHNpZGU9VE9QLCBmaWxsPUJPVEgsIGV4cGFuZD0xKQ0K ICAgICAgICB0ZXh0LmZvY3VzX3NldCgpDQoNCiAgICAgICAgIyB1c2V0YWJzIHRydWUgIC0+IGxp dGVyYWwgdGFiIGNoYXJhY3RlcnMgYXJlIHVzZWQgYnkgaW5kZW50IGFuZA0KICAgICAgICAjICAg ICAgICAgICAgICAgICAgZGVkZW50IGNtZHMsIHBvc3NpYmx5IG1peGVkIHdpdGggc3BhY2VzIGlm DQogICAgICAgICMgICAgICAgICAgICAgICAgICBpbmRlbnR3aWR0aCBpcyBub3QgYSBtdWx0aXBs ZSBvZiB0YWJ3aWR0aCwNCiAgICAgICAgIyAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgY2F1 c2UgVGFibmFubnkgdG8gbmFnIQ0KICAgICAgICAjICAgICAgICAgZmFsc2UgLT4gdGFiIGNoYXJh Y3RlcnMgYXJlIGNvbnZlcnRlZCB0byBzcGFjZXMgYnkgaW5kZW50DQogICAgICAgICMgICAgICAg ICAgICAgICAgICBhbmQgZGVkZW50IGNtZHMsIGFuZCBkaXR0byBUQUIga2V5c3Ryb2tlcw0KICAg ICAgICAjIEFsdGhvdWdoIHVzZS1zcGFjZXM9MCBjYW4gYmUgY29uZmlndXJlZCBtYW51YWxseSBp biBjb25maWctbWFpbi5kZWYsDQogICAgICAgICMgY29uZmlndXJhdGlvbiBvZiB0YWJzIHYuIHNw YWNlcyBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBjb25maWd1cmF0aW9uDQogICAgICAgICMgZGlh bG9nLiAgSURMRSBwcm9tb3RlcyB0aGUgcHJlZmVycmVkIFB5dGhvbiBpbmRlbnRhdGlvbjogdXNl IHNwYWNlcyENCiAgICAgICAgdXNlc3BhY2VzID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywg J0luZGVudCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlLXNw YWNlcycsIHR5cGU9J2Jvb2wnKQ0KICAgICAgICBzZWxmLnVzZXRhYnMgPSBub3QgdXNlc3BhY2Vz DQoNCiAgICAgICAgIyB0YWJ3aWR0aCBpcyB0aGUgZGlzcGxheSB3aWR0aCBvZiBhIGxpdGVyYWwg dGFiIGNoYXJhY3Rlci4NCiAgICAgICAgIyBDQVVUSU9OOiAgdGVsbGluZyBUayB0byB1c2UgYW55 dGhpbmcgb3RoZXIgdGhhbiBpdHMgZGVmYXVsdA0KICAgICAgICAjIHRhYiBzZXR0aW5nIGNhdXNl cyBpdCB0byB1c2UgYW4gZW50aXJlbHkgZGlmZmVyZW50IHRhYmJpbmcgYWxnb3JpdGhtLA0KICAg ICAgICAjIHRyZWF0aW5nIHRhYiBzdG9wcyBhcyBmaXhlZCBkaXN0YW5jZXMgZnJvbSB0aGUgbGVm dCBtYXJnaW4uDQogICAgICAgICMgTm9ib2R5IGV4cGVjdHMgdGhpcywgc28gZm9yIG5vdyB0YWJ3 aWR0aCBzaG91bGQgbmV2ZXIgYmUgY2hhbmdlZC4NCiAgICAgICAgc2VsZi50YWJ3aWR0aCA9IDgg ICAgIyBtdXN0IHJlbWFpbiA4IHVudGlsIFRrIGlzIGZpeGVkLg0KDQogICAgICAgICMgaW5kZW50 d2lkdGggaXMgdGhlIG51bWJlciBvZiBzY3JlZW4gY2hhcmFjdGVycyBwZXIgaW5kZW50IGxldmVs Lg0KICAgICAgICAjIFRoZSByZWNvbW1lbmRlZCBQeXRob24gaW5kZW50YXRpb24gaXMgZm91ciBz cGFjZXMuDQogICAgICAgIHNlbGYuaW5kZW50d2lkdGggPSBzZWxmLnRhYndpZHRoDQogICAgICAg IHNlbGYuc2V0X25vdGFic19pbmRlbnR3aWR0aCgpDQoNCiAgICAgICAgIyBJZiBjb250ZXh0X3Vz ZV9wczEgaXMgdHJ1ZSwgcGFyc2luZyBzZWFyY2hlcyBiYWNrIGZvciBhIHBzMSBsaW5lOw0KICAg ICAgICAjIGVsc2Ugc2VhcmNoZXMgZm9yIGEgcG9wdWxhciAoaWYsIGRlZiwgLi4uKSBQeXRob24g c3RtdC4NCiAgICAgICAgc2VsZi5jb250ZXh0X3VzZV9wczEgPSBGYWxzZQ0KDQogICAgICAgICMg V2hlbiBzZWFyY2hpbmcgYmFja3dhcmRzIGZvciBhIHJlbGlhYmxlIHBsYWNlIHRvIGJlZ2luIHBh cnNpbmcsDQogICAgICAgICMgZmlyc3Qgc3RhcnQgbnVtX2NvbnRleHRfbGluZXNbMF0gbGluZXMg YmFjaywgdGhlbg0KICAgICAgICAjIG51bV9jb250ZXh0X2xpbmVzWzFdIGxpbmVzIGJhY2sgaWYg dGhhdCBkaWRuJ3Qgd29yaywgYW5kIHNvIG9uLg0KICAgICAgICAjIFRoZSBsYXN0IHZhbHVlIHNo b3VsZCBiZSBodWdlIChsYXJnZXIgdGhhbiB0aGUgIyBvZiBsaW5lcyBpbiBhDQogICAgICAgICMg Y29uY2VpdmFibGUgZmlsZSkuDQogICAgICAgICMgTWFraW5nIHRoZSBpbml0aWFsIHZhbHVlcyBs YXJnZXIgc2xvd3MgdGhpbmdzIGRvd24gbW9yZSBvZnRlbi4NCiAgICAgICAgc2VsZi5udW1fY29u dGV4dF9saW5lcyA9IDUwLCA1MDAsIDUwMDAwMDANCiAgICAgICAgc2VsZi5wZXIgPSBwZXIgPSBz ZWxmLlBlcmNvbGF0b3IodGV4dCkNCiAgICAgICAgc2VsZi51bmRvID0gdW5kbyA9IHNlbGYuVW5k b0RlbGVnYXRvcigpDQogICAgICAgIHBlci5pbnNlcnRmaWx0ZXIodW5kbykNCiAgICAgICAgdGV4 dC51bmRvX2Jsb2NrX3N0YXJ0ID0gdW5kby51bmRvX2Jsb2NrX3N0YXJ0DQogICAgICAgIHRleHQu dW5kb19ibG9ja19zdG9wID0gdW5kby51bmRvX2Jsb2NrX3N0b3ANCiAgICAgICAgdW5kby5zZXRf c2F2ZWRfY2hhbmdlX2hvb2soc2VsZi5zYXZlZF9jaGFuZ2VfaG9vaykNCiAgICAgICAgIyBJT0Jp bmRpbmcgaW1wbGVtZW50cyBmaWxlIEkvTyBhbmQgcHJpbnRpbmcgZnVuY3Rpb25hbGl0eQ0KICAg ICAgICBzZWxmLmlvID0gaW8gPSBzZWxmLklPQmluZGluZyhzZWxmKQ0KICAgICAgICBpby5zZXRf ZmlsZW5hbWVfY2hhbmdlX2hvb2soc2VsZi5maWxlbmFtZV9jaGFuZ2VfaG9vaykNCiAgICAgICAg c2VsZi5nb29kX2xvYWQgPSBGYWxzZQ0KICAgICAgICBzZWxmLnNldF9pbmRlbnRhdGlvbl9wYXJh bXMoRmFsc2UpDQogICAgICAgIHNlbGYuY29sb3IgPSBOb25lICMgaW5pdGlhbGl6ZWQgYmVsb3cg aW4gc2VsZi5SZXNldENvbG9yaXplcg0KICAgICAgICBpZiBmaWxlbmFtZToNCiAgICAgICAgICAg IGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSBhbmQgbm90IG9zLnBhdGguaXNkaXIoZmlsZW5h bWUpOg0KICAgICAgICAgICAgICAgIGlmIGlvLmxvYWRmaWxlKGZpbGVuYW1lKToNCiAgICAgICAg ICAgICAgICAgICAgc2VsZi5nb29kX2xvYWQgPSBUcnVlDQogICAgICAgICAgICAgICAgICAgIGlz X3B5X3NyYyA9IHNlbGYuaXNweXRob25zb3VyY2UoZmlsZW5hbWUpDQogICAgICAgICAgICAgICAg ICAgIHNlbGYuc2V0X2luZGVudGF0aW9uX3BhcmFtcyhpc19weV9zcmMpDQogICAgICAgICAgICBl bHNlOg0KICAgICAgICAgICAgICAgIGlvLnNldF9maWxlbmFtZShmaWxlbmFtZSkNCiAgICAgICAg ICAgICAgICBzZWxmLmdvb2RfbG9hZCA9IFRydWUNCg0KICAgICAgICBzZWxmLlJlc2V0Q29sb3Jp emVyKCkNCiAgICAgICAgc2VsZi5zYXZlZF9jaGFuZ2VfaG9vaygpDQogICAgICAgIHNlbGYudXBk YXRlX3JlY2VudF9maWxlc19saXN0KCkNCiAgICAgICAgc2VsZi5sb2FkX2V4dGVuc2lvbnMoKQ0K ICAgICAgICBtZW51ID0gc2VsZi5tZW51ZGljdC5nZXQoJ3dpbmRvd3MnKQ0KICAgICAgICBpZiBt ZW51Og0KICAgICAgICAgICAgZW5kID0gbWVudS5pbmRleCgiZW5kIikNCiAgICAgICAgICAgIGlm IGVuZCBpcyBOb25lOg0KICAgICAgICAgICAgICAgIGVuZCA9IC0xDQogICAgICAgICAgICBpZiBl bmQgPj0gMDoNCiAgICAgICAgICAgICAgICBtZW51LmFkZF9zZXBhcmF0b3IoKQ0KICAgICAgICAg ICAgICAgIGVuZCA9IGVuZCArIDENCiAgICAgICAgICAgIHNlbGYud21lbnVfZW5kID0gZW5kDQog ICAgICAgICAgICB3aW5kb3dzLnJlZ2lzdGVyX2NhbGxiYWNrKHNlbGYucG9zdHdpbmRvd3NtZW51 KQ0KDQogICAgICAgICMgU29tZSBhYnN0cmFjdGlvbnMgc28gSURMRSBleHRlbnNpb25zIGFyZSBj cm9zcy1JREUNCiAgICAgICAgc2VsZi5hc2t5ZXNubyA9IHRrTWVzc2FnZUJveC5hc2t5ZXNubw0K ICAgICAgICBzZWxmLmFza2ludGVnZXIgPSB0a1NpbXBsZURpYWxvZy5hc2tpbnRlZ2VyDQogICAg ICAgIHNlbGYuc2hvd2Vycm9yID0gdGtNZXNzYWdlQm94LnNob3dlcnJvcg0KDQogICAgICAgICMg QWRkIHBzZXVkb2V2ZW50cyBmb3IgZm9ybWVyIGV4dGVuc2lvbiBmaXhlZCBrZXlzLg0KICAgICAg ICAjIChUaGlzIHByb2JhYmx5IG5lZWRzIHRvIGJlIGRvbmUgb25jZSBpbiB0aGUgcHJvY2Vzcy4p DQogICAgICAgIHRleHQuZXZlbnRfYWRkKCc8PGF1dG9jb21wbGV0ZT4+JywgJzxLZXktVGFiPicp DQogICAgICAgIHRleHQuZXZlbnRfYWRkKCc8PHRyeS1vcGVuLWNvbXBsZXRpb25zPj4nLCAnPEtl eVJlbGVhc2UtcGVyaW9kPicsDQogICAgICAgICAgICAgICAgICAgICAgICc8S2V5UmVsZWFzZS1z bGFzaD4nLCAnPEtleVJlbGVhc2UtYmFja3NsYXNoPicpDQogICAgICAgIHRleHQuZXZlbnRfYWRk KCc8PHRyeS1vcGVuLWNhbGx0aXA+PicsICc8S2V5UmVsZWFzZS1wYXJlbmxlZnQ+JykNCiAgICAg ICAgdGV4dC5ldmVudF9hZGQoJzw8cmVmcmVzaC1jYWxsdGlwPj4nLCAnPEtleVJlbGVhc2UtcGFy ZW5yaWdodD4nKQ0KICAgICAgICB0ZXh0LmV2ZW50X2FkZCgnPDxwYXJlbi1jbG9zZWQ+PicsICc8 S2V5UmVsZWFzZS1wYXJlbnJpZ2h0PicsDQogICAgICAgICAgICAgICAgICAgICAgICc8S2V5UmVs ZWFzZS1icmFja2V0cmlnaHQ+JywgJzxLZXlSZWxlYXNlLWJyYWNlcmlnaHQ+JykNCg0KICAgICAg ICAjIEZvcm1lciBleHRlbnNpb24gYmluZGluZ3MgZGVwZW5kcyBvbiBmcmFtZS50ZXh0IGJlaW5n IHBhY2tlZA0KICAgICAgICAjIChjYWxsZWQgZnJvbSBzZWxmLlJlc2V0Q29sb3JpemVyKCkpLg0K ICAgICAgICBhdXRvY29tcGxldGUgPSBzZWxmLkF1dG9Db21wbGV0ZShzZWxmKQ0KICAgICAgICB0 ZXh0LmJpbmQoIjw8YXV0b2NvbXBsZXRlPj4iLCBhdXRvY29tcGxldGUuYXV0b2NvbXBsZXRlX2V2 ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8dHJ5LW9wZW4tY29tcGxldGlvbnM+PiIsDQogICAg ICAgICAgICAgICAgICBhdXRvY29tcGxldGUudHJ5X29wZW5fY29tcGxldGlvbnNfZXZlbnQpDQog ICAgICAgIHRleHQuYmluZCgiPDxmb3JjZS1vcGVuLWNvbXBsZXRpb25zPj4iLA0KICAgICAgICAg ICAgICAgICAgYXV0b2NvbXBsZXRlLmZvcmNlX29wZW5fY29tcGxldGlvbnNfZXZlbnQpDQogICAg ICAgIHRleHQuYmluZCgiPDxleHBhbmQtd29yZD4+Iiwgc2VsZi5BdXRvRXhwYW5kKHNlbGYpLmV4 cGFuZF93b3JkX2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8Zm9ybWF0LXBhcmFncmFwaD4+ IiwNCiAgICAgICAgICAgICAgICAgIHNlbGYuRm9ybWF0UGFyYWdyYXBoKHNlbGYpLmZvcm1hdF9w YXJhZ3JhcGhfZXZlbnQpDQogICAgICAgIHBhcmVubWF0Y2ggPSBzZWxmLlBhcmVuTWF0Y2goc2Vs ZikNCiAgICAgICAgdGV4dC5iaW5kKCI8PGZsYXNoLXBhcmVuPj4iLCBwYXJlbm1hdGNoLmZsYXNo X3BhcmVuX2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8cGFyZW4tY2xvc2VkPj4iLCBwYXJl bm1hdGNoLnBhcmVuX2Nsb3NlZF9ldmVudCkNCiAgICAgICAgc2NyaXB0YmluZGluZyA9IFNjcmlw dEJpbmRpbmcoc2VsZikNCiAgICAgICAgdGV4dC5iaW5kKCI8PGNoZWNrLW1vZHVsZT4+Iiwgc2Ny aXB0YmluZGluZy5jaGVja19tb2R1bGVfZXZlbnQpDQogICAgICAgIHRleHQuYmluZCgiPDxydW4t bW9kdWxlPj4iLCBzY3JpcHRiaW5kaW5nLnJ1bl9tb2R1bGVfZXZlbnQpDQogICAgICAgIHRleHQu YmluZCgiPDxkby1yc3RyaXA+PiIsIHNlbGYuUnN0cmlwRXh0ZW5zaW9uKHNlbGYpLmRvX3JzdHJp cCkNCiAgICAgICAgY2FsbHRpcHMgPSBzZWxmLkNhbGxUaXBzKHNlbGYpDQogICAgICAgIHRleHQu YmluZCgiPDx0cnktb3Blbi1jYWxsdGlwPj4iLCBjYWxsdGlwcy50cnlfb3Blbl9jYWxsdGlwX2V2 ZW50KQ0KICAgICAgICAjcmVmcmVzaC1jYWxsdGlwcyBtdXN0IGNvbWUgYWZ0ZXIgcGFyZW4tY2xv c2VkIHRvIHdvcmsgcmlnaHQNCiAgICAgICAgdGV4dC5iaW5kKCI8PHJlZnJlc2gtY2FsbHRpcD4+ IiwgY2FsbHRpcHMucmVmcmVzaF9jYWxsdGlwX2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8 Zm9yY2Utb3Blbi1jYWxsdGlwPj4iLCBjYWxsdGlwcy5mb3JjZV9vcGVuX2NhbGx0aXBfZXZlbnQp DQogICAgICAgIHRleHQuYmluZCgiPDx6b29tLWhlaWdodD4+Iiwgc2VsZi5ab29tSGVpZ2h0KHNl bGYpLnpvb21faGVpZ2h0X2V2ZW50KQ0KICAgICAgICB0ZXh0LmJpbmQoIjw8dG9nZ2xlLWNvZGUt Y29udGV4dD4+IiwNCiAgICAgICAgICAgICAgICAgIHNlbGYuQ29kZUNvbnRleHQoc2VsZikudG9n Z2xlX2NvZGVfY29udGV4dF9ldmVudCkNCg0KICAgIGRlZiBfZmlsZW5hbWVfdG9fdW5pY29kZShz ZWxmLCBmaWxlbmFtZSk6DQogICAgICAgICIiIlJldHVybiBmaWxlbmFtZSBhcyBCTVAgdW5pY29k ZSBzbyBkaXBsYXlhYmxlIGluIFRrLiIiIg0KICAgICAgICAjIERlY29kZSBieXRlcyB0byB1bmlj b2RlLg0KICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBieXRlcyk6DQogICAgICAgICAg ICB0cnk6DQogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5kZWNvZGUoc2VsZi5m aWxlc3lzdGVtZW5jb2RpbmcpDQogICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9y Og0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBm aWxlbmFtZS5kZWNvZGUoc2VsZi5lbmNvZGluZykNCiAgICAgICAgICAgICAgICBleGNlcHQgVW5p Y29kZURlY29kZUVycm9yOg0KICAgICAgICAgICAgICAgICAgICAjIGJ5dGUtdG8tYnl0ZSBjb252 ZXJzaW9uDQogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuZGVjb2RlKCdp c284ODU5LTEnKQ0KICAgICAgICAjIFJlcGxhY2Ugbm9uLUJNUCBjaGFyIHdpdGggZGlhbW9uZCBx dWVzdGlvbm1hcmsuDQogICAgICAgIHJldHVybiByZS5zdWIoJ1tcVTAwMDEwMDAwLVxVMDAxMEZG RkZdJywgJ1x1ZmZmZCcsIGZpbGVuYW1lKQ0KDQogICAgZGVmIG5ld19jYWxsYmFjayhzZWxmLCBl dmVudCk6DQogICAgICAgIGRpcm5hbWUsIGJhc2VuYW1lID0gc2VsZi5pby5kZWZhdWx0ZmlsZW5h bWUoKQ0KICAgICAgICBzZWxmLmZsaXN0Lm5ldyhkaXJuYW1lKQ0KICAgICAgICByZXR1cm4gImJy ZWFrIg0KDQogICAgZGVmIGhvbWVfY2FsbGJhY2soc2VsZiwgZXZlbnQpOg0KICAgICAgICBpZiAo ZXZlbnQuc3RhdGUgJiA0KSAhPSAwIGFuZCBldmVudC5rZXlzeW0gPT0gIkhvbWUiOg0KICAgICAg ICAgICAgIyBzdGF0ZSY0PT1Db250cm9sLiBJZiA8Q29udHJvbC1Ib21lPiwgdXNlIHRoZSBUayBi aW5kaW5nLg0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgaWYgc2VsZi50ZXh0Lmlu ZGV4KCJpb21hcmsiKSBhbmQgXA0KICAgICAgICAgICBzZWxmLnRleHQuY29tcGFyZSgiaW9tYXJr IiwgIjw9IiwgImluc2VydCBsaW5lZW5kIikgYW5kIFwNCiAgICAgICAgICAgc2VsZi50ZXh0LmNv bXBhcmUoImluc2VydCBsaW5lc3RhcnQiLCAiPD0iLCAiaW9tYXJrIik6DQogICAgICAgICAgICAj IEluIFNoZWxsIG9uIGlucHV0IGxpbmUsIGdvIHRvIGp1c3QgYWZ0ZXIgcHJvbXB0DQogICAgICAg ICAgICBpbnNlcnRwdCA9IGludChzZWxmLnRleHQuaW5kZXgoImlvbWFyayIpLnNwbGl0KCIuIilb MV0pDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBsaW5lID0gc2VsZi50ZXh0LmdldCgiaW5z ZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQgbGluZWVuZCIpDQogICAgICAgICAgICBmb3IgaW5zZXJ0 cHQgaW4gcmFuZ2UobGVuKGxpbmUpKToNCiAgICAgICAgICAgICAgICBpZiBsaW5lW2luc2VydHB0 XSBub3QgaW4gKCcgJywnXHQnKToNCiAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAg ICAgIGVsc2U6DQogICAgICAgICAgICAgICAgaW5zZXJ0cHQ9bGVuKGxpbmUpDQogICAgICAgIGxp bmVhdCA9IGludChzZWxmLnRleHQuaW5kZXgoImluc2VydCIpLnNwbGl0KCcuJylbMV0pDQogICAg ICAgIGlmIGluc2VydHB0ID09IGxpbmVhdDoNCiAgICAgICAgICAgIGluc2VydHB0ID0gMA0KICAg ICAgICBkZXN0ID0gImluc2VydCBsaW5lc3RhcnQrIitzdHIoaW5zZXJ0cHQpKyJjIg0KICAgICAg ICBpZiAoZXZlbnQuc3RhdGUmMSkgPT0gMDoNCiAgICAgICAgICAgICMgc2hpZnQgd2FzIG5vdCBw cmVzc2VkDQogICAgICAgICAgICBzZWxmLnRleHQudGFnX3JlbW92ZSgic2VsIiwgIjEuMCIsICJl bmQiKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgbm90IHNlbGYudGV4dC5pbmRleCgi c2VsLmZpcnN0Iik6DQogICAgICAgICAgICAgICAgIyB0aGVyZSB3YXMgbm8gcHJldmlvdXMgc2Vs ZWN0aW9uDQogICAgICAgICAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJteV9hbmNob3IiLCAi aW5zZXJ0IikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgaWYgc2VsZi50ZXh0 LmNvbXBhcmUoc2VsZi50ZXh0LmluZGV4KCJzZWwuZmlyc3QiKSwgIjwiLA0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dC5pbmRleCgiaW5zZXJ0IikpOg0KICAg ICAgICAgICAgICAgICAgICBzZWxmLnRleHQubWFya19zZXQoIm15X2FuY2hvciIsICJzZWwuZmly c3QiKSAjIGV4dGVuZCBiYWNrDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAg ICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJteV9hbmNob3IiLCAic2VsLmxhc3QiKSAjIGV4dGVu ZCBmb3J3YXJkDQogICAgICAgICAgICBmaXJzdCA9IHNlbGYudGV4dC5pbmRleChkZXN0KQ0KICAg ICAgICAgICAgbGFzdCA9IHNlbGYudGV4dC5pbmRleCgibXlfYW5jaG9yIikNCiAgICAgICAgICAg IGlmIHNlbGYudGV4dC5jb21wYXJlKGZpcnN0LCI+IixsYXN0KToNCiAgICAgICAgICAgICAgICBm aXJzdCxsYXN0ID0gbGFzdCxmaXJzdA0KICAgICAgICAgICAgc2VsZi50ZXh0LnRhZ19yZW1vdmUo InNlbCIsICIxLjAiLCAiZW5kIikNCiAgICAgICAgICAgIHNlbGYudGV4dC50YWdfYWRkKCJzZWwi LCBmaXJzdCwgbGFzdCkNCiAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBkZXN0 KQ0KICAgICAgICBzZWxmLnRleHQuc2VlKCJpbnNlcnQiKQ0KICAgICAgICByZXR1cm4gImJyZWFr Ig0KDQogICAgZGVmIHNldF9zdGF0dXNfYmFyKHNlbGYpOg0KICAgICAgICBzZWxmLnN0YXR1c19i YXIgPSBzZWxmLk11bHRpU3RhdHVzQmFyKHNlbGYudG9wKQ0KICAgICAgICBzZXAgPSBGcmFtZShz ZWxmLnRvcCwgaGVpZ2h0PTEsIGJvcmRlcndpZHRoPTEsIGJhY2tncm91bmQ9J2dyZXk3NScpDQog ICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoNCiAgICAgICAgICAgICMgSW5zZXJ0 IHNvbWUgcGFkZGluZyB0byBhdm9pZCBvYnNjdXJpbmcgc29tZSBvZiB0aGUgc3RhdHVzYmFyDQog ICAgICAgICAgICAjIGJ5IHRoZSByZXNpemUgd2lkZ2V0Lg0KICAgICAgICAgICAgc2VsZi5zdGF0 dXNfYmFyLnNldF9sYWJlbCgnX3BhZGRpbmcxJywgJyAgICAnLCBzaWRlPVJJR0hUKQ0KICAgICAg ICBzZWxmLnN0YXR1c19iYXIuc2V0X2xhYmVsKCdjb2x1bW4nLCAnQ29sOiA/Jywgc2lkZT1SSUdI VCkNCiAgICAgICAgc2VsZi5zdGF0dXNfYmFyLnNldF9sYWJlbCgnbGluZScsICdMbjogPycsIHNp ZGU9UklHSFQpDQogICAgICAgIHNlbGYuc3RhdHVzX2Jhci5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxs PVgpDQogICAgICAgIHNlcC5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpDQogICAgICAgIHNlbGYu dGV4dC5iaW5kKCI8PHNldC1saW5lLWFuZC1jb2x1bW4+PiIsIHNlbGYuc2V0X2xpbmVfYW5kX2Nv bHVtbikNCiAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2FkZCgiPDxzZXQtbGluZS1hbmQtY29sdW1u Pj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8S2V5UmVsZWFzZT4iLCAiPEJ1dHRv blJlbGVhc2U+IikNCiAgICAgICAgc2VsZi50ZXh0LmFmdGVyX2lkbGUoc2VsZi5zZXRfbGluZV9h bmRfY29sdW1uKQ0KDQogICAgZGVmIHNldF9saW5lX2FuZF9jb2x1bW4oc2VsZiwgZXZlbnQ9Tm9u ZSk6DQogICAgICAgIGxpbmUsIGNvbHVtbiA9IHNlbGYudGV4dC5pbmRleChJTlNFUlQpLnNwbGl0 KCcuJykNCiAgICAgICAgc2VsZi5zdGF0dXNfYmFyLnNldF9sYWJlbCgnY29sdW1uJywgJ0NvbDog JXMnICUgY29sdW1uKQ0KICAgICAgICBzZWxmLnN0YXR1c19iYXIuc2V0X2xhYmVsKCdsaW5lJywg J0xuOiAlcycgJSBsaW5lKQ0KDQogICAgbWVudV9zcGVjcyA9IFsNCiAgICAgICAgKCJmaWxlIiwg Il9GaWxlIiksDQogICAgICAgICgiZWRpdCIsICJfRWRpdCIpLA0KICAgICAgICAoImZvcm1hdCIs ICJGX29ybWF0IiksDQogICAgICAgICgicnVuIiwgIl9SdW4iKSwNCiAgICAgICAgKCJvcHRpb25z IiwgIl9PcHRpb25zIiksDQogICAgICAgICgid2luZG93cyIsICJfV2luZG93IiksDQogICAgICAg ICgiaGVscCIsICJfSGVscCIpLA0KICAgICAgICAoImFscGhhIiwgIl9BbHBoYSIpDQogICAgXQ0K DQoNCiAgICBkZWYgY3JlYXRlbWVudWJhcihzZWxmKToNCiAgICAgICAgbWJhciA9IHNlbGYubWVu dWJhcg0KICAgICAgICBzZWxmLm1lbnVkaWN0ID0gbWVudWRpY3QgPSB7fQ0KICAgICAgICBmb3Ig bmFtZSwgbGFiZWwgaW4gc2VsZi5tZW51X3NwZWNzOg0KICAgICAgICAgICAgdW5kZXJsaW5lLCBs YWJlbCA9IHByZXBzdHIobGFiZWwpDQogICAgICAgICAgICBtZW51ZGljdFtuYW1lXSA9IG1lbnUg PSBNZW51KG1iYXIsIG5hbWU9bmFtZSwgdGVhcm9mZj0wKQ0KICAgICAgICAgICAgbWJhci5hZGRf Y2FzY2FkZShsYWJlbD1sYWJlbCwgbWVudT1tZW51LCB1bmRlcmxpbmU9dW5kZXJsaW5lKQ0KICAg ICAgICBpZiBtYWNvc3guaXNDYXJib25UaygpOg0KICAgICAgICAgICAgIyBJbnNlcnQgdGhlIGFw cGxpY2F0aW9uIG1lbnUNCiAgICAgICAgICAgIG1lbnVkaWN0WydhcHBsaWNhdGlvbiddID0gbWVu dSA9IE1lbnUobWJhciwgbmFtZT0nYXBwbGUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB0ZWFyb2ZmPTApDQogICAgICAgICAgICBtYmFyLmFkZF9j YXNjYWRlKGxhYmVsPSdJRExFJywgbWVudT1tZW51KQ0KICAgICAgICBzZWxmLmZpbGxfbWVudXMo KQ0KICAgICAgICBzZWxmLnJlY2VudF9maWxlc19tZW51ID0gTWVudShzZWxmLm1lbnViYXIsIHRl YXJvZmY9MCkNCiAgICAgICAgc2VsZi5tZW51ZGljdFsnZmlsZSddLmluc2VydF9jYXNjYWRlKDMs IGxhYmVsPSdSZWNlbnQgRmlsZXMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdW5kZXJsaW5lPTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBtZW51PXNlbGYucmVjZW50X2ZpbGVzX21lbnUpDQogICAgICAgIHNlbGYu YmFzZV9oZWxwbWVudV9sZW5ndGggPSBzZWxmLm1lbnVkaWN0WydoZWxwJ10uaW5kZXgoRU5EKQ0K ICAgICAgICBzZWxmLnJlc2V0X2hlbHBfbWVudV9lbnRyaWVzKCkNCg0KICAgIGRlZiBwb3N0d2lu ZG93c21lbnUoc2VsZik6DQogICAgICAgICMgT25seSBjYWxsZWQgd2hlbiBXaW5kb3dzIG1lbnUg ZXhpc3RzDQogICAgICAgIG1lbnUgPSBzZWxmLm1lbnVkaWN0Wyd3aW5kb3dzJ10NCiAgICAgICAg ZW5kID0gbWVudS5pbmRleCgiZW5kIikNCiAgICAgICAgaWYgZW5kIGlzIE5vbmU6DQogICAgICAg ICAgICBlbmQgPSAtMQ0KICAgICAgICBpZiBlbmQgPiBzZWxmLndtZW51X2VuZDoNCiAgICAgICAg ICAgIG1lbnUuZGVsZXRlKHNlbGYud21lbnVfZW5kKzEsIGVuZCkNCiAgICAgICAgd2luZG93cy5h ZGRfd2luZG93c190b19tZW51KG1lbnUpDQoNCiAgICBkZWYgaGFuZGxlX3l2aWV3KHNlbGYsIGV2 ZW50LCAqYXJncyk6DQogICAgICAgICJIYW5kbGUgc2Nyb2xsYmFyLiINCiAgICAgICAgaWYgZXZl bnQgPT0gJ21vdmV0byc6DQogICAgICAgICAgICBmcmFjdGlvbiA9IGZsb2F0KGFyZ3NbMF0pDQog ICAgICAgICAgICBsaW5lcyA9IChyb3VuZChzZWxmLmdldGxpbmVubygnZW5kJykgKiBmcmFjdGlv bikgLQ0KICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRsaW5lbm8oJ0AwLDAnKSkNCiAgICAg ICAgICAgIGV2ZW50ID0gJ3Njcm9sbCcNCiAgICAgICAgICAgIGFyZ3MgPSAobGluZXMsICd1bml0 cycpDQogICAgICAgIHNlbGYudGV4dC55dmlldyhldmVudCwgKmFyZ3MpDQogICAgICAgIHJldHVy biAnYnJlYWsnDQoNCiAgICBkZWYgbW91c2VzY3JvbGwoc2VsZiwgZXZlbnQpOg0KICAgICAgICAi SGFuZGxlIHNjcm9sbCB3aGVlbC4iDQogICAgICAgIHVwID0ge0V2ZW50VHlwZS5Nb3VzZVdoZWVs OiBldmVudC5kZWx0YSA+PSAwID09IGRhcndpbiwNCiAgICAgICAgICAgICAgRXZlbnRUeXBlLkJ1 dHRvbjogZXZlbnQubnVtID09IDR9DQogICAgICAgIGxpbmVzID0gNQ0KICAgICAgICBpZiB1cFtl dmVudC50eXBlXToNCiAgICAgICAgICAgIGxpbmVzID0gLWxpbmVzDQogICAgICAgIHNlbGYudGV4 dC55dmlld19zY3JvbGwobGluZXMsICd1bml0cycpDQogICAgICAgIHJldHVybiAnYnJlYWsnDQoN CiAgICBybWVudSA9IE5vbmUNCg0KICAgIGRlZiByaWdodF9tZW51X2V2ZW50KHNlbGYsIGV2ZW50 KToNCiAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCAiQCVkLCVkIiAlIChldmVu dC54LCBldmVudC55KSkNCiAgICAgICAgaWYgbm90IHNlbGYucm1lbnU6DQogICAgICAgICAgICBz ZWxmLm1ha2Vfcm1lbnUoKQ0KICAgICAgICBybWVudSA9IHNlbGYucm1lbnUNCiAgICAgICAgc2Vs Zi5ldmVudCA9IGV2ZW50DQogICAgICAgIGlzd2luID0gc3lzLnBsYXRmb3JtWzozXSA9PSAnd2lu Jw0KICAgICAgICBpZiBpc3dpbjoNCiAgICAgICAgICAgIHNlbGYudGV4dC5jb25maWcoY3Vyc29y PSJhcnJvdyIpDQoNCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5ybWVudV9zcGVjczoNCiAgICAg ICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBsYWJlbCwgZXZlbnRuYW1lLCB2ZXJpZnlfc3Rh dGUgPSBpdGVtDQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogIyBzZWUgaXNzdWUxMjA3 NTg5DQogICAgICAgICAgICAgICAgY29udGludWUNCg0KICAgICAgICAgICAgaWYgdmVyaWZ5X3N0 YXRlIGlzIE5vbmU6DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIHN0YXRl ID0gZ2V0YXR0cihzZWxmLCB2ZXJpZnlfc3RhdGUpKCkNCiAgICAgICAgICAgIHJtZW51LmVudHJ5 Y29uZmlndXJlKGxhYmVsLCBzdGF0ZT1zdGF0ZSkNCg0KDQogICAgICAgIHJtZW51LnRrX3BvcHVw KGV2ZW50Lnhfcm9vdCwgZXZlbnQueV9yb290KQ0KICAgICAgICBpZiBpc3dpbjoNCiAgICAgICAg ICAgIHNlbGYudGV4dC5jb25maWcoY3Vyc29yPSJpYmVhbSIpDQogICAgICAgIHJldHVybiAiYnJl YWsiDQoNCiAgICBybWVudV9zcGVjcyA9IFsNCiAgICAgICAgIyAoIkxhYmVsIiwgIjw8dmlydHVh bC1ldmVudD4+IiwgInN0YXRlZnVuY25hbWUiKSwgLi4uDQogICAgICAgICgiQ2xvc2UiLCAiPDxj bG9zZS13aW5kb3c+PiIsIE5vbmUpLCAjIEV4YW1wbGUNCiAgICBdDQoNCiAgICBkZWYgbWFrZV9y bWVudShzZWxmKToNCiAgICAgICAgcm1lbnUgPSBNZW51KHNlbGYudGV4dCwgdGVhcm9mZj0wKQ0K ICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnJtZW51X3NwZWNzOg0KICAgICAgICAgICAgbGFiZWws IGV2ZW50bmFtZSA9IGl0ZW1bMF0sIGl0ZW1bMV0NCiAgICAgICAgICAgIGlmIGxhYmVsIGlzIG5v dCBOb25lOg0KICAgICAgICAgICAgICAgIGRlZiBjb21tYW5kKHRleHQ9c2VsZi50ZXh0LCBldmVu dG5hbWU9ZXZlbnRuYW1lKToNCiAgICAgICAgICAgICAgICAgICAgdGV4dC5ldmVudF9nZW5lcmF0 ZShldmVudG5hbWUpDQogICAgICAgICAgICAgICAgcm1lbnUuYWRkX2NvbW1hbmQobGFiZWw9bGFi ZWwsIGNvbW1hbmQ9Y29tbWFuZCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAg cm1lbnUuYWRkX3NlcGFyYXRvcigpDQogICAgICAgIHNlbGYucm1lbnUgPSBybWVudQ0KDQogICAg ZGVmIHJtZW51X2NoZWNrX2N1dChzZWxmKToNCiAgICAgICAgcmV0dXJuIHNlbGYucm1lbnVfY2hl Y2tfY29weSgpDQoNCiAgICBkZWYgcm1lbnVfY2hlY2tfY29weShzZWxmKToNCiAgICAgICAgdHJ5 Og0KICAgICAgICAgICAgaW5keCA9IHNlbGYudGV4dC5pbmRleCgnc2VsLmZpcnN0JykNCiAgICAg ICAgZXhjZXB0IFRjbEVycm9yOg0KICAgICAgICAgICAgcmV0dXJuICdkaXNhYmxlZCcNCiAgICAg ICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiAnbm9ybWFsJyBpZiBpbmR4IGVsc2UgJ2Rpc2Fi bGVkJw0KDQogICAgZGVmIHJtZW51X2NoZWNrX3Bhc3RlKHNlbGYpOg0KICAgICAgICB0cnk6DQog ICAgICAgICAgICBzZWxmLnRleHQudGsuY2FsbCgndGs6OkdldFNlbGVjdGlvbicsIHNlbGYudGV4 dCwgJ0NMSVBCT0FSRCcpDQogICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoNCiAgICAgICAgICAgIHJl dHVybiAnZGlzYWJsZWQnDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gJ25vcm1h bCcNCg0KICAgIGRlZiBhYm91dF9kaWFsb2coc2VsZiwgZXZlbnQ9Tm9uZSk6DQogICAgICAgICJI YW5kbGUgSGVscCAnQWJvdXQgSURMRScgZXZlbnQuIg0KICAgICAgICAjIFN5bmNocm9uaXplIHdp dGggbWFjb3N4Lm92ZXJyaWRlUm9vdE1lbnUuYWJvdXRfZGlhbG9nLg0KICAgICAgICBoZWxwX2Fi b3V0LkFib3V0RGlhbG9nKHNlbGYudG9wKQ0KICAgICAgICByZXR1cm4gImJyZWFrIg0KDQogICAg ZGVmIGNvbmZpZ19kaWFsb2coc2VsZiwgZXZlbnQ9Tm9uZSk6DQogICAgICAgICJIYW5kbGUgT3B0 aW9ucyAnQ29uZmlndXJlIElETEUnIGV2ZW50LiINCiAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRo IG1hY29zeC5vdmVycmlkZVJvb3RNZW51LmNvbmZpZ19kaWFsb2cuDQogICAgICAgIGNvbmZpZ2Rp YWxvZy5Db25maWdEaWFsb2coc2VsZi50b3AsJ1NldHRpbmdzJykNCiAgICAgICAgcmV0dXJuICJi cmVhayINCg0KICAgIGRlZiBoZWxwX2RpYWxvZyhzZWxmLCBldmVudD1Ob25lKToNCiAgICAgICAg IkhhbmRsZSBIZWxwICdJRExFIEhlbHAnIGV2ZW50LiINCiAgICAgICAgIyBTeW5jaHJvbml6ZSB3 aXRoIG1hY29zeC5vdmVycmlkZVJvb3RNZW51LmhlbHBfZGlhbG9nLg0KICAgICAgICBpZiBzZWxm LnJvb3Q6DQogICAgICAgICAgICBwYXJlbnQgPSBzZWxmLnJvb3QNCiAgICAgICAgZWxzZToNCiAg ICAgICAgICAgIHBhcmVudCA9IHNlbGYudG9wDQogICAgICAgIGhlbHAuc2hvd19pZGxlaGVscChw YXJlbnQpDQogICAgICAgIHJldHVybiAiYnJlYWsiDQoNCiAgICBkZWYgcHl0aG9uX2RvY3Moc2Vs ZiwgZXZlbnQ9Tm9uZSk6DQogICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6DQog ICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgb3Muc3RhcnRmaWxlKHNlbGYuaGVscF91 cmwpDQogICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyB3aHk6DQogICAgICAgICAgICAgICAg dGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nRG9jdW1lbnQgU3RhcnQgRmFpbHVyZScsDQog ICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9c3RyKHdoeSksIHBhcmVudD1zZWxmLnRleHQpDQog ICAgICAgIGVsc2U6DQogICAgICAgICAgICB3ZWJicm93c2VyLm9wZW4oc2VsZi5oZWxwX3VybCkN CiAgICAgICAgcmV0dXJuICJicmVhayINCg0KICAgIGRlZiBjdXQoc2VsZixldmVudCk6DQogICAg ICAgIHNlbGYudGV4dC5ldmVudF9nZW5lcmF0ZSgiPDxDdXQ+PiIpDQogICAgICAgIHJldHVybiAi YnJlYWsiDQoNCiAgICBkZWYgY29weShzZWxmLGV2ZW50KToNCiAgICAgICAgaWYgbm90IHNlbGYu dGV4dC50YWdfcmFuZ2VzKCJzZWwiKToNCiAgICAgICAgICAgICMgVGhlcmUgaXMgbm8gc2VsZWN0 aW9uLCBzbyBkbyBub3RoaW5nIGFuZCBtYXliZSBpbnRlcnJ1cHQuDQogICAgICAgICAgICByZXR1 cm4gTm9uZQ0KICAgICAgICBzZWxmLnRleHQuZXZlbnRfZ2VuZXJhdGUoIjw8Q29weT4+IikNCiAg ICAgICAgcmV0dXJuICJicmVhayINCg0KICAgIGRlZiBwYXN0ZShzZWxmLGV2ZW50KToNCiAgICAg ICAgc2VsZi50ZXh0LmV2ZW50X2dlbmVyYXRlKCI8PFBhc3RlPj4iKQ0KICAgICAgICBzZWxmLnRl eHQuc2VlKCJpbnNlcnQiKQ0KICAgICAgICByZXR1cm4gImJyZWFrIg0KDQogICAgZGVmIHNlbGVj dF9hbGwoc2VsZiwgZXZlbnQ9Tm9uZSk6DQogICAgICAgIHNlbGYudGV4dC50YWdfYWRkKCJzZWwi LCAiMS4wIiwgImVuZC0xYyIpDQogICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgiaW5zZXJ0Iiwg IjEuMCIpDQogICAgICAgIHNlbGYudGV4dC5zZWUoImluc2VydCIpDQogICAgICAgIHJldHVybiAi YnJlYWsiDQoNCiAgICBkZWYgcmVtb3ZlX3NlbGVjdGlvbihzZWxmLCBldmVudD1Ob25lKToNCiAg ICAgICAgc2VsZi50ZXh0LnRhZ19yZW1vdmUoInNlbCIsICIxLjAiLCAiZW5kIikNCiAgICAgICAg c2VsZi50ZXh0LnNlZSgiaW5zZXJ0IikNCiAgICAgICAgcmV0dXJuICJicmVhayINCg0KICAgIGRl ZiBtb3ZlX2F0X2VkZ2VfaWZfc2VsZWN0aW9uKHNlbGYsIGVkZ2VfaW5kZXgpOg0KICAgICAgICAi IiJDdXJzb3IgbW92ZSBiZWdpbnMgYXQgc3RhcnQgb3IgZW5kIG9mIHNlbGVjdGlvbg0KDQogICAg ICAgIFdoZW4gYSBsZWZ0L3JpZ2h0IGN1cnNvciBrZXkgaXMgcHJlc3NlZCBjcmVhdGUgYW5kIHJl dHVybiB0byBUa2ludGVyIGENCiAgICAgICAgZnVuY3Rpb24gd2hpY2ggY2F1c2VzIGEgY3Vyc29y IG1vdmUgZnJvbSB0aGUgYXNzb2NpYXRlZCBlZGdlIG9mIHRoZQ0KICAgICAgICBzZWxlY3Rpb24u DQoNCiAgICAgICAgIiIiDQogICAgICAgIHNlbGZfdGV4dF9pbmRleCA9IHNlbGYudGV4dC5pbmRl eA0KICAgICAgICBzZWxmX3RleHRfbWFya19zZXQgPSBzZWxmLnRleHQubWFya19zZXQNCiAgICAg ICAgZWRnZXNfdGFibGUgPSAoInNlbC5maXJzdCsxYyIsICJzZWwubGFzdC0xYyIpDQogICAgICAg IGRlZiBtb3ZlX2F0X2VkZ2UoZXZlbnQpOg0KICAgICAgICAgICAgaWYgKGV2ZW50LnN0YXRlICYg NSkgPT0gMDogIyBubyBzaGlmdCg9PTEpIG9yIGNvbnRyb2woPT00KSBwcmVzc2VkDQogICAgICAg ICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBzZWxmX3RleHRfaW5kZXgoInNlbC5m aXJzdCIpDQogICAgICAgICAgICAgICAgICAgIHNlbGZfdGV4dF9tYXJrX3NldCgiaW5zZXJ0Iiwg ZWRnZXNfdGFibGVbZWRnZV9pbmRleF0pDQogICAgICAgICAgICAgICAgZXhjZXB0IFRjbEVycm9y Og0KICAgICAgICAgICAgICAgICAgICBwYXNzDQogICAgICAgIHJldHVybiBtb3ZlX2F0X2VkZ2UN Cg0KICAgIGRlZiBkZWxfd29yZF9sZWZ0KHNlbGYsIGV2ZW50KToNCiAgICAgICAgc2VsZi50ZXh0 LmV2ZW50X2dlbmVyYXRlKCc8TWV0YS1EZWxldGU+JykNCiAgICAgICAgcmV0dXJuICJicmVhayIN Cg0KICAgIGRlZiBkZWxfd29yZF9yaWdodChzZWxmLCBldmVudCk6DQogICAgICAgIHNlbGYudGV4 dC5ldmVudF9nZW5lcmF0ZSgnPE1ldGEtZD4nKQ0KICAgICAgICByZXR1cm4gImJyZWFrIg0KDQog ICAgZGVmIGZpbmRfZXZlbnQoc2VsZiwgZXZlbnQpOg0KICAgICAgICBzZWFyY2guZmluZChzZWxm LnRleHQpDQogICAgICAgIHJldHVybiAiYnJlYWsiDQoNCiAgICBkZWYgZmluZF9hZ2Fpbl9ldmVu dChzZWxmLCBldmVudCk6DQogICAgICAgIHNlYXJjaC5maW5kX2FnYWluKHNlbGYudGV4dCkNCiAg ICAgICAgcmV0dXJuICJicmVhayINCg0KICAgIGRlZiBmaW5kX3NlbGVjdGlvbl9ldmVudChzZWxm LCBldmVudCk6DQogICAgICAgIHNlYXJjaC5maW5kX3NlbGVjdGlvbihzZWxmLnRleHQpDQogICAg ICAgIHJldHVybiAiYnJlYWsiDQoNCiAgICBkZWYgZmluZF9pbl9maWxlc19ldmVudChzZWxmLCBl dmVudCk6DQogICAgICAgIGdyZXAuZ3JlcChzZWxmLnRleHQsIHNlbGYuaW8sIHNlbGYuZmxpc3Qp DQogICAgICAgIHJldHVybiAiYnJlYWsiDQoNCiAgICBkZWYgcmVwbGFjZV9ldmVudChzZWxmLCBl dmVudCk6DQogICAgICAgIHJlcGxhY2UucmVwbGFjZShzZWxmLnRleHQpDQogICAgICAgIHJldHVy biAiYnJlYWsiDQoNCiAgICBkZWYgZ290b19saW5lX2V2ZW50KHNlbGYsIGV2ZW50KToNCiAgICAg ICAgdGV4dCA9IHNlbGYudGV4dA0KICAgICAgICBsaW5lbm8gPSB0a1NpbXBsZURpYWxvZy5hc2tp bnRlZ2VyKCJHb3RvIiwNCiAgICAgICAgICAgICAgICAiR28gdG8gbGluZSBudW1iZXI6IixwYXJl bnQ9dGV4dCkNCiAgICAgICAgaWYgbGluZW5vIGlzIE5vbmU6DQogICAgICAgICAgICByZXR1cm4g ImJyZWFrIg0KICAgICAgICBpZiBsaW5lbm8gPD0gMDoNCiAgICAgICAgICAgIHRleHQuYmVsbCgp DQogICAgICAgICAgICByZXR1cm4gImJyZWFrIg0KICAgICAgICB0ZXh0Lm1hcmtfc2V0KCJpbnNl cnQiLCAiJWQuMCIgJSBsaW5lbm8pDQogICAgICAgIHRleHQuc2VlKCJpbnNlcnQiKQ0KICAgICAg ICByZXR1cm4gImJyZWFrIg0KDQogICAgZGVmIG9wZW5fbW9kdWxlKHNlbGYpOg0KICAgICAgICAi IiJHZXQgbW9kdWxlIG5hbWUgZnJvbSB1c2VyIGFuZCBvcGVuIGl0Lg0KDQogICAgICAgIFJldHVy biBtb2R1bGUgcGF0aCBvciBOb25lIGZvciBjYWxscyBieSBvcGVuX21vZHVsZV9icm93c2VyDQog ICAgICAgIHdoZW4gbGF0dGVyIGlzIG5vdCBpbnZva2VkIGluIG5hbWVkIGVkaXRvciB3aW5kb3cu DQogICAgICAgICIiIg0KICAgICAgICAjIFhYWCBUaGlzLCBvcGVuX21vZHVsZV9icm93c2VyLCBh bmQgb3Blbl9wYXRoX2Jyb3dzZXINCiAgICAgICAgIyB3b3VsZCBmaXQgYmV0dGVyIGluIGlvbWVu dS5JT0JpbmRpbmcuDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIG5hbWUgPSBzZWxmLnRleHQu Z2V0KCJzZWwuZmlyc3QiLCAic2VsLmxhc3QiKS5zdHJpcCgpDQogICAgICAgIGV4Y2VwdCBUY2xF cnJvcjoNCiAgICAgICAgICAgIG5hbWUgPSAnJw0KICAgICAgICBmaWxlX3BhdGggPSBxdWVyeS5N b2R1bGVOYW1lKA0KICAgICAgICAgICAgICAgIHNlbGYudGV4dCwgIk9wZW4gTW9kdWxlIiwNCiAg ICAgICAgICAgICAgICAiRW50ZXIgdGhlIG5hbWUgb2YgYSBQeXRob24gbW9kdWxlXG4iDQogICAg ICAgICAgICAgICAgInRvIHNlYXJjaCBvbiBzeXMucGF0aCBhbmQgb3BlbjoiLA0KICAgICAgICAg ICAgICAgIG5hbWUpLnJlc3VsdA0KICAgICAgICBpZiBmaWxlX3BhdGggaXMgbm90IE5vbmU6DQog ICAgICAgICAgICBpZiBzZWxmLmZsaXN0Og0KICAgICAgICAgICAgICAgIHNlbGYuZmxpc3Qub3Bl bihmaWxlX3BhdGgpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYuaW8u bG9hZGZpbGUoZmlsZV9wYXRoKQ0KICAgICAgICByZXR1cm4gZmlsZV9wYXRoDQoNCiAgICBkZWYg b3Blbl9tb2R1bGVfZXZlbnQoc2VsZiwgZXZlbnQpOg0KICAgICAgICBzZWxmLm9wZW5fbW9kdWxl KCkNCiAgICAgICAgcmV0dXJuICJicmVhayINCg0KICAgIGRlZiBvcGVuX21vZHVsZV9icm93c2Vy KHNlbGYsIGV2ZW50PU5vbmUpOg0KICAgICAgICBmaWxlbmFtZSA9IHNlbGYuaW8uZmlsZW5hbWUN CiAgICAgICAgaWYgbm90IChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyA9PSAnUHlTaGVsbEVkaXRv cldpbmRvdycNCiAgICAgICAgICAgICAgICBhbmQgZmlsZW5hbWUpOg0KICAgICAgICAgICAgZmls ZW5hbWUgPSBzZWxmLm9wZW5fbW9kdWxlKCkNCiAgICAgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5v bmU6DQogICAgICAgICAgICAgICAgcmV0dXJuICJicmVhayINCiAgICAgICAgZnJvbSBpZGxlbGli IGltcG9ydCBicm93c2VyDQogICAgICAgIGJyb3dzZXIuTW9kdWxlQnJvd3NlcihzZWxmLnJvb3Qs IGZpbGVuYW1lKQ0KICAgICAgICByZXR1cm4gImJyZWFrIg0KDQogICAgZGVmIG9wZW5fcGF0aF9i cm93c2VyKHNlbGYsIGV2ZW50PU5vbmUpOg0KICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IHBh dGhicm93c2VyDQogICAgICAgIHBhdGhicm93c2VyLlBhdGhCcm93c2VyKHNlbGYucm9vdCkNCiAg ICAgICAgcmV0dXJuICJicmVhayINCg0KICAgIGRlZiBvcGVuX3R1cnRsZV9kZW1vKHNlbGYsIGV2 ZW50ID0gTm9uZSk6DQogICAgICAgIGltcG9ydCBzdWJwcm9jZXNzDQoNCiAgICAgICAgY21kID0g W3N5cy5leGVjdXRhYmxlLA0KICAgICAgICAgICAgICAgJy1jJywNCiAgICAgICAgICAgICAgICdm cm9tIHR1cnRsZWRlbW8uX19tYWluX18gaW1wb3J0IG1haW47IG1haW4oKSddDQogICAgICAgIHN1 YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1GYWxzZSkNCiAgICAgICAgcmV0dXJuICJicmVhayIN Cg0KICAgIGRlZiBnb3RvbGluZShzZWxmLCBsaW5lbm8pOg0KICAgICAgICBpZiBsaW5lbm8gaXMg bm90IE5vbmUgYW5kIGxpbmVubyA+IDA6DQogICAgICAgICAgICBzZWxmLnRleHQubWFya19zZXQo Imluc2VydCIsICIlZC4wIiAlIGxpbmVubykNCiAgICAgICAgICAgIHNlbGYudGV4dC50YWdfcmVt b3ZlKCJzZWwiLCAiMS4wIiwgImVuZCIpDQogICAgICAgICAgICBzZWxmLnRleHQudGFnX2FkZCgi c2VsIiwgImluc2VydCIsICJpbnNlcnQgKzFsIikNCiAgICAgICAgICAgIHNlbGYuY2VudGVyKCkN Cg0KICAgIGRlZiBpc3B5dGhvbnNvdXJjZShzZWxmLCBmaWxlbmFtZSk6DQogICAgICAgIGlmIG5v dCBmaWxlbmFtZSBvciBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToNCiAgICAgICAgICAgIHJldHVy biBUcnVlDQogICAgICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNl bmFtZShmaWxlbmFtZSkpDQogICAgICAgIGlmIG9zLnBhdGgubm9ybWNhc2UoZXh0KSBpbiAoIi5w eSIsICIucHl3Iik6DQogICAgICAgICAgICByZXR1cm4gVHJ1ZQ0KICAgICAgICBsaW5lID0gc2Vs Zi50ZXh0LmdldCgnMS4wJywgJzEuMCBsaW5lZW5kJykNCiAgICAgICAgcmV0dXJuIGxpbmUuc3Rh cnRzd2l0aCgnIyEnKSBhbmQgJ3B5dGhvbicgaW4gbGluZQ0KDQogICAgZGVmIGNsb3NlX2hvb2so c2VsZik6DQogICAgICAgIGlmIHNlbGYuZmxpc3Q6DQogICAgICAgICAgICBzZWxmLmZsaXN0LnVu cmVnaXN0ZXJfbWF5YmVfdGVybWluYXRlKHNlbGYpDQogICAgICAgICAgICBzZWxmLmZsaXN0ID0g Tm9uZQ0KDQogICAgZGVmIHNldF9jbG9zZV9ob29rKHNlbGYsIGNsb3NlX2hvb2spOg0KICAgICAg ICBzZWxmLmNsb3NlX2hvb2sgPSBjbG9zZV9ob29rDQoNCiAgICBkZWYgZmlsZW5hbWVfY2hhbmdl X2hvb2soc2VsZik6DQogICAgICAgIGlmIHNlbGYuZmxpc3Q6DQogICAgICAgICAgICBzZWxmLmZs aXN0LmZpbGVuYW1lX2NoYW5nZWRfZWRpdChzZWxmKQ0KICAgICAgICBzZWxmLnNhdmVkX2NoYW5n ZV9ob29rKCkNCiAgICAgICAgc2VsZi50b3AudXBkYXRlX3dpbmRvd2xpc3RfcmVnaXN0cnkoc2Vs ZikNCiAgICAgICAgc2VsZi5SZXNldENvbG9yaXplcigpDQoNCiAgICBkZWYgX2FkZGNvbG9yaXpl cihzZWxmKToNCiAgICAgICAgaWYgc2VsZi5jb2xvcjoNCiAgICAgICAgICAgIHJldHVybg0KICAg ICAgICBpZiBzZWxmLmlzcHl0aG9uc291cmNlKHNlbGYuaW8uZmlsZW5hbWUpOg0KICAgICAgICAg ICAgc2VsZi5jb2xvciA9IHNlbGYuQ29sb3JEZWxlZ2F0b3IoKQ0KICAgICAgICAjIGNhbiBhZGQg bW9yZSBjb2xvcml6ZXJzIGhlcmUuLi4NCiAgICAgICAgaWYgc2VsZi5jb2xvcjoNCiAgICAgICAg ICAgIHNlbGYucGVyLnJlbW92ZWZpbHRlcihzZWxmLnVuZG8pDQogICAgICAgICAgICBzZWxmLnBl ci5pbnNlcnRmaWx0ZXIoc2VsZi5jb2xvcikNCiAgICAgICAgICAgIHNlbGYucGVyLmluc2VydGZp bHRlcihzZWxmLnVuZG8pDQoNCiAgICBkZWYgX3JtY29sb3JpemVyKHNlbGYpOg0KICAgICAgICBp ZiBub3Qgc2VsZi5jb2xvcjoNCiAgICAgICAgICAgIHJldHVybg0KICAgICAgICBzZWxmLmNvbG9y LnJlbW92ZWNvbG9ycygpDQogICAgICAgIHNlbGYucGVyLnJlbW92ZWZpbHRlcihzZWxmLmNvbG9y KQ0KICAgICAgICBzZWxmLmNvbG9yID0gTm9uZQ0KDQogICAgZGVmIFJlc2V0Q29sb3JpemVyKHNl bGYpOg0KICAgICAgICAiVXBkYXRlIHRoZSBjb2xvciB0aGVtZSINCiAgICAgICAgIyBDYWxsZWQg ZnJvbSBzZWxmLmZpbGVuYW1lX2NoYW5nZV9ob29rIGFuZCBmcm9tIGNvbmZpZ2RpYWxvZy5weQ0K ICAgICAgICBzZWxmLl9ybWNvbG9yaXplcigpDQogICAgICAgIHNlbGYuX2FkZGNvbG9yaXplcigp DQogICAgICAgIEVkaXRvcldpbmRvdy5jb2xvcl9jb25maWcoc2VsZi50ZXh0KQ0KDQogICAgSURF TlRDSEFSUyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICJfIg0KDQog ICAgZGVmIGNvbG9yaXplX3N5bnRheF9lcnJvcihzZWxmLCB0ZXh0LCBwb3MpOg0KICAgICAgICB0 ZXh0LnRhZ19hZGQoIkVSUk9SIiwgcG9zKQ0KICAgICAgICBjaGFyID0gdGV4dC5nZXQocG9zKQ0K ICAgICAgICBpZiBjaGFyIGFuZCBjaGFyIGluIHNlbGYuSURFTlRDSEFSUzoNCiAgICAgICAgICAg IHRleHQudGFnX2FkZCgiRVJST1IiLCBwb3MgKyAiIHdvcmRzdGFydCIsIHBvcykNCiAgICAgICAg aWYgJ1xuJyA9PSB0ZXh0LmdldChwb3MpOiAgICMgZXJyb3IgYXQgbGluZSBlbmQNCiAgICAgICAg ICAgIHRleHQubWFya19zZXQoImluc2VydCIsIHBvcykNCiAgICAgICAgZWxzZToNCiAgICAgICAg ICAgIHRleHQubWFya19zZXQoImluc2VydCIsIHBvcyArICIrMWMiKQ0KICAgICAgICB0ZXh0LnNl ZShwb3MpDQoNCiAgICBkZWYgUmVzZXRGb250KHNlbGYpOg0KICAgICAgICAiVXBkYXRlIHRoZSB0 ZXh0IHdpZGdldHMnIGZvbnQgaWYgaXQgaXMgY2hhbmdlZCINCiAgICAgICAgIyBDYWxsZWQgZnJv bSBjb25maWdkaWFsb2cucHkNCg0KICAgICAgICBzZWxmLnRleHRbJ2ZvbnQnXSA9IGlkbGVDb25m LkdldEZvbnQoc2VsZi5yb290LCAnbWFpbicsJ0VkaXRvcldpbmRvdycpDQoNCiAgICBkZWYgUmVt b3ZlS2V5YmluZGluZ3Moc2VsZik6DQogICAgICAgICJSZW1vdmUgdGhlIGtleWJpbmRpbmdzIGJl Zm9yZSB0aGV5IGFyZSBjaGFuZ2VkLiINCiAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdkaWFs b2cucHkNCiAgICAgICAgc2VsZi5tYWlubWVudS5kZWZhdWx0X2tleWRlZnMgPSBrZXlkZWZzID0g aWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpDQogICAgICAgIGZvciBldmVudCwga2V5bGlzdCBp biBrZXlkZWZzLml0ZW1zKCk6DQogICAgICAgICAgICBzZWxmLnRleHQuZXZlbnRfZGVsZXRlKGV2 ZW50LCAqa2V5bGlzdCkNCiAgICAgICAgZm9yIGV4dGVuc2lvbk5hbWUgaW4gc2VsZi5nZXRfc3Rh bmRhcmRfZXh0ZW5zaW9uX25hbWVzKCk6DQogICAgICAgICAgICB4a2V5ZGVmcyA9IGlkbGVDb25m LkdldEV4dGVuc2lvbkJpbmRpbmdzKGV4dGVuc2lvbk5hbWUpDQogICAgICAgICAgICBpZiB4a2V5 ZGVmczoNCiAgICAgICAgICAgICAgICBmb3IgZXZlbnQsIGtleWxpc3QgaW4geGtleWRlZnMuaXRl bXMoKToNCiAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2RlbGV0ZShldmVudCwg KmtleWxpc3QpDQoNCiAgICBkZWYgQXBwbHlLZXliaW5kaW5ncyhzZWxmKToNCiAgICAgICAgIlVw ZGF0ZSB0aGUga2V5YmluZGluZ3MgYWZ0ZXIgdGhleSBhcmUgY2hhbmdlZCINCiAgICAgICAgIyBD YWxsZWQgZnJvbSBjb25maWdkaWFsb2cucHkNCiAgICAgICAgc2VsZi5tYWlubWVudS5kZWZhdWx0 X2tleWRlZnMgPSBrZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpDQogICAgICAg IHNlbGYuYXBwbHlfYmluZGluZ3MoKQ0KICAgICAgICBmb3IgZXh0ZW5zaW9uTmFtZSBpbiBzZWxm LmdldF9zdGFuZGFyZF9leHRlbnNpb25fbmFtZXMoKToNCiAgICAgICAgICAgIHhrZXlkZWZzID0g aWRsZUNvbmYuR2V0RXh0ZW5zaW9uQmluZGluZ3MoZXh0ZW5zaW9uTmFtZSkNCiAgICAgICAgICAg IGlmIHhrZXlkZWZzOg0KICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlfYmluZGluZ3MoeGtleWRl ZnMpDQogICAgICAgICN1cGRhdGUgbWVudSBhY2NlbGVyYXRvcnMNCiAgICAgICAgbWVudUV2ZW50 RGljdCA9IHt9DQogICAgICAgIGZvciBtZW51IGluIHNlbGYubWFpbm1lbnUubWVudWRlZnM6DQog ICAgICAgICAgICBtZW51RXZlbnREaWN0W21lbnVbMF1dID0ge30NCiAgICAgICAgICAgIGZvciBp dGVtIGluIG1lbnVbMV06DQogICAgICAgICAgICAgICAgaWYgaXRlbToNCiAgICAgICAgICAgICAg ICAgICAgbWVudUV2ZW50RGljdFttZW51WzBdXVtwcmVwc3RyKGl0ZW1bMF0pWzFdXSA9IGl0ZW1b MV0NCiAgICAgICAgZm9yIG1lbnViYXJJdGVtIGluIHNlbGYubWVudWRpY3Q6DQogICAgICAgICAg ICBtZW51ID0gc2VsZi5tZW51ZGljdFttZW51YmFySXRlbV0NCiAgICAgICAgICAgIGVuZCA9IG1l bnUuaW5kZXgoRU5EKQ0KICAgICAgICAgICAgaWYgZW5kIGlzIE5vbmU6DQogICAgICAgICAgICAg ICAgIyBTa2lwIGVtcHR5IG1lbnVzDQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAg ICAgIGVuZCArPSAxDQogICAgICAgICAgICBmb3IgaW5kZXggaW4gcmFuZ2UoMCwgZW5kKToNCiAg ICAgICAgICAgICAgICBpZiBtZW51LnR5cGUoaW5kZXgpID09ICdjb21tYW5kJzoNCiAgICAgICAg ICAgICAgICAgICAgYWNjZWwgPSBtZW51LmVudHJ5Y2dldChpbmRleCwgJ2FjY2VsZXJhdG9yJykN CiAgICAgICAgICAgICAgICAgICAgaWYgYWNjZWw6DQogICAgICAgICAgICAgICAgICAgICAgICBp dGVtTmFtZSA9IG1lbnUuZW50cnljZ2V0KGluZGV4LCAnbGFiZWwnKQ0KICAgICAgICAgICAgICAg ICAgICAgICAgZXZlbnQgPSAnJw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWVudWJhckl0 ZW0gaW4gbWVudUV2ZW50RGljdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdGVt TmFtZSBpbiBtZW51RXZlbnREaWN0W21lbnViYXJJdGVtXToNCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZXZlbnQgPSBtZW51RXZlbnREaWN0W21lbnViYXJJdGVtXVtpdGVtTmFtZV0N CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV2ZW50Og0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGFjY2VsID0gZ2V0X2FjY2VsZXJhdG9yKGtleWRlZnMsIGV2ZW50KQ0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG1lbnUuZW50cnljb25maWcoaW5kZXgsIGFjY2VsZXJhdG9yPWFj Y2VsKQ0KDQogICAgZGVmIHNldF9ub3RhYnNfaW5kZW50d2lkdGgoc2VsZik6DQogICAgICAgICJV cGRhdGUgdGhlIGluZGVudHdpZHRoIGlmIGNoYW5nZWQgYW5kIG5vdCB1c2luZyB0YWJzIGluIHRo aXMgd2luZG93Ig0KICAgICAgICAjIENhbGxlZCBmcm9tIGNvbmZpZ2RpYWxvZy5weQ0KICAgICAg ICBpZiBub3Qgc2VsZi51c2V0YWJzOg0KICAgICAgICAgICAgc2VsZi5pbmRlbnR3aWR0aCA9IGlk bGVDb25mLkdldE9wdGlvbignbWFpbicsICdJbmRlbnQnLCdudW0tc3BhY2VzJywNCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0naW50JykNCg0K ICAgIGRlZiByZXNldF9oZWxwX21lbnVfZW50cmllcyhzZWxmKToNCiAgICAgICAgIlVwZGF0ZSB0 aGUgYWRkaXRpb25hbCBoZWxwIGVudHJpZXMgb24gdGhlIEhlbHAgbWVudSINCiAgICAgICAgaGVs cF9saXN0ID0gaWRsZUNvbmYuR2V0QWxsRXh0cmFIZWxwU291cmNlc0xpc3QoKQ0KICAgICAgICBo ZWxwbWVudSA9IHNlbGYubWVudWRpY3RbJ2hlbHAnXQ0KICAgICAgICAjIGZpcnN0IGRlbGV0ZSB0 aGUgZXh0cmEgaGVscCBlbnRyaWVzLCBpZiBhbnkNCiAgICAgICAgaGVscG1lbnVfbGVuZ3RoID0g aGVscG1lbnUuaW5kZXgoRU5EKQ0KICAgICAgICBpZiBoZWxwbWVudV9sZW5ndGggPiBzZWxmLmJh c2VfaGVscG1lbnVfbGVuZ3RoOg0KICAgICAgICAgICAgaGVscG1lbnUuZGVsZXRlKChzZWxmLmJh c2VfaGVscG1lbnVfbGVuZ3RoICsgMSksIGhlbHBtZW51X2xlbmd0aCkNCiAgICAgICAgIyB0aGVu IHJlYnVpbGQgdGhlbQ0KICAgICAgICBpZiBoZWxwX2xpc3Q6DQogICAgICAgICAgICBoZWxwbWVu dS5hZGRfc2VwYXJhdG9yKCkNCiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBoZWxwX2xpc3Q6DQog ICAgICAgICAgICAgICAgY21kID0gc2VsZi5fX2V4dHJhX2hlbHBfY2FsbGJhY2soZW50cnlbMV0p DQogICAgICAgICAgICAgICAgaGVscG1lbnUuYWRkX2NvbW1hbmQobGFiZWw9ZW50cnlbMF0sIGNv bW1hbmQ9Y21kKQ0KICAgICAgICAjIGFuZCB1cGRhdGUgdGhlIG1lbnUgZGljdGlvbmFyeQ0KICAg ICAgICBzZWxmLm1lbnVkaWN0WydoZWxwJ10gPSBoZWxwbWVudQ0KDQogICAgZGVmIF9fZXh0cmFf aGVscF9jYWxsYmFjayhzZWxmLCBoZWxwZmlsZSk6DQogICAgICAgICJDcmVhdGUgYSBjYWxsYmFj ayB3aXRoIHRoZSBoZWxwZmlsZSB2YWx1ZSBmcm96ZW4gYXQgZGVmaW5pdGlvbiB0aW1lIg0KICAg ICAgICBkZWYgZGlzcGxheV9leHRyYV9oZWxwKGhlbHBmaWxlPWhlbHBmaWxlKToNCiAgICAgICAg ICAgIGlmIG5vdCBoZWxwZmlsZS5zdGFydHN3aXRoKCgnd3d3JywgJ2h0dHAnKSk6DQogICAgICAg ICAgICAgICAgaGVscGZpbGUgPSBvcy5wYXRoLm5vcm1wYXRoKGhlbHBmaWxlKQ0KICAgICAgICAg ICAgaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnd2luJzoNCiAgICAgICAgICAgICAgICB0cnk6DQog ICAgICAgICAgICAgICAgICAgIG9zLnN0YXJ0ZmlsZShoZWxwZmlsZSkNCiAgICAgICAgICAgICAg ICBleGNlcHQgT1NFcnJvciBhcyB3aHk6DQogICAgICAgICAgICAgICAgICAgIHRrTWVzc2FnZUJv eC5zaG93ZXJyb3IodGl0bGU9J0RvY3VtZW50IFN0YXJ0IEZhaWx1cmUnLA0KICAgICAgICAgICAg ICAgICAgICAgICAgbWVzc2FnZT1zdHIod2h5KSwgcGFyZW50PXNlbGYudGV4dCkNCiAgICAgICAg ICAgIGVsc2U6DQogICAgICAgICAgICAgICAgd2ViYnJvd3Nlci5vcGVuKGhlbHBmaWxlKQ0KICAg ICAgICByZXR1cm4gZGlzcGxheV9leHRyYV9oZWxwDQoNCiAgICBkZWYgdXBkYXRlX3JlY2VudF9m aWxlc19saXN0KHNlbGYsIG5ld19maWxlPU5vbmUpOg0KICAgICAgICAiTG9hZCBhbmQgdXBkYXRl IHRoZSByZWNlbnQgZmlsZXMgbGlzdCBhbmQgbWVudXMiDQogICAgICAgIHJmX2xpc3QgPSBbXQ0K ICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnJlY2VudF9maWxlc19wYXRoKToNCiAgICAg ICAgICAgIHdpdGggb3BlbihzZWxmLnJlY2VudF9maWxlc19wYXRoLCAncicsDQogICAgICAgICAg ICAgICAgICAgICAgZW5jb2Rpbmc9J3V0Zl84JywgZXJyb3JzPSdyZXBsYWNlJykgYXMgcmZfbGlz dF9maWxlOg0KICAgICAgICAgICAgICAgIHJmX2xpc3QgPSByZl9saXN0X2ZpbGUucmVhZGxpbmVz KCkNCiAgICAgICAgaWYgbmV3X2ZpbGU6DQogICAgICAgICAgICBuZXdfZmlsZSA9IG9zLnBhdGgu YWJzcGF0aChuZXdfZmlsZSkgKyAnXG4nDQogICAgICAgICAgICBpZiBuZXdfZmlsZSBpbiByZl9s aXN0Og0KICAgICAgICAgICAgICAgIHJmX2xpc3QucmVtb3ZlKG5ld19maWxlKSAgIyBtb3ZlIHRv IHRvcA0KICAgICAgICAgICAgcmZfbGlzdC5pbnNlcnQoMCwgbmV3X2ZpbGUpDQogICAgICAgICMg Y2xlYW4gYW5kIHNhdmUgdGhlIHJlY2VudCBmaWxlcyBsaXN0DQogICAgICAgIGJhZF9wYXRocyA9 IFtdDQogICAgICAgIGZvciBwYXRoIGluIHJmX2xpc3Q6DQogICAgICAgICAgICBpZiAnXDAnIGlu IHBhdGggb3Igbm90IG9zLnBhdGguZXhpc3RzKHBhdGhbMDotMV0pOg0KICAgICAgICAgICAgICAg IGJhZF9wYXRocy5hcHBlbmQocGF0aCkNCiAgICAgICAgcmZfbGlzdCA9IFtwYXRoIGZvciBwYXRo IGluIHJmX2xpc3QgaWYgcGF0aCBub3QgaW4gYmFkX3BhdGhzXQ0KICAgICAgICB1bGNoYXJzID0g IjEyMzQ1Njc4OTBBQkNERUZHSElKSyINCiAgICAgICAgcmZfbGlzdCA9IHJmX2xpc3RbMDpsZW4o dWxjaGFycyldDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLnJlY2Vu dF9maWxlc19wYXRoLCAndycsDQogICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz0ndXRm XzgnLCBlcnJvcnM9J3JlcGxhY2UnKSBhcyByZl9maWxlOg0KICAgICAgICAgICAgICAgIHJmX2Zp bGUud3JpdGVsaW5lcyhyZl9saXN0KQ0KICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6DQog ICAgICAgICAgICBpZiBub3QgZ2V0YXR0cihzZWxmLnJvb3QsICJyZWNlbnRmaWxlbGlzdF9lcnJv cl9kaXNwbGF5ZWQiLCBGYWxzZSk6DQogICAgICAgICAgICAgICAgc2VsZi5yb290LnJlY2VudGZp bGVsaXN0X2Vycm9yX2Rpc3BsYXllZCA9IFRydWUNCiAgICAgICAgICAgICAgICB0a01lc3NhZ2VC b3guc2hvd3dhcm5pbmcodGl0bGU9J0lETEUgV2FybmluZycsDQogICAgICAgICAgICAgICAgICAg IG1lc3NhZ2U9IkNhbm5vdCB1cGRhdGUgRmlsZSBtZW51IFJlY2VudCBGaWxlcyBsaXN0LiAiDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdXIgb3BlcmF0aW5nIHN5c3RlbSBzYXlzOlxu JXNcbiINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VsZWN0IE9LIGFuZCBJRExFIHdp bGwgY29udGludWUgd2l0aG91dCB1cGRhdGluZy4iDQogICAgICAgICAgICAgICAgICAgICAgICAl IHNlbGYuX2ZpbGVuYW1lX3RvX3VuaWNvZGUoc3RyKGVycikpLA0KICAgICAgICAgICAgICAgICAg ICBwYXJlbnQ9c2VsZi50ZXh0KQ0KICAgICAgICAjIGZvciBlYWNoIGVkaXQgd2luZG93IGluc3Rh bmNlLCBjb25zdHJ1Y3QgdGhlIHJlY2VudCBmaWxlcyBtZW51DQogICAgICAgIGZvciBpbnN0YW5j ZSBpbiBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0Og0KICAgICAgICAgICAgbWVudSA9IGluc3RhbmNl LnJlY2VudF9maWxlc19tZW51DQogICAgICAgICAgICBtZW51LmRlbGV0ZSgwLCBFTkQpICAjIGNs ZWFyLCBhbmQgcmVidWlsZDoNCiAgICAgICAgICAgIGZvciBpLCBmaWxlX25hbWUgaW4gZW51bWVy YXRlKHJmX2xpc3QpOg0KICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9IGZpbGVfbmFtZS5yc3Ry aXAoKSAgIyB6YXAgXG4NCiAgICAgICAgICAgICAgICAjIG1ha2UgdW5pY29kZSBzdHJpbmcgdG8g ZGlzcGxheSBub24tQVNDSUkgY2hhcnMgY29ycmVjdGx5DQogICAgICAgICAgICAgICAgdWZpbGVf bmFtZSA9IHNlbGYuX2ZpbGVuYW1lX3RvX3VuaWNvZGUoZmlsZV9uYW1lKQ0KICAgICAgICAgICAg ICAgIGNhbGxiYWNrID0gaW5zdGFuY2UuX19yZWNlbnRfZmlsZV9jYWxsYmFjayhmaWxlX25hbWUp DQogICAgICAgICAgICAgICAgbWVudS5hZGRfY29tbWFuZChsYWJlbD11bGNoYXJzW2ldICsgIiAi ICsgdWZpbGVfbmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9 Y2FsbGJhY2ssDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmU9MCkN Cg0KICAgIGRlZiBfX3JlY2VudF9maWxlX2NhbGxiYWNrKHNlbGYsIGZpbGVfbmFtZSk6DQogICAg ICAgIGRlZiBvcGVuX3JlY2VudF9maWxlKGZuX2Nsb3N1cmU9ZmlsZV9uYW1lKToNCiAgICAgICAg ICAgIHNlbGYuaW8ub3BlbihlZGl0RmlsZT1mbl9jbG9zdXJlKQ0KICAgICAgICByZXR1cm4gb3Bl bl9yZWNlbnRfZmlsZQ0KDQogICAgZGVmIHNhdmVkX2NoYW5nZV9ob29rKHNlbGYpOg0KICAgICAg ICBzaG9ydCA9IHNlbGYuc2hvcnRfdGl0bGUoKQ0KICAgICAgICBsb25nID0gc2VsZi5sb25nX3Rp dGxlKCkNCiAgICAgICAgaWYgc2hvcnQgYW5kIGxvbmc6DQogICAgICAgICAgICB0aXRsZSA9IHNo b3J0ICsgIiAtICIgKyBsb25nICsgX3B5X3ZlcnNpb24NCiAgICAgICAgZWxpZiBzaG9ydDoNCiAg ICAgICAgICAgIHRpdGxlID0gc2hvcnQNCiAgICAgICAgZWxpZiBsb25nOg0KICAgICAgICAgICAg dGl0bGUgPSBsb25nDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICB0aXRsZSA9ICJVbnRpdGxl ZCINCiAgICAgICAgaWNvbiA9IHNob3J0IG9yIGxvbmcgb3IgdGl0bGUNCiAgICAgICAgaWYgbm90 IHNlbGYuZ2V0X3NhdmVkKCk6DQogICAgICAgICAgICB0aXRsZSA9ICIqJXMqIiAlIHRpdGxlDQog ICAgICAgICAgICBpY29uID0gIiolcyIgJSBpY29uDQogICAgICAgIHNlbGYudG9wLndtX3RpdGxl KHRpdGxlKQ0KICAgICAgICBzZWxmLnRvcC53bV9pY29ubmFtZShpY29uKQ0KDQogICAgZGVmIGdl dF9zYXZlZChzZWxmKToNCiAgICAgICAgcmV0dXJuIHNlbGYudW5kby5nZXRfc2F2ZWQoKQ0KDQog ICAgZGVmIHNldF9zYXZlZChzZWxmLCBmbGFnKToNCiAgICAgICAgc2VsZi51bmRvLnNldF9zYXZl ZChmbGFnKQ0KDQogICAgZGVmIHJlc2V0X3VuZG8oc2VsZik6DQogICAgICAgIHNlbGYudW5kby5y ZXNldF91bmRvKCkNCg0KICAgIGRlZiBzaG9ydF90aXRsZShzZWxmKToNCiAgICAgICAgZmlsZW5h bWUgPSBzZWxmLmlvLmZpbGVuYW1lDQogICAgICAgIGlmIGZpbGVuYW1lOg0KICAgICAgICAgICAg ZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQ0KICAgICAgICBlbHNlOg0KICAg ICAgICAgICAgZmlsZW5hbWUgPSAiVW50aXRsZWQiDQogICAgICAgICMgcmV0dXJuIHVuaWNvZGUg c3RyaW5nIHRvIGRpc3BsYXkgbm9uLUFTQ0lJIGNoYXJzIGNvcnJlY3RseQ0KICAgICAgICByZXR1 cm4gc2VsZi5fZmlsZW5hbWVfdG9fdW5pY29kZShmaWxlbmFtZSkNCg0KICAgIGRlZiBsb25nX3Rp dGxlKHNlbGYpOg0KICAgICAgICAjIHJldHVybiB1bmljb2RlIHN0cmluZyB0byBkaXNwbGF5IG5v bi1BU0NJSSBjaGFycyBjb3JyZWN0bHkNCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVuYW1lX3Rv X3VuaWNvZGUoc2VsZi5pby5maWxlbmFtZSBvciAiIikNCg0KICAgIGRlZiBjZW50ZXJfaW5zZXJ0 X2V2ZW50KHNlbGYsIGV2ZW50KToNCiAgICAgICAgc2VsZi5jZW50ZXIoKQ0KICAgICAgICByZXR1 cm4gImJyZWFrIg0KDQogICAgZGVmIGNlbnRlcihzZWxmLCBtYXJrPSJpbnNlcnQiKToNCiAgICAg ICAgdGV4dCA9IHNlbGYudGV4dA0KICAgICAgICB0b3AsIGJvdCA9IHNlbGYuZ2V0d2luZG93bGlu ZXMoKQ0KICAgICAgICBsaW5lbm8gPSBzZWxmLmdldGxpbmVubyhtYXJrKQ0KICAgICAgICBoZWln aHQgPSBib3QgLSB0b3ANCiAgICAgICAgbmV3dG9wID0gbWF4KDEsIGxpbmVubyAtIGhlaWdodC8v MikNCiAgICAgICAgdGV4dC55dmlldyhmbG9hdChuZXd0b3ApKQ0KDQogICAgZGVmIGdldHdpbmRv d2xpbmVzKHNlbGYpOg0KICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0DQogICAgICAgIHRvcCA9IHNl bGYuZ2V0bGluZW5vKCJAMCwwIikNCiAgICAgICAgYm90ID0gc2VsZi5nZXRsaW5lbm8oIkAwLDY1 NTM1IikNCiAgICAgICAgaWYgdG9wID09IGJvdCBhbmQgdGV4dC53aW5mb19oZWlnaHQoKSA9PSAx Og0KICAgICAgICAgICAgIyBHZW9tZXRyeSBtYW5hZ2VyIGhhc24ndCBydW4geWV0DQogICAgICAg ICAgICBoZWlnaHQgPSBpbnQodGV4dFsnaGVpZ2h0J10pDQogICAgICAgICAgICBib3QgPSB0b3Ag KyBoZWlnaHQgLSAxDQogICAgICAgIHJldHVybiB0b3AsIGJvdA0KDQogICAgZGVmIGdldGxpbmVu byhzZWxmLCBtYXJrPSJpbnNlcnQiKToNCiAgICAgICAgdGV4dCA9IHNlbGYudGV4dA0KICAgICAg ICByZXR1cm4gaW50KGZsb2F0KHRleHQuaW5kZXgobWFyaykpKQ0KDQogICAgZGVmIGdldF9nZW9t ZXRyeShzZWxmKToNCiAgICAgICAgIlJldHVybiAod2lkdGgsIGhlaWdodCwgeCwgeSkiDQogICAg ICAgIGdlb20gPSBzZWxmLnRvcC53bV9nZW9tZXRyeSgpDQogICAgICAgIG0gPSByZS5tYXRjaChy IihcZCspeChcZCspXCsoLT9cZCspXCsoLT9cZCspIiwgZ2VvbSkNCiAgICAgICAgcmV0dXJuIGxp c3QobWFwKGludCwgbS5ncm91cHMoKSkpDQoNCiAgICBkZWYgY2xvc2VfZXZlbnQoc2VsZiwgZXZl bnQpOg0KICAgICAgICBzZWxmLmNsb3NlKCkNCiAgICAgICAgcmV0dXJuICJicmVhayINCg0KICAg IGRlZiBtYXliZXNhdmUoc2VsZik6DQogICAgICAgIGlmIHNlbGYuaW86DQogICAgICAgICAgICBp ZiBub3Qgc2VsZi5nZXRfc2F2ZWQoKToNCiAgICAgICAgICAgICAgICBpZiBzZWxmLnRvcC5zdGF0 ZSgpIT0nbm9ybWFsJzoNCiAgICAgICAgICAgICAgICAgICAgc2VsZi50b3AuZGVpY29uaWZ5KCkN CiAgICAgICAgICAgICAgICBzZWxmLnRvcC5sb3dlcigpDQogICAgICAgICAgICAgICAgc2VsZi50 b3AubGlmdCgpDQogICAgICAgICAgICByZXR1cm4gc2VsZi5pby5tYXliZXNhdmUoKQ0KDQogICAg ZGVmIGNsb3NlKHNlbGYpOg0KICAgICAgICByZXBseSA9IHNlbGYubWF5YmVzYXZlKCkNCiAgICAg ICAgaWYgc3RyKHJlcGx5KSAhPSAiY2FuY2VsIjoNCiAgICAgICAgICAgIHNlbGYuX2Nsb3NlKCkN CiAgICAgICAgcmV0dXJuIHJlcGx5DQoNCiAgICBkZWYgX2Nsb3NlKHNlbGYpOg0KICAgICAgICBp ZiBzZWxmLmlvLmZpbGVuYW1lOg0KICAgICAgICAgICAgc2VsZi51cGRhdGVfcmVjZW50X2ZpbGVz X2xpc3QobmV3X2ZpbGU9c2VsZi5pby5maWxlbmFtZSkNCiAgICAgICAgd2luZG93cy51bnJlZ2lz dGVyX2NhbGxiYWNrKHNlbGYucG9zdHdpbmRvd3NtZW51KQ0KICAgICAgICBzZWxmLnVubG9hZF9l eHRlbnNpb25zKCkNCiAgICAgICAgc2VsZi5pby5jbG9zZSgpDQogICAgICAgIHNlbGYuaW8gPSBO b25lDQogICAgICAgIHNlbGYudW5kbyA9IE5vbmUNCiAgICAgICAgaWYgc2VsZi5jb2xvcjoNCiAg ICAgICAgICAgIHNlbGYuY29sb3IuY2xvc2UoRmFsc2UpDQogICAgICAgICAgICBzZWxmLmNvbG9y ID0gTm9uZQ0KICAgICAgICBzZWxmLnRleHQgPSBOb25lDQogICAgICAgIHNlbGYudGtpbnRlcl92 YXJzID0gTm9uZQ0KICAgICAgICBzZWxmLnBlci5jbG9zZSgpDQogICAgICAgIHNlbGYucGVyID0g Tm9uZQ0KICAgICAgICBzZWxmLnRvcC5kZXN0cm95KCkNCiAgICAgICAgaWYgc2VsZi5jbG9zZV9o b29rOg0KICAgICAgICAgICAgIyB1bmxlc3Mgb3ZlcnJpZGU6IHVucmVnaXN0ZXIgZnJvbSBmbGlz dCwgdGVybWluYXRlIGlmIGxhc3Qgd2luZG93DQogICAgICAgICAgICBzZWxmLmNsb3NlX2hvb2so KQ0KDQogICAgZGVmIGxvYWRfZXh0ZW5zaW9ucyhzZWxmKToNCiAgICAgICAgc2VsZi5leHRlbnNp b25zID0ge30NCiAgICAgICAgc2VsZi5sb2FkX3N0YW5kYXJkX2V4dGVuc2lvbnMoKQ0KDQogICAg ZGVmIHVubG9hZF9leHRlbnNpb25zKHNlbGYpOg0KICAgICAgICBmb3IgaW5zIGluIGxpc3Qoc2Vs Zi5leHRlbnNpb25zLnZhbHVlcygpKToNCiAgICAgICAgICAgIGlmIGhhc2F0dHIoaW5zLCAiY2xv c2UiKToNCiAgICAgICAgICAgICAgICBpbnMuY2xvc2UoKQ0KICAgICAgICBzZWxmLmV4dGVuc2lv bnMgPSB7fQ0KDQogICAgZGVmIGxvYWRfc3RhbmRhcmRfZXh0ZW5zaW9ucyhzZWxmKToNCiAgICAg ICAgZm9yIG5hbWUgaW4gc2VsZi5nZXRfc3RhbmRhcmRfZXh0ZW5zaW9uX25hbWVzKCk6DQogICAg ICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgc2VsZi5sb2FkX2V4dGVuc2lvbihuYW1lKQ0K ICAgICAgICAgICAgZXhjZXB0Og0KICAgICAgICAgICAgICAgIHByaW50KCJGYWlsZWQgdG8gbG9h ZCBleHRlbnNpb24iLCByZXByKG5hbWUpKQ0KICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmlu dF9leGMoKQ0KDQogICAgZGVmIGdldF9zdGFuZGFyZF9leHRlbnNpb25fbmFtZXMoc2VsZik6DQog ICAgICAgIHJldHVybiBpZGxlQ29uZi5HZXRFeHRlbnNpb25zKGVkaXRvcl9vbmx5PVRydWUpDQoN CiAgICBleHRmaWxlcyA9IHsgICMgTWFwIGJ1aWx0LWluIGNvbmZpZy1leHRlbnNpb24gc2VjdGlv biBuYW1lcyB0byBmaWxlIG5hbWVzLg0KICAgICAgICAnWnpEdW1teSc6ICd6emR1bW15JywNCiAg ICAgICAgfQ0KDQogICAgZGVmIGxvYWRfZXh0ZW5zaW9uKHNlbGYsIG5hbWUpOg0KICAgICAgICBm bmFtZSA9IHNlbGYuZXh0ZmlsZXMuZ2V0KG5hbWUsIG5hbWUpDQogICAgICAgIHRyeToNCiAgICAg ICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVs ZSgnLicgKyBmbmFtZSwgcGFja2FnZT1fX3BhY2thZ2VfXykNCiAgICAgICAgICAgIGV4Y2VwdCAo SW1wb3J0RXJyb3IsIFR5cGVFcnJvcik6DQogICAgICAgICAgICAgICAgbW9kID0gaW1wb3J0bGli LmltcG9ydF9tb2R1bGUoZm5hbWUpDQogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICAg ICAgICAgIHByaW50KCJcbkZhaWxlZCB0byBpbXBvcnQgZXh0ZW5zaW9uOiAiLCBuYW1lKQ0KICAg ICAgICAgICAgcmFpc2UNCiAgICAgICAgY2xzID0gZ2V0YXR0cihtb2QsIG5hbWUpDQogICAgICAg IGtleWRlZnMgPSBpZGxlQ29uZi5HZXRFeHRlbnNpb25CaW5kaW5ncyhuYW1lKQ0KICAgICAgICBp ZiBoYXNhdHRyKGNscywgIm1lbnVkZWZzIik6DQogICAgICAgICAgICBzZWxmLmZpbGxfbWVudXMo Y2xzLm1lbnVkZWZzLCBrZXlkZWZzKQ0KICAgICAgICBpbnMgPSBjbHMoc2VsZikNCiAgICAgICAg c2VsZi5leHRlbnNpb25zW25hbWVdID0gaW5zDQogICAgICAgIGlmIGtleWRlZnM6DQogICAgICAg ICAgICBzZWxmLmFwcGx5X2JpbmRpbmdzKGtleWRlZnMpDQogICAgICAgICAgICBmb3IgdmV2ZW50 IGluIGtleWRlZnM6DQogICAgICAgICAgICAgICAgbWV0aG9kbmFtZSA9IHZldmVudC5yZXBsYWNl KCItIiwgIl8iKQ0KICAgICAgICAgICAgICAgIHdoaWxlIG1ldGhvZG5hbWVbOjFdID09ICc8JzoN CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kbmFtZSA9IG1ldGhvZG5hbWVbMTpdDQogICAgICAg ICAgICAgICAgd2hpbGUgbWV0aG9kbmFtZVstMTpdID09ICc+JzoNCiAgICAgICAgICAgICAgICAg ICAgbWV0aG9kbmFtZSA9IG1ldGhvZG5hbWVbOi0xXQ0KICAgICAgICAgICAgICAgIG1ldGhvZG5h bWUgPSBtZXRob2RuYW1lICsgIl9ldmVudCINCiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGlu cywgbWV0aG9kbmFtZSk6DQogICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dC5iaW5kKHZldmVu dCwgZ2V0YXR0cihpbnMsIG1ldGhvZG5hbWUpKQ0KDQogICAgZGVmIGFwcGx5X2JpbmRpbmdzKHNl bGYsIGtleWRlZnM9Tm9uZSk6DQogICAgICAgIGlmIGtleWRlZnMgaXMgTm9uZToNCiAgICAgICAg ICAgIGtleWRlZnMgPSBzZWxmLm1haW5tZW51LmRlZmF1bHRfa2V5ZGVmcw0KICAgICAgICB0ZXh0 ID0gc2VsZi50ZXh0DQogICAgICAgIHRleHQua2V5ZGVmcyA9IGtleWRlZnMNCiAgICAgICAgZm9y IGV2ZW50LCBrZXlsaXN0IGluIGtleWRlZnMuaXRlbXMoKToNCiAgICAgICAgICAgIGlmIGtleWxp c3Q6DQogICAgICAgICAgICAgICAgdGV4dC5ldmVudF9hZGQoZXZlbnQsICprZXlsaXN0KQ0KDQog ICAgZGVmIGZpbGxfbWVudXMoc2VsZiwgbWVudWRlZnM9Tm9uZSwga2V5ZGVmcz1Ob25lKToNCiAg ICAgICAgIiIiQWRkIGFwcHJvcHJpYXRlIGVudHJpZXMgdG8gdGhlIG1lbnVzIGFuZCBzdWJtZW51 cw0KDQogICAgICAgIE1lbnVzIHRoYXQgYXJlIGFic2VudCBvciBOb25lIGluIHNlbGYubWVudWRp Y3QgYXJlIGlnbm9yZWQuDQogICAgICAgICIiIg0KICAgICAgICBpZiBtZW51ZGVmcyBpcyBOb25l Og0KICAgICAgICAgICAgbWVudWRlZnMgPSBbDQogICAgICAgICAgICAgICAgKCdmaWxlJywgWygn X05ldyBGaWxlJywgJzw8b3Blbi1uZXctd2luZG93Pj4nKSwoJ19PcGVuLi4uJywgJzw8b3Blbi13 aW5kb3ctZnJvbS1maWxlPj4nKSwgKCdPcGVuIF9Nb2R1bGUuLi4nLCAnPDxvcGVuLW1vZHVsZT4+ JyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICgnTW9kdWxlIF9Ccm93c2VyJywgJzw8b3Bl bi1jbGFzcy1icm93c2VyPj4nKSwgKCdfUGF0aCBCcm93c2VyJywgJzw8b3Blbi1wYXRoLWJyb3dz ZXI+PicpLCBOb25lLCAoJ19TYXZlJywgJzw8c2F2ZS13aW5kb3c+PicpLA0KICAgICAgICAgICAg ICAgICAgICAgICAgICAoJ1NhdmUgX0FzLi4uJywgJzw8c2F2ZS13aW5kb3ctYXMtZmlsZT4+Jyks ICgnU2F2ZSBDb3BfeSBBcy4uLicsICc8PHNhdmUtY29weS1vZi13aW5kb3ctYXMtZmlsZT4+Jyks IE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICgnUHJpbl90IFdpbmRvdycsICc8PHBy aW50LXdpbmRvdz4+JyksIE5vbmUsICgnX0Nsb3NlJywgJzw8Y2xvc2Utd2luZG93Pj4nKSwgKCdF X3hpdCcsICc8PGNsb3NlLWFsbC13aW5kb3dzPj4nKV0pLA0KICAgICAgICAgICAgICAgICgnZWRp dCcsIFsoJ19VbmRvJywgJzw8dW5kbz4+JyksICgnX1JlZG8nLCAnPDxyZWRvPj4nKSwgTm9uZSwg KCdDdV90JywgJzw8Y3V0Pj4nKSwgKCdfQ29weScsICc8PGNvcHk+PicpLCAoJ19QYXN0ZScsICc8 PHBhc3RlPj4nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgKCdTZWxlY3QgX0FsbCcsICc8 PHNlbGVjdC1hbGw+PicpLCBOb25lLCAoJ19GaW5kLi4uJywgJzw8ZmluZD4+JyksICgnRmluZCBB X2dhaW4nLCAnPDxmaW5kLWFnYWluPj4nKSwgKCdGaW5kIF9TZWxlY3Rpb24nLCAnPDxmaW5kLXNl bGVjdGlvbj4+JyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICgnRmluZCBpbiBGaWxlcy4u LicsICc8PGZpbmQtaW4tZmlsZXM+PicpLCAoJ1JfZXBsYWNlLi4uJywgJzw8cmVwbGFjZT4+Jyks ICgnR28gdG8gX0xpbmUnLCAnPDxnb3RvLWxpbmU+PicpLA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAoJ1NfaG93IENvbXBsZXRpb25zJywgJzw8Zm9yY2Utb3Blbi1jb21wbGV0aW9ucz4+Jyks ICgnRV94cGFuZCBXb3JkJywgJzw8ZXhwYW5kLXdvcmQ+PicpLCAoJ1Nob3cgQ19hbGwgVGlwJywg Jzw8Zm9yY2Utb3Blbi1jYWxsdGlwPj4nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgKCdT aG93IFN1cnJvdW5kaW5nIFBfYXJlbnMnLCAnPDxmbGFzaC1wYXJlbj4+JyldKSwNCiAgICAgICAg ICAgICAgICAoJ2Zvcm1hdCcsIFsoJ19JbmRlbnQgUmVnaW9uJywgJzw8aW5kZW50LXJlZ2lvbj4+ JyksICgnX0RlZGVudCBSZWdpb24nLCAnPDxkZWRlbnQtcmVnaW9uPj4nKSwgKCdDb21tZW50IF9P dXQgUmVnaW9uJywgJzw8Y29tbWVudC1yZWdpb24+PicpLA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICgnVV9uY29tbWVudCBSZWdpb24nLCAnPDx1bmNvbW1lbnQtcmVnaW9uPj4nKSwgKCdU YWJpZnkgUmVnaW9uJywgJzw8dGFiaWZ5LXJlZ2lvbj4+JyksICgnVW50YWJpZnkgUmVnaW9uJywg Jzw8dW50YWJpZnktcmVnaW9uPj4nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ1Rv Z2dsZSBUYWJzJywgJzw8dG9nZ2xlLXRhYnM+PicpLCAoJ05ldyBJbmRlbnQgV2lkdGgnLCAnPDxj aGFuZ2UtaW5kZW50d2lkdGg+PicpLCAoJ0Zfb3JtYXQgUGFyYWdyYXBoJywgJzw8Zm9ybWF0LXBh cmFncmFwaD4+JyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdTX3RyaXAgVHJhaWxp bmcgV2hpdGVzcGFjZScsICc8PGRvLXJzdHJpcD4+JyldKSwNCiAgICAgICAgICAgICAgICAoJ3J1 bicsIFsoJ1B5dGhvbiBTaGVsbCcsICc8PG9wZW4tcHl0aG9uLXNoZWxsPj4nKSwgKCdDX2hlY2sg TW9kdWxlJywgJzw8Y2hlY2stbW9kdWxlPj4nKSwgKCdSX3VuIE1vZHVsZScsICc8PHJ1bi1tb2R1 bGU+PicpXSksDQogICAgICAgICAgICAgICAgKCdzaGVsbCcsIFsoJ19WaWV3IExhc3QgUmVzdGFy dCcsICc8PHZpZXctcmVzdGFydD4+JyksICgnX1Jlc3RhcnQgU2hlbGwnLCAnPDxyZXN0YXJ0LXNo ZWxsPj4nKSwgTm9uZSwgKCdfSW50ZXJydXB0IEV4ZWN1dGlvbicsICc8PGludGVycnVwdC1leGVj dXRpb24+PicpXSksDQogICAgICAgICAgICAgICAgKCdkZWJ1ZycsIFsoJ19HbyB0byBGaWxlL0xp bmUnLCAnPDxnb3RvLWZpbGUtbGluZT4+JyksICgnIV9EZWJ1Z2dlcicsICc8PHRvZ2dsZS1kZWJ1 Z2dlcj4+JyksICgnX1N0YWNrIFZpZXdlcicsICc8PG9wZW4tc3RhY2stdmlld2VyPj4nKSwNCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICgnIV9BdXRvLW9wZW4gU3RhY2sgVmlld2VyJywgJzw8 dG9nZ2xlLWppdC1zdGFjay12aWV3ZXI+PicpXSksDQogICAgICAgICAgICAgICAgKCdvcHRpb25z JywgWygnQ29uZmlndXJlIF9JRExFJywgJzw8b3Blbi1jb25maWctZGlhbG9nPj4nKSwoJ19Db2Rl IENvbnRleHQnLCAnPDx0b2dnbGUtY29kZS1jb250ZXh0Pj4nKV0pLA0KICAgICAgICAgICAgICAg ICgnd2luZG93cycsIFsoJ1pvb20gSGVpZ2h0JywgJzw8em9vbS1oZWlnaHQ+PicpXSksDQogICAg ICAgICAgICAgICAgKCdoZWxwJywgWygnX0Fib3V0IElETEUnLCAnPDxhYm91dC1pZGxlPj4nKSwg Tm9uZSwgKCdfSURMRSBIZWxwJywgJzw8aGVscD4+JyksICgnUHl0aG9uIF9Eb2NzJywgJzw8cHl0 aG9uLWRvY3M+PicpLCAoJ1R1cnRsZSBEZW1vJywgJzw8b3Blbi10dXJ0bGUtZGVtbz4+JyldKSwN CiAgICAgICAgICAgICAgICAoJ2FscGhhJywgWygnTm90IFRyYW5zcGFyZW50JywgJzw8YWxwaGEt MD4+JyksICgnTGl0dGxlIFRyYW5zcGFyZW50JywgJzw8YWxwaGEtMT4+JyksICgnSGFsZiBUcmFu c3BhcmVudCcsICc8PGFscGhhLTI+PicpLCAoJ01vc3RseSBUcmFuc3BhcmVudCcsICc8PGFscGhh LTM+PicpXSldDQogICAgICAgICAgICANCiAgICAgICAgIyBBbHBoYXMgd2VyZSBhZGRlZCBoZXJl IGJ5IGhhbmQNCiAgICAgICAgIyBTdXBlciBzb3JyeSBpZiB0aGlzIGxvb2tzIHVnbHksIGJ1dCBJ IHJlYWxseSBjYW4gbm90IGZpbmQgd2hlcmUgaXMgdGhlICJzZWxmLm1haW5tZW51Lm1lbnVkZWZz Ig0KICAgICAgICAjIEFuZCBJJ20ganVzdCB0b28gbGF6eSB0byBnbyB0byB0aGVyZSB4RA0KICAg ICAgICBpZiBrZXlkZWZzIGlzIE5vbmU6DQogICAgICAgICAgICBrZXlkZWZzID0gc2VsZi5tYWlu bWVudS5kZWZhdWx0X2tleWRlZnMNCiAgICAgICAgbWVudWRpY3QgPSBzZWxmLm1lbnVkaWN0DQog ICAgICAgIHRleHQgPSBzZWxmLnRleHQNCiAgICAgICAgZm9yIG1uYW1lLCBlbnRyeWxpc3QgaW4g bWVudWRlZnM6DQogICAgICAgICAgICBtZW51ID0gbWVudWRpY3QuZ2V0KG1uYW1lKQ0KICAgICAg ICAgICAgaWYgbm90IG1lbnU6DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAg IGZvciBlbnRyeSBpbiBlbnRyeWxpc3Q6DQogICAgICAgICAgICAgICAgaWYgbm90IGVudHJ5Og0K ICAgICAgICAgICAgICAgICAgICBtZW51LmFkZF9zZXBhcmF0b3IoKQ0KICAgICAgICAgICAgICAg IGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGxhYmVsLCBldmVudG5hbWUgPSBlbnRyeQ0KICAg ICAgICAgICAgICAgICAgICBjaGVja2J1dHRvbiA9IChsYWJlbFs6MV0gPT0gJyEnKQ0KICAgICAg ICAgICAgICAgICAgICBpZiBjaGVja2J1dHRvbjoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxh YmVsID0gbGFiZWxbMTpdDQogICAgICAgICAgICAgICAgICAgIHVuZGVybGluZSwgbGFiZWwgPSBw cmVwc3RyKGxhYmVsKQ0KICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRvciA9IGdldF9hY2Nl bGVyYXRvcihrZXlkZWZzLCBldmVudG5hbWUpDQogICAgICAgICAgICAgICAgICAgIGRlZiBjb21t YW5kKHRleHQ9dGV4dCwgZXZlbnRuYW1lPWV2ZW50bmFtZSk6DQogICAgICAgICAgICAgICAgICAg ICAgICB0ZXh0LmV2ZW50X2dlbmVyYXRlKGV2ZW50bmFtZSkNCiAgICAgICAgICAgICAgICAgICAg aWYgY2hlY2tidXR0b246DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgPSBzZWxmLmdldF92 YXJfb2JqKGV2ZW50bmFtZSwgQm9vbGVhblZhcikNCiAgICAgICAgICAgICAgICAgICAgICAgIG1l bnUuYWRkX2NoZWNrYnV0dG9uKGxhYmVsPWxhYmVsLCB1bmRlcmxpbmU9dW5kZXJsaW5lLA0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9Y29tbWFuZCwgYWNjZWxlcmF0b3I9YWNj ZWxlcmF0b3IsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU9dmFyKQ0KICAg ICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5hZGRf Y29tbWFuZChsYWJlbD1sYWJlbCwgdW5kZXJsaW5lPXVuZGVybGluZSwNCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1jb21tYW5kLA0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRvcj1hY2NlbGVyYXRvcikNCg0K ICAgIGRlZiBnZXR2YXIoc2VsZiwgbmFtZSk6DQogICAgICAgIHZhciA9IHNlbGYuZ2V0X3Zhcl9v YmoobmFtZSkNCiAgICAgICAgaWYgdmFyOg0KICAgICAgICAgICAgdmFsdWUgPSB2YXIuZ2V0KCkN CiAgICAgICAgICAgIHJldHVybiB2YWx1ZQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmFp c2UgTmFtZUVycm9yKG5hbWUpDQoNCiAgICBkZWYgc2V0dmFyKHNlbGYsIG5hbWUsIHZhbHVlLCB2 YXJ0eXBlPU5vbmUpOg0KICAgICAgICB2YXIgPSBzZWxmLmdldF92YXJfb2JqKG5hbWUsIHZhcnR5 cGUpDQogICAgICAgIGlmIHZhcjoNCiAgICAgICAgICAgIHZhci5zZXQodmFsdWUpDQogICAgICAg IGVsc2U6DQogICAgICAgICAgICByYWlzZSBOYW1lRXJyb3IobmFtZSkNCg0KICAgIGRlZiBnZXRf dmFyX29iaihzZWxmLCBuYW1lLCB2YXJ0eXBlPU5vbmUpOg0KICAgICAgICB2YXIgPSBzZWxmLnRr aW50ZXJfdmFycy5nZXQobmFtZSkNCiAgICAgICAgaWYgbm90IHZhciBhbmQgdmFydHlwZToNCiAg ICAgICAgICAgICMgY3JlYXRlIGEgVGtpbnRlciB2YXJpYWJsZSBvYmplY3Qgd2l0aCBzZWxmLnRl eHQgYXMgbWFzdGVyOg0KICAgICAgICAgICAgc2VsZi50a2ludGVyX3ZhcnNbbmFtZV0gPSB2YXIg PSB2YXJ0eXBlKHNlbGYudGV4dCkNCiAgICAgICAgcmV0dXJuIHZhcg0KDQogICAgIyBUayBpbXBs ZW1lbnRhdGlvbnMgb2YgInZpcnR1YWwgdGV4dCBtZXRob2RzIiAtLSBlYWNoIHBsYXRmb3JtDQog ICAgIyByZXVzaW5nIElETEUncyBzdXBwb3J0IGNvZGUgbmVlZHMgdG8gZGVmaW5lIHRoZXNlIGZv ciBpdHMgR1VJJ3MNCiAgICAjIGZsYXZvciBvZiB3aWRnZXQuDQoNCiAgICAjIElzIGNoYXJhY3Rl ciBhdCB0ZXh0X2luZGV4IGluIGEgUHl0aG9uIHN0cmluZz8gIFJldHVybiAwIGZvcg0KICAgICMg Imd1YXJhbnRlZWQgbm8iLCB0cnVlIGZvciBhbnl0aGluZyBlbHNlLiAgVGhpcyBpbmZvIGlzIGV4 cGVuc2l2ZQ0KICAgICMgdG8gY29tcHV0ZSBhYiBpbml0aW8sIGJ1dCBpcyBwcm9iYWJseSBhbHJl YWR5IGtub3duIGJ5IHRoZQ0KICAgICMgcGxhdGZvcm0ncyBjb2xvcml6ZXIuDQoNCiAgICBkZWYg aXNfY2hhcl9pbl9zdHJpbmcoc2VsZiwgdGV4dF9pbmRleCk6DQogICAgICAgIGlmIHNlbGYuY29s b3I6DQogICAgICAgICAgICAjIFJldHVybiB0cnVlIGlmZiBjb2xvcml6ZXIgaGFzbid0IChyZSln b3R0ZW4gdGhpcyBmYXINCiAgICAgICAgICAgICMgeWV0LCBvciB0aGUgY2hhcmFjdGVyIGlzIHRh Z2dlZCBhcyBiZWluZyBpbiBhIHN0cmluZw0KICAgICAgICAgICAgcmV0dXJuIHNlbGYudGV4dC50 YWdfcHJldnJhbmdlKCJUT0RPIiwgdGV4dF9pbmRleCkgb3IgXA0KICAgICAgICAgICAgICAgICAg ICJTVFJJTkciIGluIHNlbGYudGV4dC50YWdfbmFtZXModGV4dF9pbmRleCkNCiAgICAgICAgZWxz ZToNCiAgICAgICAgICAgICMgVGhlIGNvbG9yaXplciBpcyBtaXNzaW5nOiBhc3N1bWUgdGhlIHdv cnN0DQogICAgICAgICAgICByZXR1cm4gMQ0KDQogICAgIyBJZiBhIHNlbGVjdGlvbiBpcyBkZWZp bmVkIGluIHRoZSB0ZXh0IHdpZGdldCwgcmV0dXJuIChzdGFydCwNCiAgICAjIGVuZCkgYXMgVGtp bnRlciB0ZXh0IGluZGljZXMsIG90aGVyd2lzZSByZXR1cm4gKE5vbmUsIE5vbmUpDQogICAgZGVm IGdldF9zZWxlY3Rpb25faW5kaWNlcyhzZWxmKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAg Zmlyc3QgPSBzZWxmLnRleHQuaW5kZXgoInNlbC5maXJzdCIpDQogICAgICAgICAgICBsYXN0ID0g c2VsZi50ZXh0LmluZGV4KCJzZWwubGFzdCIpDQogICAgICAgICAgICByZXR1cm4gZmlyc3QsIGxh c3QNCiAgICAgICAgZXhjZXB0IFRjbEVycm9yOg0KICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5v bmUNCg0KICAgICMgUmV0dXJuIHRoZSB0ZXh0IHdpZGdldCdzIGN1cnJlbnQgdmlldyBvZiB3aGF0 IGEgdGFiIHN0b3AgbWVhbnMNCiAgICAjIChlcXVpdmFsZW50IHdpZHRoIGluIHNwYWNlcykuDQoN CiAgICBkZWYgZ2V0X3RrX3RhYndpZHRoKHNlbGYpOg0KICAgICAgICBjdXJyZW50ID0gc2VsZi50 ZXh0Wyd0YWJzJ10gb3IgVEtfVEFCV0lEVEhfREVGQVVMVA0KICAgICAgICByZXR1cm4gaW50KGN1 cnJlbnQpDQoNCiAgICAjIFNldCB0aGUgdGV4dCB3aWRnZXQncyBjdXJyZW50IHZpZXcgb2Ygd2hh dCBhIHRhYiBzdG9wIG1lYW5zLg0KDQogICAgZGVmIHNldF90a190YWJ3aWR0aChzZWxmLCBuZXd0 YWJ3aWR0aCk6DQogICAgICAgIHRleHQgPSBzZWxmLnRleHQNCiAgICAgICAgaWYgc2VsZi5nZXRf dGtfdGFid2lkdGgoKSAhPSBuZXd0YWJ3aWR0aDoNCiAgICAgICAgICAgICMgU2V0IHRleHQgd2lk Z2V0IHRhYiB3aWR0aA0KICAgICAgICAgICAgcGl4ZWxzID0gdGV4dC50ay5jYWxsKCJmb250Iiwg Im1lYXN1cmUiLCB0ZXh0WyJmb250Il0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIi1kaXNwbGF5b2YiLCB0ZXh0Lm1hc3RlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAibiIgKiBuZXd0YWJ3aWR0aCkNCiAgICAgICAgICAgIHRleHQuY29uZmlndXJlKHRh YnM9cGl4ZWxzKQ0KDQojIyMgYmVnaW4gYXV0b2luZGVudCBjb2RlICMjIyAgKGNvbmZpZ3VyYXRp b24gd2FzIG1vdmVkIHRvIGJlZ2lubmluZyBvZiBjbGFzcykNCg0KICAgIGRlZiBzZXRfaW5kZW50 YXRpb25fcGFyYW1zKHNlbGYsIGlzX3B5X3NyYywgZ3Vlc3M9VHJ1ZSk6DQogICAgICAgIGlmIGlz X3B5X3NyYyBhbmQgZ3Vlc3M6DQogICAgICAgICAgICBpID0gc2VsZi5ndWVzc19pbmRlbnQoKQ0K ICAgICAgICAgICAgaWYgMiA8PSBpIDw9IDg6DQogICAgICAgICAgICAgICAgc2VsZi5pbmRlbnR3 aWR0aCA9IGkNCiAgICAgICAgICAgIGlmIHNlbGYuaW5kZW50d2lkdGggIT0gc2VsZi50YWJ3aWR0 aDoNCiAgICAgICAgICAgICAgICBzZWxmLnVzZXRhYnMgPSBGYWxzZQ0KICAgICAgICBzZWxmLnNl dF90a190YWJ3aWR0aChzZWxmLnRhYndpZHRoKQ0KDQogICAgZGVmIHNtYXJ0X2JhY2tzcGFjZV9l dmVudChzZWxmLCBldmVudCk6DQogICAgICAgIHRleHQgPSBzZWxmLnRleHQNCiAgICAgICAgZmly c3QsIGxhc3QgPSBzZWxmLmdldF9zZWxlY3Rpb25faW5kaWNlcygpDQogICAgICAgIGlmIGZpcnN0 IGFuZCBsYXN0Og0KICAgICAgICAgICAgdGV4dC5kZWxldGUoZmlyc3QsIGxhc3QpDQogICAgICAg ICAgICB0ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBmaXJzdCkNCiAgICAgICAgICAgIHJldHVybiAi YnJlYWsiDQogICAgICAgICMgRGVsZXRlIHdoaXRlc3BhY2UgbGVmdCwgdW50aWwgaGl0dGluZyBh IHJlYWwgY2hhciBvciBjbG9zZXN0DQogICAgICAgICMgcHJlY2VkaW5nIHZpcnR1YWwgdGFiIHN0 b3AuDQogICAgICAgIGNoYXJzID0gdGV4dC5nZXQoImluc2VydCBsaW5lc3RhcnQiLCAiaW5zZXJ0 IikNCiAgICAgICAgaWYgY2hhcnMgPT0gJyc6DQogICAgICAgICAgICBpZiB0ZXh0LmNvbXBhcmUo Imluc2VydCIsICI+IiwgIjEuMCIpOg0KICAgICAgICAgICAgICAgICMgZWFzeTogZGVsZXRlIHBy ZWNlZGluZyBuZXdsaW5lDQogICAgICAgICAgICAgICAgdGV4dC5kZWxldGUoImluc2VydC0xYyIp DQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHRleHQuYmVsbCgpICAgICAjIGF0 IHN0YXJ0IG9mIGJ1ZmZlcg0KICAgICAgICAgICAgcmV0dXJuICJicmVhayINCiAgICAgICAgaWYg IGNoYXJzWy0xXSBub3QgaW4gIiBcdCI6DQogICAgICAgICAgICAjIGVhc3k6IGRlbGV0ZSBwcmVj ZWRpbmcgcmVhbCBjaGFyDQogICAgICAgICAgICB0ZXh0LmRlbGV0ZSgiaW5zZXJ0LTFjIikNCiAg ICAgICAgICAgIHJldHVybiAiYnJlYWsiDQogICAgICAgICMgSWNrLiAgSXQgbWF5IHJlcXVpcmUg Kmluc2VydGluZyogc3BhY2VzIGlmIHdlIGJhY2sgdXAgb3ZlciBhDQogICAgICAgICMgdGFiIGNo YXJhY3RlciEgIFRoaXMgaXMgd3JpdHRlbiB0byBiZSBjbGVhciwgbm90IGZhc3QuDQogICAgICAg IHRhYndpZHRoID0gc2VsZi50YWJ3aWR0aA0KICAgICAgICBoYXZlID0gbGVuKGNoYXJzLmV4cGFu ZHRhYnModGFid2lkdGgpKQ0KICAgICAgICBhc3NlcnQgaGF2ZSA+IDANCiAgICAgICAgd2FudCA9 ICgoaGF2ZSAtIDEpIC8vIHNlbGYuaW5kZW50d2lkdGgpICogc2VsZi5pbmRlbnR3aWR0aA0KICAg ICAgICAjIERlYnVnIHByb21wdCBpcyBtdWx0aWxpbmVkLi4uLg0KICAgICAgICBuY2hhcnNkZWxl dGVkID0gMA0KICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgaWYgY2hhcnMgPT0gc2VsZi5w cm9tcHRfbGFzdF9saW5lOiAgIyAnJyB1bmxlc3MgUHlTaGVsbA0KICAgICAgICAgICAgICAgIGJy ZWFrDQogICAgICAgICAgICBjaGFycyA9IGNoYXJzWzotMV0NCiAgICAgICAgICAgIG5jaGFyc2Rl bGV0ZWQgPSBuY2hhcnNkZWxldGVkICsgMQ0KICAgICAgICAgICAgaGF2ZSA9IGxlbihjaGFycy5l eHBhbmR0YWJzKHRhYndpZHRoKSkNCiAgICAgICAgICAgIGlmIGhhdmUgPD0gd2FudCBvciBjaGFy c1stMV0gbm90IGluICIgXHQiOg0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgIHRleHQu dW5kb19ibG9ja19zdGFydCgpDQogICAgICAgIHRleHQuZGVsZXRlKCJpbnNlcnQtJWRjIiAlIG5j aGFyc2RlbGV0ZWQsICJpbnNlcnQiKQ0KICAgICAgICBpZiBoYXZlIDwgd2FudDoNCiAgICAgICAg ICAgIHRleHQuaW5zZXJ0KCJpbnNlcnQiLCAnICcgKiAod2FudCAtIGhhdmUpKQ0KICAgICAgICB0 ZXh0LnVuZG9fYmxvY2tfc3RvcCgpDQogICAgICAgIHJldHVybiAiYnJlYWsiDQoNCiAgICBkZWYg c21hcnRfaW5kZW50X2V2ZW50KHNlbGYsIGV2ZW50KToNCiAgICAgICAgIyBpZiBpbnRyYWxpbmUg c2VsZWN0aW9uOg0KICAgICAgICAjICAgICBkZWxldGUgaXQNCiAgICAgICAgIyBlbGlmIG11bHRp bGluZSBzZWxlY3Rpb246DQogICAgICAgICMgICAgIGRvIGluZGVudC1yZWdpb24NCiAgICAgICAg IyBlbHNlOg0KICAgICAgICAjICAgICBpbmRlbnQgb25lIGxldmVsDQogICAgICAgIHRleHQgPSBz ZWxmLnRleHQNCiAgICAgICAgZmlyc3QsIGxhc3QgPSBzZWxmLmdldF9zZWxlY3Rpb25faW5kaWNl cygpDQogICAgICAgIHRleHQudW5kb19ibG9ja19zdGFydCgpDQogICAgICAgIHRyeToNCiAgICAg ICAgICAgIGlmIGZpcnN0IGFuZCBsYXN0Og0KICAgICAgICAgICAgICAgIGlmIGluZGV4MmxpbmUo Zmlyc3QpICE9IGluZGV4MmxpbmUobGFzdCk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBz ZWxmLmluZGVudF9yZWdpb25fZXZlbnQoZXZlbnQpDQogICAgICAgICAgICAgICAgdGV4dC5kZWxl dGUoZmlyc3QsIGxhc3QpDQogICAgICAgICAgICAgICAgdGV4dC5tYXJrX3NldCgiaW5zZXJ0Iiwg Zmlyc3QpDQogICAgICAgICAgICBwcmVmaXggPSB0ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIs ICJpbnNlcnQiKQ0KICAgICAgICAgICAgcmF3LCBlZmZlY3RpdmUgPSBjbGFzc2lmeXdzKHByZWZp eCwgc2VsZi50YWJ3aWR0aCkNCiAgICAgICAgICAgIGlmIHJhdyA9PSBsZW4ocHJlZml4KToNCiAg ICAgICAgICAgICAgICAjIG9ubHkgd2hpdGVzcGFjZSB0byB0aGUgbGVmdA0KICAgICAgICAgICAg ICAgIHNlbGYucmVpbmRlbnRfdG8oZWZmZWN0aXZlICsgc2VsZi5pbmRlbnR3aWR0aCkNCiAgICAg ICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyB0YWIgdG8gdGhlIG5leHQgJ3N0b3AnIHdp dGhpbiBvciB0byByaWdodCBvZiBsaW5lJ3MgdGV4dDoNCiAgICAgICAgICAgICAgICBpZiBzZWxm LnVzZXRhYnM6DQogICAgICAgICAgICAgICAgICAgIHBhZCA9ICdcdCcNCiAgICAgICAgICAgICAg ICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmUgPSBsZW4ocHJlZml4LmV4cGFu ZHRhYnMoc2VsZi50YWJ3aWR0aCkpDQogICAgICAgICAgICAgICAgICAgIG4gPSBzZWxmLmluZGVu dHdpZHRoDQogICAgICAgICAgICAgICAgICAgIHBhZCA9ICcgJyAqIChuIC0gZWZmZWN0aXZlICUg bikNCiAgICAgICAgICAgICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwgcGFkKQ0KICAgICAgICAg ICAgdGV4dC5zZWUoImluc2VydCIpDQogICAgICAgICAgICByZXR1cm4gImJyZWFrIg0KICAgICAg ICBmaW5hbGx5Og0KICAgICAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0b3AoKQ0KDQogICAgZGVm IG5ld2xpbmVfYW5kX2luZGVudF9ldmVudChzZWxmLCBldmVudCk6DQogICAgICAgIHRleHQgPSBz ZWxmLnRleHQNCiAgICAgICAgZmlyc3QsIGxhc3QgPSBzZWxmLmdldF9zZWxlY3Rpb25faW5kaWNl cygpDQogICAgICAgIHRleHQudW5kb19ibG9ja19zdGFydCgpDQogICAgICAgIHRyeToNCiAgICAg ICAgICAgIGlmIGZpcnN0IGFuZCBsYXN0Og0KICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKGZp cnN0LCBsYXN0KQ0KICAgICAgICAgICAgICAgIHRleHQubWFya19zZXQoImluc2VydCIsIGZpcnN0 KQ0KICAgICAgICAgICAgbGluZSA9IHRleHQuZ2V0KCJpbnNlcnQgbGluZXN0YXJ0IiwgImluc2Vy dCIpDQogICAgICAgICAgICBpLCBuID0gMCwgbGVuKGxpbmUpDQogICAgICAgICAgICB3aGlsZSBp IDwgbiBhbmQgbGluZVtpXSBpbiAiIFx0IjoNCiAgICAgICAgICAgICAgICBpID0gaSsxDQogICAg ICAgICAgICBpZiBpID09IG46DQogICAgICAgICAgICAgICAgIyB0aGUgY3Vyc29yIGlzIGluIG9y IGF0IGxlYWRpbmcgaW5kZW50YXRpb24gaW4gYSBjb250aW51YXRpb24NCiAgICAgICAgICAgICAg ICAjIGxpbmU7IGp1c3QgaW5qZWN0IGFuIGVtcHR5IGxpbmUgYXQgdGhlIHN0YXJ0DQogICAgICAg ICAgICAgICAgdGV4dC5pbnNlcnQoImluc2VydCBsaW5lc3RhcnQiLCAnXG4nKQ0KICAgICAgICAg ICAgICAgIHJldHVybiAiYnJlYWsiDQogICAgICAgICAgICBpbmRlbnQgPSBsaW5lWzppXQ0KICAg ICAgICAgICAgIyBzdHJpcCB3aGl0ZXNwYWNlIGJlZm9yZSBpbnNlcnQgcG9pbnQgdW5sZXNzIGl0 J3MgaW4gdGhlIHByb21wdA0KICAgICAgICAgICAgaSA9IDANCiAgICAgICAgICAgIHdoaWxlIGxp bmUgYW5kIGxpbmVbLTFdIGluICIgXHQiIGFuZCBsaW5lICE9IHNlbGYucHJvbXB0X2xhc3RfbGlu ZToNCiAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdDQogICAgICAgICAgICAgICAgaSA9 IGkrMQ0KICAgICAgICAgICAgaWYgaToNCiAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZSgiaW5z ZXJ0IC0gJWQgY2hhcnMiICUgaSwgImluc2VydCIpDQogICAgICAgICAgICAjIHN0cmlwIHdoaXRl c3BhY2UgYWZ0ZXIgaW5zZXJ0IHBvaW50DQogICAgICAgICAgICB3aGlsZSB0ZXh0LmdldCgiaW5z ZXJ0IikgaW4gIiBcdCI6DQogICAgICAgICAgICAgICAgdGV4dC5kZWxldGUoImluc2VydCIpDQog ICAgICAgICAgICAjIHN0YXJ0IG5ldyBsaW5lDQogICAgICAgICAgICB0ZXh0Lmluc2VydCgiaW5z ZXJ0IiwgJ1xuJykNCg0KICAgICAgICAgICAgIyBhZGp1c3QgaW5kZW50YXRpb24gZm9yIGNvbnRp bnVhdGlvbnMgYW5kIGJsb2NrDQogICAgICAgICAgICAjIG9wZW4vY2xvc2UgZmlyc3QgbmVlZCB0 byBmaW5kIHRoZSBsYXN0IHN0bXQNCiAgICAgICAgICAgIGxubyA9IGluZGV4MmxpbmUodGV4dC5p bmRleCgnaW5zZXJ0JykpDQogICAgICAgICAgICB5ID0gcHlwYXJzZS5QYXJzZXIoc2VsZi5pbmRl bnR3aWR0aCwgc2VsZi50YWJ3aWR0aCkNCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvbnRleHRf dXNlX3BzMToNCiAgICAgICAgICAgICAgICBmb3IgY29udGV4dCBpbiBzZWxmLm51bV9jb250ZXh0 X2xpbmVzOg0KICAgICAgICAgICAgICAgICAgICBzdGFydGF0ID0gbWF4KGxubyAtIGNvbnRleHQs IDEpDQogICAgICAgICAgICAgICAgICAgIHN0YXJ0YXRpbmRleCA9IHJlcHIoc3RhcnRhdCkgKyAi LjAiDQogICAgICAgICAgICAgICAgICAgIHJhd3RleHQgPSB0ZXh0LmdldChzdGFydGF0aW5kZXgs ICJpbnNlcnQiKQ0KICAgICAgICAgICAgICAgICAgICB5LnNldF9jb2RlKHJhd3RleHQpDQogICAg ICAgICAgICAgICAgICAgIGJvZCA9IHkuZmluZF9nb29kX3BhcnNlX3N0YXJ0KA0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0X3VzZV9wczEsDQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzZWxmLl9idWlsZF9jaGFyX2luX3N0cmluZ19mdW5jKHN0YXJ0YXRp bmRleCkpDQogICAgICAgICAgICAgICAgICAgIGlmIGJvZCBpcyBub3QgTm9uZSBvciBzdGFydGF0 ID09IDE6DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgIHku c2V0X2xvKGJvZCBvciAwKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByID0g dGV4dC50YWdfcHJldnJhbmdlKCJjb25zb2xlIiwgImluc2VydCIpDQogICAgICAgICAgICAgICAg aWYgcjoNCiAgICAgICAgICAgICAgICAgICAgc3RhcnRhdGluZGV4ID0gclsxXQ0KICAgICAgICAg ICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHN0YXJ0YXRpbmRleCA9ICIxLjAiDQog ICAgICAgICAgICAgICAgcmF3dGV4dCA9IHRleHQuZ2V0KHN0YXJ0YXRpbmRleCwgImluc2VydCIp DQogICAgICAgICAgICAgICAgeS5zZXRfY29kZShyYXd0ZXh0KQ0KICAgICAgICAgICAgICAgIHku c2V0X2xvKDApDQoNCiAgICAgICAgICAgIGMgPSB5LmdldF9jb250aW51YXRpb25fdHlwZSgpDQog ICAgICAgICAgICBpZiBjICE9IHB5cGFyc2UuQ19OT05FOg0KICAgICAgICAgICAgICAgICMgVGhl IGN1cnJlbnQgc3RtdCBoYXNuJ3QgZW5kZWQgeWV0Lg0KICAgICAgICAgICAgICAgIGlmIGMgPT0g cHlwYXJzZS5DX1NUUklOR19GSVJTVF9MSU5FOg0KICAgICAgICAgICAgICAgICAgICAjIGFmdGVy IHRoZSBmaXJzdCBsaW5lIG9mIGEgc3RyaW5nOyBkbyBub3QgaW5kZW50IGF0IGFsbA0KICAgICAg ICAgICAgICAgICAgICBwYXNzDQogICAgICAgICAgICAgICAgZWxpZiBjID09IHB5cGFyc2UuQ19T VFJJTkdfTkVYVF9MSU5FUzoNCiAgICAgICAgICAgICAgICAgICAgIyBpbnNpZGUgYSBzdHJpbmcg d2hpY2ggc3RhcnRlZCBiZWZvcmUgdGhpcyBsaW5lOw0KICAgICAgICAgICAgICAgICAgICAjIGp1 c3QgbWltaWMgdGhlIGN1cnJlbnQgaW5kZW50DQogICAgICAgICAgICAgICAgICAgIHRleHQuaW5z ZXJ0KCJpbnNlcnQiLCBpbmRlbnQpDQogICAgICAgICAgICAgICAgZWxpZiBjID09IHB5cGFyc2Uu Q19CUkFDS0VUOg0KICAgICAgICAgICAgICAgICAgICAjIGxpbmUgdXAgd2l0aCB0aGUgZmlyc3Qg KGlmIGFueSkgZWxlbWVudCBvZiB0aGUNCiAgICAgICAgICAgICAgICAgICAgIyBsYXN0IG9wZW4g YnJhY2tldCBzdHJ1Y3R1cmU7IGVsc2UgaW5kZW50IG9uZQ0KICAgICAgICAgICAgICAgICAgICAj IGxldmVsIGJleW9uZCB0aGUgaW5kZW50IG9mIHRoZSBsaW5lIHdpdGggdGhlDQogICAgICAgICAg ICAgICAgICAgICMgbGFzdCBvcGVuIGJyYWNrZXQNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5y ZWluZGVudF90byh5LmNvbXB1dGVfYnJhY2tldF9pbmRlbnQoKSkNCiAgICAgICAgICAgICAgICBl bGlmIGMgPT0gcHlwYXJzZS5DX0JBQ0tTTEFTSDoNCiAgICAgICAgICAgICAgICAgICAgIyBpZiBt b3JlIHRoYW4gb25lIGxpbmUgaW4gdGhpcyBzdG10IGFscmVhZHksIGp1c3QNCiAgICAgICAgICAg ICAgICAgICAgIyBtaW1pYyB0aGUgY3VycmVudCBpbmRlbnQ7IGVsc2UgaWYgaW5pdGlhbCBsaW5l DQogICAgICAgICAgICAgICAgICAgICMgaGFzIGEgc3RhcnQgb24gYW4gYXNzaWdubWVudCBzdG10 LCBpbmRlbnQgdG8NCiAgICAgICAgICAgICAgICAgICAgIyBiZXlvbmQgbGVmdG1vc3QgPTsgZWxz ZSB0byBiZXlvbmQgZmlyc3QgY2h1bmsgb2YNCiAgICAgICAgICAgICAgICAgICAgIyBub24td2hp dGVzcGFjZSBvbiBpbml0aWFsIGxpbmUNCiAgICAgICAgICAgICAgICAgICAgaWYgeS5nZXRfbnVt X2xpbmVzX2luX3N0bXQoKSA+IDE6DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Lmluc2Vy dCgiaW5zZXJ0IiwgaW5kZW50KQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAg ICAgICAgICAgICAgICAgc2VsZi5yZWluZGVudF90byh5LmNvbXB1dGVfYmFja3NsYXNoX2luZGVu dCgpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGFzc2VydCAw LCAiYm9ndXMgY29udGludWF0aW9uIHR5cGUgJXIiICUgKGMsKQ0KICAgICAgICAgICAgICAgIHJl dHVybiAiYnJlYWsiDQoNCiAgICAgICAgICAgICMgVGhpcyBsaW5lIHN0YXJ0cyBhIGJyYW5kIG5l dyBzdG10OyBpbmRlbnQgcmVsYXRpdmUgdG8NCiAgICAgICAgICAgICMgaW5kZW50YXRpb24gb2Yg aW5pdGlhbCBsaW5lIG9mIGNsb3Nlc3QgcHJlY2VkaW5nDQogICAgICAgICAgICAjIGludGVyZXN0 aW5nIHN0bXQuDQogICAgICAgICAgICBpbmRlbnQgPSB5LmdldF9iYXNlX2luZGVudF9zdHJpbmco KQ0KICAgICAgICAgICAgdGV4dC5pbnNlcnQoImluc2VydCIsIGluZGVudCkNCiAgICAgICAgICAg IGlmIHkuaXNfYmxvY2tfb3BlbmVyKCk6DQogICAgICAgICAgICAgICAgc2VsZi5zbWFydF9pbmRl bnRfZXZlbnQoZXZlbnQpDQogICAgICAgICAgICBlbGlmIGluZGVudCBhbmQgeS5pc19ibG9ja19j bG9zZXIoKToNCiAgICAgICAgICAgICAgICBzZWxmLnNtYXJ0X2JhY2tzcGFjZV9ldmVudChldmVu dCkNCiAgICAgICAgICAgIHJldHVybiAiYnJlYWsiDQogICAgICAgIGZpbmFsbHk6DQogICAgICAg ICAgICB0ZXh0LnNlZSgiaW5zZXJ0IikNCiAgICAgICAgICAgIHRleHQudW5kb19ibG9ja19zdG9w KCkNCg0KICAgICMgT3VyIGVkaXR3aW4gcHJvdmlkZXMgYW4gaXNfY2hhcl9pbl9zdHJpbmcgZnVu Y3Rpb24gdGhhdCB3b3Jrcw0KICAgICMgd2l0aCBhIFRrIHRleHQgaW5kZXgsIGJ1dCBQeVBhcnNl IG9ubHkga25vd3MgYWJvdXQgb2Zmc2V0cyBpbnRvDQogICAgIyBhIHN0cmluZy4gVGhpcyBidWls ZHMgYSBmdW5jdGlvbiBmb3IgUHlQYXJzZSB0aGF0IGFjY2VwdHMgYW4NCiAgICAjIG9mZnNldC4N Cg0KICAgIGRlZiBfYnVpbGRfY2hhcl9pbl9zdHJpbmdfZnVuYyhzZWxmLCBzdGFydGluZGV4KToN CiAgICAgICAgZGVmIGlubmVyKG9mZnNldCwgX3N0YXJ0aW5kZXg9c3RhcnRpbmRleCwNCiAgICAg ICAgICAgICAgICAgIF9pY2lzPXNlbGYuaXNfY2hhcl9pbl9zdHJpbmcpOg0KICAgICAgICAgICAg cmV0dXJuIF9pY2lzKF9zdGFydGluZGV4ICsgIislZGMiICUgb2Zmc2V0KQ0KICAgICAgICByZXR1 cm4gaW5uZXINCg0KICAgIGRlZiBpbmRlbnRfcmVnaW9uX2V2ZW50KHNlbGYsIGV2ZW50KToNCiAg ICAgICAgaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzID0gc2VsZi5nZXRfcmVnaW9uKCkNCiAgICAg ICAgZm9yIHBvcyBpbiByYW5nZShsZW4obGluZXMpKToNCiAgICAgICAgICAgIGxpbmUgPSBsaW5l c1twb3NdDQogICAgICAgICAgICBpZiBsaW5lOg0KICAgICAgICAgICAgICAgIHJhdywgZWZmZWN0 aXZlID0gY2xhc3NpZnl3cyhsaW5lLCBzZWxmLnRhYndpZHRoKQ0KICAgICAgICAgICAgICAgIGVm ZmVjdGl2ZSA9IGVmZmVjdGl2ZSArIHNlbGYuaW5kZW50d2lkdGgNCiAgICAgICAgICAgICAgICBs aW5lc1twb3NdID0gc2VsZi5fbWFrZV9ibGFua3MoZWZmZWN0aXZlKSArIGxpbmVbcmF3Ol0NCiAg ICAgICAgc2VsZi5zZXRfcmVnaW9uKGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcykNCiAgICAgICAg cmV0dXJuICJicmVhayINCg0KICAgIGRlZiBkZWRlbnRfcmVnaW9uX2V2ZW50KHNlbGYsIGV2ZW50 KToNCiAgICAgICAgaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzID0gc2VsZi5nZXRfcmVnaW9uKCkN CiAgICAgICAgZm9yIHBvcyBpbiByYW5nZShsZW4obGluZXMpKToNCiAgICAgICAgICAgIGxpbmUg PSBsaW5lc1twb3NdDQogICAgICAgICAgICBpZiBsaW5lOg0KICAgICAgICAgICAgICAgIHJhdywg ZWZmZWN0aXZlID0gY2xhc3NpZnl3cyhsaW5lLCBzZWxmLnRhYndpZHRoKQ0KICAgICAgICAgICAg ICAgIGVmZmVjdGl2ZSA9IG1heChlZmZlY3RpdmUgLSBzZWxmLmluZGVudHdpZHRoLCAwKQ0KICAg ICAgICAgICAgICAgIGxpbmVzW3Bvc10gPSBzZWxmLl9tYWtlX2JsYW5rcyhlZmZlY3RpdmUpICsg bGluZVtyYXc6XQ0KICAgICAgICBzZWxmLnNldF9yZWdpb24oaGVhZCwgdGFpbCwgY2hhcnMsIGxp bmVzKQ0KICAgICAgICByZXR1cm4gImJyZWFrIg0KDQogICAgZGVmIGNvbW1lbnRfcmVnaW9uX2V2 ZW50KHNlbGYsIGV2ZW50KToNCiAgICAgICAgaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzID0gc2Vs Zi5nZXRfcmVnaW9uKCkNCiAgICAgICAgZm9yIHBvcyBpbiByYW5nZShsZW4obGluZXMpIC0gMSk6 DQogICAgICAgICAgICBsaW5lID0gbGluZXNbcG9zXQ0KICAgICAgICAgICAgbGluZXNbcG9zXSA9 ICcjIycgKyBsaW5lDQogICAgICAgIHNlbGYuc2V0X3JlZ2lvbihoZWFkLCB0YWlsLCBjaGFycywg bGluZXMpDQogICAgICAgIHJldHVybiAiYnJlYWsiDQoNCiAgICBkZWYgdW5jb21tZW50X3JlZ2lv bl9ldmVudChzZWxmLCBldmVudCk6DQogICAgICAgIGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcyA9 IHNlbGYuZ2V0X3JlZ2lvbigpDQogICAgICAgIGZvciBwb3MgaW4gcmFuZ2UobGVuKGxpbmVzKSk6 DQogICAgICAgICAgICBsaW5lID0gbGluZXNbcG9zXQ0KICAgICAgICAgICAgaWYgbm90IGxpbmU6 DQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlmIGxpbmVbOjJdID09ICcj Iyc6DQogICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMjpdDQogICAgICAgICAgICBlbGlmIGxp bmVbOjFdID09ICcjJzoNCiAgICAgICAgICAgICAgICBsaW5lID0gbGluZVsxOl0NCiAgICAgICAg ICAgIGxpbmVzW3Bvc10gPSBsaW5lDQogICAgICAgIHNlbGYuc2V0X3JlZ2lvbihoZWFkLCB0YWls LCBjaGFycywgbGluZXMpDQogICAgICAgIHJldHVybiAiYnJlYWsiDQoNCiAgICBkZWYgdGFiaWZ5 X3JlZ2lvbl9ldmVudChzZWxmLCBldmVudCk6DQogICAgICAgIGhlYWQsIHRhaWwsIGNoYXJzLCBs aW5lcyA9IHNlbGYuZ2V0X3JlZ2lvbigpDQogICAgICAgIHRhYndpZHRoID0gc2VsZi5fYXNrdGFi d2lkdGgoKQ0KICAgICAgICBpZiB0YWJ3aWR0aCBpcyBOb25lOiByZXR1cm4NCiAgICAgICAgZm9y IHBvcyBpbiByYW5nZShsZW4obGluZXMpKToNCiAgICAgICAgICAgIGxpbmUgPSBsaW5lc1twb3Nd DQogICAgICAgICAgICBpZiBsaW5lOg0KICAgICAgICAgICAgICAgIHJhdywgZWZmZWN0aXZlID0g Y2xhc3NpZnl3cyhsaW5lLCB0YWJ3aWR0aCkNCiAgICAgICAgICAgICAgICBudGFicywgbnNwYWNl cyA9IGRpdm1vZChlZmZlY3RpdmUsIHRhYndpZHRoKQ0KICAgICAgICAgICAgICAgIGxpbmVzW3Bv c10gPSAnXHQnICogbnRhYnMgKyAnICcgKiBuc3BhY2VzICsgbGluZVtyYXc6XQ0KICAgICAgICBz ZWxmLnNldF9yZWdpb24oaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzKQ0KICAgICAgICByZXR1cm4g ImJyZWFrIg0KDQogICAgZGVmIHVudGFiaWZ5X3JlZ2lvbl9ldmVudChzZWxmLCBldmVudCk6DQog ICAgICAgIGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcyA9IHNlbGYuZ2V0X3JlZ2lvbigpDQogICAg ICAgIHRhYndpZHRoID0gc2VsZi5fYXNrdGFid2lkdGgoKQ0KICAgICAgICBpZiB0YWJ3aWR0aCBp cyBOb25lOiByZXR1cm4NCiAgICAgICAgZm9yIHBvcyBpbiByYW5nZShsZW4obGluZXMpKToNCiAg ICAgICAgICAgIGxpbmVzW3Bvc10gPSBsaW5lc1twb3NdLmV4cGFuZHRhYnModGFid2lkdGgpDQog ICAgICAgIHNlbGYuc2V0X3JlZ2lvbihoZWFkLCB0YWlsLCBjaGFycywgbGluZXMpDQogICAgICAg IHJldHVybiAiYnJlYWsiDQoNCiAgICBkZWYgdG9nZ2xlX3RhYnNfZXZlbnQoc2VsZiwgZXZlbnQp Og0KICAgICAgICBpZiBzZWxmLmFza3llc25vKA0KICAgICAgICAgICAgICAiVG9nZ2xlIHRhYnMi LA0KICAgICAgICAgICAgICAiVHVybiB0YWJzICIgKyAoIm9uIiwgIm9mZiIpW3NlbGYudXNldGFi c10gKw0KICAgICAgICAgICAgICAiP1xuSW5kZW50IHdpZHRoICIgKw0KICAgICAgICAgICAgICAo IndpbGwgYmUiLCAicmVtYWlucyBhdCIpW3NlbGYudXNldGFic10gKyAiIDguIiArDQogICAgICAg ICAgICAgICJcbiBOb3RlOiBhIHRhYiBpcyBhbHdheXMgOCBjb2x1bW5zIiwNCiAgICAgICAgICAg ICAgcGFyZW50PXNlbGYudGV4dCk6DQogICAgICAgICAgICBzZWxmLnVzZXRhYnMgPSBub3Qgc2Vs Zi51c2V0YWJzDQogICAgICAgICAgICAjIFRyeSB0byBwcmV2ZW50IGluY29uc2lzdGVudCBpbmRl bnRhdGlvbi4NCiAgICAgICAgICAgICMgVXNlciBtdXN0IGNoYW5nZSBpbmRlbnQgd2lkdGggbWFu dWFsbHkgYWZ0ZXIgdXNpbmcgdGFicy4NCiAgICAgICAgICAgIHNlbGYuaW5kZW50d2lkdGggPSA4 DQogICAgICAgIHJldHVybiAiYnJlYWsiDQoNCiAgICAjIFhYWCB0aGlzIGlzbid0IGJvdW5kIHRv IGFueXRoaW5nIC0tIHNlZSB0YWJ3aWR0aCBjb21tZW50cw0KIyMgICAgIGRlZiBjaGFuZ2VfdGFi d2lkdGhfZXZlbnQoc2VsZiwgZXZlbnQpOg0KIyMgICAgICAgICBuZXcgPSBzZWxmLl9hc2t0YWJ3 aWR0aCgpDQojIyAgICAgICAgIGlmIG5ldyAhPSBzZWxmLnRhYndpZHRoOg0KIyMgICAgICAgICAg ICAgc2VsZi50YWJ3aWR0aCA9IG5ldw0KIyMgICAgICAgICAgICAgc2VsZi5zZXRfaW5kZW50YXRp b25fcGFyYW1zKDAsIGd1ZXNzPTApDQojIyAgICAgICAgIHJldHVybiAiYnJlYWsiDQoNCiAgICBk ZWYgY2hhbmdlX2luZGVudHdpZHRoX2V2ZW50KHNlbGYsIGV2ZW50KToNCiAgICAgICAgbmV3ID0g c2VsZi5hc2tpbnRlZ2VyKA0KICAgICAgICAgICAgICAgICAgIkluZGVudCB3aWR0aCIsDQogICAg ICAgICAgICAgICAgICAiTmV3IGluZGVudCB3aWR0aCAoMi0xNilcbihBbHdheXMgdXNlIDggd2hl biB1c2luZyB0YWJzKSIsDQogICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZi50ZXh0LA0KICAg ICAgICAgICAgICAgICAgaW5pdGlhbHZhbHVlPXNlbGYuaW5kZW50d2lkdGgsDQogICAgICAgICAg ICAgICAgICBtaW52YWx1ZT0yLA0KICAgICAgICAgICAgICAgICAgbWF4dmFsdWU9MTYpDQogICAg ICAgIGlmIG5ldyBhbmQgbmV3ICE9IHNlbGYuaW5kZW50d2lkdGggYW5kIG5vdCBzZWxmLnVzZXRh YnM6DQogICAgICAgICAgICBzZWxmLmluZGVudHdpZHRoID0gbmV3DQogICAgICAgIHJldHVybiAi YnJlYWsiDQoNCiAgICBkZWYgZ2V0X3JlZ2lvbihzZWxmKToNCiAgICAgICAgdGV4dCA9IHNlbGYu dGV4dA0KICAgICAgICBmaXJzdCwgbGFzdCA9IHNlbGYuZ2V0X3NlbGVjdGlvbl9pbmRpY2VzKCkN CiAgICAgICAgaWYgZmlyc3QgYW5kIGxhc3Q6DQogICAgICAgICAgICBoZWFkID0gdGV4dC5pbmRl eChmaXJzdCArICIgbGluZXN0YXJ0IikNCiAgICAgICAgICAgIHRhaWwgPSB0ZXh0LmluZGV4KGxh c3QgKyAiLTFjIGxpbmVlbmQgKzFjIikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGhlYWQg PSB0ZXh0LmluZGV4KCJpbnNlcnQgbGluZXN0YXJ0IikNCiAgICAgICAgICAgIHRhaWwgPSB0ZXh0 LmluZGV4KCJpbnNlcnQgbGluZWVuZCArMWMiKQ0KICAgICAgICBjaGFycyA9IHRleHQuZ2V0KGhl YWQsIHRhaWwpDQogICAgICAgIGxpbmVzID0gY2hhcnMuc3BsaXQoIlxuIikNCiAgICAgICAgcmV0 dXJuIGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcw0KDQogICAgZGVmIHNldF9yZWdpb24oc2VsZiwg aGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzKToNCiAgICAgICAgdGV4dCA9IHNlbGYudGV4dA0KICAg ICAgICBuZXdjaGFycyA9ICJcbiIuam9pbihsaW5lcykNCiAgICAgICAgaWYgbmV3Y2hhcnMgPT0g Y2hhcnM6DQogICAgICAgICAgICB0ZXh0LmJlbGwoKQ0KICAgICAgICAgICAgcmV0dXJuDQogICAg ICAgIHRleHQudGFnX3JlbW92ZSgic2VsIiwgIjEuMCIsICJlbmQiKQ0KICAgICAgICB0ZXh0Lm1h cmtfc2V0KCJpbnNlcnQiLCBoZWFkKQ0KICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RhcnQoKQ0K ICAgICAgICB0ZXh0LmRlbGV0ZShoZWFkLCB0YWlsKQ0KICAgICAgICB0ZXh0Lmluc2VydChoZWFk LCBuZXdjaGFycykNCiAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0b3AoKQ0KICAgICAgICB0ZXh0 LnRhZ19hZGQoInNlbCIsIGhlYWQsICJpbnNlcnQiKQ0KDQogICAgIyBNYWtlIHN0cmluZyB0aGF0 IGRpc3BsYXlzIGFzIG4gbGVhZGluZyBibGFua3MuDQoNCiAgICBkZWYgX21ha2VfYmxhbmtzKHNl bGYsIG4pOg0KICAgICAgICBpZiBzZWxmLnVzZXRhYnM6DQogICAgICAgICAgICBudGFicywgbnNw YWNlcyA9IGRpdm1vZChuLCBzZWxmLnRhYndpZHRoKQ0KICAgICAgICAgICAgcmV0dXJuICdcdCcg KiBudGFicyArICcgJyAqIG5zcGFjZXMNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVy biAnICcgKiBuDQoNCiAgICAjIERlbGV0ZSBmcm9tIGJlZ2lubmluZyBvZiBsaW5lIHRvIGluc2Vy dCBwb2ludCwgdGhlbiByZWluc2VydA0KICAgICMgY29sdW1uIGxvZ2ljYWwgKG1lYW5pbmcgdXNl IHRhYnMgaWYgYXBwcm9wcmlhdGUpIHNwYWNlcy4NCg0KICAgIGRlZiByZWluZGVudF90byhzZWxm LCBjb2x1bW4pOg0KICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0DQogICAgICAgIHRleHQudW5kb19i bG9ja19zdGFydCgpDQogICAgICAgIGlmIHRleHQuY29tcGFyZSgiaW5zZXJ0IGxpbmVzdGFydCIs ICIhPSIsICJpbnNlcnQiKToNCiAgICAgICAgICAgIHRleHQuZGVsZXRlKCJpbnNlcnQgbGluZXN0 YXJ0IiwgImluc2VydCIpDQogICAgICAgIGlmIGNvbHVtbjoNCiAgICAgICAgICAgIHRleHQuaW5z ZXJ0KCJpbnNlcnQiLCBzZWxmLl9tYWtlX2JsYW5rcyhjb2x1bW4pKQ0KICAgICAgICB0ZXh0LnVu ZG9fYmxvY2tfc3RvcCgpDQoNCiAgICBkZWYgX2Fza3RhYndpZHRoKHNlbGYpOg0KICAgICAgICBy ZXR1cm4gc2VsZi5hc2tpbnRlZ2VyKA0KICAgICAgICAgICAgIlRhYiB3aWR0aCIsDQogICAgICAg ICAgICAiQ29sdW1ucyBwZXIgdGFiPyAoMi0xNikiLA0KICAgICAgICAgICAgcGFyZW50PXNlbGYu dGV4dCwNCiAgICAgICAgICAgIGluaXRpYWx2YWx1ZT1zZWxmLmluZGVudHdpZHRoLA0KICAgICAg ICAgICAgbWludmFsdWU9MiwNCiAgICAgICAgICAgIG1heHZhbHVlPTE2KQ0KDQogICAgIyBHdWVz cyBpbmRlbnR3aWR0aCBmcm9tIHRleHQgY29udGVudC4NCiAgICAjIFJldHVybiBndWVzc2VkIGlu ZGVudHdpZHRoLiAgVGhpcyBzaG91bGQgbm90IGJlIGJlbGlldmVkIHVubGVzcw0KICAgICMgaXQn cyBpbiBhIHJlYXNvbmFibGUgcmFuZ2UgKGUuZy4sIGl0IHdpbGwgYmUgMCBpZiBubyBpbmRlbnRl ZA0KICAgICMgYmxvY2tzIGFyZSBmb3VuZCkuDQoNCiAgICBkZWYgZ3Vlc3NfaW5kZW50KHNlbGYp Og0KICAgICAgICBvcGVuZXIsIGluZGVudGVkID0gSW5kZW50U2VhcmNoZXIoc2VsZi50ZXh0LCBz ZWxmLnRhYndpZHRoKS5ydW4oKQ0KICAgICAgICBpZiBvcGVuZXIgYW5kIGluZGVudGVkOg0KICAg ICAgICAgICAgcmF3LCBpbmRlbnRzbWFsbCA9IGNsYXNzaWZ5d3Mob3BlbmVyLCBzZWxmLnRhYndp ZHRoKQ0KICAgICAgICAgICAgcmF3LCBpbmRlbnRsYXJnZSA9IGNsYXNzaWZ5d3MoaW5kZW50ZWQs IHNlbGYudGFid2lkdGgpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpbmRlbnRzbWFsbCA9 IGluZGVudGxhcmdlID0gMA0KICAgICAgICByZXR1cm4gaW5kZW50bGFyZ2UgLSBpbmRlbnRzbWFs bA0KDQojICJsaW5lLmNvbCIgLT4gbGluZSwgYXMgYW4gaW50DQpkZWYgaW5kZXgybGluZShpbmRl eCk6DQogICAgcmV0dXJuIGludChmbG9hdChpbmRleCkpDQoNCiMgTG9vayBhdCB0aGUgbGVhZGlu ZyB3aGl0ZXNwYWNlIGluIHMuDQojIFJldHVybiBwYWlyICgjIG9mIGxlYWRpbmcgd3MgY2hhcmFj dGVycywNCiMgICAgICAgICAgICAgIGVmZmVjdGl2ZSAjIG9mIGxlYWRpbmcgYmxhbmtzIGFmdGVy IGV4cGFuZGluZw0KIyAgICAgICAgICAgICAgdGFicyB0byB3aWR0aCB0YWJ3aWR0aCkNCg0KZGVm IGNsYXNzaWZ5d3MocywgdGFid2lkdGgpOg0KICAgIHJhdyA9IGVmZmVjdGl2ZSA9IDANCiAgICBm b3IgY2ggaW4gczoNCiAgICAgICAgaWYgY2ggPT0gJyAnOg0KICAgICAgICAgICAgcmF3ID0gcmF3 ICsgMQ0KICAgICAgICAgICAgZWZmZWN0aXZlID0gZWZmZWN0aXZlICsgMQ0KICAgICAgICBlbGlm IGNoID09ICdcdCc6DQogICAgICAgICAgICByYXcgPSByYXcgKyAxDQogICAgICAgICAgICBlZmZl Y3RpdmUgPSAoZWZmZWN0aXZlIC8vIHRhYndpZHRoICsgMSkgKiB0YWJ3aWR0aA0KICAgICAgICBl bHNlOg0KICAgICAgICAgICAgYnJlYWsNCiAgICByZXR1cm4gcmF3LCBlZmZlY3RpdmUNCg0KDQpj bGFzcyBJbmRlbnRTZWFyY2hlcihvYmplY3QpOg0KDQogICAgIyAucnVuKCkgY2hld3Mgb3ZlciB0 aGUgVGV4dCB3aWRnZXQsIGxvb2tpbmcgZm9yIGEgYmxvY2sgb3BlbmVyDQogICAgIyBhbmQgdGhl IHN0bXQgZm9sbG93aW5nIGl0LiAgUmV0dXJucyBhIHBhaXIsDQogICAgIyAgICAgKGxpbmUgY29u dGFpbmluZyBibG9jayBvcGVuZXIsIGxpbmUgY29udGFpbmluZyBzdG10KQ0KICAgICMgRWl0aGVy IG9yIGJvdGggbWF5IGJlIE5vbmUuDQoNCiAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCwgdGFi d2lkdGgpOg0KICAgICAgICBzZWxmLnRleHQgPSB0ZXh0DQogICAgICAgIHNlbGYudGFid2lkdGgg PSB0YWJ3aWR0aA0KICAgICAgICBzZWxmLmkgPSBzZWxmLmZpbmlzaGVkID0gMA0KICAgICAgICBz ZWxmLmJsa29wZW5saW5lID0gc2VsZi5pbmRlbnRlZGxpbmUgPSBOb25lDQoNCiAgICBkZWYgcmVh ZGxpbmUoc2VsZik6DQogICAgICAgIGlmIHNlbGYuZmluaXNoZWQ6DQogICAgICAgICAgICByZXR1 cm4gIiINCiAgICAgICAgaSA9IHNlbGYuaSA9IHNlbGYuaSArIDENCiAgICAgICAgbWFyayA9IHJl cHIoaSkgKyAiLjAiDQogICAgICAgIGlmIHNlbGYudGV4dC5jb21wYXJlKG1hcmssICI+PSIsICJl bmQiKToNCiAgICAgICAgICAgIHJldHVybiAiIg0KICAgICAgICByZXR1cm4gc2VsZi50ZXh0Lmdl dChtYXJrLCBtYXJrICsgIiBsaW5lZW5kKzFjIikNCg0KICAgIGRlZiB0b2tlbmVhdGVyKHNlbGYs IHR5cGUsIHRva2VuLCBzdGFydCwgZW5kLCBsaW5lLA0KICAgICAgICAgICAgICAgICAgIElOREVO VD10b2tlbml6ZS5JTkRFTlQsDQogICAgICAgICAgICAgICAgICAgTkFNRT10b2tlbml6ZS5OQU1F LA0KICAgICAgICAgICAgICAgICAgIE9QRU5FUlM9KCdjbGFzcycsICdkZWYnLCAnZm9yJywgJ2lm JywgJ3RyeScsICd3aGlsZScpKToNCiAgICAgICAgaWYgc2VsZi5maW5pc2hlZDoNCiAgICAgICAg ICAgIHBhc3MNCiAgICAgICAgZWxpZiB0eXBlID09IE5BTUUgYW5kIHRva2VuIGluIE9QRU5FUlM6 DQogICAgICAgICAgICBzZWxmLmJsa29wZW5saW5lID0gbGluZQ0KICAgICAgICBlbGlmIHR5cGUg PT0gSU5ERU5UIGFuZCBzZWxmLmJsa29wZW5saW5lOg0KICAgICAgICAgICAgc2VsZi5pbmRlbnRl ZGxpbmUgPSBsaW5lDQogICAgICAgICAgICBzZWxmLmZpbmlzaGVkID0gMQ0KDQogICAgZGVmIHJ1 bihzZWxmKToNCiAgICAgICAgc2F2ZV90YWJzaXplID0gdG9rZW5pemUudGFic2l6ZQ0KICAgICAg ICB0b2tlbml6ZS50YWJzaXplID0gc2VsZi50YWJ3aWR0aA0KICAgICAgICB0cnk6DQogICAgICAg ICAgICB0cnk6DQogICAgICAgICAgICAgICAgdG9rZW5zID0gdG9rZW5pemUuZ2VuZXJhdGVfdG9r ZW5zKHNlbGYucmVhZGxpbmUpDQogICAgICAgICAgICAgICAgZm9yIHRva2VuIGluIHRva2VuczoN CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbmVhdGVyKCp0b2tlbikNCiAgICAgICAgICAg IGV4Y2VwdCAodG9rZW5pemUuVG9rZW5FcnJvciwgU3ludGF4RXJyb3IpOg0KICAgICAgICAgICAg ICAgICMgc2luY2Ugd2UgY3V0IG9mZiB0aGUgdG9rZW5pemVyIGVhcmx5LCB3ZSBjYW4gdHJpZ2dl cg0KICAgICAgICAgICAgICAgICMgc3B1cmlvdXMgZXJyb3JzDQogICAgICAgICAgICAgICAgcGFz cw0KICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgdG9rZW5pemUudGFic2l6ZSA9IHNhdmVf dGFic2l6ZQ0KICAgICAgICByZXR1cm4gc2VsZi5ibGtvcGVubGluZSwgc2VsZi5pbmRlbnRlZGxp bmUNCg0KIyMjIGVuZCBhdXRvaW5kZW50IGNvZGUgIyMjDQoNCmRlZiBwcmVwc3RyKHMpOg0KICAg ICMgSGVscGVyIHRvIGV4dHJhY3QgdGhlIHVuZGVyc2NvcmUgZnJvbSBhIHN0cmluZywgZS5nLg0K ICAgICMgcHJlcHN0cigiQ29fcHkiKSByZXR1cm5zICgyLCAiQ29weSIpLg0KICAgIGkgPSBzLmZp bmQoJ18nKQ0KICAgIGlmIGkgPj0gMDoNCiAgICAgICAgcyA9IHNbOmldICsgc1tpKzE6XQ0KICAg IHJldHVybiBpLCBzDQoNCg0Ka2V5bmFtZXMgPSB7DQogJ2JyYWNrZXRsZWZ0JzogJ1snLA0KICdi cmFja2V0cmlnaHQnOiAnXScsDQogJ3NsYXNoJzogJy8nLA0KfQ0KDQpkZWYgZ2V0X2FjY2VsZXJh dG9yKGtleWRlZnMsIGV2ZW50bmFtZSk6DQogICAga2V5bGlzdCA9IGtleWRlZnMuZ2V0KGV2ZW50 bmFtZSkNCiAgICAjIGlzc3VlMTA5NDA6IHRlbXBvcmFyeSB3b3JrYXJvdW5kIHRvIHByZXZlbnQg aGFuZyB3aXRoIE9TIFggQ29jb2EgVGsgOC41DQogICAgIyBpZiBub3Qga2V5bGlzdDoNCiAgICBp ZiAobm90IGtleWxpc3QpIG9yIChtYWNvc3guaXNDb2NvYVRrKCkgYW5kIGV2ZW50bmFtZSBpbiB7 DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjw8b3Blbi1tb2R1bGU+PiIsDQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgIjw8Z290by1saW5lPj4iLA0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICI8PGNoYW5nZS1pbmRlbnR3aWR0aD4+In0pOg0KICAgICAgICByZXR1cm4gIiIN CiAgICBzID0ga2V5bGlzdFswXQ0KICAgIHMgPSByZS5zdWIociItW2Etel1cYiIsIGxhbWJkYSBt OiBtLmdyb3VwKCkudXBwZXIoKSwgcykNCiAgICBzID0gcmUuc3ViKHIiXGJcdytcYiIsIGxhbWJk YSBtOiBrZXluYW1lcy5nZXQobS5ncm91cCgpLCBtLmdyb3VwKCkpLCBzKQ0KICAgIHMgPSByZS5z dWIoIktleS0iLCAiIiwgcykNCiAgICBzID0gcmUuc3ViKCJDYW5jZWwiLCJDdHJsLUJyZWFrIixz KSAgICMgZHNjaGVyZXJAY211LmVkdQ0KICAgIHMgPSByZS5zdWIoIkNvbnRyb2wtIiwgIkN0cmwt IiwgcykNCiAgICBzID0gcmUuc3ViKCItIiwgIisiLCBzKQ0KICAgIHMgPSByZS5zdWIoIj48Iiwg IiAiLCBzKQ0KICAgIHMgPSByZS5zdWIoIjwiLCAiIiwgcykNCiAgICBzID0gcmUuc3ViKCI+Iiwg IiIsIHMpDQogICAgcmV0dXJuIHMNCg0KDQpkZWYgZml4d29yZGJyZWFrcyhyb290KToNCiAgICAj IE9uIFdpbmRvd3MsIHRjbC90ayBicmVha3MgJ3dvcmRzJyBvbmx5IG9uIHNwYWNlcywgYXMgaW4g Q29tbWFuZCBQcm9tcHQuDQogICAgIyBXZSB3YW50IE1vdGlmIHN0eWxlIGV2ZXJ5d2hlcmUuIFNl ZSAjMjE0NzQsIG1zZzIxODk5MiBhbmQgZm9sbG93dXAuDQogICAgdGsgPSByb290LnRrDQogICAg dGsuY2FsbCgndGNsX3dvcmRCcmVha0FmdGVyJywgJ2EgYicsIDApICMgbWFrZSBzdXJlIHdvcmQu dGNsIGlzIGxvYWRlZA0KICAgIHRrLmNhbGwoJ3NldCcsICd0Y2xfd29yZGNoYXJzJywgcidcdycp DQogICAgdGsuY2FsbCgnc2V0JywgJ3RjbF9ub253b3JkY2hhcnMnLCByJ1xXJykNCg0KDQpkZWYg X2VkaXRvcl93aW5kb3cocGFyZW50KTogICMgaHRlc3QgIw0KICAgICMgZXJyb3IgaWYgY2xvc2Ug bWFzdGVyIHdpbmRvdyBmaXJzdCAtIHRpbWVyIGV2ZW50LCBhZnRlciBzY3JpcHQNCiAgICByb290 ID0gcGFyZW50DQogICAgZml4d29yZGJyZWFrcyhyb290KQ0KICAgIGlmIHN5cy5hcmd2WzE6XToN CiAgICAgICAgZmlsZW5hbWUgPSBzeXMuYXJndlsxXQ0KICAgIGVsc2U6DQogICAgICAgIGZpbGVu YW1lID0gTm9uZQ0KICAgIG1hY29zeC5zZXR1cEFwcChyb290LCBOb25lKQ0KICAgIGVkaXQgPSBF ZGl0b3JXaW5kb3cocm9vdD1yb290LCBmaWxlbmFtZT1maWxlbmFtZSkNCiAgICBlZGl0LnRleHQu YmluZCgiPDxjbG9zZS1hbGwtd2luZG93cz4+IiwgZWRpdC5jbG9zZV9ldmVudCkNCiAgICAjIERv ZXMgbm90IHN0b3AgZXJyb3IsIG5laXRoZXIgZG9lcyBmb2xsb3dpbmcNCiAgICAjIGVkaXQudGV4 dC5iaW5kKCI8PGNsb3NlLXdpbmRvdz4+IiwgZWRpdC5jbG9zZV9ldmVudCkNCg0KaWYgX19uYW1l X18gPT0gJ19fbWFpbl9fJzoNCiAgICBpbXBvcnQgdW5pdHRlc3QNCiAgICB1bml0dGVzdC5tYWlu KCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2VkaXRvcicsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNl KQ0KDQogICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuDQogICAgcnVu KF9lZGl0b3Jfd2luZG93KQ0K --mailmaster-5fa53b4f_0_29 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ IDLE-dev mailing list [email protected] https://mail.python.org/mailman/listinfo/idle-dev --mailmaster-5fa53b4f_0_29--