Survey
1.0.13
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Fixed bug# 1887 - Sending of survey mail to customer fails.
fixed not working links in dtl file
fixed timezone bug and some code cleanup
update package for OTRS 2.1 framework and small code cleanup
change charset to iso-8895-1 and code cleanup
fix bug in RequestSend() if $MasterID is null
fix problems with blank fields
rename colum "number" to "surveynumber" in survey-table
fix "not null" error on oracle dbs
New package
A customer survey tool.
Ein Kundenumfragen Werkzeug.
2.1.x
2007-05-16 12:24:50
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFN1cnZleS54bWwsdiAxLjggMjAwNi8xMS8yMSAyMzoxMzo1MyBtaCBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50U3VydmV5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+QWxsIHBhcmFtZXRlcnMgZm9yIHRoZSBTdXJ2ZXkgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFsbGUgUGFyYW1ldGVyIGRlcyBCZWZyYWd1bmdzLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cnZleTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkEgU3VydmV5IE1vZHVsZTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5TdXJ2ZXk8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8VGl0bGU+U3VydmV5PC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkEgU3VydmV5IE1vZHVsZTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U3VydmV5PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPk1lbnU8L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkl0ZW1BcmVhPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+c3VydmV5LnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50U3VydmV5PC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+U3VydmV5PC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT51PC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+ODAwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+T3ZlcnZpZXc8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPk92ZXJ2aWV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5vdmVydmlldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudFN1cnZleTwvTGluaz4KICAgICAgICAgICAgICAgICAgICA8VHlwZT48L1R5cGU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPjwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPE5hdkJhcj5TdXJ2ZXk8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5Pm88L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPk5ldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+TmV3PC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5uZXcucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRTdXJ2ZXkmYW1wO1N1YmFjdGlvbj1TdXJ2ZXlBZGQ8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+U3VydmV5PC9OYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc0tleT5uPC9BY2Nlc3NLZXk+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MjAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iUHVibGljRnJvbnRlbmQ6Ok1vZHVsZSMjI1B1YmxpY1N1cnZleSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBQdWJsaWNTdXJ2ZXkgb2JqZWN0IGluIHRoZSBwdWJsaWMgU3VydmV5IGFyZWEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGb8ciBkYXMgUHVibGljU3VydmV5LU9iamVrdCBpbSD2ZmZlbnRsaWNoZW4gVW1mcmFnZS1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cnZleTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpQdWJsaWM6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5QdWJsaWMgU3VydmV5PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlN1cnZleTwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxUaXRsZT5TdXJ2ZXk8L1RpdGxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cnZleTo6U2VuZFBlcmlvZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRheXMgc3RhcnRpbmcgZnJvbSB0aGUgbGF0ZXN0IGN1c3RvbWVyIHN1cnZleSBlbWFpbCBiZXR3ZWVuIG5vIGN1c3RvbWVyIHN1cnZleSBlbWFpbCBpcyBzZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5UYWdlIHp3aXNjaGVuIGRlciBsZXR6dGVuIEt1bmRlbi1VbWZyYWdlIHVuZCBkZW4ga2VpbmUgS3VuZGVuLVVtZnJhZ2UgZ2VzZW5kZXQgd2lyZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXJ2ZXk8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4zMDA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXJ2ZXk6Ok5vdGlmaWNhdGlvblNlbmRlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNlbmRlciBmb3IgdGhlIG5vdGlmaWNhdGlvbiBlbWFpbCB0byBjdXN0b21lcnMgYWJvdXQgbmV3IHN1cnZleS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+U2VuZGVyIGb8ciBkaWUgQmVuYWNocmljaHRpZ3VuZ3NtYWlsIGFuIEt1bmRlbiBiemdsLiBuZXVlIFVtZnJhZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cnZleTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnF1YWxpdHlAZXhhbXBsZS5jb208L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdXJ2ZXk6Ok5vdGlmaWNhdGlvblN1YmplY3QiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TdWJqZWN0IGZvciB0aGUgbm90aWZpY2F0aW9uIGVtYWlsIHRvIGN1c3RvbWVycyBhYm91dCBuZXcgc3VydmV5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5CZXRyZWZmIGb8ciBkaWUgQmVuYWNocmljaHRpZ3VuZ3NtYWlsIGFuIEt1bmRlbiBiemdsLiBuZXVlIFVtZnJhZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cnZleTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkhlbHAgdXMgd2l0aCB5b3VyIGZlZWRiYWNrITwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN1cnZleTo6Tm90aWZpY2F0aW9uQm9keSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkJvZHkgZm9yIHRoZSBub3RpZmljYXRpb24gZW1haWwgdG8gY3VzdG9tZXJzIGFib3V0IG5ldyBzdXJ2ZXkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkJvZHkgZvxyIGRpZSBCZW5hY2hyaWNodGlndW5nc21haWwgYW4gS3VuZGVuIGJ6Z2wuIG5ldWUgVW1mcmFnZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3VydmV5PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxUZXh0QXJlYT5EZWFyIEN1c3RvbWVyLAoKdGhhbmtzIGZvciB1c2luZyBvdXIgc2VydmljZS4gSGVscCB1cyB0byBpbXByb3ZlIHVzIGFuZCBvdXIgc2VydmljZXMuCgpHaXZlIHVzIGZlZWRiYWNrIHdoYXQgd2UgY2FuIGRvOgoKJmx0O09UUlNfQ09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtPVFJTX0NPTkZJR19GUUROJmd0Oy8mbHQ7T1RSU19DT05GSUdfU2NyaXB0QWxpYXMmZ3Q7cHVibGljLnBsP0FjdGlvbj1QdWJsaWNTdXJ2ZXkmYW1wO1B1YmxpY1N1cnZleUtleT0mbHQ7T1RSU19QdWJsaWNTdXJ2ZXlLZXkmZ3Q7CgpUaGFua3MgZm9yIHlvdXIgaGVscCEKCllvdXIgT1RSUy1UZWFtCiAgICAgICAgICAgIDwvVGV4dEFyZWE+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3VydmV5OjpTZW5kTm9TdXJ2ZXlSZWdFeHAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5JZiB0aGlzIHJlZ2V4IG1hdGNoZXMsIG5vIGN1c3RvbWVyIHN1cnZleSB3aWxsIGJlIHNlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlRyaWZmdCBkaWVzZXIgcmVndWzkcmUgQXVzZHJ1Y2sgenUsIHdpcmQga2VpbmUgQmVuYWNocmljaHRpZ3VuZ3NtYWlsIGFuIEt1bmRlbiBiemdsLiBuZXVlIFVtZnJhZ2VuIGdlc2VuZGV0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN1cnZleTwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPihNQUlMRVItREFFTU9OfHBvc3RtYXN0ZXJ8YWJ1c2UpQC4rP1wuLis/PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpFdmVudE1vZHVsZVBvc3QjIyM5OS1TdXJ2ZXlTZW5kUmVxdWVzdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRpY2tldCBldmVudCBtb2R1bGUgdG8gc2VuZCBhdXRvbWF0aWNhbGx5IHN1cnZleSBlbWFpbCByZXF1ZXN0cyB0byBjdXN0b21lcnMgaWYgYSB0aWNrZXQgZ2V0cyBjbG9zZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlRpY2tldCBFdmVudCBNb2R1bCB3ZWxjaGVzIGF1dG9tYXRpc2NoIFVtZnJhZ2VuLUVtYWlscyBhbiBLdW5kZW4gd2VubiBkZXJlbiBUaWNrZXQgZ2VzY2hsb3NzZW4gd2lyZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TdXJ2ZXk8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlN1cnZleVNlbmRSZXF1ZXN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KFRpY2tldFN0YXRlVXBkYXRlfFN0YXRlU2V0KTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VydmV5LnBtIC0gbWFuYWdlIGFsbCBzdXJ2ZXkgbW9kdWxlIGV2ZW50cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBTdXJ2ZXkucG0sdiAxLjMxIDIwMDcvMDUvMTYgMTA6MjA6NTQgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXk7Cgp1c2Ugc3RyaWN0Owp1c2UgRGlnZXN0OjpNRDU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW1haWw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMzEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3VydmV5IC0gc3VydmV5IGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgc3VydmV5IGZ1bmN0aW9ucy4gRS4gZy4gdG8gYWRkIHN1cnZleSBvciBhbmQgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlN1cnZleTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRVc2VyT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCA9PiAkREJPYmplY3QsCiAgICApOwogICAgbXkgJFN1cnZleU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXktPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ID0+ICRNYWluT2JqZWN0LAogICAgICAgIFVzZXJPYmplY3QgPT4gJFVzZXJPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBNYWluT2JqZWN0IFVzZXJPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntTZW5kbWFpbE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW1haWwtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntUaWNrZXRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlRpY2tldC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cnZleUxpc3QoKQoKdG8gZ2V0IGEgYXJyYXkgbGlzdCBvZiBhbGwgc3VydmV5IGl0ZW1zCgogICAgbXkgQExpc3QgPSAkU3VydmV5T2JqZWN0LT5TdXJ2ZXlMaXN0KCk7Cgo9Y3V0CgpzdWIgU3VydmV5TGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSBATGlzdCA9ICgpOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGFzayB0aGUgZGIKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gc3VydmV5IE9SREVSIEJZIGNyZWF0ZV90aW1lIERFU0MiOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgIyBmZXRjaCBhbGwgcmVzdWx0cwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgcHVzaChATGlzdCwgJFJvd1swXSk7CiAgICB9CiAgICAjIHJldHVybiBhcnJheQogICAgcmV0dXJuIEBMaXN0Owp9Cgo9aXRlbSBTdXJ2ZXlHZXQoKQoKdG8gZ2V0IGFsbCBhdHRyaWJ1dGVzIG9mIGEgc3VydmV5CgogICAgbXkgJVN1cnZleSA9ICRTdXJ2ZXlPYmplY3QtPlN1cnZleUdldCgKICAgICAgICBTdXJ2ZXlJRCA9PiAxMjMKICAgICk7Cgo9Y3V0CgpzdWIgU3VydmV5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIGdldCBhbGwgYXR0cmlidXRlcyBvZiBhIHN1cnZleQogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQsIHN1cnZleW51bWJlciwgdGl0bGUsIGludHJvZHVjdGlvbiwgZGVzY3JpcHRpb24sIi4KICAgICAgICAiIHN0YXR1cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAiLgogICAgICAgICIgRlJPTSBzdXJ2ZXkgV0hFUkUgaWQgPSAkUGFyYW17U3VydmV5SUR9IjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURhdGEgPSAoKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICREYXRhe1N1cnZleUlEfSA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7U3VydmV5TnVtYmVyfSA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7VGl0bGV9ID0gJFJvd1syXTsKICAgICAgICAkRGF0YXtJbnRyb2R1Y3Rpb259ID0gJFJvd1szXTsKICAgICAgICAkRGF0YXtEZXNjcmlwdGlvbn0gPSAkUm93WzRdOwogICAgICAgICREYXRhe1N0YXR1c30gPSAkUm93WzVdOwogICAgICAgICREYXRhe0NyZWF0ZVRpbWV9ID0gJFJvd1s2XTsKICAgICAgICAkRGF0YXtDcmVhdGVCeX0gPSAkUm93WzddOwogICAgICAgICREYXRhe0NoYW5nZVRpbWV9ID0gJFJvd1s4XTsKICAgICAgICAkRGF0YXtDaGFuZ2VCeX0gPSAkUm93WzldOwogICAgfQogICAgaWYgKCVEYXRhKSB7CiAgICAgICAgIyBhZGRlZCBDcmVhdGVCeQogICAgICAgIG15ICVDcmVhdGVVc2VySW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJERhdGF7Q3JlYXRlQnl9LAogICAgICAgICAgICBDYWNoZWQgPT4gMQogICAgICAgICk7CiAgICAgICAgJERhdGF7Q3JlYXRlVXNlckxvZ2lufSA9ICRDcmVhdGVVc2VySW5mb3tVc2VyTG9naW59OwogICAgICAgICREYXRhe0NyZWF0ZVVzZXJGaXJzdG5hbWV9ID0gJENyZWF0ZVVzZXJJbmZve1VzZXJGaXJzdG5hbWV9OwogICAgICAgICREYXRhe0NyZWF0ZVVzZXJMYXN0bmFtZX0gPSAkQ3JlYXRlVXNlckluZm97VXNlckxhc3RuYW1lfTsKICAgICAgICAjIGFkZGVkIENoYW5nZUJ5CiAgICAgICAgbXkgJUNoYW5nZVVzZXJJbmZvID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkRGF0YXtDaGFuZ2VCeX0sCiAgICAgICAgICAgIENhY2hlZCA9PiAxCiAgICAgICAgKTsKICAgICAgICAkRGF0YXtDaGFuZ2VVc2VyTG9naW59ID0gJENoYW5nZVVzZXJJbmZve1VzZXJMb2dpbn07CiAgICAgICAgJERhdGF7Q2hhbmdlVXNlckZpcnN0bmFtZX0gPSAkQ2hhbmdlVXNlckluZm97VXNlckZpcnN0bmFtZX07CiAgICAgICAgJERhdGF7Q2hhbmdlVXNlckxhc3RuYW1lfSA9ICRDaGFuZ2VVc2VySW5mb3tVc2VyTGFzdG5hbWV9OwogICAgICAgICMgcmV0dXJuIGhhc2gKICAgICAgICByZXR1cm4gJURhdGE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJObyBzdWNoIFN1cnZleUlEICRQYXJhbXtTdXJ2ZXlJRH0hIik7CiAgICAgICAgcmV0dXJuICgpOwogICAgfQp9Cgo9aXRlbSBTdXJ2ZXlTdGF0dXNTZXQoKQoKdG8gc2V0IGEgbmV3IHN1cnZleSBzdGF0dXMgKFZhbGlkLCBJbnZhbGlkLCBNYXN0ZXIpCgogICAgJFN0YXR1c1NldCA9ICRTdXJ2ZXlPYmplY3QtPlN1cnZleVN0YXR1c1NldCgKICAgICAgICBTdXJ2ZXlJRCA9PiAxMjMsCiAgICAgICAgTmV3U3RhdHVzID0+ICdNYXN0ZXInCiAgICApOwoKPWN1dAoKc3ViIFN1cnZleVN0YXR1c1NldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoU3VydmV5SUQgTmV3U3RhdHVzKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KE5ld1N0YXR1cykpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoU3VydmV5SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBnZXQgY3VycmVudCBzdGF0dXMKICAgIG15ICRTUUwgPSAiU0VMRUNUIHN0YXR1cyBGUk9NIHN1cnZleSBXSEVSRSBpZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkU3RhdHVzID0gJyc7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkU3RhdHVzID0gJFJvd1swXTsKICAgIH0KICAgICMgdGhlIGN1cmVudCBzdGF0dXMKICAgIGlmICgkU3RhdHVzIGVxICdOZXcnIHx8ICRTdGF0dXMgZXEgJ0ludmFsaWQnKSB7CiAgICAgICAgIyBnZXQgdGhlIHF1ZXN0aW9uIGlkcwogICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gc3VydmV5X3F1ZXN0aW9uIFdIRVJFIHN1cnZleV9pZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkUXVlc3QgPSAnJzsKICAgICAgICB3aGlsZSAobXkgQFJvdzIgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICRRdWVzdCA9ICRSb3cyWzBdOwogICAgICAgIH0KICAgICAgICAjIGlmIG1vcmUgdGhlbiBvbmUgcXVlc3Rpb24KICAgICAgICBpZiAoJFF1ZXN0KSB7CiAgICAgICAgICAgICMgZ2V0IGFsbCBxdWVzdGlvbnMgKHR5cGUgcmFkaW8gYW5kIGNoZWNrYm94KQogICAgICAgICAgICBteSAkU1FMID0gIlNFTEVDVCBpZCBGUk9NIHN1cnZleV9xdWVzdGlvbiIuCiAgICAgICAgICAgICAgICAiIFdIRVJFIHN1cnZleV9pZCA9ICRQYXJhbXtTdXJ2ZXlJRH0gQU5EICh0eXBlID0gJ1JhZGlvJyBPUiB0eXBlID0gJ0NoZWNrYm94JykiOwogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICAgICAgICAgICMgaW5pdCB0aHJlZSB2YXJzCiAgICAgICAgICAgIG15ICRBbGxRdWVzdGlvbnNBbnNlcnMgPSAnWWVzJzsKICAgICAgICAgICAgbXkgQFF1ZXN0aW9uSURzID0gKCk7CiAgICAgICAgICAgIG15ICRDb3VudGVyMSA9IDA7CiAgICAgICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgICAgICB3aGlsZSAobXkgQFJvdzMgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICAgICAkUXVlc3Rpb25JRHNbJENvdW50ZXIxXSA9ICRSb3czWzBdOwogICAgICAgICAgICAgICAgJENvdW50ZXIxKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCBteSAkT25lSUQoQFF1ZXN0aW9uSURzKSB7CiAgICAgICAgICAgICAgICAjIGdldCBhbGwgYW5zd2VyIGlkcyBvZiBhIHF1ZXN0aW9uCiAgICAgICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIHN1cnZleV9hbnN3ZXIgV0hFUkUgcXVlc3Rpb25faWQgPSAkT25lSUQiKTsKICAgICAgICAgICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgICAgICAgICAgbXkgJENvdW50ZXIyID0gJzAnOwogICAgICAgICAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICAgICAgICAgJENvdW50ZXIyKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIGl0cyBvaywgaWYgbWluaW11bSB0d28gYW5zd2VycyBkZWZpbmllZAogICAgICAgICAgICAgICAgaWYgKCRDb3VudGVyMiA8IDIpIHsKICAgICAgICAgICAgICAgICAgICAkQWxsUXVlc3Rpb25zQW5zZXJzID0gJ25vJzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0luY29tcGxldGVRdWVzdGlvbic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBzZXQgbmV3IHN0YXR1cyBpZiBzdXJ2ZXkgaXMgY29tcGxldGUKICAgICAgICAgICAgaWYgKCRBbGxRdWVzdGlvbnNBbnNlcnMgZXEgJ1llcycpIHsKICAgICAgICAgICAgICAgICMgc2V0IHN0YXR1cyBWYWxpZAogICAgICAgICAgICAgICAgaWYgKCRQYXJhbXtOZXdTdGF0dXN9IGVxICdWYWxpZCcpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleSBTRVQgc3RhdHVzID0gJ1ZhbGlkJyBXSEVSRSBpZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdTdGF0dXNTZXQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBzZXQgc3RhdHVzIE1hc3RlcgogICAgICAgICAgICAgICAgZWxzaWYgKCRQYXJhbXtOZXdTdGF0dXN9IGVxICdNYXN0ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXkgU0VUIHN0YXR1cyA9ICdNYXN0ZXInIFdIRVJFIGlkID0gJFBhcmFte1N1cnZleUlEfSIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1N0YXR1c1NldCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAnTm9RdWVzdGlvbic7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCRTdGF0dXMgZXEgJ1ZhbGlkJykgewogICAgICAgICMgc2V0IHN0YXR1cyBNYXN0ZXIKICAgICAgICBpZiAoJFBhcmFte05ld1N0YXR1c30gZXEgJ01hc3RlcicpIHsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5IFNFVCBzdGF0dXMgPSAnVmFsaWQnIFdIRVJFIHN0YXR1cyA9ICdNYXN0ZXInIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5IFNFVCBzdGF0dXMgPSAnTWFzdGVyJyBXSEVSRSBpZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJ1N0YXR1c1NldCc7CiAgICAgICAgfQogICAgICAgICMgc2V0IHN0YXR1cyBJbnZhbGlkCiAgICAgICAgZWxzaWYgKCRQYXJhbXtOZXdTdGF0dXN9IGVxICdJbnZhbGlkJykgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXkgU0VUIHN0YXR1cyA9ICdJbnZhbGlkJyBXSEVSRSBpZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJ1N0YXR1c1NldCc7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCRTdGF0dXMgZXEgJ01hc3RlcicpIHsKICAgICAgICAjIHNldCBzdGF0dXMgVmFsaWQKICAgICAgICBpZiAoJFBhcmFte05ld1N0YXR1c30gZXEgJ1ZhbGlkJykgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXkgU0VUIHN0YXR1cyA9ICdWYWxpZCcgV0hFUkUgaWQgPSAkUGFyYW17U3VydmV5SUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICdTdGF0dXNTZXQnOwogICAgICAgIH0KICAgICAgICAjIHNldCBzdGF0dXMgSW52YWxpZAogICAgICAgIGVsc2lmICgkUGFyYW17TmV3U3RhdHVzfSBlcSAnSW52YWxpZCcpIHsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5IFNFVCBzdGF0dXMgPSAnSW52YWxpZCcgV0hFUkUgaWQgPSAkUGFyYW17U3VydmV5SUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICdTdGF0dXNTZXQnOwogICAgICAgIH0KICAgIH0KfQoKPWl0ZW0gU3VydmV5U2F2ZSgpCgp0byB1cGRhdGUgYW4gZXhpc3Rpbmcgc3VydmV5CgogICAgJFN1cnZleU9iamVjdC0+U3VydmV5U2F2ZSgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBTdXJ2ZXlJRCA9PiA0LAogICAgICAgIFRpdGxlID0+ICdBIFRpdGxlJywKICAgICAgICBJbnRyb2R1Y3Rpb24gPT4gJ1RoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIHN1cnZleScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1RoZSBpbnRlcm5hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3VydmV5JywKICAgICk7Cgo9Y3V0CgpzdWIgU3VydmV5U2F2ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVXNlcklEIFN1cnZleUlEIFRpdGxlIEludHJvZHVjdGlvbiBEZXNjcmlwdGlvbikpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhUaXRsZSBJbnRyb2R1Y3Rpb24gRGVzY3JpcHRpb24pKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KFVzZXJJRCBTdXJ2ZXlJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICBpZiAoJFBhcmFte1RpdGxlfSAmJiAkUGFyYW17SW50cm9kdWN0aW9ufSAmJiAkUGFyYW17RGVzY3JpcHRpb259KSB7CiAgICAgICAgbXkgJEN1cnJlbnRUaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgICAgICMgdXBkYXRlIHRoZSBzdXJ2ZXkKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleSBTRVQgIi4KICAgICAgICAgICAgICAgICJ0aXRsZSA9ICckUGFyYW17VGl0bGV9JywgIi4KICAgICAgICAgICAgICAgICJpbnRyb2R1Y3Rpb24gPSAnJFBhcmFte0ludHJvZHVjdGlvbn0nLCAiLgogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uID0gJyRQYXJhbXtEZXNjcmlwdGlvbn0nLCAiLgogICAgICAgICAgICAgICAgImNoYW5nZV90aW1lID0gJyRDdXJyZW50VGltZScsICIuCiAgICAgICAgICAgICAgICAiY2hhbmdlX2J5ID0gJFBhcmFte1VzZXJJRH0gIi4KICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iLAogICAgICAgICk7CiAgICB9Cn0KCj1pdGVtIFN1cnZleU5ldygpCgp0byBhZGQgYSBuZXcgc3VydmV5CgogICAgbXkgJFN1cnZleUlEID0gJFN1cnZleU9iamVjdC0+U3VydmV5TmV3KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIFRpdGxlID0+ICdBIFRpdGxlJywKICAgICAgICBJbnRyb2R1Y3Rpb24gPT4gJ1RoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIHN1cnZleScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1RoZSBpbnRlcm5hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3VydmV5JywKICAgICk7Cgo9Y3V0CgpzdWIgU3VydmV5TmV3IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhVc2VySUQgVGl0bGUgSW50cm9kdWN0aW9uIERlc2NyaXB0aW9uKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFRpdGxlIEludHJvZHVjdGlvbiBEZXNjcmlwdGlvbikpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoVXNlcklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgIGlmICgkUGFyYW17VGl0bGV9ICYmICRQYXJhbXtJbnRyb2R1Y3Rpb259ICYmICRQYXJhbXtEZXNjcmlwdGlvbn0pIHsKICAgICAgICBteSAkQ3VycmVudFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICAgICAgIyBpbnNlcnQgYSBuZXcgc3VydmV5CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIHN1cnZleSAodGl0bGUsIGludHJvZHVjdGlvbiwgZGVzY3JpcHRpb24sIi4KICAgICAgICAgICAgICAgICIgc3RhdHVzLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSBWQUxVRVMgKCIuCiAgICAgICAgICAgICAgICAiJyRQYXJhbXtUaXRsZX0nLCAiLgogICAgICAgICAgICAgICAgIickUGFyYW17SW50cm9kdWN0aW9ufScsICIuCiAgICAgICAgICAgICAgICAiJyRQYXJhbXtEZXNjcmlwdGlvbn0nLCAiLgogICAgICAgICAgICAgICAgIidOZXcnLCAiLgogICAgICAgICAgICAgICAgIickQ3VycmVudFRpbWUnLCAiLgogICAgICAgICAgICAgICAgIiRQYXJhbXtVc2VySUR9LCAiLgogICAgICAgICAgICAgICAgIickQ3VycmVudFRpbWUnLCAiLgogICAgICAgICAgICAgICAgIiRQYXJhbXtVc2VySUR9KSIKICAgICAgICApOwogICAgICAgICMgZ2V0IHRoZSBpZCBvZiB0aGUgc3VydmV5CiAgICAgICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSBzdXJ2ZXkgV0hFUkUgIi4KICAgICAgICAgICAgInRpdGxlID0gJyRQYXJhbXtUaXRsZX0nIEFORCAiLgogICAgICAgICAgICAiaW50cm9kdWN0aW9uID0gJyRQYXJhbXtJbnRyb2R1Y3Rpb259JyBBTkQgIi4KICAgICAgICAgICAgImRlc2NyaXB0aW9uID0gJyRQYXJhbXtEZXNjcmlwdGlvbn0nICIuCiAgICAgICAgICAgICJPUkRFUiBCWSBjcmVhdGVfdGltZSBERVNDIjsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgJFN1cnZleUlEID0gJyc7CiAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICRTdXJ2ZXlJRCA9ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgICMgc2V0IHRoZSBzdXJ2ZXkgbnVtYmVyCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXkgU0VUICIuCiAgICAgICAgICAgICAgICAic3VydmV5bnVtYmVyID0gJyIgLiAoJFN1cnZleUlEICsgMTAwMDApIC4gIicgIi4KICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRTdXJ2ZXlJRCIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJFN1cnZleUlEOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQp9Cgo9aXRlbSBRdWVzdGlvbkxpc3QoKQoKdG8gZ2V0IGEgYXJyYXkgbGlzdCBvZiBhbGwgcXVlc3Rpb24gaXRlbXMKCiAgICBteSBATGlzdCA9ICRTdXJ2ZXlPYmplY3QtPlF1ZXN0aW9uTGlzdCgKICAgICAgICBTdXJ2ZXlJRCA9PiAxCiAgICApOwoKPWN1dAoKc3ViIFF1ZXN0aW9uTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSBATGlzdCA9ICgpOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgZ2V0IGFsbCBxdWVzdGlvbnMgb2YgYSBzdXJ2ZXkKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkLCBzdXJ2ZXlfaWQsIHF1ZXN0aW9uLCB0eXBlICIuCiAgICAgICAgIiBGUk9NIHN1cnZleV9xdWVzdGlvbiBXSEVSRSBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IE9SREVSIEJZIHBvc2l0aW9uIjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgICMgZmV0Y2ggdGggcmVzdWx0CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICBteSAlRGF0YSA9ICgpOwogICAgICAgICREYXRhe1F1ZXN0aW9uSUR9ID0gJFJvd1swXTsKICAgICAgICAkRGF0YXtTdXJ2ZXlJRH0gPSAkUm93WzFdOwogICAgICAgICREYXRhe1F1ZXN0aW9ufSA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7VHlwZX0gPSAkUm93WzNdOwogICAgICAgIHB1c2goQExpc3QsXCVEYXRhKTsKICAgIH0KICAgIHJldHVybiBATGlzdDsKfQoKPWl0ZW0gUXVlc3Rpb25BZGQoKQoKdG8gYWRkIGEgbmV3IHF1ZXN0aW9uIHRvIGEgc3VydmV5CgogICAgJFN1cnZleU9iamVjdC0+UXVlc3Rpb25BZGQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgU3VydmV5SUQgPT4gMTAsCiAgICAgICAgUXVlc3Rpb24gPT4gJ1RoZSBRdWVzdGlvbicsCiAgICAgICAgVHlwZSA9PiAnUmFkaW8nLAogICAgKTsKCj1jdXQKCnN1YiBRdWVzdGlvbkFkZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVXNlcklEIFN1cnZleUlEIFF1ZXN0aW9uIFR5cGUpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUXVlc3Rpb24gVHlwZSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoVXNlcklEIFN1cnZleUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KCiAgICBpZiAoJFBhcmFte1F1ZXN0aW9ufSkgewogICAgICAgIG15ICRDdXJyZW50VGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgICAgICAjIGluc2VydCBhIG5ldyBxdWVzdGlvbgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBzdXJ2ZXlfcXVlc3Rpb24gKHN1cnZleV9pZCwgcXVlc3Rpb24sIHR5cGUsICIuCiAgICAgICAgICAgICAgICAicG9zaXRpb24sIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAoIi4KICAgICAgICAgICAgICAgICIkUGFyYW17U3VydmV5SUR9LCAiLgogICAgICAgICAgICAgICAgIickUGFyYW17UXVlc3Rpb259JywgIi4KICAgICAgICAgICAgICAgICInJFBhcmFte1R5cGV9JywgIi4KICAgICAgICAgICAgICAgICIyNTUsICIuCiAgICAgICAgICAgICAgICAiJyRDdXJyZW50VGltZScsICIuCiAgICAgICAgICAgICAgICAiJFBhcmFte1VzZXJJRH0sICIuCiAgICAgICAgICAgICAgICAiJyRDdXJyZW50VGltZScsICIuCiAgICAgICAgICAgICAgICAiJFBhcmFte1VzZXJJRH0pIgogICAgICAgICk7CiAgICB9Cn0KCj1pdGVtIFF1ZXN0aW9uRGVsZXRlKCkKCnRvIGRlbGV0ZSBhIHF1ZXN0aW9uIGZyb20gYSBzdXJ2ZXkKCiAgICAkU3VydmV5T2JqZWN0LT5RdWVzdGlvbkRlbGV0ZSgKICAgICAgICBTdXJ2ZXlJRCA9PiAxLAogICAgICAgIFF1ZXN0aW9uSUQgPT4gMTAsCiAgICApOwoKPWN1dAoKc3ViIFF1ZXN0aW9uRGVsZXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCBRdWVzdGlvbklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEIFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBkZWxldGUgYWxsIGFuc3dlcnMgb2YgYSBxdWVzdGlvbgogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc3VydmV5X2Fuc3dlciBXSEVSRSAiLgogICAgICAgICAgICAicXVlc3Rpb25faWQgPSAkUGFyYW17UXVlc3Rpb25JRH0iCiAgICApOwogICAgIyBkZWxldGUgdGggcXVlc3Rpb24KICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHN1cnZleV9xdWVzdGlvbiBXSEVSRSAiLgogICAgICAgICAgICAiaWQgPSAkUGFyYW17UXVlc3Rpb25JRH0gQU5EICIuCiAgICAgICAgICAgICJzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IgogICAgKTsKfQoKPWl0ZW0gUXVlc3Rpb25Tb3J0KCkKCnRvIHNvcnQgYWxsIHF1ZXN0aW9ucyBmcm9tIGEgc3VydmV5CgogICAgJFN1cnZleU9iamVjdC0+UXVlc3Rpb25Tb3J0KAogICAgICAgIFN1cnZleUlEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFF1ZXN0aW9uU29ydCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoU3VydmV5SUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoU3VydmV5SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBnZXQgYWxsIHF1ZXN0aW9uIG9mIGEgc3VydmV5IChzb3J0ZWQgYnkgcG9zaXRpb24pCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCBGUk9NIHN1cnZleV9xdWVzdGlvbiIuCiAgICAgICAgIiBXSEVSRSBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IE9SREVSIEJZIHBvc2l0aW9uIjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJENvdW50ZXIgPSAxOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgIyB1cGRhdGUgdGhlIHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXlfcXVlc3Rpb24gU0VUIHBvc2l0aW9uID0gJENvdW50ZXIgV0hFUkUgaWQgPSAkUm93WzBdIiwKICAgICAgICApOwogICAgICAgICRDb3VudGVyKys7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gUXVlc3Rpb25VcCgpCgp0byBtb3ZlIGEgcXVlc3Rpb24gdXAKCiAgICAkU3VydmV5T2JqZWN0LT5RdWVzdGlvblVwKAogICAgICAgIFN1cnZleUlEID0+IDEsCiAgICAgICAgUXVlc3Rpb25JRCA9PiA0LAogICAgKTsKCj1jdXQKCnN1YiBRdWVzdGlvblVwIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCBRdWVzdGlvbklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEIFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBwb3NpdGlvbiBGUk9NIHN1cnZleV9xdWVzdGlvbiIuCiAgICAgICAgIiBXSEVSRSBpZCA9ICRQYXJhbXtRdWVzdGlvbklEfSBBTkQgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSIKICAgICk7CgogICAgbXkgJFBvc2l0aW9uID0gJyc7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkUG9zaXRpb24gPSAkUm93WzBdOwogICAgfQoKICAgIGlmICgkUG9zaXRpb24gPiAnMScpIHsKICAgICAgICBteSAkUG9zaXRpb25VcCA9ICRQb3NpdGlvbiAtIDE7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBzdXJ2ZXlfcXVlc3Rpb24iLgogICAgICAgICAgICAiIFdIRVJFIHN1cnZleV9pZCA9ICRQYXJhbXtTdXJ2ZXlJRH0gQU5EIHBvc2l0aW9uID0gJFBvc2l0aW9uVXAiCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFF1ZXN0aW9uSUREb3duID0gJyc7CiAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICRRdWVzdGlvbklERG93biA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICBpZiAoJFF1ZXN0aW9uSUREb3duIG5lICcnKSB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9xdWVzdGlvbiBTRVQgIi4KICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gPSAkUG9zaXRpb24gIi4KICAgICAgICAgICAgICAgICAgICAiV0hFUkUgaWQgPSAkUXVlc3Rpb25JRERvd24iCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9xdWVzdGlvbiBTRVQgIi4KICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gPSAkUG9zaXRpb25VcCAiLgogICAgICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRQYXJhbXtRdWVzdGlvbklEfSIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KCj1pdGVtIFF1ZXN0aW9uRG93bigpCgp0byBtb3ZlIGEgcXVlc3Rpb24gZG93bgoKICAgICRTdXJ2ZXlPYmplY3QtPlF1ZXN0aW9uRG93bigKICAgICAgICBTdXJ2ZXlJRCA9PiAxLAogICAgICAgIFF1ZXN0aW9uSUQgPT4gNCwKICAgICk7Cgo9Y3V0CgpzdWIgUXVlc3Rpb25Eb3duIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCBRdWVzdGlvbklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEIFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBwb3NpdGlvbiBGUk9NIHN1cnZleV9xdWVzdGlvbiIuCiAgICAgICAgIiBXSEVSRSBpZCA9ICRQYXJhbXtRdWVzdGlvbklEfSBBTkQgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSIKICAgICk7CgogICAgbXkgJFBvc2l0aW9uID0gJyc7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkUG9zaXRpb24gPSAkUm93WzBdOwogICAgfQoKICAgIGlmICgkUG9zaXRpb24pIHsKICAgICAgICBteSAkUG9zaXRpb25Eb3duID0gJFBvc2l0aW9uICsgMTsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIHN1cnZleV9xdWVzdGlvbiIuCiAgICAgICAgICAgICIgV0hFUkUgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSBBTkQgcG9zaXRpb24gPSAkUG9zaXRpb25Eb3duIgogICAgICAgICk7CgogICAgICAgIG15ICRRdWVzdGlvbklEVXAgPSAnJzsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJFF1ZXN0aW9uSURVcCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICBpZiAoJFF1ZXN0aW9uSURVcCBuZSAnJykKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9xdWVzdGlvbiBTRVQgIi4KICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gPSAkUG9zaXRpb24gIi4KICAgICAgICAgICAgICAgICAgICAiV0hFUkUgaWQgPSAkUXVlc3Rpb25JRFVwIgogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXlfcXVlc3Rpb24gU0VUICIuCiAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uID0gJFBvc2l0aW9uRG93biAiLgogICAgICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRQYXJhbXtRdWVzdGlvbklEfSIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KCj1pdGVtIFF1ZXN0aW9uR2V0KCkKCnRvIGdldCBhbGwgYXR0cmlidXRlcyBvZiBhIHF1ZXN0aW9uCgogICAgbXkgJVF1ZXN0aW9uID0gJFN1cnZleU9iamVjdC0+UXVlc3Rpb25HZXQoCiAgICAgICAgUXVlc3Rpb25JRCA9PiAxMjMKICAgICk7Cgo9Y3V0CgpzdWIgUXVlc3Rpb25HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkLCBzdXJ2ZXlfaWQsIHF1ZXN0aW9uLCB0eXBlLCBwb3NpdGlvbiwgIi4KICAgICAgICAiY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAiLgogICAgICAgICJGUk9NIHN1cnZleV9xdWVzdGlvbiBXSEVSRSBpZCA9ICRQYXJhbXtRdWVzdGlvbklEfSI7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgbXkgJURhdGEgPSAoKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICREYXRhe1F1ZXN0aW9uSUR9ID0gJFJvd1swXTsKICAgICAgICAkRGF0YXtTdXJ2ZXlJRH0gPSAkUm93WzFdOwogICAgICAgICREYXRhe1F1ZXN0aW9ufSA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7VHlwZX0gPSAkUm93WzNdOwogICAgICAgICREYXRhe1Bvc2l0aW9ufSA9ICRSb3dbNF07CiAgICAgICAgJERhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzVdOwogICAgICAgICREYXRhe0NyZWF0ZUJ5fSA9ICRSb3dbNl07CiAgICAgICAgJERhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzddOwogICAgICAgICREYXRhe0NoYW5nZUJ5fSA9ICRSb3dbOF07CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIFF1ZXN0aW9uU2F2ZSgpCgp0byB1cGRhdGUgYW4gZXhpc3RpbmcgcXVlc3Rpb24KCiAgICAkU3VydmV5T2JqZWN0LT5RdWVzdGlvblNhdmUoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgUXVlc3Rpb25JRCA9PiA0LAogICAgICAgIFN1cnZleUlEID0+IDMsCiAgICAgICAgUXVlc3Rpb24gPT4gJ1RoZSBRdWVzdGlvbicsCiAgICApOwoKPWN1dAoKc3ViIFF1ZXN0aW9uU2F2ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVXNlcklEIFF1ZXN0aW9uSUQgU3VydmV5SUQgUXVlc3Rpb24pKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUXVlc3Rpb24pKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KFVzZXJJRCBRdWVzdGlvbklEIFN1cnZleUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KCiAgICBpZiAoJFBhcmFte1F1ZXN0aW9ufSkgewogICAgICAgIG15ICRDdXJyZW50VGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgICAgICAjIHNxbCBmb3IgZXZlbnQKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9xdWVzdGlvbiBTRVQgIi4KICAgICAgICAgICAgICAgICJxdWVzdGlvbiA9ICckUGFyYW17UXVlc3Rpb259JywgIi4KICAgICAgICAgICAgICAgICJjaGFuZ2VfdGltZSA9ICckQ3VycmVudFRpbWUnLCAiLgogICAgICAgICAgICAgICAgImNoYW5nZV9ieSA9ICRQYXJhbXtVc2VySUR9ICIuCiAgICAgICAgICAgICAgICAiV0hFUkUgaWQgPSAkUGFyYW17UXVlc3Rpb25JRH0gIiwKICAgICAgICAgICAgICAgICJBTkQgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSIsCiAgICAgICAgKTsKICAgIH0KfQoKPWl0ZW0gUXVlc3Rpb25Db3VudCgpCgp0byBjb3VudCBhbGwgcXVlc3Rpb25zIG9mIGEgc3VydmV5CgogICAgbXkgJENvdW50UXVlc3Rpb24gPSAkU3VydmV5T2JqZWN0LT5RdWVzdGlvbkNvdW50KAogICAgICAgIFN1cnZleUlEID0+IDEyMwogICAgKTsKCj1jdXQKCnN1YiBRdWVzdGlvbkNvdW50IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgIG15ICRTUUwgPSAiU0VMRUNUIENPVU5UKGlkKSBGUk9NIHN1cnZleV9xdWVzdGlvbiBXSEVSRSBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IjsKCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgbXkgJENvdW50UXVlc3Rpb24gPSAnJzsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRDb3VudFF1ZXN0aW9uID0gJFJvd1swXTsKICAgIH0KICAgIHJldHVybiAkQ291bnRRdWVzdGlvbjsKfQoKPWl0ZW0gQW5zd2VyTGlzdCgpCgp0byBnZXQgYSBhcnJheSBsaXN0IG9mIGFsbCBhbnN3ZXIgaXRlbXMKCiAgICBteSBATGlzdCA9ICRTdXJ2ZXlPYmplY3QtPkFuc3dlckxpc3QoCiAgICAgICAgUXVlc3Rpb25JRCA9PiAxCiAgICApOwoKPWN1dAoKc3ViIEFuc3dlckxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQExpc3QgPSAoKTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgcXVlc3Rpb25faWQsIGFuc3dlciAiLgogICAgICAgICIgRlJPTSBzdXJ2ZXlfYW5zd2VyIFdIRVJFIHF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IE9SREVSIEJZIHBvc2l0aW9uIjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIG15ICVEYXRhID0gKCk7CgogICAgICAgICREYXRhe0Fuc3dlcklEfSA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7UXVlc3Rpb25JRH0gPSAkUm93WzFdOwogICAgICAgICREYXRhe0Fuc3dlcn0gPSAkUm93WzJdOwoKICAgICAgICBwdXNoKEBMaXN0LFwlRGF0YSk7CiAgICB9CiAgICByZXR1cm4gQExpc3Q7Cn0KCj1pdGVtIEFuc3dlckFkZCgpCgp0byBhZGQgYSBuZXcgYW5zd2VyIHRvIGEgcXVlc3Rpb24KCiAgICAkU3VydmV5T2JqZWN0LT5BbnN3ZXJBZGQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgUXVlc3Rpb25JRCA9PiAxMCwKICAgICAgICBBbnN3ZXIgPT4gJ1RoZSBBbnN3ZXInLAogICAgKTsKCj1jdXQKCnN1YiBBbnN3ZXJBZGQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFVzZXJJRCBRdWVzdGlvbklEIEFuc3dlcikpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhBbnN3ZXIpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KFVzZXJJRCBRdWVzdGlvbklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KCiAgICBpZiAoJFBhcmFte0Fuc3dlcn0pIHsKICAgICAgICBteSAkQ3VycmVudFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICAgICAgIyBzcWwgZm9yIGV2ZW50CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIHN1cnZleV9hbnN3ZXIgKHF1ZXN0aW9uX2lkLCBhbnN3ZXIsIHBvc2l0aW9uLCAiLgogICAgICAgICAgICAgICAgImNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAoIi4KICAgICAgICAgICAgICAgICIkUGFyYW17UXVlc3Rpb25JRH0sICIuCiAgICAgICAgICAgICAgICAiJyRQYXJhbXtBbnN3ZXJ9JywgIi4KICAgICAgICAgICAgICAgICIyNTUsICIuCiAgICAgICAgICAgICAgICAiJyRDdXJyZW50VGltZScsICIuCiAgICAgICAgICAgICAgICAiJFBhcmFte1VzZXJJRH0sICIuCiAgICAgICAgICAgICAgICAiJyRDdXJyZW50VGltZScsICIuCiAgICAgICAgICAgICAgICAiJFBhcmFte1VzZXJJRH0pIgogICAgICAgICk7CiAgICB9Cn0KCj1pdGVtIEFuc3dlckRlbGV0ZSgpCgp0byBkZWxldGUgYSBhbnN3ZXIgZnJvbSBhIHF1ZXN0aW9uCgogICAgJFN1cnZleU9iamVjdC0+QW5zd2VyRGVsZXRlKAogICAgICAgIFF1ZXN0aW9uSUQgPT4gMTAsCiAgICAgICAgQW5zd2VySUQgPT4gNCwKICAgICk7Cgo9Y3V0CgpzdWIgQW5zd2VyRGVsZXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEIEFuc3dlcklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQgQW5zd2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgICMgc3FsIGZvciBldmVudAogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc3VydmV5X2Fuc3dlciBXSEVSRSAiLgogICAgICAgICAgICAiaWQgPSAkUGFyYW17QW5zd2VySUR9IEFORCAiLgogICAgICAgICAgICAicXVlc3Rpb25faWQgPSAkUGFyYW17UXVlc3Rpb25JRH0iCiAgICApOwp9Cgo9aXRlbSBBbnN3ZXJTb3J0KCkKCnRvIHNvcnQgYWxsIGFuc3dlcnMgZnJvbSBhIHF1ZXN0aW9uCgogICAgJFN1cnZleU9iamVjdC0+QW5zd2VyU29ydCgKICAgICAgICBRdWVzdGlvbklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEFuc3dlclNvcnQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gc3VydmV5X2Fuc3dlciIuCiAgICAgICAgIiBXSEVSRSBxdWVzdGlvbl9pZCA9ICRQYXJhbXtRdWVzdGlvbklEfSBPUkRFUiBCWSBwb3NpdGlvbiI7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgbXkgJGNvdW50ZXIgPSAxOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXlfYW5zd2VyIFNFVCBwb3NpdGlvbiA9ICRjb3VudGVyIFdIRVJFIGlkID0gJFJvd1swXSIsCiAgICAgICAgKTsKICAgICAgICAkY291bnRlcisrOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFuc3dlclVwKCkKCnRvIG1vdmUgYSBhbnN3ZXIgdXAKCiAgICAkU3VydmV5T2JqZWN0LT5BbnN3ZXJVcCgKICAgICAgICBRdWVzdGlvbklEID0+IDQsCiAgICAgICAgQW5zd2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQW5zd2VyVXAgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQgQW5zd2VySUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCBBbnN3ZXJJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIHBvc2l0aW9uIEZST00gc3VydmV5X2Fuc3dlciIuCiAgICAgICAgIiBXSEVSRSBpZCA9ICRQYXJhbXtBbnN3ZXJJRH0gQU5EIHF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IgogICAgKTsKCiAgICBteSAkUG9zaXRpb24gPSAnJzsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRQb3NpdGlvbiA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCRQb3NpdGlvbiA+ICcxJykgewogICAgICAgIG15ICRQb3NpdGlvblVwID0gJFBvc2l0aW9uIC0gMTsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIHN1cnZleV9hbnN3ZXIiLgogICAgICAgICAgICAiIFdIRVJFIHF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IEFORCBwb3NpdGlvbiA9ICRQb3NpdGlvblVwIgogICAgICAgICk7CgogICAgICAgIG15ICRBbnN3ZXJJRERvd24gPSAnJzsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJEFuc3dlcklERG93biA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICBpZiAoJEFuc3dlcklERG93biBuZSAnJykgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXlfYW5zd2VyIFNFVCAiLgogICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiA9ICRQb3NpdGlvbiAiLgogICAgICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRBbnN3ZXJJRERvd24iCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9hbnN3ZXIgU0VUICIuCiAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uID0gJFBvc2l0aW9uVXAgIi4KICAgICAgICAgICAgICAgICAgICAiV0hFUkUgaWQgPSAkUGFyYW17QW5zd2VySUR9IgogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKPWl0ZW0gQW5zd2VyRG93bigpCgp0byBtb3ZlIGEgYW5zd2VyIGRvd24KCiAgICAkU3VydmV5T2JqZWN0LT5BbnN3ZXJEb3duKAogICAgICAgIFF1ZXN0aW9uSUQgPT4gNCwKICAgICAgICBBbnN3ZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBbnN3ZXJEb3duIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEIEFuc3dlcklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQgQW5zd2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBwb3NpdGlvbiBGUk9NIHN1cnZleV9hbnN3ZXIiLgogICAgICAgICIgV0hFUkUgaWQgPSAkUGFyYW17QW5zd2VySUR9IEFORCBxdWVzdGlvbl9pZCA9ICRQYXJhbXtRdWVzdGlvbklEfSIKICAgICk7CgogICAgbXkgJFBvc2l0aW9uID0gJyc7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkUG9zaXRpb24gPSAkUm93WzBdOwogICAgfQoKICAgIGlmICgkUG9zaXRpb24pIHsKICAgICAgICBteSAkUG9zaXRpb25Eb3duID0gJFBvc2l0aW9uICsgMTsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIHN1cnZleV9hbnN3ZXIiLgogICAgICAgICAgICAiIFdIRVJFIHF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IEFORCBwb3NpdGlvbiA9ICRQb3NpdGlvbkRvd24iCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFuc3dlcklEVXAgPSAnJzsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJEFuc3dlcklEVXAgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRBbnN3ZXJJRFVwIG5lICcnKSB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9hbnN3ZXIgU0VUICIuCiAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uID0gJFBvc2l0aW9uICIuCiAgICAgICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJEFuc3dlcklEVXAiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9hbnN3ZXIgU0VUICIuCiAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uID0gJFBvc2l0aW9uRG93biAiLgogICAgICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRQYXJhbXtBbnN3ZXJJRH0iCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9Cgo9aXRlbSBBbnN3ZXJHZXQoKQoKdG8gZ2V0IGFsbCBhdHRyaWJ1dGVzIG9mIGEgYW5zd2VyCgogICAgbXkgJUFuc3dlciA9ICRTdXJ2ZXlPYmplY3QtPkFuc3dlckdldCgKICAgICAgICBBbnN3ZXJJRCA9PiAxMjMKICAgICk7Cgo9Y3V0CgpzdWIgQW5zd2VyR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhBbnN3ZXJJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhBbnN3ZXJJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkLCBxdWVzdGlvbl9pZCwgYW5zd2VyLCBwb3NpdGlvbiwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAiLgogICAgICAgICJGUk9NIHN1cnZleV9hbnN3ZXIgV0hFUkUgaWQgPSAkUGFyYW17QW5zd2VySUR9IjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICBteSAlRGF0YSA9ICgpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7QW5zd2VySUR9ID0gJFJvd1swXTsKICAgICAgICAkRGF0YXtRdWVzdGlvbklEfSA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7QW5zd2VyfSA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7UG9zaXRpb259ID0gJFJvd1szXTsKICAgICAgICAkRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNF07CiAgICAgICAgJERhdGF7Q3JlYXRlQnl9ID0gJFJvd1s1XTsKICAgICAgICAkRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbNl07CiAgICAgICAgJERhdGF7Q2hhbmdlQnl9ID0gJFJvd1s3XTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gQW5zd2VyU2F2ZSgpCgp0byB1cGRhdGUgYW4gZXhpc3RpbmcgYW5zd2VyCgogICAgJFN1cnZleU9iamVjdC0+QW5zd2VyU2F2ZSgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBBbnN3ZXJJRCA9PiA2LAogICAgICAgIFF1ZXN0aW9uSUQgPT4gNCwKICAgICAgICBBbnN3ZXIgPT4gJ1RoZSBBbnN3ZXInLAogICAgKTsKCj1jdXQKCnN1YiBBbnN3ZXJTYXZlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhVc2VySUQgQW5zd2VySUQgUXVlc3Rpb25JRCBBbnN3ZXIpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoQW5zd2VyKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhVc2VySUQgQW5zd2VySUQgUXVlc3Rpb25JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CgogICAgaWYgKCRQYXJhbXtBbnN3ZXJ9KSB7CiAgICAgICAgbXkgJEN1cnJlbnRUaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgICAgICMgc3FsIGZvciBldmVudAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5X2Fuc3dlciBTRVQgIi4KICAgICAgICAgICAgICAgICJhbnN3ZXIgPSAnJFBhcmFte0Fuc3dlcn0nLCAiLgogICAgICAgICAgICAgICAgImNoYW5nZV90aW1lID0gJyRDdXJyZW50VGltZScsICIuCiAgICAgICAgICAgICAgICAiY2hhbmdlX2J5ID0gJFBhcmFte1VzZXJJRH0gIi4KICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRQYXJhbXtBbnN3ZXJJRH0gIiwKICAgICAgICAgICAgICAgICJBTkQgcXVlc3Rpb25faWQgPSAkUGFyYW17UXVlc3Rpb25JRH0iLAogICAgICAgICk7CiAgICB9Cn0KCj1pdGVtIEFuc3dlckNvdW50KCkKCnRvIGNvdW50IGFsbCBhbnN3ZXJzIG9mIGEgcXVlc3Rpb24KCiAgICBteSAkQ291bnRBbnN3ZXIgPSAkU3VydmV5T2JqZWN0LT5BbnN3ZXJDb3VudCgKICAgICAgICBRdWVzdGlvbklEID0+IDEyMwogICAgKTsKCj1jdXQKCnN1YiBBbnN3ZXJDb3VudCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgQ09VTlQoaWQpIEZST00gc3VydmV5X2Fuc3dlciBXSEVSRSBxdWVzdGlvbl9pZCA9ICRQYXJhbXtRdWVzdGlvbklEfSI7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwoKICAgIG15ICRDb3VudEFuc3dlciA9ICcnOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJENvdW50QW5zd2VyID0gJFJvd1swXTsKICAgIH0KICAgIHJldHVybiAkQ291bnRBbnN3ZXI7Cn0KCj1pdGVtIFZvdGVMaXN0KCkKCnRvIGdldCBhIGFycmF5IGxpc3Qgb2YgYWxsIHZvdGUgaXRlbXMKCiAgICBteSBATGlzdCA9ICRTdXJ2ZXlPYmplY3QtPlZvdGVMaXN0KAogICAgICAgIFN1cnZleUlEID0+IDEKICAgICk7Cgo9Y3V0CgpzdWIgVm90ZUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQExpc3QgPSAoKTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkLCB0aWNrZXRfaWQsIHNlbmRfdGltZSwgdm90ZV90aW1lICIuCiAgICAgICAgIkZST00gc3VydmV5X3JlcXVlc3QgV0hFUkUgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSAiLgogICAgICAgICJBTkQgdmFsaWRfaWQgPSAwIE9SREVSIEJZIHZvdGVfdGltZSBERVNDIjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICBteSAlRGF0YSA9ICgpOwoKICAgICAgICAkRGF0YXtSZXF1ZXN0SUR9ID0gJFJvd1swXTsKICAgICAgICAkRGF0YXtUaWNrZXRJRH0gPSAkUm93WzFdOwogICAgICAgICREYXRhe1NlbmRUaW1lfSA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7Vm90ZVRpbWV9ID0gJFJvd1szXTsKCiAgICAgICAgcHVzaChATGlzdCxcJURhdGEpOwogICAgfQogICAgcmV0dXJuIEBMaXN0Owp9Cgo9aXRlbSBWb3RlR2V0KCkKCnRvIGdldCBhbGwgYXR0cmlidXRlcyBvZiBhIHZvdGUKCiAgICBteSBAVm90ZSA9ICRTdXJ2ZXlPYmplY3QtPlZvdGVHZXQoCiAgICAgICAgUmVxdWVzdElEID0+IDEzLAogICAgICAgIFF1ZXN0aW9uSUQgPT4gMjMKICAgICk7Cgo9Y3V0CgpzdWIgVm90ZUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSBATGlzdCA9ICgpOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFJlcXVlc3RJRCBRdWVzdGlvbklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFJlcXVlc3RJRCBRdWVzdGlvbklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQsIHZvdGVfdmFsdWUgRlJPTSBzdXJ2ZXlfdm90ZSIuCiAgICAgICAgIiBXSEVSRSByZXF1ZXN0X2lkID0gJFBhcmFte1JlcXVlc3RJRH0gQU5EIHF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICBteSAlRGF0YSA9ICgpOwogICAgICAgICREYXRhe1JlcXVlc3RJRH0gPSAkUm93WzBdOwogICAgICAgICREYXRhe1ZvdGVWYWx1ZX0gPSAkUm93WzFdIHx8ICctJzsKICAgICAgICBwdXNoKEBMaXN0LCBcJURhdGEpOwogICAgfQogICAgcmV0dXJuIEBMaXN0Owp9Cgo9aXRlbSBDb3VudFZvdGUoKQoKdG8gY291bnQgYWxsIHZvdGVzIG9mIGEgc3VydmV5CgogICAgbXkgJENvdW50Vm90ZSA9ICRTdXJ2ZXlPYmplY3QtPkNvdW50Vm90ZSgKICAgICAgICBRdWVzdGlvbklEID0+IDEyMywKICAgICAgICBWb3RlVmFsdWUgPT4gJ1RoZSBWYWx1ZScsCiAgICApOwoKPWN1dAoKc3ViIENvdW50Vm90ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCBWb3RlVmFsdWUpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoVm90ZVZhbHVlKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgQ09VTlQodm90ZV92YWx1ZSkgRlJPTSBzdXJ2ZXlfdm90ZSBXSEVSRSAiLgogICAgICAgICJxdWVzdGlvbl9pZCA9ICRQYXJhbXtRdWVzdGlvbklEfSBBTkQgdm90ZV92YWx1ZSA9ICckUGFyYW17Vm90ZVZhbHVlfSciOwoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICBteSAlRGF0YSA9ICgpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7Q291bnRWb3RlfSA9ICRSb3dbMF07CiAgICB9CiAgICByZXR1cm4gJERhdGF7Q291bnRWb3RlfTsKfQoKPWl0ZW0gQ291bnRSZXF1ZXN0KCkKCnRvIGNvdW50IGFsbCByZXF1ZXN0cyBvZiBhIHN1cnZleQoKICAgIG15ICRDb3VudFJlcXVlc3QgPSAkU3VydmV5T2JqZWN0LT5Db3VudFJlcXVlc3QoCiAgICAgICAgUXVlc3Rpb25JRCA9PiAxMjMsCiAgICAgICAgVmFsaWRJRCA9PiAwLCAgICAgICAjICgwfDF8YWxsKQogICAgKTsKCj1jdXQKCnN1YiBDb3VudFJlcXVlc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEIFZhbGlkSUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoU3VydmV5SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICBteSAkU1FMID0gIlNFTEVDVCBDT1VOVChpZCkgRlJPTSBzdXJ2ZXlfcmVxdWVzdCBXSEVSRSBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IjsKCiAgICBpZiAoISRQYXJhbXtWYWxpZElEfSkgewogICAgICAgICRTUUwgLj0gIiBBTkQgdmFsaWRfaWQgPSAwIjsKICAgIH0KICAgIGVsc2lmICgkUGFyYW17VmFsaWRJRH0gZXEgMSkgewogICAgICAgICRTUUwgLj0gIiBBTkQgdmFsaWRfaWQgPSAxIjsKICAgIH0KCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgbXkgJURhdGEgPSAoKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICREYXRhe0NvdW50UmVxdWVzdH0gPSAkUm93WzBdOwogICAgfQogICAgcmV0dXJuICREYXRhe0NvdW50UmVxdWVzdH07Cn0KCj1pdGVtIEVsZW1lbnRFeGlzdHMoKQoKZXhpc3RzIGFuIHN1cnZleS0sIHF1ZXN0aW9uLSwgYW5zd2VyLSBvciByZXF1ZXN0LWVsZW1lbnQKCiAgICBteSAkQ291bnRSZXF1ZXN0ID0gJFN1cnZleU9iamVjdC0+RWxlbWVudEV4aXN0cygKICAgICAgICBJRCA9PiAxMjMsICAgICAgICAgICAjIFN1cnZleUlELCBRdWVzdGlvbklELCBBbnN3ZXJJRCwgUmVxdWVzdElECiAgICAgICAgRWxlbWVudCA9PiAnU3VydmV5JyAgIyBTdXJ2ZXksIFF1ZXN0aW9uLCBBbnN3ZXIsIFJlcXVlc3QKICAgICk7Cgo9Y3V0CgpzdWIgRWxlbWVudEV4aXN0cyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoRWxlbWVudElEIEVsZW1lbnQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoRWxlbWVudCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoRWxlbWVudElEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KCiAgICBteSAkRWxlbWVudEV4aXN0cyA9ICdObyc7CgogICAgaWYgKCRQYXJhbXtFbGVtZW50fSBlcSAnU3VydmV5JykgewogICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIENPVU5UKGlkKSBGUk9NIHN1cnZleSBXSEVSRSBpZCA9ICRQYXJhbXtFbGVtZW50SUR9IjsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgICAgIG15ICREYXRhID0gJyc7CiAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICREYXRhID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgaWYgKCREYXRhID4gMCkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cyA9ICdZZXMnOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICgkUGFyYW17RWxlbWVudH0gZXEgJ1F1ZXN0aW9uJykgewogICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIENPVU5UKGlkKSBGUk9NIHN1cnZleV9xdWVzdGlvbiBXSEVSRSBpZCA9ICRQYXJhbXtFbGVtZW50SUR9IjsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgICAgIG15ICREYXRhID0gJyc7CiAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICREYXRhID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgaWYgKCREYXRhID4gMCkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cyA9ICdZZXMnOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICgkUGFyYW17RWxlbWVudH0gZXEgJ0Fuc3dlcicpIHsKICAgICAgICBteSAkU1FMID0gIlNFTEVDVCBDT1VOVChpZCkgRlJPTSBzdXJ2ZXlfYW5zd2VyIFdIRVJFIGlkID0gJFBhcmFte0VsZW1lbnRJRH0iOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICAgICAgbXkgJERhdGEgPSAnJzsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJERhdGEgPSAkUm93WzBdOwogICAgICAgIH0KICAgICAgICBpZiAoJERhdGEgPiAwKSB7CiAgICAgICAgICAgICRFbGVtZW50RXhpc3RzID0gJ1llcyc7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCRQYXJhbXtFbGVtZW50fSBlcSAnUmVxdWVzdCcpIHsKICAgICAgICBteSAkU1FMID0gIlNFTEVDVCBDT1VOVChpZCkgRlJPTSBzdXJ2ZXlfcmVxdWVzdCBXSEVSRSBpZCA9ICRQYXJhbXtFbGVtZW50SUR9IjsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgICAgIG15ICREYXRhID0gJyc7CiAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICREYXRhID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgaWYgKCREYXRhID4gMCkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cyA9ICdZZXMnOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJEVsZW1lbnRFeGlzdHM7Cn0KCj1pdGVtIFJlcXVlc3RTZW5kKCkKCnRvIHNlbmQgYSByZXF1ZXN0IHRvIGEgY3VzdG9tZXIKCiAgICAkU3VydmV5T2JqZWN0LT5SZXF1ZXN0U2VuZCgKICAgICAgICBUaWNrZXRJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFJlcXVlc3RTZW5kIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRNYXN0ZXJJRCA9ICcnOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFRpY2tldElEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFRpY2tldElEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgY3JlYXRlIFB1YmxpY1N1cnZleUtleQogICAgbXkgJG1kNSA9IERpZ2VzdDo6TUQ1LT5uZXcoKTsKICAgICRtZDUtPmFkZCgkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkgLiBpbnQocmFuZCg5OTk5OTk5OTkpKSk7CiAgICBteSAkUHVibGljU3VydmV5S2V5ID0gJG1kNS0+aGV4ZGlnZXN0OwoKICAgICMgZmluZCBtYXN0ZXIgc3VydmV5CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBpZCBGUk9NIHN1cnZleSBXSEVSRSBzdGF0dXMgPSAnTWFzdGVyJyIKICAgICk7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkTWFzdGVySUQgPSAkUm93WzBdOwogICAgfQogICAgIyBpZiBtYXN0ZXIgc3VydmV5IGV4aXN0cwogICAgaWYgKCRNYXN0ZXJJRCAmJiAkTWFzdGVySUQgPiAwKSB7CiAgICAgICAgbXkgJFN1YmplY3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VydmV5OjpOb3RpZmljYXRpb25TdWJqZWN0Jyk7CiAgICAgICAgbXkgJEJvZHkgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VydmV5OjpOb3RpZmljYXRpb25Cb2R5Jyk7CiAgICAgICAgIyB0aWNrZXQgZGF0YQogICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldChUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9KTsKICAgICAgICBmb3JlYWNoIChrZXlzICVUaWNrZXQpIHsKICAgICAgICAgICAgaWYgKGRlZmluZWQoJFRpY2tldHskX30pKSB7CiAgICAgICAgICAgICAgICAkU3ViamVjdCA9fiBzLzxPVFJTX1RJQ0tFVF8kXz4vJFRpY2tldHskX30vZ2k7CiAgICAgICAgICAgICAgICAkQm9keSA9fiBzLzxPVFJTX1RJQ0tFVF8kXz4vJFRpY2tldHskX30vZ2k7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyBjbGVhbnVwCiAgICAgICAgJFN1YmplY3QgPX4gcy88T1RSU19USUNLRVRfLis/Pi8tL2dpOwogICAgICAgICRCb2R5ID1+IHMvPE9UUlNfVElDS0VUXy4rPz4vLS9naTsKICAgICAgICAjIHJlcGxhY2UgY29uZmlnIG9wdGlvbnMKICAgICAgICAkU3ViamVjdCA9fiBzezxPVFJTX0NPTkZJR18oLis/KT59eyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCQxKX1lZ3g7CiAgICAgICAgJEJvZHkgPX4gc3s8T1RSU19DT05GSUdfKC4rPyk+fXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgkMSl9ZWd4OwogICAgICAgICMgY2xlYW51cAogICAgICAgICRTdWJqZWN0ID1+IHMvPE9UUlNfQ09ORklHXy4rPz4vLS9naTsKICAgICAgICAkQm9keSA9fiBzLzxPVFJTX0NPTkZJR18uKz8+Ly0vZ2k7CiAgICAgICAgIyBnZXQgY3VzdG9tZXIgZGF0YSBhbmQgcmVwbGFjZSBpdCB3aXRoIDxPVFJTX0NVU1RPTUVSX0RBVEFfLi4uCiAgICAgICAgbXkgJUN1c3RvbWVyVXNlciA9ICgpOwogICAgICAgIGlmICgkVGlja2V0e0N1c3RvbWVyVXNlcklEfSkgewogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyByZXBsYWNlIGN1c3RvbWVyIHN0dWZmIHdpdGggdGFncwogICAgICAgICAgICBmb3JlYWNoIChrZXlzICVDdXN0b21lclVzZXIpIHsKICAgICAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJVc2VyeyRffSkgewogICAgICAgICAgICAgICAgICAgICRTdWJqZWN0ID1+IHMvPE9UUlNfQ1VTVE9NRVJfREFUQV8kXz4vJEN1c3RvbWVyVXNlcnskX30vZ2k7CiAgICAgICAgICAgICAgICAgICAgJEJvZHkgPX4gcy88T1RSU19DVVNUT01FUl9EQVRBXyRfPi8kQ3VzdG9tZXJVc2VyeyRffS9naTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIGNsZWFudXAgYWxsIG5vdCBuZWVkZWQgPE9UUlNfQ1VTVE9NRVJfREFUQV8gdGFncwogICAgICAgICRTdWJqZWN0ID1+IHMvPE9UUlNfQ1VTVE9NRVJfREFUQV8uKz8+Ly0vZ2k7CiAgICAgICAgJEJvZHkgPX4gcy88T1RSU19DVVNUT01FUl9EQVRBXy4rPz4vLS9naTsKICAgICAgICAjIHJlcGxhY2Uga2V5CiAgICAgICAgJFN1YmplY3QgPX4gcy88T1RSU19QdWJsaWNTdXJ2ZXlLZXk+LyRQdWJsaWNTdXJ2ZXlLZXkvZ2k7CiAgICAgICAgJEJvZHkgPX4gcy88T1RSU19QdWJsaWNTdXJ2ZXlLZXk+LyRQdWJsaWNTdXJ2ZXlLZXkvZ2k7CiAgICAgICAgbXkgJFRvID0gJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9OwogICAgICAgIGlmICghJFRvKSB7CiAgICAgICAgICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlTGFzdEN1c3RvbWVyQXJ0aWNsZSgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUbyA9ICRBcnRpY2xle0Zyb219OwogICAgICAgIH0KICAgICAgICBpZiAoJFRvKSB7CiAgICAgICAgICAgICMgY2hlY2sgaWYgbm90IHN1cnZleSBzaG91bGQgYmUgc2VuZAogICAgICAgICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cnZleTo6U2VuZE5vU3VydmV5UmVnRXhwJykpIHsKICAgICAgICAgICAgICAgIGlmICgkVG8gPX4gLyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXJ2ZXk6OlNlbmROb1N1cnZleVJlZ0V4cCcpL2kpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAjIGNoZWNrIGlmIGEgc3VydmV5IGlzIHNlbnQgaW4gdGhlIGxhc3QgdGltZQogICAgICAgICAgICBpZiAoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cnZleTo6U2VuZFBlcmlvZCcpKSB7CiAgICAgICAgICAgICAgICBteSAkTGFzdFNlbnRUaW1lID0gMDsKICAgICAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIHNlbmRfdGltZSBGUk9NICIuCiAgICAgICAgICAgICAgICAgICAgICAgICJzdXJ2ZXlfcmVxdWVzdCBXSEVSRSBzZW5kX3RvID0gJyIuJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRUbykuIiciCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICAgICAgICAgJExhc3RTZW50VGltZSA9ICRSb3dbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJExhc3RTZW50VGltZSkgewogICAgICAgICAgICAgICAgICAgICRMYXN0U2VudFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRMYXN0U2VudFRpbWUsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKCRMYXN0U2VudFRpbWUrKCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXJ2ZXk6OlNlbmRQZXJpb2QnKSo2MCo2MCoyNCkpID4KICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAjIGNyZWF0ZSBhIHN1cnZleV9yZXF1ZXN0IGVudHJ5CiAgICAgICAgICAgIG15ICRDdXJyZW50VGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBzdXJ2ZXlfcmVxdWVzdCAiLgogICAgICAgICAgICAgICAgICAgICIgKHRpY2tldF9pZCwgc3VydmV5X2lkLCB2YWxpZF9pZCwgcHVibGljX3N1cnZleV9rZXksIHNlbmRfdG8sIHNlbmRfdGltZSkgIi4KICAgICAgICAgICAgICAgICAgICAiIFZBTFVFUyAoIi4KICAgICAgICAgICAgICAgICAgICAiJFBhcmFte1RpY2tldElEfSwgIi4KICAgICAgICAgICAgICAgICAgICAiJE1hc3RlcklELCAiLgogICAgICAgICAgICAgICAgICAgICIxLCAiLgogICAgICAgICAgICAgICAgICAgICInIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFB1YmxpY1N1cnZleUtleSkuIicsICIuCiAgICAgICAgICAgICAgICAgICAgIiciLiRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkVG8pLiInLCAiLgogICAgICAgICAgICAgICAgICAgICInJEN1cnJlbnRUaW1lJykiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgbG9nIGFjdGlvbiBvbiB0aWNrZXQKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJ01pc2MnLAogICAgICAgICAgICAgICAgTmFtZSA9PiAiU2VudCBjdXN0b21lciBzdXJ2ZXkgdG8gJFRvLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgc2VuZCBzdXJ2ZXkKICAgICAgICAgICAgJFNlbGYtPntTZW5kbWFpbE9iamVjdH0tPlNlbmQoCiAgICAgICAgICAgICAgICBGcm9tID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXJ2ZXk6Ok5vdGlmaWNhdGlvblNlbmRlcicpIHx8ICcnLAogICAgICAgICAgICAgICAgVG8gPT4gJFRvLAogICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkU3ViamVjdCwKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgQ2hhcnNldCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSwKICAgICAgICAgICAgICAgIEJvZHkgPT4gJEJvZHksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFB1YmxpY1N1cnZleUdldCgpCgp0byBnZXQgYWxsIHB1YmxpYyBhdHRyaWJ1dGVzIG9mIGEgc3VydmV5CgogICAgbXkgJVB1YmxpY1N1cnZleSA9ICRTdXJ2ZXlPYmplY3QtPlB1YmxpY1N1cnZleUdldCgKICAgICAgICBQdWJsaWNTdXJ2ZXlLZXkgPT4gJ0F3NWRlM1hmNXFBJywKICAgICk7Cgo9Y3V0CgpzdWIgUHVibGljU3VydmV5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhQdWJsaWNTdXJ2ZXlLZXkpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBzdXJ2ZXlfaWQgIi4KICAgICAgICAiRlJPTSBzdXJ2ZXlfcmVxdWVzdCBXSEVSRSBwdWJsaWNfc3VydmV5X2tleSA9ICckUGFyYW17UHVibGljU3VydmV5S2V5fScgQU5EIHZhbGlkX2lkID0gMSIKICAgICk7CgogICAgbXkgJFN1cnZleUlEID0gKCk7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkU3VydmV5SUQgPSAkUm93WzBdOwogICAgfQoKICAgIGlmICgkU3VydmV5SUQpIHsKICAgICAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgc3VydmV5bnVtYmVyLCB0aXRsZSwgaW50cm9kdWN0aW9uICIuCiAgICAgICAgICAgICJGUk9NIHN1cnZleSBXSEVSRSBpZCA9ICRTdXJ2ZXlJRCBBTkQgKHN0YXR1cyA9ICdNYXN0ZXInIE9SIHN0YXR1cyA9ICdWYWxpZCcpIjsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICAgICAgbXkgQFN1cnZleSA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCk7CgogICAgICAgIG15ICVEYXRhID0gKCk7CiAgICAgICAgaWYgKCRTdXJ2ZXlbMF0pIHsKICAgICAgICAgICAgJERhdGF7U3VydmV5SUR9ID0gJFN1cnZleVswXTsKICAgICAgICAgICAgJERhdGF7U3VydmV5TnVtYmVyfSA9ICRTdXJ2ZXlbMV07CiAgICAgICAgICAgICREYXRhe1RpdGxlfSA9ICRTdXJ2ZXlbMl07CiAgICAgICAgICAgICREYXRhe0ludHJvZHVjdGlvbn0gPSAkU3VydmV5WzNdOwogICAgICAgICAgICByZXR1cm4gJURhdGE7CiAgICAgICAgfQogICAgfQp9Cgo9aXRlbSBQdWJsaWNBbnN3ZXJTYXZlKCkKCnRvIHNhdmUgYSBwdWJsaWMgdm90ZQoKICAgICRTdXJ2ZXlPYmplY3QtPlB1YmxpY0Fuc3dlclNhdmUoCiAgICAgICAgUHVibGljU3VydmV5S2V5ID0+ICdhVmtkRTgyRHcycXc2ZXJDZGEnLAogICAgICAgIFF1ZXN0aW9uSUQgPT4gNCwKICAgICAgICBWb3RlVmFsdWUgPT4gJ1RoZSBWYWx1ZScsCiAgICApOwoKPWN1dAoKc3ViIFB1YmxpY0Fuc3dlclNhdmV7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUHVibGljU3VydmV5S2V5IFF1ZXN0aW9uSUQgVm90ZVZhbHVlKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFB1YmxpY1N1cnZleUtleSBWb3RlVmFsdWUpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99KTsKICAgIH0KICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBpZCAiLgogICAgICAgICIgRlJPTSBzdXJ2ZXlfcmVxdWVzdCBXSEVSRSBwdWJsaWNfc3VydmV5X2tleSA9ICckUGFyYW17UHVibGljU3VydmV5S2V5fScgQU5EIHZhbGlkX2lkID0gMSIKICAgICk7CgogICAgbXkgJFJlcXVlc3RJRCA9ICgpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJFJlcXVlc3RJRCA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCRSZXF1ZXN0SUQpIHsKICAgICAgICBteSAkQ3VycmVudFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIHN1cnZleV92b3RlIChyZXF1ZXN0X2lkLCBxdWVzdGlvbl9pZCwgdm90ZV92YWx1ZSwgY3JlYXRlX3RpbWUpIFZBTFVFUyAoIi4KICAgICAgICAgICAgICAgICIkUmVxdWVzdElELCAiLgogICAgICAgICAgICAgICAgIiRQYXJhbXtRdWVzdGlvbklEfSwgIi4KICAgICAgICAgICAgICAgICInJFBhcmFte1ZvdGVWYWx1ZX0nLCAiLgogICAgICAgICAgICAgICAgIickQ3VycmVudFRpbWUnKSIKICAgICAgICApOwogICAgfQp9Cgo9aXRlbSBQdWJsaWNTdXJ2ZXlJbnZhbGlkU2V0KCkKCnRvIHNldCBhIHJlcXVlc3QgaW52YWxpZAoKICAgICRTdXJ2ZXlPYmplY3QtPlB1YmxpY1N1cnZleUludmFsaWRTZXQoCiAgICAgICAgUHVibGljU3VydmV5S2V5ID0+ICdhVmtkRTgyRHcycXc2ZXJDZGEnLAogICAgKTsKCj1jdXQKCnN1YiBQdWJsaWNTdXJ2ZXlJbnZhbGlkU2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhQdWJsaWNTdXJ2ZXlLZXkpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUHVibGljU3VydmV5S2V5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIGlkICIuCiAgICAgICAgIiBGUk9NIHN1cnZleV9yZXF1ZXN0IFdIRVJFIHB1YmxpY19zdXJ2ZXlfa2V5ID0gJyRQYXJhbXtQdWJsaWNTdXJ2ZXlLZXl9JyIKICAgICk7CgogICAgbXkgJFJlcXVlc3RJRCA9ICgpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJFJlcXVlc3RJRCA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCRSZXF1ZXN0SUQpIHsKICAgICAgICBteSAkQ3VycmVudFRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXlfcmVxdWVzdCBTRVQgIi4KICAgICAgICAgICAgICAgICJ2YWxpZF9pZCA9IDAsICIuCiAgICAgICAgICAgICAgICAidm90ZV90aW1lID0gJyRDdXJyZW50VGltZScgIi4KICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRSZXF1ZXN0SUQiCiAgICAgICAgKTsKICAgIH0KfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMxICQgJERhdGU6IDIwMDcvMDUvMTYgMTA6MjA6NTQgJAoKPWN1dA==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L0V2ZW50L1N1cnZleVNlbmRSZXF1ZXN0LnBtIC0gc2VuZCBzdXJ2ZXkgcmVxdWVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNiBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRJZDogU3VydmV5U2VuZFJlcXVlc3QucG0sdiAxLjYgMjAwNi8xMS8yMSAyMzoyNTowMyBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlN1cnZleVNlbmRSZXF1ZXN0OwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS42ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IFRpY2tldE9iamVjdCBMb2dPYmplY3QgVXNlck9iamVjdCBDdXN0b21lclVzZXJPYmplY3QgU2VuZG1haWxPYmplY3QgVGltZU9iamVjdCBFbmNvZGVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN1cnZleS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhUaWNrZXRJRCBFdmVudCBDb25maWcpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoJFBhcmFte0V2ZW50fSBlcSAnU3RhdGVTZXQnIHx8ICRQYXJhbXtFdmVudH0gZXEgJ1RpY2tldFN0YXRlVXBkYXRlJykgewogICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldChUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9KTsKICAgICAgICBpZiAoJFRpY2tldHtTdGF0ZVR5cGV9IGVxICdjbG9zZWQnKXsKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5SZXF1ZXN0U2VuZChUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTs=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50U3VydmV5LnBtIC0gYSBzdXJ2ZXkgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkSWQ6IEFnZW50U3VydmV5LnBtLHYgMS4yOCAyMDA2LzEyLzA5IDAwOjM2OjMyIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50U3VydmV5OwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yOCAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgT3BqZWN0cwogICAgZm9yZWFjaCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCEkU2VsZi0+eyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiR290IG5vICRfISIpCiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN1cnZleS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRPdXRwdXQ7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzdXJ2ZXkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdXJ2ZXknKSB7CiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJNZXNzYWdlIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXkgZXhpc3RzCiAgICAgICAgaWYgKCRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFN1cnZleUlELCBFbGVtZW50ID0+ICdTdXJ2ZXknKSBuZSAnWWVzJykgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ1N1cnZleScpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgIyBvdXRwdXQgbWVzYWdlcyBpZiBzdGF0dXMgd2FzIGNoYW5nZWQKICAgICAgICBpZiAoZGVmaW5lZCgkTWVzc2FnZSkgJiYgJE1lc3NhZ2UgZXEgJ05vUXVlc3Rpb24nKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyA9PiAnQ2FuXCd0IHNldCBuZXcgU3RhdHVzISBObyBRdWVzdGlvbiBkZWZpbmllZC4nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoZGVmaW5lZCgkTWVzc2FnZSkgJiYgJE1lc3NhZ2UgZXEgJ0luY29tcGxldGVRdWVzdGlvbicpIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBJbmZvID0+ICdDYW5cJ3Qgc2V0IG5ldyBTdGF0dXMhIFF1ZXN0aW9uKHMpIGluY29tcGxldGUuJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKGRlZmluZWQoJE1lc3NhZ2UpICYmICRNZXNzYWdlIGVxICdTdGF0dXNTZXQnKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnTm90aWNlJywKICAgICAgICAgICAgICAgIEluZm8gPT4gJ05ldyBTdGF0dXMgYWt0aXYhJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgIyBnZXQgYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIHN1cnZleQogICAgICAgIG15ICVTdXJ2ZXkgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlN1cnZleUdldChTdXJ2ZXlJRCA9PiAkU3VydmV5SUQpOwogICAgICAgICMga29udmVydCB0aGUgdGV4dGFyZWFzIGluIGh0bWwgKFxuIC0tPjxicj4pCiAgICAgICAgJFN1cnZleXtJbnRyb2R1Y3Rpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ID0+ICRTdXJ2ZXl7SW50cm9kdWN0aW9ufSwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICApOwogICAgICAgICRTdXJ2ZXl7RGVzY3JpcHRpb259ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ID0+ICRTdXJ2ZXl7RGVzY3JpcHRpb259LAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgIyBnZXQgbnVtYmVycyBvZiByZXF1ZXN0cyBhbmQgdm90ZXMKICAgICAgICBteSAkU2VuZFJlcXVlc3QgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkNvdW50UmVxdWVzdChTdXJ2ZXlJRCA9PiAkU3VydmV5SUQsIFZhbGlkSUQgPT4gJ2FsbCcpOwogICAgICAgIG15ICRSZXF1ZXN0Q29tcGxldGUgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkNvdW50UmVxdWVzdChTdXJ2ZXlJRCA9PiAkU3VydmV5SUQsIFZhbGlkSUQgPT4gMCk7CiAgICAgICAgJFN1cnZleXtTZW5kUmVxdWVzdH0gPSAkU2VuZFJlcXVlc3Q7CiAgICAgICAgJFN1cnZleXtSZXF1ZXN0Q29tcGxldGV9ID0gJFJlcXVlc3RDb21wbGV0ZTsKICAgICAgICAjIHByaW50IHRoZSBtYWluIHRhYmxlLgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleScsCiAgICAgICAgICAgIERhdGEgPT4geyVTdXJ2ZXl9LAogICAgICAgICk7CiAgICAgICAgIyBkaXNwbGF5IHN0YXRzIGlmIHN0YXR1cyBNYXN0ZXIsIFZhbGlkIG9yIEludmFsaWQKICAgICAgICBpZiAoJFN1cnZleXtTdGF0dXN9IGVxICdNYXN0ZXInIHx8ICRTdXJ2ZXl7U3RhdHVzfSBlcSAnVmFsaWQnIHx8ICRTdXJ2ZXl7U3RhdHVzfSBlcSAnSW52YWxpZCcpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRTdGF0cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHtTdXJ2ZXlJRCA9PiAkU3VydmV5SUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIGdldCBhbGwgcXVlc3Rpb25zIG9mIHRoZSBzdXJ2ZXkKICAgICAgICAgICAgbXkgQFF1ZXN0aW9uTGlzdCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25MaXN0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CgogICAgICAgICAgICBmb3JlYWNoIG15ICRRdWVzdGlvbihAUXVlc3Rpb25MaXN0KSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRTdGF0c1F1ZXN0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgQEFuc3dlcnMgPSAoKTsKICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgdGhlIGFuc3dlcnMgb2YgdGhlIHF1ZXN0aW9uCiAgICAgICAgICAgICAgICBpZiAoJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1llc05vJyB8fCAkUXVlc3Rpb24tPntUeXBlfSBlcSAnUmFkaW8nIHx8ICRRdWVzdGlvbi0+e1R5cGV9IGVxICdDaGVja2JveCcgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFuc3dlckxpc3QgPSAoKTsKICAgICAgICAgICAgICAgICAgICAjIHNldCBhbnN3ZXJzIHRvIFllcyBhbmQgTm8gaWYgdHlwZSB3YXMgWWVzTm8KICAgICAgICAgICAgICAgICAgICBpZiAoJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1llc05vJykgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtBbnN3ZXJ9ID0gIlllcyI7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0Fuc3dlcklEfSA9ICJZZXMiOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKEBBbnN3ZXJMaXN0LFwlRGF0YSk7CgogICAgICAgICAgICAgICAgICAgICAgICBteSAlRGF0YTIgPSAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGEye0Fuc3dlcn0gPSAiTm8iOwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YTJ7QW5zd2VySUR9ID0gIk5vIjsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChAQW5zd2VyTGlzdCxcJURhdGEyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IGFsbCBhbnN3ZXJzIG9mIGEgcXVlc3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgQEFuc3dlckxpc3QgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlckxpc3QoUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb24tPntRdWVzdGlvbklEfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRSb3coQEFuc3dlckxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJENvdW50Vm90ZSA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+Q291bnRWb3RlKFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uLT57UXVlc3Rpb25JRH0sIFZvdGVWYWx1ZSA9PiAkUm93LT57QW5zd2VySUR9KTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFBlcmNlbnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAjIGNhbGN1bGF0ZSB0aGUgcGVyY2VudHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRSZXF1ZXN0Q29tcGxldGUgbmUgJzAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGVyY2VudCA9IDEwMCAvICRSZXF1ZXN0Q29tcGxldGUgKiAkQ291bnRWb3RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFBlcmNlbnQgPSBzcHJpbnRmICgiJS4wZiIsICRQZXJjZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJURhdGEgPSAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7QW5zd2VyfSA9ICRSb3ctPntBbnN3ZXJ9OwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtBbnN3ZXJQZXJjZW50fSA9ICRQZXJjZW50OwoKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChAQW5zd2VycyxcJURhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkUXVlc3Rpb24tPntUeXBlfSBlcSAnVGV4dGFyZWEnICkgewogICAgICAgICAgICAgICAgICAgIG15ICRBbnN3ZXJObyA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+Q291bnRWb3RlKFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uLT57UXVlc3Rpb25JRH0sIFZvdGVWYWx1ZSA9PiAnJyk7CiAgICAgICAgICAgICAgICAgICAgbXkgJFBlcmNlbnQgPSAwOwogICAgICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIHRoZSBwZXJjZW50cwogICAgICAgICAgICAgICAgICAgIGlmICgkUmVxdWVzdENvbXBsZXRlIG5lICcwJykgewogICAgICAgICAgICAgICAgICAgICAgICAkUGVyY2VudCA9IDEwMCAvICRSZXF1ZXN0Q29tcGxldGUgKiAkQW5zd2VyTm87CiAgICAgICAgICAgICAgICAgICAgICAgICRQZXJjZW50ID0gc3ByaW50ZiAoIiUuMGYiLCAkUGVyY2VudCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICREYXRhe0Fuc3dlcn0gPSAiYW5zd2VyZWQiOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJFJlcXVlc3RDb21wbGV0ZSBlcSAnMCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7QW5zd2VyUGVyY2VudH0gPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7QW5zd2VyUGVyY2VudH0gPSAxMDAgLSAkUGVyY2VudDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHB1c2goQEFuc3dlcnMsXCVEYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJURhdGEyID0gKCk7CiAgICAgICAgICAgICAgICAgICAgJERhdGEye0Fuc3dlcn0gPSAibm90IGFuc3dlcmVkIjsKICAgICAgICAgICAgICAgICAgICAkRGF0YTJ7QW5zd2VyUGVyY2VudH0gPSAkUGVyY2VudDsKCiAgICAgICAgICAgICAgICAgICAgcHVzaChAQW5zd2VycywgXCVEYXRhMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIG91dHB1dCBhbGwgYW5zd2VycyBvZiB0aGUgc3VydmV5CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRSb3cgKEBBbnN3ZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgJFJvdy0+e0Fuc3dlclBlcmNlbnRUYWJsZX0gPSAkUm93LT57QW5zd2VyUGVyY2VudH07CgogICAgICAgICAgICAgICAgICAgIGlmICgkUm93LT57QW5zd2VyUGVyY2VudH0gZXEgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkUm93LT57QW5zd2VyUGVyY2VudFRhYmxlfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlFZGl0U3RhdHNBbnN3ZXInLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRSb3csCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFJlcXVlc3RDb21wbGV0ZSA+IDApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3VydmV5RWRpdFN0YXRzRGV0YWlscycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUlEID0+ICRTdXJ2ZXlJRCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIG91dHB1dCB0aGUgcG9zc2libGUgc3RhdHVzCiAgICAgICAgbXkgJU5ld1N0YXR1czsKICAgICAgICBpZiAoJFN1cnZleXtTdGF0dXN9IGVxICdOZXcnIHx8ICRTdXJ2ZXl7U3RhdHVzfSBlcSAnSW52YWxpZCcpIHsKICAgICAgICAgICAgJE5ld1N0YXR1c3snTWFzdGVyJ30gPSAnTWFzdGVyJzsKICAgICAgICAgICAgJE5ld1N0YXR1c3snVmFsaWQnfSA9ICdWYWxpZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkU3VydmV5e1N0YXR1c30gZXEgJ1ZhbGlkJykgewogICAgICAgICAgICAkTmV3U3RhdHVzeydNYXN0ZXInfSA9ICdNYXN0ZXInOwogICAgICAgICAgICAkTmV3U3RhdHVzeydJbnZhbGlkJ30gPSAnSW52YWxpZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkU3VydmV5e1N0YXR1c30gZXEgJ01hc3RlcicpIHsKICAgICAgICAgICAgJE5ld1N0YXR1c3snVmFsaWQnfSA9ICdWYWxpZCc7CiAgICAgICAgICAgICROZXdTdGF0dXN7J0ludmFsaWQnfSA9ICdJbnZhbGlkJzsKICAgICAgICB9CiAgICAgICAgbXkgJE5ld1N0YXR1c1N0ciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3B0aW9uU3RyZ0hhc2hSZWYoCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1N0YXR1cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVOZXdTdGF0dXMsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlTdGF0dXMnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5ld1N0YXR1c1N0ciA9PiAkTmV3U3RhdHVzU3RyLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRTdXJ2ZXknLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzdXJ2ZXkgc3RhdHVzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3VydmV5U3RhdHVzJykgewogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICBteSAkTmV3U3RhdHVzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJOZXdTdGF0dXMiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQogICAgICAgICMgc2V0IGEgbmV3IHN0YXR1cwogICAgICAgIG15ICRTdGF0dXNTZXQgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlN1cnZleVN0YXR1c1NldCgKICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICBOZXdTdGF0dXMgPT4gJE5ld1N0YXR1cwogICAgICAgICk7CgogICAgICAgIG15ICRNZXNzYWdlID0gJyc7CiAgICAgICAgaWYgKGRlZmluZWQoJFN0YXR1c1NldCkgJiYgJFN0YXR1c1NldCBlcSAnTm9RdWVzdGlvbicpIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAnJk1lc3NhZ2U9Tm9RdWVzdGlvbic7CiAgICAgICAgfQogICAgICAgIGVsc2lmIChkZWZpbmVkKCRTdGF0dXNTZXQpICYmICRTdGF0dXNTZXQgZXEgJ0luY29tcGxldGVRdWVzdGlvbicpIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAnJk1lc3NhZ2U9SW5jb21wbGV0ZVF1ZXN0aW9uJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKGRlZmluZWQoJFN0YXR1c1NldCkgJiYgJFN0YXR1c1NldCBlcSAnU3RhdHVzU2V0JykgewogICAgICAgICAgICAkTWVzc2FnZSA9ICcmTWVzc2FnZT1TdGF0dXNTZXQnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVN1cnZleSZTdXJ2ZXlJRD0kU3VydmV5SUQkTWVzc2FnZSIpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgc3VydmV5IGVkaXQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdXJ2ZXlFZGl0JykgewogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAnU3VydmV5Jyk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgbXkgJVN1cnZleSA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+U3VydmV5R2V0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CgogICAgICAgICMgcHJpbnQgdGhlIG1haW4gdGFibGUuCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3VydmV5RWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4geyVTdXJ2ZXl9LAogICAgICAgICk7CgogICAgICAgIG15IEBMaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvbkxpc3QoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKCiAgICAgICAgaWYgKCRTdXJ2ZXl7U3RhdHVzfSBlcSAnTmV3JykgewogICAgICAgICAgICBmb3JlYWNoIG15ICRRdWVzdGlvbihATGlzdCkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlFZGl0UXVlc3Rpb25zJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJEFuc3dlckNvdW50ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJDb3VudChRdWVzdGlvbklEID0+ICRRdWVzdGlvbi0+e1F1ZXN0aW9uSUR9KTsKCiAgICAgICAgICAgICAgICBpZiAoJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1JhZGlvJyB8fCAkUXVlc3Rpb24tPntUeXBlfSBlcSAnQ2hlY2tib3gnKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBbnN3ZXJDb3VudCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRRdWVzdGlvbnNJbmNvbXBsZXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFF1ZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRRdWVzdGlvbnNDb21wbGV0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlFZGl0UXVlc3Rpb25zQ29tcGxldGUnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlFZGl0TmV3UXVlc3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFF1ZXN0aW9uKEBMaXN0KSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRRdWVzdGlvbnNWYWxpZE9uY2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFF1ZXN0aW9uLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFN1cnZleScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHN1cnZleSBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3VydmV5U2F2ZScpIHsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJFRpdGxlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJUaXRsZSIpOwogICAgICAgIG15ICRJbnRyb2R1Y3Rpb24gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkludHJvZHVjdGlvbiIpOwogICAgICAgIG15ICREZXNjcmlwdGlvbiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiRGVzY3JpcHRpb24iKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQogICAgICAgIGlmICgkVGl0bGUgJiYgJEludHJvZHVjdGlvbiAmJiAkRGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5TdXJ2ZXlTYXZlKAogICAgICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICAgICAgVGl0bGUgPT4gJFRpdGxlLAogICAgICAgICAgICAgICAgSW50cm9kdWN0aW9uID0+ICRJbnRyb2R1Y3Rpb24sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkRGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVN1cnZleSZTdXJ2ZXlJRD0kU3VydmV5SUQjUXVlc3Rpb24iKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TdXJ2ZXlFZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCIpOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHN1cnZleSBhZGQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdXJ2ZXlBZGQnKSB7CiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdTdXJ2ZXkgQWRkJyk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBwcmludCB0aGUgbWFpbiB0YWJsZS4KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlBZGQnLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRTdXJ2ZXknLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzdXJ2ZXkgbmV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3VydmV5TmV3JykgewogICAgICAgIG15ICRUaXRsZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiVGl0bGUiKTsKICAgICAgICBteSAkSW50cm9kdWN0aW9uID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iKTsKICAgICAgICBteSAkRGVzY3JpcHRpb24gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkRlc2NyaXB0aW9uIik7CgogICAgICAgIGlmICgkVGl0bGUgJiYgJEludHJvZHVjdGlvbiAmJiAkRGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5TdXJ2ZXlOZXcoCiAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVGl0bGUsCiAgICAgICAgICAgICAgICBJbnRyb2R1Y3Rpb24gPT4gJEludHJvZHVjdGlvbiwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICREZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249U3VydmV5JlN1cnZleUlEPSRTdXJ2ZXlJRCIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVN1cnZleUFkZCIpOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHF1ZXN0aW9uIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1F1ZXN0aW9uQWRkJykgewogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICBteSAkUXVlc3Rpb24gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uIik7CiAgICAgICAgbXkgJFR5cGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlR5cGUiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICBpZiAoJFF1ZXN0aW9uKSB7CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25BZGQoCiAgICAgICAgICAgICAgICBTdXJ2ZXlJRCA9PiAkU3VydmV5SUQsCiAgICAgICAgICAgICAgICBRdWVzdGlvbiA9PiAkUXVlc3Rpb24sCiAgICAgICAgICAgICAgICBUeXBlID0+ICRUeXBlLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25Tb3J0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249U3VydmV5RWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQjTmV3UXVlc3Rpb24iKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHF1ZXN0aW9uIGRlbGV0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1F1ZXN0aW9uRGVsZXRlJykgewogICAgICAgIG15ICRRdWVzdGlvbklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbklEIik7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvbkRlbGV0ZSgKICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICBRdWVzdGlvbklEID0+ICRRdWVzdGlvbklELAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25Tb3J0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TdXJ2ZXlFZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCNRdWVzdGlvbiIpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgcXVlc3Rpb24gdXAKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdRdWVzdGlvblVwJykgewogICAgICAgIG15ICRRdWVzdGlvbklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbklEIik7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblNvcnQoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKCiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblVwKAogICAgICAgICAgICBTdXJ2ZXlJRCA9PiAkU3VydmV5SUQsCiAgICAgICAgICAgIFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVN1cnZleUVkaXQmU3VydmV5SUQ9JFN1cnZleUlEI1F1ZXN0aW9uIik7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBxdWVzdGlvbiBkb3duCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUXVlc3Rpb25Eb3duJykgewogICAgICAgIG15ICRRdWVzdGlvbklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbklEIik7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblNvcnQoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKCiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvbkRvd24oCiAgICAgICAgICAgIFN1cnZleUlEID0+ICRTdXJ2ZXlJRCwKICAgICAgICAgICAgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249U3VydmV5RWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQjUXVlc3Rpb24iKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHF1ZXN0aW9uIGVkaXQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdRdWVzdGlvbkVkaXQnKSB7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgIG15ICRRdWVzdGlvbklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbklEIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXkgYW5kIHF1ZXN0aW9uIGV4aXN0cwogICAgICAgIGlmICgkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRTdXJ2ZXlJRCwgRWxlbWVudCA9PiAnU3VydmV5JykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkUXVlc3Rpb25JRCwgRWxlbWVudCA9PiAnUXVlc3Rpb24nKSBuZSAnWWVzJykgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ1F1ZXN0aW9uIEVkaXQnKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICBteSAlU3VydmV5ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5TdXJ2ZXlHZXQoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKICAgICAgICBteSAlUXVlc3Rpb24gPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlF1ZXN0aW9uR2V0KFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQpOwoKICAgICAgICAjIHByaW50IHRoZSBtYWluIHRhYmxlLgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1F1ZXN0aW9uRWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4geyVRdWVzdGlvbn0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRRdWVzdGlvbntUeXBlfSBlcSAnWWVzTm8nKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQxJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRRdWVzdGlvbntUeXBlfSBlcSAnUmFkaW8nKSB7CiAgICAgICAgICAgIG15IEBMaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJMaXN0KFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQpOwoKICAgICAgICAgICAgaWYgKCRTdXJ2ZXl7U3RhdHVzfSBlcSAnTmV3JykgewogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkQW5zd2VyMihATGlzdCkgewogICAgICAgICAgICAgICAgICAgICRBbnN3ZXIyLT57U3VydmV5SUR9ID0gJFN1cnZleUlEOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQyJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQW5zd2VyMiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQyYicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVF1ZXN0aW9ufSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRBbnN3ZXIyKEBMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgJEFuc3dlcjItPntTdXJ2ZXlJRH0gPSAkU3VydmV5SUQ7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1F1ZXN0aW9uRWRpdDJWYWxpZE9uY2UnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRBbnN3ZXIyLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRRdWVzdGlvbntUeXBlfSBlcSAnQ2hlY2tib3gnKSB7CiAgICAgICAgICAgIG15IEBMaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJMaXN0KFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQpOwoKICAgICAgICAgICAgaWYgKCRTdXJ2ZXl7U3RhdHVzfSBlcSAnTmV3JykgewogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkQW5zd2VyMyhATGlzdCkgewogICAgICAgICAgICAgICAgICAgICRBbnN3ZXIzLT57U3VydmV5SUR9ID0gJFN1cnZleUlEOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQzJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQW5zd2VyMywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQzYicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7JVF1ZXN0aW9ufSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRBbnN3ZXIzKEBMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgJEFuc3dlcjMtPntTdXJ2ZXlJRH0gPSAkU3VydmV5SUQ7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1F1ZXN0aW9uRWRpdDNWYWxpZE9uY2UnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRBbnN3ZXIzLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRRdWVzdGlvbntUeXBlfSBlcSAnVGV4dGFyZWEnKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQ0JywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRTdXJ2ZXknLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19CiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHF1ZXN0aW9uIHNhdmUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdRdWVzdGlvblNhdmUnKSB7CiAgICAgICAgbXkgJFF1ZXN0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uSUQiKTsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJFF1ZXN0aW9uID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbiIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CgogICAgICAgIGlmICgkUXVlc3Rpb24pIHsKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblNhdmUoCiAgICAgICAgICAgICAgICBRdWVzdGlvbklEID0+ICRRdWVzdGlvbklELAogICAgICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICAgICAgUXVlc3Rpb24gPT4gJFF1ZXN0aW9uLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TdXJ2ZXlFZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCNRdWVzdGlvbiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVF1ZXN0aW9uRWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQmUXVlc3Rpb25JRD0kUXVlc3Rpb25JRCIpOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFuc3dlciBhZGRkCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQW5zd2VyQWRkJykgewogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICBteSAkUXVlc3Rpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVlc3Rpb25JRCIpOwogICAgICAgIG15ICRBbnN3ZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkFuc3dlciIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CgogICAgICAgIGlmICgkQW5zd2VyKSB7CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyQWRkKAogICAgICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICAgICAgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCwKICAgICAgICAgICAgICAgIEFuc3dlciA9PiAkQW5zd2VyLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyU29ydChRdWVzdGlvbklEID0+ICRRdWVzdGlvbklEKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1RdWVzdGlvbkVkaXQmU3VydmV5SUQ9JFN1cnZleUlEJlF1ZXN0aW9uSUQ9JFF1ZXN0aW9uSUQjTmV3QW5zd2VyIik7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhbnN3ZXIgZGVsZXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQW5zd2VyRGVsZXRlJykgewogICAgICAgIG15ICRBbnN3ZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiQW5zd2VySUQiKTsKICAgICAgICBteSAkUXVlc3Rpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVlc3Rpb25JRCIpOwogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSwgcXVlc3Rpb24gYW5kIGFuc3dlciBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkQW5zd2VySUQsIEVsZW1lbnQgPT4gJ0Fuc3dlcicpIG5lICdZZXMnCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlckRlbGV0ZSgKICAgICAgICAgICAgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCwKICAgICAgICAgICAgQW5zd2VySUQgPT4gJEFuc3dlcklELAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyU29ydChRdWVzdGlvbklEID0+ICRRdWVzdGlvbklEKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVF1ZXN0aW9uRWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQmUXVlc3Rpb25JRD0kUXVlc3Rpb25JRCNBbnN3ZXIiKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFuc3dlciB1cAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Fuc3dlclVwJykgewogICAgICAgIG15ICRBbnN3ZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiQW5zd2VySUQiKTsKICAgICAgICBteSAkUXVlc3Rpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVlc3Rpb25JRCIpOwogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSwgcXVlc3Rpb24gYW5kIGFuc3dlciBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkQW5zd2VySUQsIEVsZW1lbnQgPT4gJ0Fuc3dlcicpIG5lICdZZXMnCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlclNvcnQoUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCk7CgogICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyVXAoCiAgICAgICAgICAgIFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQsCiAgICAgICAgICAgIEFuc3dlcklEID0+ICRBbnN3ZXJJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249UXVlc3Rpb25FZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCZRdWVzdGlvbklEPSRRdWVzdGlvbklEI0Fuc3dlciIpOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYW5zd2VyIGRvd24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdBbnN3ZXJEb3duJykgewogICAgICAgIG15ICRBbnN3ZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiQW5zd2VySUQiKTsKICAgICAgICBteSAkUXVlc3Rpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVlc3Rpb25JRCIpOwogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSwgcXVlc3Rpb24gYW5kIGFuc3dlciBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkQW5zd2VySUQsIEVsZW1lbnQgPT4gJ0Fuc3dlcicpIG5lICdZZXMnCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlclNvcnQoUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCk7CgogICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyRG93bigKICAgICAgICAgICAgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCwKICAgICAgICAgICAgQW5zd2VySUQgPT4gJEFuc3dlcklELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1RdWVzdGlvbkVkaXQmU3VydmV5SUQ9JFN1cnZleUlEJlF1ZXN0aW9uSUQ9JFF1ZXN0aW9uSUQjQW5zd2VyIik7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhbnN3ZXIgZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Fuc3dlckVkaXQnKSB7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgIG15ICRRdWVzdGlvbklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbklEIik7CiAgICAgICAgbXkgJEFuc3dlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJBbnN3ZXJJRCIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5LCBxdWVzdGlvbiBhbmQgYW5zd2VyIGV4aXN0cwogICAgICAgIGlmICgkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRTdXJ2ZXlJRCwgRWxlbWVudCA9PiAnU3VydmV5JykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkUXVlc3Rpb25JRCwgRWxlbWVudCA9PiAnUXVlc3Rpb24nKSBuZSAnWWVzJyB8fAogICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRBbnN3ZXJJRCwgRWxlbWVudCA9PiAnQW5zd2VyJykgbmUgJ1llcycKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAnQW5zd2VyIEVkaXQnKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICBteSAlQW5zd2VyID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJHZXQoQW5zd2VySUQgPT4gJEFuc3dlcklEKTsKICAgICAgICAkQW5zd2Vye1N1cnZleUlEfSA9ICRTdXJ2ZXlJRDsKCiAgICAgICAgIyBwcmludCB0aGUgbWFpbiB0YWJsZS4KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBbnN3ZXJFZGl0JywKICAgICAgICAgICAgRGF0YSA9PiB7JUFuc3dlcn0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFN1cnZleScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFuc3dlciBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQW5zd2VyU2F2ZScpIHsKICAgICAgICBteSAkQW5zd2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkFuc3dlcklEIik7CiAgICAgICAgbXkgJFF1ZXN0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uSUQiKTsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJEFuc3dlciA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiQW5zd2VyIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXksIHF1ZXN0aW9uIGFuZCBhbnN3ZXIgZXhpc3RzCiAgICAgICAgaWYgKCRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFN1cnZleUlELCBFbGVtZW50ID0+ICdTdXJ2ZXknKSBuZSAnWWVzJyB8fAogICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRRdWVzdGlvbklELCBFbGVtZW50ID0+ICdRdWVzdGlvbicpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJEFuc3dlcklELCBFbGVtZW50ID0+ICdBbnN3ZXInKSBuZSAnWWVzJwogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRBbnN3ZXIpIHsKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJTYXZlKAogICAgICAgICAgICAgICAgQW5zd2VySUQgPT4gJEFuc3dlcklELAogICAgICAgICAgICAgICAgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCwKICAgICAgICAgICAgICAgIEFuc3dlciA9PiAkQW5zd2VyLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVF1ZXN0aW9uRWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQmUXVlc3Rpb25JRD0kUXVlc3Rpb25JRCNBbnN3ZXIiCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1BbnN3ZXJFZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCZRdWVzdGlvbklEPSRRdWVzdGlvbklEJkFuc3dlcklEPSRBbnN3ZXJJRCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzdGF0cwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0YXRzJykgewogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ1N0YXRzIE92ZXJ2aWV3Jyk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBwcmludCB0aGUgbWFpbiB0YWJsZS4KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0cycsCiAgICAgICAgICAgIERhdGEgPT4ge1N1cnZleUlEID0+ICRTdXJ2ZXlJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQExpc3QgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlZvdGVMaXN0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CgogICAgICAgIGZvcmVhY2ggbXkgJFZvdGUoQExpc3QpIHsKICAgICAgICAgICAgJFZvdGUtPntTdXJ2ZXlJRH0gPSAkU3VydmV5SUQ7CiAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldChUaWNrZXRJRCA9PiAkVm90ZS0+e1RpY2tldElEfSk7CiAgICAgICAgICAgICRWb3RlLT57VGlja2V0TnVtYmVyfSA9ICRUaWNrZXR7VGlja2V0TnVtYmVyfTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0c1ZvdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkVm90ZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRTdXJ2ZXknLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBzdGF0ZSBkZXRhaWwKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdGF0c0RldGFpbCcpIHsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJFJlcXVlc3RJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUmVxdWVzdElEIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXkgZXhpc3RzCiAgICAgICAgaWYgKCRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFN1cnZleUlELCBFbGVtZW50ID0+ICdTdXJ2ZXknKSBuZSAnWWVzJyB8fAogICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRSZXF1ZXN0SUQsIEVsZW1lbnQgPT4gJ1JlcXVlc3QnKSBuZSAnWWVzJwogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdTdGF0cyBEZXRhaWwnKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHByaW50IHRoZSBtYWluIHRhYmxlLgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRzRGV0YWlsJywKICAgICAgICAgICAgRGF0YSA9PiB7U3VydmV5SUQgPT4gJFN1cnZleUlEfSwKICAgICAgICApOwoKICAgICAgICBteSBAUXVlc3Rpb25MaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvbkxpc3QoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKCiAgICAgICAgZm9yZWFjaCBteSAkUXVlc3Rpb24oQFF1ZXN0aW9uTGlzdCkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdHNEZXRhaWxRdWVzdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBBbnN3ZXJzID0gKCk7CgogICAgICAgICAgICBpZiAoJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1JhZGlvJyB8fCAkUXVlc3Rpb24tPntUeXBlfSBlcSAnQ2hlY2tib3gnKSB7CiAgICAgICAgICAgICAgICBteSBAQW5zd2VyTGlzdCA9ICgpOwoKICAgICAgICAgICAgICAgIEBBbnN3ZXJMaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5Wb3RlR2V0KFJlcXVlc3RJRCA9PiAkUmVxdWVzdElELCBRdWVzdGlvbklEID0+ICRRdWVzdGlvbi0+e1F1ZXN0aW9uSUR9KTsKCiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRSb3cgKEBBbnN3ZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUFuc3dlciA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyR2V0KEFuc3dlcklEID0+ICRSb3ctPntWb3RlVmFsdWV9KTsKICAgICAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICREYXRhe0Fuc3dlcn0gPSAkQW5zd2Vye0Fuc3dlcn07CgogICAgICAgICAgICAgICAgICAgIHB1c2goQEFuc3dlcnMs