Survey
1.0.10
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
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
2006-10-24 13:01:16
portal.otrs.de
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50U3VydmV5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+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=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VydmV5LnBtIC0gbWFuYWdlIGFsbCBzdXJ2ZXkgbW9kdWxlIGV2ZW50cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBTdXJ2ZXkucG0sdiAxLjI2IDIwMDYvMDkvMDYgMTY6MjE6MDAgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXk7Cgp1c2Ugc3RyaWN0Owp1c2UgRGlnZXN0OjpNRDU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW1haWw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMjYgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3VydmV5IC0gc3VydmV5IGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgc3VydmV5IGZ1bmN0aW9ucy4gRS4gZy4gdG8gYWRkIHN1cnZleSBvciBhbmQgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFRpbWVPYmplY3QgVXNlck9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAkU2VsZi0+e1NlbmRtYWlsT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gU3VydmV5TGlzdCgpCgp0byBnZXQgYSBhcnJheSBsaXN0IG9mIGFsbCBzdXJ2ZXkgaXRlbXMKCiAgICBteSBATGlzdCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+U3VydmV5TGlzdCgpOwoKPWN1dAoKc3ViIFN1cnZleUxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQExpc3QgPSAoKTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBhc2sgdGhlIGRiCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCBGUk9NIHN1cnZleSBPUkRFUiBCWSBjcmVhdGVfdGltZSBERVNDIjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgICMgZmV0Y2ggYWxsIHJlc3VsdHMKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIHB1c2goQExpc3QsICRSb3dbMF0pOwogICAgfQogICAgIyByZXR1cm4gYXJyYXkKICAgIHJldHVybiBATGlzdDsKfQoKPWl0ZW0gU3VydmV5R2V0KCkKCnRvIGdldCBhbGwgYXR0cmlidXRlcyBvZiBhIHN1cnZleQoKICAgIG15ICVTdXJ2ZXkgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlN1cnZleUdldChTdXJ2ZXlJRCA9PiAxMjMpOwoKPWN1dAoKc3ViIFN1cnZleUdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoU3VydmV5SUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoU3VydmV5SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBnZXQgYWxsIGF0dHJpYnV0ZXMgb2YgYSBzdXJ2ZXkKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkLCBzdXJ2ZXludW1iZXIsIHRpdGxlLCBpbnRyb2R1Y3Rpb24sIGRlc2NyaXB0aW9uLCIuCiAgICAgICAgIiBzdGF0dXMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgIi4KICAgICAgICAiIEZST00gc3VydmV5IFdIRVJFIGlkID0gJFBhcmFte1N1cnZleUlEfSI7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVEYXRhID0gKCk7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkRGF0YXtTdXJ2ZXlJRH0gPSAkUm93WzBdOwogICAgICAgICREYXRhe1N1cnZleU51bWJlcn0gPSAkUm93WzFdOwogICAgICAgICREYXRhe1RpdGxlfSA9ICRSb3dbMl07CiAgICAgICAgJERhdGF7SW50cm9kdWN0aW9ufSA9ICRSb3dbM107CiAgICAgICAgJERhdGF7RGVzY3JpcHRpb259ID0gJFJvd1s0XTsKICAgICAgICAkRGF0YXtTdGF0dXN9ID0gJFJvd1s1XTsKICAgICAgICAkRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNl07CiAgICAgICAgJERhdGF7Q3JlYXRlQnl9ID0gJFJvd1s3XTsKICAgICAgICAkRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbOF07CiAgICAgICAgJERhdGF7Q2hhbmdlQnl9ID0gJFJvd1s5XTsKICAgIH0KICAgIGlmICglRGF0YSkgewogICAgICAgICMgYWRkZWQgQ3JlYXRlQnkKICAgICAgICBteSAlQ3JlYXRlVXNlckluZm8gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICREYXRhe0NyZWF0ZUJ5fSwKICAgICAgICAgICAgQ2FjaGVkID0+IDEKICAgICAgICApOwogICAgICAgICREYXRhe0NyZWF0ZVVzZXJMb2dpbn0gPSAkQ3JlYXRlVXNlckluZm97VXNlckxvZ2lufTsKICAgICAgICAkRGF0YXtDcmVhdGVVc2VyRmlyc3RuYW1lfSA9ICRDcmVhdGVVc2VySW5mb3tVc2VyRmlyc3RuYW1lfTsKICAgICAgICAkRGF0YXtDcmVhdGVVc2VyTGFzdG5hbWV9ID0gJENyZWF0ZVVzZXJJbmZve1VzZXJMYXN0bmFtZX07CiAgICAgICAgIyBhZGRlZCBDaGFuZ2VCeQogICAgICAgIG15ICVDaGFuZ2VVc2VySW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJERhdGF7Q2hhbmdlQnl9LAogICAgICAgICAgICBDYWNoZWQgPT4gMQogICAgICAgICk7CiAgICAgICAgJERhdGF7Q2hhbmdlVXNlckxvZ2lufSA9ICRDaGFuZ2VVc2VySW5mb3tVc2VyTG9naW59OwogICAgICAgICREYXRhe0NoYW5nZVVzZXJGaXJzdG5hbWV9ID0gJENoYW5nZVVzZXJJbmZve1VzZXJGaXJzdG5hbWV9OwogICAgICAgICREYXRhe0NoYW5nZVVzZXJMYXN0bmFtZX0gPSAkQ2hhbmdlVXNlckluZm97VXNlckxhc3RuYW1lfTsKICAgICAgICAjIHJldHVybiBoYXNoCiAgICAgICAgcmV0dXJuICVEYXRhOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTm8gc3VjaCBTdXJ2ZXlJRCAkUGFyYW17U3VydmV5SUR9ISIpOwogICAgICAgIHJldHVybiAoKTsKICAgIH0KfQoKPWl0ZW0gU3VydmV5U3RhdHVzU2V0KCkKCnRvIHNldCBhIG5ldyBzdXJ2ZXkgc3RhdHVzIChWYWxpZCwgSW52YWxpZCwgTWFzdGVyKQoKICAgICRTdGF0dXNTZXQgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlN1cnZleVN0YXR1c1NldChTdXJ2ZXlJRCA9PiAxMjMsIE5ld1N0YXR1cyA9PiAnTWFzdGVyJyk7Cgo9Y3V0CgpzdWIgU3VydmV5U3RhdHVzU2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCBOZXdTdGF0dXMpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoTmV3U3RhdHVzKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIGdldCBjdXJyZW50IHN0YXR1cwogICAgbXkgJFNRTCA9ICJTRUxFQ1Qgc3RhdHVzIEZST00gc3VydmV5IFdIRVJFIGlkID0gJFBhcmFte1N1cnZleUlEfSI7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRTdGF0dXMgPSAnJzsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRTdGF0dXMgPSAkUm93WzBdOwogICAgfQogICAgIyB0aGUgY3VyZW50IHN0YXR1cwogICAgaWYgKCRTdGF0dXMgZXEgJ05ldycgfHwgJFN0YXR1cyBlcSAnSW52YWxpZCcpIHsKICAgICAgICAjIGdldCB0aGUgcXVlc3Rpb24gaWRzCiAgICAgICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSBzdXJ2ZXlfcXVlc3Rpb24gV0hFUkUgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSI7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICRRdWVzdCA9ICcnOwogICAgICAgIHdoaWxlIChteSBAUm93MiA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJFF1ZXN0ID0gJFJvdzJbMF07CiAgICAgICAgfQogICAgICAgICMgaWYgbW9yZSB0aGVuIG9uZSBxdWVzdGlvbgogICAgICAgIGlmICgkUXVlc3QgPiAnMCcpIHsKICAgICAgICAgICAgIyBnZXQgYWxsIHF1ZXN0aW9ucyAodHlwZSByYWRpbyBhbmQgY2hlY2tib3gpCiAgICAgICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gc3VydmV5X3F1ZXN0aW9uIi4KICAgICAgICAgICAgICAgICIgV0hFUkUgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSBBTkQgKHR5cGUgPSAnUmFkaW8nIE9SIHR5cGUgPSAnQ2hlY2tib3gnKSI7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgICAgICAgICAgIyBpbml0IHRocmVlIHZhcnMKICAgICAgICAgICAgbXkgJEFsbFF1ZXN0aW9uc0Fuc2VycyA9ICdZZXMnOwogICAgICAgICAgICBteSBAUXVlc3Rpb25JRHMgPSAoKTsKICAgICAgICAgICAgbXkgJENvdW50ZXIxID0gMDsKICAgICAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgICAgIHdoaWxlIChteSBAUm93MyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgICAgICRRdWVzdGlvbklEc1skQ291bnRlcjFdID0gJFJvdzNbMF07CiAgICAgICAgICAgICAgICAkQ291bnRlcjErKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JlYWNoIG15ICRPbmVJRChAUXVlc3Rpb25JRHMpIHsKICAgICAgICAgICAgICAgICMgZ2V0IGFsbCBhbnN3ZXIgaWRzIG9mIGEgcXVlc3Rpb24KICAgICAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIGlkIEZST00gc3VydmV5X2Fuc3dlciBXSEVSRSBxdWVzdGlvbl9pZCA9ICRPbmVJRCIpOwogICAgICAgICAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgICAgICAgICBteSAkQ291bnRlcjIgPSAnMCc7CiAgICAgICAgICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgICAgICAgICAkQ291bnRlcjIrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgaXRzIG9rLCBpZiBtaW5pbXVtIHR3byBhbnN3ZXJzIGRlZmluaWVkCiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIyIDwgMikgewogICAgICAgICAgICAgICAgICAgICRBbGxRdWVzdGlvbnNBbnNlcnMgPSAnbm8nOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnSW5jb21wbGV0ZVF1ZXN0aW9uJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAjIHNldCBuZXcgc3RhdHVzIGlmIHN1cnZleSBpcyBjb21wbGV0ZQogICAgICAgICAgICBpZiAoJEFsbFF1ZXN0aW9uc0Fuc2VycyBlcSAnWWVzJykgewogICAgICAgICAgICAgICAgIyBzZXQgc3RhdHVzIFZhbGlkCiAgICAgICAgICAgICAgICBpZiAoJFBhcmFte05ld1N0YXR1c30gZXEgJ1ZhbGlkJykgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5IFNFVCBzdGF0dXMgPSAnVmFsaWQnIFdIRVJFIGlkID0gJFBhcmFte1N1cnZleUlEfSIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1N0YXR1c1NldCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIHNldCBzdGF0dXMgTWFzdGVyCiAgICAgICAgICAgICAgICBlbHNpZiAoJFBhcmFte05ld1N0YXR1c30gZXEgJ01hc3RlcicpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleSBTRVQgc3RhdHVzID0gJ01hc3RlcicgV0hFUkUgaWQgPSAkUGFyYW17U3VydmV5SUR9IiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnU3RhdHVzU2V0JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICdOb1F1ZXN0aW9uJzsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoJFN0YXR1cyBlcSAnVmFsaWQnKSB7CiAgICAgICAgIyBzZXQgc3RhdHVzIE1hc3RlcgogICAgICAgIGlmICgkUGFyYW17TmV3U3RhdHVzfSBlcSAnTWFzdGVyJykgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXkgU0VUIHN0YXR1cyA9ICdWYWxpZCcgV0hFUkUgc3RhdHVzID0gJ01hc3RlciciLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXkgU0VUIHN0YXR1cyA9ICdNYXN0ZXInIFdIRVJFIGlkID0gJFBhcmFte1N1cnZleUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAnU3RhdHVzU2V0JzsKICAgICAgICB9CiAgICAgICAgIyBzZXQgc3RhdHVzIEludmFsaWQKICAgICAgICBlbHNpZiAoJFBhcmFte05ld1N0YXR1c30gZXEgJ0ludmFsaWQnKSB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleSBTRVQgc3RhdHVzID0gJ0ludmFsaWQnIFdIRVJFIGlkID0gJFBhcmFte1N1cnZleUlEfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAnU3RhdHVzU2V0JzsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoJFN0YXR1cyBlcSAnTWFzdGVyJykgewogICAgICAgICMgc2V0IHN0YXR1cyBWYWxpZAogICAgICAgIGlmICgkUGFyYW17TmV3U3RhdHVzfSBlcSAnVmFsaWQnKSB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleSBTRVQgc3RhdHVzID0gJ1ZhbGlkJyBXSEVSRSBpZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJ1N0YXR1c1NldCc7CiAgICAgICAgfQogICAgICAgICMgc2V0IHN0YXR1cyBJbnZhbGlkCiAgICAgICAgZWxzaWYgKCRQYXJhbXtOZXdTdGF0dXN9IGVxICdJbnZhbGlkJykgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXkgU0VUIHN0YXR1cyA9ICdJbnZhbGlkJyBXSEVSRSBpZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJ1N0YXR1c1NldCc7CiAgICAgICAgfQogICAgfQp9Cgo9aXRlbSBTdXJ2ZXlTYXZlKCkKCnRvIHVwZGF0ZSBhbiBleGlzdGluZyBzdXJ2ZXkKCiAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlN1cnZleVNhdmUoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgU3VydmV5SUQgPT4gNCwKICAgICAgICBUaXRsZSA9PiAnQSBUaXRsZScsCiAgICAgICAgSW50cm9kdWN0aW9uID0+ICdUaGUgaW50cm9kdWN0aW9uIG9mIHRoZSBzdXJ2ZXknLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdUaGUgaW50ZXJuYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN1cnZleScsCiAgICApOwoKPWN1dAoKc3ViIFN1cnZleVNhdmUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFVzZXJJRCBTdXJ2ZXlJRCBUaXRsZSBJbnRyb2R1Y3Rpb24gRGVzY3JpcHRpb24pKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoVGl0bGUgSW50cm9kdWN0aW9uIERlc2NyaXB0aW9uKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhVc2VySUQgU3VydmV5SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgaWYgKCRQYXJhbXtUaXRsZX0gJiYgJFBhcmFte0ludHJvZHVjdGlvbn0gJiYgJFBhcmFte0Rlc2NyaXB0aW9ufSkgewogICAgICAgICMgdXBkYXRlIHRoZSBzdXJ2ZXkKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleSBTRVQgIi4KICAgICAgICAgICAgICAgICJ0aXRsZSA9ICckUGFyYW17VGl0bGV9JywgIi4KICAgICAgICAgICAgICAgICJpbnRyb2R1Y3Rpb24gPSAnJFBhcmFte0ludHJvZHVjdGlvbn0nLCAiLgogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uID0gJyRQYXJhbXtEZXNjcmlwdGlvbn0nLCAiLgogICAgICAgICAgICAgICAgImNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsICIuCiAgICAgICAgICAgICAgICAiY2hhbmdlX2J5ID0gJFBhcmFte1VzZXJJRH0gIi4KICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRQYXJhbXtTdXJ2ZXlJRH0iLAogICAgICAgICk7CiAgICB9Cn0KCj1pdGVtIFN1cnZleU5ldygpCgp0byBhZGQgYSBuZXcgc3VydmV5CgogICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5TdXJ2ZXlOZXcoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgVGl0bGUgPT4gJ0EgVGl0bGUnLAogICAgICAgIEludHJvZHVjdGlvbiA9PiAnVGhlIGludHJvZHVjdGlvbiBvZiB0aGUgc3VydmV5JywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGhlIGludGVybmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzdXJ2ZXknLAogICAgKTsKCj1jdXQKCnN1YiBTdXJ2ZXlOZXcgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFVzZXJJRCBUaXRsZSBJbnRyb2R1Y3Rpb24gRGVzY3JpcHRpb24pKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoVGl0bGUgSW50cm9kdWN0aW9uIERlc2NyaXB0aW9uKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhVc2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgaWYgKCRQYXJhbXtUaXRsZX0gJiYgJFBhcmFte0ludHJvZHVjdGlvbn0gJiYgJFBhcmFte0Rlc2NyaXB0aW9ufSkgewogICAgICAgICMgaW5zZXJ0IGEgbmV3IHN1cnZleQogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBzdXJ2ZXkgKHRpdGxlLCBpbnRyb2R1Y3Rpb24sIGRlc2NyaXB0aW9uLCIuCiAgICAgICAgICAgICAgICAiIHN0YXR1cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgVkFMVUVTICgiLgogICAgICAgICAgICAgICAgIickUGFyYW17VGl0bGV9JywgIi4KICAgICAgICAgICAgICAgICInJFBhcmFte0ludHJvZHVjdGlvbn0nLCAiLgogICAgICAgICAgICAgICAgIickUGFyYW17RGVzY3JpcHRpb259JywgIi4KICAgICAgICAgICAgICAgICInTmV3JywgIi4KICAgICAgICAgICAgICAgICJjdXJyZW50X3RpbWVzdGFtcCwgIi4KICAgICAgICAgICAgICAgICIkUGFyYW17VXNlcklEfSwgIi4KICAgICAgICAgICAgICAgICJjdXJyZW50X3RpbWVzdGFtcCwgIi4KICAgICAgICAgICAgICAgICIkUGFyYW17VXNlcklEfSkiCiAgICAgICAgKTsKICAgICAgICAjIGdldCB0aGUgaWQgb2YgdGhlIHN1cnZleQogICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gc3VydmV5IFdIRVJFICIuCiAgICAgICAgICAgICJ0aXRsZSA9ICckUGFyYW17VGl0bGV9JyBBTkQgIi4KICAgICAgICAgICAgImludHJvZHVjdGlvbiA9ICckUGFyYW17SW50cm9kdWN0aW9ufScgQU5EICIuCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiA9ICckUGFyYW17RGVzY3JpcHRpb259JyAiLgogICAgICAgICAgICAiT1JERVIgQlkgY3JlYXRlX3RpbWUgREVTQyI7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICcnOwogICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICAkU3VydmV5SUQgPSAkUm93WzBdOwogICAgICAgIH0KICAgICAgICAjIHNldCB0aGUgc3VydmV5IG51bWJlcgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5IFNFVCAiLgogICAgICAgICAgICAgICAgInN1cnZleW51bWJlciA9ICciIC4gKCRTdXJ2ZXlJRCArIDEwMDAwKSAuICInICIuCiAgICAgICAgICAgICAgICAiV0hFUkUgaWQgPSAkU3VydmV5SUQiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTdXJ2ZXlJRDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KfQoKPWl0ZW0gUXVlc3Rpb25MaXN0KCkKCnRvIGdldCBhIGFycmF5IGxpc3Qgb2YgYWxsIHF1ZXN0aW9uIGl0ZW1zCgogICAgbXkgQExpc3QgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlF1ZXN0aW9uTGlzdChTdXJ2ZXlJRCA9PiAxKTsKCj1jdXQKCnN1YiBRdWVzdGlvbkxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQExpc3QgPSAoKTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIGdldCBhbGwgcXVlc3Rpb25zIG9mIGEgc3VydmV5CiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgc3VydmV5X2lkLCBxdWVzdGlvbiwgdHlwZSAiLgogICAgICAgICIgRlJPTSBzdXJ2ZXlfcXVlc3Rpb24gV0hFUkUgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSBPUkRFUiBCWSBwb3NpdGlvbiI7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICAjIGZldGNoIHRoIHJlc3VsdAogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgbXkgJURhdGEgPSAoKTsKICAgICAgICAkRGF0YXtRdWVzdGlvbklEfSA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7U3VydmV5SUR9ID0gJFJvd1sxXTsKICAgICAgICAkRGF0YXtRdWVzdGlvbn0gPSAkUm93WzJdOwogICAgICAgICREYXRhe1R5cGV9ID0gJFJvd1szXTsKICAgICAgICBwdXNoKEBMaXN0LFwlRGF0YSk7CiAgICB9CiAgICByZXR1cm4gQExpc3Q7Cn0KCj1pdGVtIFF1ZXN0aW9uQWRkKCkKCnRvIGFkZCBhIG5ldyBxdWVzdGlvbiB0byBhIHN1cnZleQoKICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25BZGQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgU3VydmV5SUQgPT4gMTAsCiAgICAgICAgUXVlc3Rpb24gPT4gJ1RoZSBRdWVzdGlvbicsCiAgICAgICAgVHlwZSA9PiAnUmFkaW8nLAogICAgKTsKCj1jdXQKCnN1YiBRdWVzdGlvbkFkZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVXNlcklEIFN1cnZleUlEIFF1ZXN0aW9uIFR5cGUpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUXVlc3Rpb24gVHlwZSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoVXNlcklEIFN1cnZleUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KCiAgICBpZiAoJFBhcmFte1F1ZXN0aW9ufSkgewogICAgICAgICMgaW5zZXJ0IGEgbmV3IHF1ZXN0aW9uCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIHN1cnZleV9xdWVzdGlvbiAoc3VydmV5X2lkLCBxdWVzdGlvbiwgdHlwZSwgIi4KICAgICAgICAgICAgICAgICJwb3NpdGlvbiwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgVkFMVUVTICgiLgogICAgICAgICAgICAgICAgIiRQYXJhbXtTdXJ2ZXlJRH0sICIuCiAgICAgICAgICAgICAgICAiJyRQYXJhbXtRdWVzdGlvbn0nLCAiLgogICAgICAgICAgICAgICAgIickUGFyYW17VHlwZX0nLCAiLgogICAgICAgICAgICAgICAgIjI1NSwgIi4KICAgICAgICAgICAgICAgICJjdXJyZW50X3RpbWVzdGFtcCwgIi4KICAgICAgICAgICAgICAgICIkUGFyYW17VXNlcklEfSwgIi4KICAgICAgICAgICAgICAgICJjdXJyZW50X3RpbWVzdGFtcCwgIi4KICAgICAgICAgICAgICAgICIkUGFyYW17VXNlcklEfSkiCiAgICAgICAgKTsKICAgIH0KfQoKPWl0ZW0gUXVlc3Rpb25EZWxldGUoKQoKdG8gZGVsZXRlIGEgcXVlc3Rpb24gZnJvbSBhIHN1cnZleQoKICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25EZWxldGUoCiAgICAgICAgU3VydmV5SUQgPT4gMSwKICAgICAgICBRdWVzdGlvbklEID0+IDEwLAogICAgKTsKCj1jdXQKCnN1YiBRdWVzdGlvbkRlbGV0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoU3VydmV5SUQgUXVlc3Rpb25JRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCBRdWVzdGlvbklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgZGVsZXRlIGFsbCBhbnN3ZXJzIG9mIGEgcXVlc3Rpb24KICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHN1cnZleV9hbnN3ZXIgV0hFUkUgIi4KICAgICAgICAgICAgInF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IgogICAgKTsKICAgICMgZGVsZXRlIHRoIHF1ZXN0aW9uCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzdXJ2ZXlfcXVlc3Rpb24gV0hFUkUgIi4KICAgICAgICAgICAgImlkID0gJFBhcmFte1F1ZXN0aW9uSUR9IEFORCAiLgogICAgICAgICAgICAic3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSIKICAgICk7Cn0KCj1pdGVtIFF1ZXN0aW9uU29ydCgpCgp0byBzb3J0IGFsbCBxdWVzdGlvbnMgZnJvbSBhIHN1cnZleQoKICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25Tb3J0KAogICAgICAgIFN1cnZleUlEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFF1ZXN0aW9uU29ydCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoU3VydmV5SUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoU3VydmV5SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBnZXQgYWxsIHF1ZXN0aW9uIG9mIGEgc3VydmV5IChzb3J0ZWQgYnkgcG9zaXRpb24pCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCBGUk9NIHN1cnZleV9xdWVzdGlvbiIuCiAgICAgICAgIiBXSEVSRSBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IE9SREVSIEJZIHBvc2l0aW9uIjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJENvdW50ZXIgPSAxOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgIyB1cGRhdGUgdGhlIHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXlfcXVlc3Rpb24gU0VUIHBvc2l0aW9uID0gJENvdW50ZXIgV0hFUkUgaWQgPSAkUm93WzBdIiwKICAgICAgICApOwogICAgICAgICRDb3VudGVyKys7CiAgICB9Cn0KCj1pdGVtIFF1ZXN0aW9uVXAoKQoKdG8gbW92ZSBhIHF1ZXN0aW9uIHVwCgogICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblVwKAogICAgICAgIFN1cnZleUlEID0+IDEsCiAgICAgICAgUXVlc3Rpb25JRCA9PiA0LAogICAgKTsKCj1jdXQKCnN1YiBRdWVzdGlvblVwIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCBRdWVzdGlvbklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEIFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBwb3NpdGlvbiBGUk9NIHN1cnZleV9xdWVzdGlvbiIuCiAgICAgICAgIiBXSEVSRSBpZCA9ICRQYXJhbXtRdWVzdGlvbklEfSBBTkQgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSIKICAgICk7CgogICAgbXkgJFBvc2l0aW9uID0gJyc7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkUG9zaXRpb24gPSAkUm93WzBdOwogICAgfQoKICAgIGlmICgkUG9zaXRpb24gPiAnMScpIHsKICAgICAgICBteSAkUG9zaXRpb25VcCA9ICRQb3NpdGlvbiAtIDE7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBzdXJ2ZXlfcXVlc3Rpb24iLgogICAgICAgICAgICAiIFdIRVJFIHN1cnZleV9pZCA9ICRQYXJhbXtTdXJ2ZXlJRH0gQU5EIHBvc2l0aW9uID0gJFBvc2l0aW9uVXAiCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFF1ZXN0aW9uSUREb3duID0gJyc7CiAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICRRdWVzdGlvbklERG93biA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICBpZiAoJFF1ZXN0aW9uSUREb3duIG5lICcnKSB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9xdWVzdGlvbiBTRVQgIi4KICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gPSAkUG9zaXRpb24gIi4KICAgICAgICAgICAgICAgICAgICAiV0hFUkUgaWQgPSAkUXVlc3Rpb25JRERvd24iCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9xdWVzdGlvbiBTRVQgIi4KICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gPSAkUG9zaXRpb25VcCAiLgogICAgICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRQYXJhbXtRdWVzdGlvbklEfSIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KCj1pdGVtIFF1ZXN0aW9uRG93bigpCgp0byBtb3ZlIGEgcXVlc3Rpb24gZG93bgoKICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25Eb3duKAogICAgICAgIFN1cnZleUlEID0+IDEsCiAgICAgICAgUXVlc3Rpb25JRCA9PiA0LAogICAgKTsKCj1jdXQKCnN1YiBRdWVzdGlvbkRvd24gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEIFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoU3VydmV5SUQgUXVlc3Rpb25JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIHBvc2l0aW9uIEZST00gc3VydmV5X3F1ZXN0aW9uIi4KICAgICAgICAiIFdIRVJFIGlkID0gJFBhcmFte1F1ZXN0aW9uSUR9IEFORCBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IgogICAgKTsKCiAgICBteSAkUG9zaXRpb24gPSAnJzsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRQb3NpdGlvbiA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCRQb3NpdGlvbiA+ICcwJykgewogICAgICAgIG15ICRQb3NpdGlvbkRvd24gPSAkUG9zaXRpb24gKyAxOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIGlkIEZST00gc3VydmV5X3F1ZXN0aW9uIi4KICAgICAgICAgICAgIiBXSEVSRSBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IEFORCBwb3NpdGlvbiA9ICRQb3NpdGlvbkRvd24iCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFF1ZXN0aW9uSURVcCA9ICcnOwogICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICAkUXVlc3Rpb25JRFVwID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIGlmICgkUXVlc3Rpb25JRFVwIG5lICcnKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5X3F1ZXN0aW9uIFNFVCAiLgogICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiA9ICRQb3NpdGlvbiAiLgogICAgICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRRdWVzdGlvbklEVXAiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9xdWVzdGlvbiBTRVQgIi4KICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gPSAkUG9zaXRpb25Eb3duICIuCiAgICAgICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJFBhcmFte1F1ZXN0aW9uSUR9IgogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKPWl0ZW0gUXVlc3Rpb25HZXQoKQoKdG8gZ2V0IGFsbCBhdHRyaWJ1dGVzIG9mIGEgcXVlc3Rpb24KCiAgICBteSAlUXVlc3Rpb24gPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlF1ZXN0aW9uR2V0KFF1ZXN0aW9uSUQgPT4gMTIzKTsKCj1jdXQKCnN1YiBRdWVzdGlvbkdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQsIHN1cnZleV9pZCwgcXVlc3Rpb24sIHR5cGUsIHBvc2l0aW9uLCAiLgogICAgICAgICJjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5ICIuCiAgICAgICAgIkZST00gc3VydmV5X3F1ZXN0aW9uIFdIRVJFIGlkID0gJFBhcmFte1F1ZXN0aW9uSUR9IjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICBteSAlRGF0YSA9ICgpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7UXVlc3Rpb25JRH0gPSAkUm93WzBdOwogICAgICAgICREYXRhe1N1cnZleUlEfSA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7UXVlc3Rpb259ID0gJFJvd1syXTsKICAgICAgICAkRGF0YXtUeXBlfSA9ICRSb3dbM107CiAgICAgICAgJERhdGF7UG9zaXRpb259ID0gJFJvd1s0XTsKICAgICAgICAkRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNV07CiAgICAgICAgJERhdGF7Q3JlYXRlQnl9ID0gJFJvd1s2XTsKICAgICAgICAkRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbN107CiAgICAgICAgJERhdGF7Q2hhbmdlQnl9ID0gJFJvd1s4XTsKICAgIH0KICAgIHJldHVybiAlRGF0YTsKfQoKPWl0ZW0gUXVlc3Rpb25TYXZlKCkKCnRvIHVwZGF0ZSBhbiBleGlzdGluZyBxdWVzdGlvbgoKICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25TYXZlKAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIFF1ZXN0aW9uSUQgPT4gNCwKICAgICAgICBTdXJ2ZXlJRCA9PiAzLAogICAgICAgIFF1ZXN0aW9uID0+ICdUaGUgUXVlc3Rpb24nLAogICAgKTsKCj1jdXQKCnN1YiBRdWVzdGlvblNhdmUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFVzZXJJRCBRdWVzdGlvbklEIFN1cnZleUlEIFF1ZXN0aW9uKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhVc2VySUQgUXVlc3Rpb25JRCBTdXJ2ZXlJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CgogICAgaWYgKCRQYXJhbXtRdWVzdGlvbn0pIHsKICAgICAgICAjIHNxbCBmb3IgZXZlbnQKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9xdWVzdGlvbiBTRVQgIi4KICAgICAgICAgICAgICAgICJxdWVzdGlvbiA9ICckUGFyYW17UXVlc3Rpb259JywgIi4KICAgICAgICAgICAgICAgICJjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCAiLgogICAgICAgICAgICAgICAgImNoYW5nZV9ieSA9ICRQYXJhbXtVc2VySUR9ICIuCiAgICAgICAgICAgICAgICAiV0hFUkUgaWQgPSAkUGFyYW17UXVlc3Rpb25JRH0gIiwKICAgICAgICAgICAgICAgICJBTkQgc3VydmV5X2lkID0gJFBhcmFte1N1cnZleUlEfSIsCiAgICAgICAgKTsKICAgIH0KfQoKPWl0ZW0gUXVlc3Rpb25Db3VudCgpCgp0byBjb3VudCBhbGwgcXVlc3Rpb25zIG9mIGEgc3VydmV5CgogICAgbXkgJENvdW50UXVlc3Rpb24gPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlF1ZXN0aW9uQ291bnQoU3VydmV5SUQgPT4gMTIzKTsKCj1jdXQKCnN1YiBRdWVzdGlvbkNvdW50IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhTdXJ2ZXlJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgIG15ICRTUUwgPSAiU0VMRUNUIENPVU5UKGlkKSBGUk9NIHN1cnZleV9xdWVzdGlvbiBXSEVSRSBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IjsKCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgbXkgJENvdW50UXVlc3Rpb24gPSAnJzsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRDb3VudFF1ZXN0aW9uID0gJFJvd1swXTsKICAgIH0KICAgIHJldHVybiAkQ291bnRRdWVzdGlvbjsKfQoKPWl0ZW0gQW5zd2VyTGlzdCgpCgp0byBnZXQgYSBhcnJheSBsaXN0IG9mIGFsbCBhbnN3ZXIgaXRlbXMKCiAgICBteSBATGlzdCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyTGlzdChRdWVzdGlvbklEID0+IDEpOwoKPWN1dAoKc3ViIEFuc3dlckxpc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQExpc3QgPSAoKTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgcXVlc3Rpb25faWQsIGFuc3dlciAiLgogICAgICAgICIgRlJPTSBzdXJ2ZXlfYW5zd2VyIFdIRVJFIHF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IE9SREVSIEJZIHBvc2l0aW9uIjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIG15ICVEYXRhID0gKCk7CgogICAgICAgICREYXRhe0Fuc3dlcklEfSA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7UXVlc3Rpb25JRH0gPSAkUm93WzFdOwogICAgICAgICREYXRhe0Fuc3dlcn0gPSAkUm93WzJdOwoKICAgICAgICBwdXNoKEBMaXN0LFwlRGF0YSk7CiAgICB9CiAgICByZXR1cm4gQExpc3Q7Cn0KCj1pdGVtIEFuc3dlckFkZCgpCgp0byBhZGQgYSBuZXcgYW5zd2VyIHRvIGEgcXVlc3Rpb24KCiAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlckFkZCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBRdWVzdGlvbklEID0+IDEwLAogICAgICAgIEFuc3dlciA9PiAnVGhlIEFuc3dlcicsCiAgICApOwoKPWN1dAoKc3ViIEFuc3dlckFkZCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVXNlcklEIFF1ZXN0aW9uSUQgQW5zd2VyKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KEFuc3dlcikpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoVXNlcklEIFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgIGlmICgkUGFyYW17QW5zd2VyfSkgewogICAgICAgICMgc3FsIGZvciBldmVudAogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBzdXJ2ZXlfYW5zd2VyIChxdWVzdGlvbl9pZCwgYW5zd2VyLCBwb3NpdGlvbiwgIi4KICAgICAgICAgICAgICAgICJjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSBWQUxVRVMgKCIuCiAgICAgICAgICAgICAgICAiJFBhcmFte1F1ZXN0aW9uSUR9LCAiLgogICAgICAgICAgICAgICAgIickUGFyYW17QW5zd2VyfScsICIuCiAgICAgICAgICAgICAgICAiMjU1LCAiLgogICAgICAgICAgICAgICAgImN1cnJlbnRfdGltZXN0YW1wLCAiLgogICAgICAgICAgICAgICAgIiRQYXJhbXtVc2VySUR9LCAiLgogICAgICAgICAgICAgICAgImN1cnJlbnRfdGltZXN0YW1wLCAiLgogICAgICAgICAgICAgICAgIiRQYXJhbXtVc2VySUR9KSIKICAgICAgICApOwogICAgfQp9Cgo9aXRlbSBBbnN3ZXJEZWxldGUoKQoKdG8gZGVsZXRlIGEgYW5zd2VyIGZyb20gYSBxdWVzdGlvbgoKICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyRGVsZXRlKAogICAgICAgIFF1ZXN0aW9uSUQgPT4gMTAsCiAgICAgICAgQW5zd2VySUQgPT4gNCwKICAgICk7Cgo9Y3V0CgpzdWIgQW5zd2VyRGVsZXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEIEFuc3dlcklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQgQW5zd2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQoKICAgICMgc3FsIGZvciBldmVudAogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc3VydmV5X2Fuc3dlciBXSEVSRSAiLgogICAgICAgICAgICAiaWQgPSAkUGFyYW17QW5zd2VySUR9IEFORCAiLgogICAgICAgICAgICAicXVlc3Rpb25faWQgPSAkUGFyYW17UXVlc3Rpb25JRH0iCiAgICApOwp9Cgo9aXRlbSBBbnN3ZXJTb3J0KCkKCnRvIHNvcnQgYWxsIGFuc3dlcnMgZnJvbSBhIHF1ZXN0aW9uCgogICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJTb3J0KAogICAgICAgIFF1ZXN0aW9uSUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQW5zd2VyU29ydCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSBzdXJ2ZXlfYW5zd2VyIi4KICAgICAgICAiIFdIRVJFIHF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IE9SREVSIEJZIHBvc2l0aW9uIjsKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICBteSAkY291bnRlciA9IDE7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9hbnN3ZXIgU0VUIHBvc2l0aW9uID0gJGNvdW50ZXIgV0hFUkUgaWQgPSAkUm93WzBdIiwKICAgICAgICApOwogICAgICAgICRjb3VudGVyKys7CiAgICB9Cn0KCj1pdGVtIEFuc3dlclVwKCkKCnRvIG1vdmUgYSBhbnN3ZXIgdXAKCiAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlclVwKAogICAgICAgIFF1ZXN0aW9uSUQgPT4gNCwKICAgICAgICBBbnN3ZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBBbnN3ZXJVcCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCBBbnN3ZXJJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEIEFuc3dlcklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICJTRUxFQ1QgcG9zaXRpb24gRlJPTSBzdXJ2ZXlfYW5zd2VyIi4KICAgICAgICAiIFdIRVJFIGlkID0gJFBhcmFte0Fuc3dlcklEfSBBTkQgcXVlc3Rpb25faWQgPSAkUGFyYW17UXVlc3Rpb25JRH0iCiAgICApOwoKICAgIG15ICRQb3NpdGlvbiA9ICcnOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJFBvc2l0aW9uID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoJFBvc2l0aW9uID4gJzEnKSB7CiAgICAgICAgbXkgJFBvc2l0aW9uVXAgPSAkUG9zaXRpb24gLSAxOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIGlkIEZST00gc3VydmV5X2Fuc3dlciIuCiAgICAgICAgICAgICIgV0hFUkUgcXVlc3Rpb25faWQgPSAkUGFyYW17UXVlc3Rpb25JRH0gQU5EIHBvc2l0aW9uID0gJFBvc2l0aW9uVXAiCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFuc3dlcklERG93biA9ICcnOwogICAgICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICAgICAkQW5zd2VySUREb3duID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIGlmICgkQW5zd2VySUREb3duIG5lICcnKSB7CiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9hbnN3ZXIgU0VUICIuCiAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uID0gJFBvc2l0aW9uICIuCiAgICAgICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJEFuc3dlcklERG93biIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgc3VydmV5X2Fuc3dlciBTRVQgIi4KICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gPSAkUG9zaXRpb25VcCAiLgogICAgICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRQYXJhbXtBbnN3ZXJJRH0iCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQp9Cgo9aXRlbSBBbnN3ZXJEb3duKCkKCnRvIG1vdmUgYSBhbnN3ZXIgZG93bgoKICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyRG93bigKICAgICAgICBRdWVzdGlvbklEID0+IDQsCiAgICAgICAgQW5zd2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQW5zd2VyRG93biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCBBbnN3ZXJJRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEIEFuc3dlcklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICJTRUxFQ1QgcG9zaXRpb24gRlJPTSBzdXJ2ZXlfYW5zd2VyIi4KICAgICAgICAiIFdIRVJFIGlkID0gJFBhcmFte0Fuc3dlcklEfSBBTkQgcXVlc3Rpb25faWQgPSAkUGFyYW17UXVlc3Rpb25JRH0iCiAgICApOwoKICAgIG15ICRQb3NpdGlvbiA9ICcnOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJFBvc2l0aW9uID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoJFBvc2l0aW9uID4gJzAnKSB7CiAgICAgICAgbXkgJFBvc2l0aW9uRG93biA9ICRQb3NpdGlvbiArIDE7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBzdXJ2ZXlfYW5zd2VyIi4KICAgICAgICAgICAgIiBXSEVSRSBxdWVzdGlvbl9pZCA9ICRQYXJhbXtRdWVzdGlvbklEfSBBTkQgcG9zaXRpb24gPSAkUG9zaXRpb25Eb3duIgogICAgICAgICk7CgogICAgICAgIG15ICRBbnN3ZXJJRFVwID0gJyc7CiAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICRBbnN3ZXJJRFVwID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgIGlmICgkQW5zd2VySURVcCBuZSAnJykgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXlfYW5zd2VyIFNFVCAiLgogICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiA9ICRQb3NpdGlvbiAiLgogICAgICAgICAgICAgICAgICAgICJXSEVSRSBpZCA9ICRBbnN3ZXJJRFVwIgogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXlfYW5zd2VyIFNFVCAiLgogICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiA9ICRQb3NpdGlvbkRvd24gIi4KICAgICAgICAgICAgICAgICAgICAiV0hFUkUgaWQgPSAkUGFyYW17QW5zd2VySUR9IgogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQoKPWl0ZW0gQW5zd2VyR2V0KCkKCnRvIGdldCBhbGwgYXR0cmlidXRlcyBvZiBhIGFuc3dlcgoKICAgIG15ICVBbnN3ZXIgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlckdldChBbnN3ZXJJRCA9PiAxMjMpOwoKPWN1dAoKc3ViIEFuc3dlckdldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoQW5zd2VySUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoQW5zd2VySUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgcXVlc3Rpb25faWQsIGFuc3dlciwgcG9zaXRpb24sIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgIi4KICAgICAgICAiRlJPTSBzdXJ2ZXlfYW5zd2VyIFdIRVJFIGlkID0gJFBhcmFte0Fuc3dlcklEfSI7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgbXkgJURhdGEgPSAoKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICREYXRhe0Fuc3dlcklEfSA9ICRSb3dbMF07CiAgICAgICAgJERhdGF7UXVlc3Rpb25JRH0gPSAkUm93WzFdOwogICAgICAgICREYXRhe0Fuc3dlcn0gPSAkUm93WzJdOwogICAgICAgICREYXRhe1Bvc2l0aW9ufSA9ICRSb3dbM107CiAgICAgICAgJERhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzRdOwogICAgICAgICREYXRhe0NyZWF0ZUJ5fSA9ICRSb3dbNV07CiAgICAgICAgJERhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzZdOwogICAgICAgICREYXRhe0NoYW5nZUJ5fSA9ICRSb3dbN107CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1pdGVtIEFuc3dlclNhdmUoKQoKdG8gdXBkYXRlIGFuIGV4aXN0aW5nIGFuc3dlcgoKICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyU2F2ZSgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBBbnN3ZXJJRCA9PiA2LAogICAgICAgIFF1ZXN0aW9uSUQgPT4gNCwKICAgICAgICBBbnN3ZXIgPT4gJ1RoZSBBbnN3ZXInLAogICAgKTsKCj1jdXQKCnN1YiBBbnN3ZXJTYXZlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhVc2VySUQgQW5zd2VySUQgUXVlc3Rpb25JRCBBbnN3ZXIpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoQW5zd2VyKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhVc2VySUQgQW5zd2VySUQgUXVlc3Rpb25JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CgogICAgaWYgKCRQYXJhbXtBbnN3ZXJ9KSB7CiAgICAgICAgIyBzcWwgZm9yIGV2ZW50CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gIlVQREFURSBzdXJ2ZXlfYW5zd2VyIFNFVCAiLgogICAgICAgICAgICAgICAgImFuc3dlciA9ICckUGFyYW17QW5zd2VyfScsICIuCiAgICAgICAgICAgICAgICAiY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgIi4KICAgICAgICAgICAgICAgICJjaGFuZ2VfYnkgPSAkUGFyYW17VXNlcklEfSAiLgogICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJFBhcmFte0Fuc3dlcklEfSAiLAogICAgICAgICAgICAgICAgIkFORCBxdWVzdGlvbl9pZCA9ICRQYXJhbXtRdWVzdGlvbklEfSIsCiAgICAgICAgKTsKICAgIH0KfQoKPWl0ZW0gQW5zd2VyQ291bnQoKQoKdG8gY291bnQgYWxsIGFuc3dlcnMgb2YgYSBxdWVzdGlvbgoKICAgIG15ICRDb3VudEFuc3dlciA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyQ291bnQoUXVlc3Rpb25JRCA9PiAxMjMpOwoKPWN1dAoKc3ViIEFuc3dlckNvdW50IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFF1ZXN0aW9uSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICBteSAkU1FMID0gIlNFTEVDVCBDT1VOVChpZCkgRlJPTSBzdXJ2ZXlfYW5zd2VyIFdIRVJFIHF1ZXN0aW9uX2lkID0gJFBhcmFte1F1ZXN0aW9uSUR9IjsKCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgbXkgJENvdW50QW5zd2VyID0gJyc7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkQ291bnRBbnN3ZXIgPSAkUm93WzBdOwogICAgfQogICAgcmV0dXJuICRDb3VudEFuc3dlcjsKfQoKPWl0ZW0gVm90ZUxpc3QoKQoKdG8gZ2V0IGEgYXJyYXkgbGlzdCBvZiBhbGwgdm90ZSBpdGVtcwoKICAgIG15IEBMaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5Wb3RlTGlzdChTdXJ2ZXlJRCA9PiAxKTsKCj1jdXQKCnN1YiBWb3RlTGlzdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSBATGlzdCA9ICgpOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEKSkgewogICAgICAgIGlmICghZGVmaW5lZCAoJFBhcmFteyRffSkpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgcXVvdGUKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQsIHRpY2tldF9pZCwgc2VuZF90aW1lLCB2b3RlX3RpbWUgIi4KICAgICAgICAiRlJPTSBzdXJ2ZXlfcmVxdWVzdCBXSEVSRSBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9ICIuCiAgICAgICAgIkFORCB2YWxpZF9pZCA9IDAgT1JERVIgQlkgdm90ZV90aW1lIERFU0MiOwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwoKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgIG15ICVEYXRhID0gKCk7CgogICAgICAgICREYXRhe1JlcXVlc3RJRH0gPSAkUm93WzBdOwogICAgICAgICREYXRhe1RpY2tldElEfSA9ICRSb3dbMV07CiAgICAgICAgJERhdGF7U2VuZFRpbWV9ID0gJFJvd1syXTsKICAgICAgICAkRGF0YXtWb3RlVGltZX0gPSAkUm93WzNdOwoKICAgICAgICBwdXNoKEBMaXN0LFwlRGF0YSk7CiAgICB9CiAgICByZXR1cm4gQExpc3Q7Cn0KCj1pdGVtIFZvdGVHZXQoKQoKdG8gZ2V0IGFsbCBhdHRyaWJ1dGVzIG9mIGEgdm90ZQoKICAgIG15IEBWb3RlID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5Wb3RlR2V0KAogICAgICAgIFJlcXVlc3RJRCA9PiAxMywKICAgICAgICBRdWVzdGlvbklEID0+IDIzCiAgICApOwoKPWN1dAoKc3ViIFZvdGVHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgQExpc3QgPSAoKTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhSZXF1ZXN0SUQgUXVlc3Rpb25JRCkpIHsKICAgICAgICBpZiAoIWRlZmluZWQgKCRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHF1b3RlCiAgICBmb3JlYWNoIChxdyhSZXF1ZXN0SUQgUXVlc3Rpb25JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkLCB2b3RlX3ZhbHVlIEZST00gc3VydmV5X3ZvdGUiLgogICAgICAgICIgV0hFUkUgcmVxdWVzdF9pZCA9ICRQYXJhbXtSZXF1ZXN0SUR9IEFORCBxdWVzdGlvbl9pZCA9ICRQYXJhbXtRdWVzdGlvbklEfSI7CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgbXkgJURhdGEgPSAoKTsKICAgICAgICAkRGF0YXtSZXF1ZXN0SUR9ID0gJFJvd1swXTsKICAgICAgICAkRGF0YXtWb3RlVmFsdWV9ID0gJFJvd1sxXSB8fCAnLSc7CiAgICAgICAgcHVzaChATGlzdCwgXCVEYXRhKTsKICAgIH0KICAgIHJldHVybiBATGlzdDsKfQoKPWl0ZW0gQ291bnRWb3RlKCkKCnRvIGNvdW50IGFsbCB2b3RlcyBvZiBhIHN1cnZleQoKICAgIG15ICRDb3VudFZvdGUgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkNvdW50Vm90ZSgKICAgICAgICBRdWVzdGlvbklEID0+IDEyMywKICAgICAgICBWb3RlVmFsdWUgPT4gJ1RoZSBWYWx1ZScsCiAgICApOwoKPWN1dAoKc3ViIENvdW50Vm90ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCBWb3RlVmFsdWUpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoVm90ZVZhbHVlKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICBmb3JlYWNoIChxdyhRdWVzdGlvbklEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KICAgICMgc3FsIGZvciBldmVudAogICAgbXkgJFNRTCA9ICJTRUxFQ1QgQ09VTlQodm90ZV92YWx1ZSkgRlJPTSBzdXJ2ZXlfdm90ZSBXSEVSRSAiLgogICAgICAgICJxdWVzdGlvbl9pZCA9ICRQYXJhbXtRdWVzdGlvbklEfSBBTkQgdm90ZV92YWx1ZSA9ICckUGFyYW17Vm90ZVZhbHVlfSciOwoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICBteSAlRGF0YSA9ICgpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJERhdGF7Q291bnRWb3RlfSA9ICRSb3dbMF07CiAgICB9CiAgICByZXR1cm4gJERhdGF7Q291bnRWb3RlfTsKfQoKPWl0ZW0gQ291bnRSZXF1ZXN0KCkKCnRvIGNvdW50IGFsbCByZXF1ZXN0cyBvZiBhIHN1cnZleQoKICAgIG15ICRDb3VudFJlcXVlc3QgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkNvdW50UmVxdWVzdCgKICAgICAgICBRdWVzdGlvbklEID0+IDEyMywKICAgICAgICBWYWxpZElEID0+IDAsICAgICAgICAjIDAsIDEsIGFsbAogICAgKTsKCj1jdXQKCnN1YiBDb3VudFJlcXVlc3QgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFN1cnZleUlEIFZhbGlkSUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoU3VydmV5SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICBteSAkU1FMID0gIlNFTEVDVCBDT1VOVChpZCkgRlJPTSBzdXJ2ZXlfcmVxdWVzdCBXSEVSRSBzdXJ2ZXlfaWQgPSAkUGFyYW17U3VydmV5SUR9IjsKCiAgICBpZiAoJFBhcmFte1ZhbGlkSUR9IGVxIDApIHsKICAgICAgICAkU1FMIC49ICIgQU5EIHZhbGlkX2lkID0gMCI7CiAgICB9CiAgICBlbHNpZiAoJFBhcmFte1ZhbGlkSUR9IGVxIDEpIHsKICAgICAgICAkU1FMIC49ICIgQU5EIHZhbGlkX2lkID0gMSI7CiAgICB9CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoU1FMID0+ICRTUUwpOwoKICAgIG15ICVEYXRhID0gKCk7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkRGF0YXtDb3VudFJlcXVlc3R9ID0gJFJvd1swXTsKICAgIH0KICAgIHJldHVybiAkRGF0YXtDb3VudFJlcXVlc3R9Owp9Cgo9aXRlbSBFbGVtZW50RXhpc3RzKCkKCmV4aXN0cyBhbiBzdXJ2ZXktLCBxdWVzdGlvbi0sIGFuc3dlci0gb3IgcmVxdWVzdC1lbGVtZW50CgogICAgbXkgJENvdW50UmVxdWVzdCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cygKICAgICAgICBJRCA9PiAxMjMsICAgICAgICAgICAjIFN1cnZleUlELCBRdWVzdGlvbklELCBBbnN3ZXJJRCwgUmVxdWVzdElECiAgICAgICAgRWxlbWVudCA9PiAnU3VydmV5JyAgIyBTdXJ2ZXksIFF1ZXN0aW9uLCBBbnN3ZXIsIFJlcXVlc3QKICAgICk7Cgo9Y3V0CgpzdWIgRWxlbWVudEV4aXN0cyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoRWxlbWVudElEIEVsZW1lbnQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoRWxlbWVudCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoRWxlbWVudElEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSwgJ0ludGVnZXInKTsKICAgIH0KCiAgICBteSAkRWxlbWVudEV4aXN0cyA9ICdObyc7CgogICAgaWYgKCRQYXJhbXtFbGVtZW50fSBlcSAnU3VydmV5JykgewogICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIENPVU5UKGlkKSBGUk9NIHN1cnZleSBXSEVSRSBpZCA9ICRQYXJhbXtFbGVtZW50SUR9IjsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgICAgIG15ICREYXRhID0gJyc7CiAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICREYXRhID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgaWYgKCREYXRhID4gMCkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cyA9ICdZZXMnOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICgkUGFyYW17RWxlbWVudH0gZXEgJ1F1ZXN0aW9uJykgewogICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIENPVU5UKGlkKSBGUk9NIHN1cnZleV9xdWVzdGlvbiBXSEVSRSBpZCA9ICRQYXJhbXtFbGVtZW50SUR9IjsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgICAgIG15ICREYXRhID0gJyc7CiAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICREYXRhID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgaWYgKCREYXRhID4gMCkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cyA9ICdZZXMnOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICgkUGFyYW17RWxlbWVudH0gZXEgJ0Fuc3dlcicpIHsKICAgICAgICBteSAkU1FMID0gIlNFTEVDVCBDT1VOVChpZCkgRlJPTSBzdXJ2ZXlfYW5zd2VyIFdIRVJFIGlkID0gJFBhcmFte0VsZW1lbnRJRH0iOwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAkU1FMKTsKCiAgICAgICAgbXkgJERhdGEgPSAnJzsKICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgJERhdGEgPSAkUm93WzBdOwogICAgICAgIH0KICAgICAgICBpZiAoJERhdGEgPiAwKSB7CiAgICAgICAgICAgICRFbGVtZW50RXhpc3RzID0gJ1llcyc7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCRQYXJhbXtFbGVtZW50fSBlcSAnUmVxdWVzdCcpIHsKICAgICAgICBteSAkU1FMID0gIlNFTEVDVCBDT1VOVChpZCkgRlJPTSBzdXJ2ZXlfcmVxdWVzdCBXSEVSRSBpZCA9ICRQYXJhbXtFbGVtZW50SUR9IjsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CgogICAgICAgIG15ICREYXRhID0gJyc7CiAgICAgICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICREYXRhID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgaWYgKCREYXRhID4gMCkgewogICAgICAgICAgICAkRWxlbWVudEV4aXN0cyA9ICdZZXMnOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJEVsZW1lbnRFeGlzdHM7Cn0KCj1pdGVtIFJlcXVlc3RTZW5kKCkKCnRvIHNlbmQgYSByZXF1ZXN0IHRvIGEgY3VzdG9tZXIKCiAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlJlcXVlc3RTZW5kKAogICAgICAgIFRpY2tldElEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgUmVxdWVzdFNlbmQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJE1hc3RlcklEID0gJyc7CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoVGlja2V0SUQpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoVGlja2V0SUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkUGFyYW17JF99LCAnSW50ZWdlcicpOwogICAgfQogICAgIyBjcmVhdGUgUHVibGljU3VydmV5S2V5CiAgICBteSAkbWQ1ID0gRGlnZXN0OjpNRDUtPm5ldygpOwogICAgJG1kNS0+YWRkKCRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSAuIGludChyYW5kKDk5OTk5OTk5OSkpKTsKICAgIG15ICRQdWJsaWNTdXJ2ZXlLZXkgPSAkbWQ1LT5oZXhkaWdlc3Q7CgogICAgIyBmaW5kIG1hc3RlciBzdXJ2ZXkKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gc3VydmV5IFdIRVJFIHN0YXR1cyA9ICdNYXN0ZXInIgogICAgKTsKICAgIHdoaWxlIChteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSkgewogICAgICAgICRNYXN0ZXJJRCA9ICRSb3dbMF07CiAgICB9CiAgICAjIGlmIG1hc3RlciBzdXJ2ZXkgZXhpc3RzCiAgICBpZiAoJE1hc3RlcklEICYmICRNYXN0ZXJJRCA+IDApIHsKICAgICAgICBteSAkU3ViamVjdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXJ2ZXk6Ok5vdGlmaWNhdGlvblN1YmplY3QnKTsKICAgICAgICBteSAkQm9keSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXJ2ZXk6Ok5vdGlmaWNhdGlvbkJvZHknKTsKICAgICAgICAjIHRpY2tldCBkYXRhCiAgICAgICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0pOwogICAgICAgIGZvcmVhY2ggKGtleXMgJVRpY2tldCkgewogICAgICAgICAgICBpZiAoZGVmaW5lZCgkVGlja2V0eyRffSkpIHsKICAgICAgICAgICAgICAgICRTdWJqZWN0ID1+IHMvPE9UUlNfVElDS0VUXyRfPi8kVGlja2V0eyRffS9naTsKICAgICAgICAgICAgICAgICRCb2R5ID1+IHMvPE9UUlNfVElDS0VUXyRfPi8kVGlja2V0eyRffS9naTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIGNsZWFudXAKICAgICAgICAkU3ViamVjdCA9fiBzLzxPVFJTX1RJQ0tFVF8uKz8+Ly0vZ2k7CiAgICAgICAgJEJvZHkgPX4gcy88T1RSU19USUNLRVRfLis/Pi8tL2dpOwogICAgICAgICMgcmVwbGFjZSBjb25maWcgb3B0aW9ucwogICAgICAgICRTdWJqZWN0ID1+IHN7PE9UUlNfQ09ORklHXyguKz8pPn17JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJDEpfWVneDsKICAgICAgICAkQm9keSA9fiBzezxPVFJTX0NPTkZJR18oLis/KT59eyRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCQxKX1lZ3g7CiAgICAgICAgIyBjbGVhbnVwCiAgICAgICAgJFN1YmplY3QgPX4gcy88T1RSU19DT05GSUdfLis/Pi8tL2dpOwogICAgICAgICRCb2R5ID1+IHMvPE9UUlNfQ09ORklHXy4rPz4vLS9naTsKICAgICAgICAjIGdldCBjdXN0b21lciBkYXRhIGFuZCByZXBsYWNlIGl0IHdpdGggPE9UUlNfQ1VTVE9NRVJfREFUQV8uLi4KICAgICAgICBteSAlQ3VzdG9tZXJVc2VyID0gKCk7CiAgICAgICAgaWYgKCRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9KSB7CiAgICAgICAgICAgICVDdXN0b21lclVzZXIgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIHJlcGxhY2UgY3VzdG9tZXIgc3R1ZmYgd2l0aCB0YWdzCiAgICAgICAgICAgIGZvcmVhY2ggKGtleXMgJUN1c3RvbWVyVXNlcikgewogICAgICAgICAgICAgICAgaWYgKCRDdXN0b21lclVzZXJ7JF99KSB7CiAgICAgICAgICAgICAgICAgICAgJFN1YmplY3QgPX4gcy88T1RSU19DVVNUT01FUl9EQVRBXyRfPi8kQ3VzdG9tZXJVc2VyeyRffS9naTsKICAgICAgICAgICAgICAgICAgICAkQm9keSA9fiBzLzxPVFJTX0NVU1RPTUVSX0RBVEFfJF8+LyRDdXN0b21lclVzZXJ7JF99L2dpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgY2xlYW51cCBhbGwgbm90IG5lZWRlZCA8T1RSU19DVVNUT01FUl9EQVRBXyB0YWdzCiAgICAgICAgJFN1YmplY3QgPX4gcy88T1RSU19DVVNUT01FUl9EQVRBXy4rPz4vLS9naTsKICAgICAgICAkQm9keSA9fiBzLzxPVFJTX0NVU1RPTUVSX0RBVEFfLis/Pi8tL2dpOwogICAgICAgICMgcmVwbGFjZSBrZXkKICAgICAgICAkU3ViamVjdCA9fiBzLzxPVFJTX1B1YmxpY1N1cnZleUtleT4vJFB1YmxpY1N1cnZleUtleS9naTsKICAgICAgICAkQm9keSA9fiBzLzxPVFJTX1B1YmxpY1N1cnZleUtleT4vJFB1YmxpY1N1cnZleUtleS9naTsKICAgICAgICBteSAkVG8gPSAkQ3VzdG9tZXJVc2Vye1VzZXJFbWFpbH07CiAgICAgICAgaWYgKCEkVG8pIHsKICAgICAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVMYXN0Q3VzdG9tZXJBcnRpY2xlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRvID0gJEFydGljbGV7RnJvbX07CiAgICAgICAgfQogICAgICAgIGlmICgkVG8pIHsKICAgICAgICAgICAgIyBjaGVjayBpZiBub3Qgc3VydmV5IHNob3VsZCBiZSBzZW5kCiAgICAgICAgICAgIGlmICgkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VydmV5OjpTZW5kTm9TdXJ2ZXlSZWdFeHAnKSkgewogICAgICAgICAgICAgICAgaWYgKCRUbyA9fiAvJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cnZleTo6U2VuZE5vU3VydmV5UmVnRXhwJykvaSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICMgY2hlY2sgaWYgYSBzdXJ2ZXkgaXMgc2VudCBpbiB0aGUgbGFzdCB0aW1lCiAgICAgICAgICAgIGlmICgkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3VydmV5OjpTZW5kUGVyaW9kJykpIHsKICAgICAgICAgICAgICAgIG15ICRMYXN0U2VudFRpbWUgPSAwOwogICAgICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1Qgc2VuZF90aW1lIEZST00gIi4KICAgICAgICAgICAgICAgICAgICAgICAgInN1cnZleV9yZXF1ZXN0IFdIRVJFIHNlbmRfdG8gPSAnIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFRvKS4iJyIKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAgICAgICAgICAgICAkTGFzdFNlbnRUaW1lID0gJFJvd1swXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkTGFzdFNlbnRUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgJExhc3RTZW50VGltZSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExhc3RTZW50VGltZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgoJExhc3RTZW50VGltZSsoJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N1cnZleTo6U2VuZFBlcmlvZCcpKjYwKjYwKjI0KSkgPgogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICMgY3JlYXRlIGEgc3VydmV5X3JlcXVlc3QgZW50cnkKICAgICAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBzdXJ2ZXlfcmVxdWVzdCAiLgogICAgICAgICAgICAgICAgICAgICIgKHRpY2tldF9pZCwgc3VydmV5X2lkLCB2YWxpZF9pZCwgcHVibGljX3N1cnZleV9rZXksIHNlbmRfdG8sIHNlbmRfdGltZSkgIi4KICAgICAgICAgICAgICAgICAgICAiIFZBTFVFUyAoIi4KICAgICAgICAgICAgICAgICAgICAiJFBhcmFte1RpY2tldElEfSwgIi4KICAgICAgICAgICAgICAgICAgICAiJE1hc3RlcklELCAiLgogICAgICAgICAgICAgICAgICAgICIxLCAiLgogICAgICAgICAgICAgICAgICAgICInIi4kU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFB1YmxpY1N1cnZleUtleSkuIicsICIuCiAgICAgICAgICAgICAgICAgICAgIiciLiRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkVG8pLiInLCAiLgogICAgICAgICAgICAgICAgICAgICJjdXJyZW50X3RpbWVzdGFtcCkiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgbG9nIGFjdGlvbiBvbiB0aWNrZXQKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5IaXN0b3J5QWRkKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJ01pc2MnLAogICAgICAgICAgICAgICAgTmFtZSA9PiAiU2VudCBjdXN0b21lciBzdXJ2ZXkgdG8gJFRvLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgc2VuZCBzdXJ2ZXkKICAgICAgICAgICAgJFNlbGYtPntTZW5kbWFpbE9iamVjdH0tPlNlbmQoCiAgICAgICAgICAgICAgICBGcm9tID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdXJ2ZXk6Ok5vdGlmaWNhdGlvblNlbmRlcicpIHx8ICcnLAogICAgICAgICAgICAgICAgVG8gPT4gJFRvLAogICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkU3ViamVjdCwKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgQm9keSA9PiAkQm9keQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBQdWJsaWNTdXJ2ZXlHZXQoKQoKdG8gZ2V0IGFsbCBwdWJsaWMgYXR0cmlidXRlcyBvZiBhIHN1cnZleQoKICAgIG15ICVQdWJsaWNTdXJ2ZXkgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlB1YmxpY1N1cnZleUdldCgKICAgICAgICBQdWJsaWNTdXJ2ZXlLZXkgPT4gJ0F3NWRlM1hmNXFBJywKICAgICk7Cgo9Y3V0CgpzdWIgUHVibGljU3VydmV5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhQdWJsaWNTdXJ2ZXlLZXkpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgIyBzcWwgZm9yIGV2ZW50CiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gIlNFTEVDVCBzdXJ2ZXlfaWQgIi4KICAgICAgICAiRlJPTSBzdXJ2ZXlfcmVxdWVzdCBXSEVSRSBwdWJsaWNfc3VydmV5X2tleSA9ICckUGFyYW17UHVibGljU3VydmV5S2V5fScgQU5EIHZhbGlkX2lkID0gMSIKICAgICk7CgogICAgbXkgJFN1cnZleUlEID0gKCk7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkU3VydmV5SUQgPSAkUm93WzBdOwogICAgfQoKICAgIGlmICgkU3VydmV5SUQgPiAnMCcpIHsKICAgICAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgc3VydmV5bnVtYmVyLCB0aXRsZSwgaW50cm9kdWN0aW9uICIuCiAgICAgICAgICAgICJGUk9NIHN1cnZleSBXSEVSRSBpZCA9ICRTdXJ2ZXlJRCBBTkQgKHN0YXR1cyA9ICdNYXN0ZXInIE9SIHN0YXR1cyA9ICdWYWxpZCcpIjsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZShTUUwgPT4gJFNRTCk7CiAgICAgICAgbXkgQFN1cnZleSA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCk7CgogICAgICAgIG15ICVEYXRhID0gKCk7CiAgICAgICAgaWYgKCRTdXJ2ZXlbMF0gPiAnMCcpIHsKICAgICAgICAgICAgJERhdGF7U3VydmV5SUR9ID0gJFN1cnZleVswXTsKICAgICAgICAgICAgJERhdGF7U3VydmV5TnVtYmVyfSA9ICRTdXJ2ZXlbMV07CiAgICAgICAgICAgICREYXRhe1RpdGxlfSA9ICRTdXJ2ZXlbMl07CiAgICAgICAgICAgICREYXRhe0ludHJvZHVjdGlvbn0gPSAkU3VydmV5WzNdOwogICAgICAgICAgICByZXR1cm4gJURhdGE7CiAgICAgICAgfQogICAgfQp9Cgo9aXRlbSBQdWJsaWNBbnN3ZXJTYXZlKCkKCnRvIHNhdmUgYSBwdWJsaWMgdm90ZQoKICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UHVibGljQW5zd2VyU2F2ZSgKICAgICAgICBQdWJsaWNTdXJ2ZXlLZXkgPT4gJ2FWa2RFODJEdzJxdzZlckNkYScsCiAgICAgICAgUXVlc3Rpb25JRCA9PiA0LAogICAgICAgIFZvdGVWYWx1ZSA9PiAnVGhlIFZhbHVlJywKICAgICk7Cgo9Y3V0CgpzdWIgUHVibGljQW5zd2VyU2F2ZXsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhQdWJsaWNTdXJ2ZXlLZXkgUXVlc3Rpb25JRCBWb3RlVmFsdWUpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUHVibGljU3VydmV5S2V5IFZvdGVWYWx1ZSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30pOwogICAgfQogICAgZm9yZWFjaCAocXcoUXVlc3Rpb25JRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCRQYXJhbXskX30sICdJbnRlZ2VyJyk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIGlkICIuCiAgICAgICAgIiBGUk9NIHN1cnZleV9yZXF1ZXN0IFdIRVJFIHB1YmxpY19zdXJ2ZXlfa2V5ID0gJyRQYXJhbXtQdWJsaWNTdXJ2ZXlLZXl9JyBBTkQgdmFsaWRfaWQgPSAxIgogICAgKTsKCiAgICBteSAkUmVxdWVzdElEID0gKCk7CiAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkpIHsKICAgICAgICAkUmVxdWVzdElEID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoJFJlcXVlc3RJRCA+ICcwJykgewogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyBzdXJ2ZXlfdm90ZSAocmVxdWVzdF9pZCwgcXVlc3Rpb25faWQsIHZvdGVfdmFsdWUsIGNyZWF0ZV90aW1lKSBWQUxVRVMgKCIuCiAgICAgICAgICAgICAgICAiJFJlcXVlc3RJRCwgIi4KICAgICAgICAgICAgICAgICIkUGFyYW17UXVlc3Rpb25JRH0sICIuCiAgICAgICAgICAgICAgICAiJyRQYXJhbXtWb3RlVmFsdWV9JywgIi4KICAgICAgICAgICAgICAgICJjdXJyZW50X3RpbWVzdGFtcCkiCiAgICAgICAgKTsKICAgIH0KfQoKPWl0ZW0gUHVibGljU3VydmV5SW52YWxpZFNldCgpCgp0byBzZXQgYSByZXF1ZXN0IGludmFsaWQKCiAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlB1YmxpY1N1cnZleUludmFsaWRTZXQoCiAgICAgICAgUHVibGljU3VydmV5S2V5ID0+ICdhVmtkRTgyRHcycXc2ZXJDZGEnLAogICAgKTsKCj1jdXQKCnN1YiBQdWJsaWNTdXJ2ZXlJbnZhbGlkU2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhQdWJsaWNTdXJ2ZXlLZXkpKSB7CiAgICAgICAgaWYgKCFkZWZpbmVkICgkUGFyYW17JF99KSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBxdW90ZQogICAgZm9yZWFjaCAocXcoUHVibGljU3VydmV5S2V5KSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoJFBhcmFteyRffSk7CiAgICB9CiAgICAjIHNxbCBmb3IgZXZlbnQKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKFNRTCA9PiAiU0VMRUNUIGlkICIuCiAgICAgICAgIiBGUk9NIHN1cnZleV9yZXF1ZXN0IFdIRVJFIHB1YmxpY19zdXJ2ZXlfa2V5ID0gJyRQYXJhbXtQdWJsaWNTdXJ2ZXlLZXl9JyIKICAgICk7CgogICAgbXkgJFJlcXVlc3RJRCA9ICgpOwogICAgd2hpbGUgKG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgJFJlcXVlc3RJRCA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCRSZXF1ZXN0SUQgPiAnMCcpIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiVVBEQVRFIHN1cnZleV9yZXF1ZXN0IFNFVCAiLgogICAgICAgICAgICAgICAgInZhbGlkX2lkID0gMCwgIi4KICAgICAgICAgICAgICAgICJ2b3RlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCAiLgogICAgICAgICAgICAgICAgIldIRVJFIGlkID0gJFJlcXVlc3RJRCIKICAgICAgICApOwogICAgfQp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yNiAkICREYXRlOiAyMDA2LzA5LzA2IDE2OjIxOjAwICQKCj1jdXQ=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L0V2ZW50L1N1cnZleVNlbmRSZXF1ZXN0LnBtIC0gc2VuZCBzdXJ2ZXkgcmVxdWVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU3VydmV5U2VuZFJlcXVlc3QucG0sdiAxLjUgMjAwNi8xMC8yNCAxMDo1NjoyNSBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RXZlbnQ6OlN1cnZleVNlbmRSZXF1ZXN0OwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS41ICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IFRpY2tldE9iamVjdCBMb2dPYmplY3QgVXNlck9iamVjdCBDdXN0b21lclVzZXJPYmplY3QgU2VuZG1haWxPYmplY3QgVGltZU9iamVjdCBFbmNvZGVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN1cnZleS0+bmV3KCVQYXJhbSk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhUaWNrZXRJRCBFdmVudCBDb25maWcpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoJFBhcmFte0V2ZW50fSBlcSAnU3RhdGVTZXQnIHx8ICRQYXJhbXtFdmVudH0gZXEgJ1RpY2tldFN0YXRlVXBkYXRlJykgewogICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldChUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9KTsKICAgICAgICBpZiAoJFRpY2tldHtTdGF0ZVR5cGV9IGVxICdjbG9zZWQnKXsKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5SZXF1ZXN0U2VuZChUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTs=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50U3VydmV5LnBtIC0gYSBzdXJ2ZXkgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50U3VydmV5LnBtLHYgMS4yMiAyMDA2LzEwLzI0IDEwOjU2OjI1IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50U3VydmV5OwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yMiAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgT3BqZWN0cwogICAgZm9yZWFjaCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgZGllICJHb3Qgbm8gJF8hIiBpZiAoISRTZWxmLT57JF99KTsKICAgIH0KICAgICRTZWxmLT57U3VydmV5T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXktPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkT3V0cHV0OwoKICAgIGlmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N1cnZleScpIHsKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIk1lc3NhZ2UiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAnU3VydmV5Jyk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAjIG91dHB1dCBtZXNhZ2VzIGlmIHN0YXR1cyB3YXMgY2hhbmdlZAogICAgICAgIGlmIChkZWZpbmVkKCRNZXNzYWdlKSAmJiAkTWVzc2FnZSBlcSAnTm9RdWVzdGlvbicpIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBJbmZvID0+ICdDYW5cJ3Qgc2V0IG5ldyBTdGF0dXMhIE5vIFF1ZXN0aW9uIGRlZmluaWVkLicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmIChkZWZpbmVkKCRNZXNzYWdlKSAmJiAkTWVzc2FnZSBlcSAnSW5jb21wbGV0ZVF1ZXN0aW9uJykgewogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIEluZm8gPT4gJ0NhblwndCBzZXQgbmV3IFN0YXR1cyEgUXVlc3Rpb24ocykgaW5jb21wbGV0ZS4nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoZGVmaW5lZCgkTWVzc2FnZSkgJiYgJE1lc3NhZ2UgZXEgJ1N0YXR1c1NldCcpIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdOb3RpY2UnLAogICAgICAgICAgICAgICAgSW5mbyA9PiAnTmV3IFN0YXR1cyBha3RpdiEnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAjIGdldCBhbGwgYXR0cmlidXRlcyBvZiB0aGUgc3VydmV5CiAgICAgICAgbXkgJVN1cnZleSA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+U3VydmV5R2V0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CiAgICAgICAgIyBrb252ZXJ0IHRoZSB0ZXh0YXJlYXMgaW4gaHRtbCAoXG4gLS0+PGJyPikKICAgICAgICAkU3VydmV5e0ludHJvZHVjdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgPT4gJFN1cnZleXtJbnRyb2R1Y3Rpb259LAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFN1cnZleXtEZXNjcmlwdGlvbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgPT4gJFN1cnZleXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKICAgICAgICAjIGdldCBudW1iZXJzIG9mIHJlcXVlc3RzIGFuZCB2b3RlcwogICAgICAgIG15ICRTZW5kUmVxdWVzdCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+Q291bnRSZXF1ZXN0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCwgVmFsaWRJRCA9PiAnYWxsJyk7CiAgICAgICAgbXkgJFJlcXVlc3RDb21wbGV0ZSA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+Q291bnRSZXF1ZXN0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCwgVmFsaWRJRCA9PiAwKTsKICAgICAgICAkU3VydmV5e1NlbmRSZXF1ZXN0fSA9ICRTZW5kUmVxdWVzdDsKICAgICAgICAkU3VydmV5e1JlcXVlc3RDb21wbGV0ZX0gPSAkUmVxdWVzdENvbXBsZXRlOwogICAgICAgICMgcHJpbnQgdGhlIG1haW4gdGFibGUuCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3VydmV5JywKICAgICAgICAgICAgRGF0YSA9PiB7JVN1cnZleX0sCiAgICAgICAgKTsKICAgICAgICAjIGRpc3BsYXkgc3RhdHMgaWYgc3RhdHVzIE1hc3RlciwgVmFsaWQgb3IgSW52YWxpZAogICAgICAgIGlmICgkU3VydmV5e1N0YXR1c30gZXEgJ01hc3RlcicgfHwgJFN1cnZleXtTdGF0dXN9IGVxICdWYWxpZCcgfHwgJFN1cnZleXtTdGF0dXN9IGVxICdJbnZhbGlkJykgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3VydmV5RWRpdFN0YXRzJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge1N1cnZleUlEID0+ICRTdXJ2ZXlJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgZ2V0IGFsbCBxdWVzdGlvbnMgb2YgdGhlIHN1cnZleQogICAgICAgICAgICBteSBAUXVlc3Rpb25MaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvbkxpc3QoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKCiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFF1ZXN0aW9uKEBRdWVzdGlvbkxpc3QpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnU3VydmV5RWRpdFN0YXRzUXVlc3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFF1ZXN0aW9uLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSBAQW5zd2VycyA9ICgpOwogICAgICAgICAgICAgICAgIyBnZW5lcmF0ZSB0aGUgYW5zd2VycyBvZiB0aGUgcXVlc3Rpb24KICAgICAgICAgICAgICAgIGlmICgkUXVlc3Rpb24tPntUeXBlfSBlcSAnWWVzTm8nIHx8ICRRdWVzdGlvbi0+e1R5cGV9IGVxICdSYWRpbycgfHwgJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ0NoZWNrYm94JyApIHsKICAgICAgICAgICAgICAgICAgICBteSBAQW5zd2VyTGlzdCA9ICgpOwogICAgICAgICAgICAgICAgICAgICMgc2V0IGFuc3dlcnMgdG8gWWVzIGFuZCBObyBpZiB0eXBlIHdhcyBZZXNObwogICAgICAgICAgICAgICAgICAgIGlmICgkUXVlc3Rpb24tPntUeXBlfSBlcSAnWWVzTm8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVEYXRhID0gKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0Fuc3dlcn0gPSAiWWVzIjsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7QW5zd2VySUR9ID0gIlllcyI7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goQEFuc3dlckxpc3QsXCVEYXRhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVEYXRhMiA9ICgpOwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YTJ7QW5zd2VyfSA9ICJObyI7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhMntBbnN3ZXJJRH0gPSAiTm8iOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKEBBbnN3ZXJMaXN0LFwlRGF0YTIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgYWxsIGFuc3dlcnMgb2YgYSBxdWVzdGlvbgogICAgICAgICAgICAgICAgICAgICAgICBAQW5zd2VyTGlzdCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyTGlzdChRdWVzdGlvbklEID0+ICRRdWVzdGlvbi0+e1F1ZXN0aW9uSUR9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJFJvdyhAQW5zd2VyTGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkQ291bnRWb3RlID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5Db3VudFZvdGUoUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb24tPntRdWVzdGlvbklEfSwgVm90ZVZhbHVlID0+ICRSb3ctPntBbnN3ZXJJRH0pOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkUGVyY2VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIHRoZSBwZXJjZW50cwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFJlcXVlc3RDb21wbGV0ZSBuZSAnMCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQZXJjZW50ID0gMTAwIC8gJFJlcXVlc3RDb21wbGV0ZSAqICRDb3VudFZvdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGVyY2VudCA9IHNwcmludGYgKCIlLjBmIiwgJFBlcmNlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICgpOwogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtBbnN3ZXJ9ID0gJFJvdy0+e0Fuc3dlcn07CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0Fuc3dlclBlcmNlbnR9ID0gJFBlcmNlbnQ7CgogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKEBBbnN3ZXJzLFwlRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCRRdWVzdGlvbi0+e1R5cGV9IGVxICdUZXh0YXJlYScgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFuc3dlck5vID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5Db3VudFZvdGUoUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb24tPntRdWVzdGlvbklEfSwgVm90ZVZhbHVlID0+ICcnKTsKICAgICAgICAgICAgICAgICAgICBteSAkUGVyY2VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIyBjYWxjdWxhdGUgdGhlIHBlcmNlbnRzCiAgICAgICAgICAgICAgICAgICAgaWYgKCRSZXF1ZXN0Q29tcGxldGUgbmUgJzAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQZXJjZW50ID0gMTAwIC8gJFJlcXVlc3RDb21wbGV0ZSAqICRBbnN3ZXJObzsKICAgICAgICAgICAgICAgICAgICAgICAgJFBlcmNlbnQgPSBzcHJpbnRmICgiJS4wZiIsICRQZXJjZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICVEYXRhID0gKCk7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7QW5zd2VyfSA9ICJhbnN3ZXJlZCI7CgogICAgICAgICAgICAgICAgICAgIGlmICgkUmVxdWVzdENvbXBsZXRlIGVxICcwJykgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtBbnN3ZXJQZXJjZW50fSA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtBbnN3ZXJQZXJjZW50fSA9IDEwMCAtICRQZXJjZW50OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcHVzaChAQW5zd2VycyxcJURhdGEpOwoKICAgICAgICAgICAgICAgICAgICBteSAlRGF0YTIgPSAoKTsKICAgICAgICAgICAgICAgICAgICAkRGF0YTJ7QW5zd2VyfSA9ICJub3QgYW5zd2VyZWQiOwogICAgICAgICAgICAgICAgICAgICREYXRhMntBbnN3ZXJQZXJjZW50fSA9ICRQZXJjZW50OwoKICAgICAgICAgICAgICAgICAgICBwdXNoKEBBbnN3ZXJzLCBcJURhdGEyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgb3V0cHV0IGFsbCBhbnN3ZXJzIG9mIHRoZSBzdXJ2ZXkKICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJFJvdyAoQEFuc3dlcnMpIHsKICAgICAgICAgICAgICAgICAgICAkUm93LT57QW5zd2VyUGVyY2VudFRhYmxlfSA9ICRSb3ctPntBbnN3ZXJQZXJjZW50fTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRSb3ctPntBbnN3ZXJQZXJjZW50fSBlcSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSb3ctPntBbnN3ZXJQZXJjZW50VGFibGV9ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRTdGF0c0Fuc3dlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFJvdywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkUmVxdWVzdENvbXBsZXRlID4gMCkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlFZGl0U3RhdHNEZXRhaWxzJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgb3V0cHV0IHRoZSBwb3NzaWJsZSBzdGF0dXMKICAgICAgICBpZiAoJFN1cnZleXtTdGF0dXN9IGVxICdOZXcnIHx8ICRTdXJ2ZXl7U3RhdHVzfSBlcSAnSW52YWxpZCcpIHsKICAgICAgICAgICAgJFN1cnZleXtOZXdTdGF0dXN9ID0gJ01hc3Rlcic7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlTdGF0dXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVN1cnZleX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU3VydmV5e05ld1N0YXR1c30gPSAnVmFsaWQnOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3VydmV5U3RhdHVzJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVTdXJ2ZXl9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoJFN1cnZleXtTdGF0dXN9IGVxICdWYWxpZCcpIHsKICAgICAgICAgICAgJFN1cnZleXtOZXdTdGF0dXN9ID0gJ01hc3Rlcic7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlTdGF0dXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVN1cnZleX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU3VydmV5e05ld1N0YXR1c30gPSAnSW52YWxpZCc7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlTdGF0dXMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVN1cnZleX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkU3VydmV5e1N0YXR1c30gZXEgJ01hc3RlcicpIHsKICAgICAgICAgICAgJFN1cnZleXtOZXdTdGF0dXN9ID0gJ1ZhbGlkJzsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleVN0YXR1cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslU3VydmV5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTdXJ2ZXl7TmV3U3RhdHVzfSA9ICdJbnZhbGlkJzsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleVN0YXR1cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslU3VydmV5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRTdXJ2ZXknLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdXJ2ZXlTdGF0dXMnKSB7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgIG15ICROZXdTdGF0dXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIk5ld1N0YXR1cyIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGV4aXN0cwogICAgICAgIGlmICgkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRTdXJ2ZXlJRCwgRWxlbWVudCA9PiAnU3VydmV5JykgbmUgJ1llcycpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CiAgICAgICAgIyBzZXQgYSBuZXcgc3RhdHVzCiAgICAgICAgbXkgJFN0YXR1c1NldCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+U3VydmV5U3RhdHVzU2V0KAogICAgICAgICAgICBTdXJ2ZXlJRCA9PiAkU3VydmV5SUQsCiAgICAgICAgICAgIE5ld1N0YXR1cyA9PiAkTmV3U3RhdHVzCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE1lc3NhZ2UgPSAnJzsKICAgICAgICBpZiAoZGVmaW5lZCgkU3RhdHVzU2V0KSAmJiAkU3RhdHVzU2V0IGVxICdOb1F1ZXN0aW9uJykgewogICAgICAgICAgICAkTWVzc2FnZSA9ICcmTWVzc2FnZT1Ob1F1ZXN0aW9uJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKGRlZmluZWQoJFN0YXR1c1NldCkgJiYgJFN0YXR1c1NldCBlcSAnSW5jb21wbGV0ZVF1ZXN0aW9uJykgewogICAgICAgICAgICAkTWVzc2FnZSA9ICcmTWVzc2FnZT1JbmNvbXBsZXRlUXVlc3Rpb24nOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoZGVmaW5lZCgkU3RhdHVzU2V0KSAmJiAkU3RhdHVzU2V0IGVxICdTdGF0dXNTZXQnKSB7CiAgICAgICAgICAgICRNZXNzYWdlID0gJyZNZXNzYWdlPVN0YXR1c1NldCc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249U3VydmV5JlN1cnZleUlEPSRTdXJ2ZXlJRCRNZXNzYWdlIik7CiAgICB9CiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdXJ2ZXlFZGl0JykgewogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAnU3VydmV5Jyk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgbXkgJVN1cnZleSA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+U3VydmV5R2V0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CgogICAgICAgICMgcHJpbnQgdGhlIG1haW4gdGFibGUuCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3VydmV5RWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4geyVTdXJ2ZXl9LAogICAgICAgICk7CgogICAgICAgIG15IEBMaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvbkxpc3QoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKCiAgICAgICAgaWYgKCRTdXJ2ZXl7U3RhdHVzfSBlcSAnTmV3JykgewogICAgICAgICAgICBmb3JlYWNoIG15ICRRdWVzdGlvbihATGlzdCkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlFZGl0UXVlc3Rpb25zJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJEFuc3dlckNvdW50ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJDb3VudChRdWVzdGlvbklEID0+ICRRdWVzdGlvbi0+e1F1ZXN0aW9uSUR9KTsKCiAgICAgICAgICAgICAgICBpZiAoJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1JhZGlvJyB8fCAkUXVlc3Rpb24tPntUeXBlfSBlcSAnQ2hlY2tib3gnKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBbnN3ZXJDb3VudCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRRdWVzdGlvbnNJbmNvbXBsZXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFF1ZXN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRRdWVzdGlvbnNDb21wbGV0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlFZGl0UXVlc3Rpb25zQ29tcGxldGUnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlFZGl0TmV3UXVlc3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJFF1ZXN0aW9uKEBMaXN0KSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1cnZleUVkaXRRdWVzdGlvbnNWYWxpZE9uY2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFF1ZXN0aW9uLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFN1cnZleScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N1cnZleVNhdmUnKSB7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgIG15ICRUaXRsZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiVGl0bGUiKTsKICAgICAgICBteSAkSW50cm9kdWN0aW9uID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJJbnRyb2R1Y3Rpb24iKTsKICAgICAgICBteSAkRGVzY3JpcHRpb24gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkRlc2NyaXB0aW9uIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXkgZXhpc3RzCiAgICAgICAgaWYgKCRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFN1cnZleUlELCBFbGVtZW50ID0+ICdTdXJ2ZXknKSBuZSAnWWVzJykgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KICAgICAgICBpZiAoJFRpdGxlICYmICRJbnRyb2R1Y3Rpb24gJiYgJERlc2NyaXB0aW9uKSB7CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+U3VydmV5U2F2ZSgKICAgICAgICAgICAgICAgIFN1cnZleUlEID0+ICRTdXJ2ZXlJRCwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRUaXRsZSwKICAgICAgICAgICAgICAgIEludHJvZHVjdGlvbiA9PiAkSW50cm9kdWN0aW9uLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJERlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TdXJ2ZXkmU3VydmV5SUQ9JFN1cnZleUlEI1F1ZXN0aW9uIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249U3VydmV5RWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQiKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdXJ2ZXlBZGQnKSB7CiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdTdXJ2ZXkgQWRkJyk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBwcmludCB0aGUgbWFpbiB0YWJsZS4KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdXJ2ZXlBZGQnLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRTdXJ2ZXknLAogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdXJ2ZXlOZXcnKSB7CiAgICAgICAgbXkgJFRpdGxlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJUaXRsZSIpOwogICAgICAgIG15ICRJbnRyb2R1Y3Rpb24gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkludHJvZHVjdGlvbiIpOwogICAgICAgIG15ICREZXNjcmlwdGlvbiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiRGVzY3JpcHRpb24iKTsKCiAgICAgICAgaWYgKCRUaXRsZSAmJiAkSW50cm9kdWN0aW9uICYmICREZXNjcmlwdGlvbikgewogICAgICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlN1cnZleU5ldygKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRUaXRsZSwKICAgICAgICAgICAgICAgIEludHJvZHVjdGlvbiA9PiAkSW50cm9kdWN0aW9uLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJERlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TdXJ2ZXkmU3VydmV5SUQ9JFN1cnZleUlEIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249U3VydmV5QWRkIik7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUXVlc3Rpb25BZGQnKSB7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgIG15ICRRdWVzdGlvbiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVlc3Rpb24iKTsKICAgICAgICBteSAkVHlwZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiVHlwZSIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGV4aXN0cwogICAgICAgIGlmICgkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRTdXJ2ZXlJRCwgRWxlbWVudCA9PiAnU3VydmV5JykgbmUgJ1llcycpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CgogICAgICAgIGlmICgkUXVlc3Rpb24pIHsKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvbkFkZCgKICAgICAgICAgICAgICAgIFN1cnZleUlEID0+ICRTdXJ2ZXlJRCwKICAgICAgICAgICAgICAgIFF1ZXN0aW9uID0+ICRRdWVzdGlvbiwKICAgICAgICAgICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblNvcnQoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TdXJ2ZXlFZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCNOZXdRdWVzdGlvbiIpOwogICAgfQogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUXVlc3Rpb25EZWxldGUnKSB7CiAgICAgICAgbXkgJFF1ZXN0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uSUQiKTsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXkgYW5kIHF1ZXN0aW9uIGV4aXN0cwogICAgICAgIGlmICgkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRTdXJ2ZXlJRCwgRWxlbWVudCA9PiAnU3VydmV5JykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkUXVlc3Rpb25JRCwgRWxlbWVudCA9PiAnUXVlc3Rpb24nKSBuZSAnWWVzJykgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlF1ZXN0aW9uRGVsZXRlKAogICAgICAgICAgICBTdXJ2ZXlJRCA9PiAkU3VydmV5SUQsCiAgICAgICAgICAgIFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblNvcnQoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVN1cnZleUVkaXQmU3VydmV5SUQ9JFN1cnZleUlEI1F1ZXN0aW9uIik7CiAgICB9CiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdRdWVzdGlvblVwJykgewogICAgICAgIG15ICRRdWVzdGlvbklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbklEIik7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblNvcnQoU3VydmV5SUQgPT4gJFN1cnZleUlEKTsKCiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblVwKAogICAgICAgICAgICBTdXJ2ZXlJRCA9PiAkU3VydmV5SUQsCiAgICAgICAgICAgIFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVN1cnZleUVkaXQmU3VydmV5SUQ9JFN1cnZleUlEI1F1ZXN0aW9uIik7CiAgICB9CiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdRdWVzdGlvbkRvd24nKSB7CiAgICAgICAgbXkgJFF1ZXN0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uSUQiKTsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXkgYW5kIHF1ZXN0aW9uIGV4aXN0cwogICAgICAgIGlmICgkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRTdXJ2ZXlJRCwgRWxlbWVudCA9PiAnU3VydmV5JykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkUXVlc3Rpb25JRCwgRWxlbWVudCA9PiAnUXVlc3Rpb24nKSBuZSAnWWVzJykgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlF1ZXN0aW9uU29ydChTdXJ2ZXlJRCA9PiAkU3VydmV5SUQpOwoKICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlF1ZXN0aW9uRG93bigKICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICBRdWVzdGlvbklEID0+ICRRdWVzdGlvbklELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TdXJ2ZXlFZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCNRdWVzdGlvbiIpOwogICAgfQogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnUXVlc3Rpb25FZGl0JykgewogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICBteSAkUXVlc3Rpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVlc3Rpb25JRCIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdRdWVzdGlvbiBFZGl0Jyk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgbXkgJVN1cnZleSA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+U3VydmV5R2V0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CiAgICAgICAgbXkgJVF1ZXN0aW9uID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvbkdldChRdWVzdGlvbklEID0+ICRRdWVzdGlvbklEKTsKCiAgICAgICAgIyBwcmludCB0aGUgbWFpbiB0YWJsZS4KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQnLAogICAgICAgICAgICBEYXRhID0+IHslUXVlc3Rpb259LAogICAgICAgICk7CgogICAgICAgIGlmICgkUXVlc3Rpb257VHlwZX0gZXEgJ1llc05vJykgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUXVlc3Rpb25FZGl0MScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkUXVlc3Rpb257VHlwZX0gZXEgJ1JhZGlvJykgewogICAgICAgICAgICBteSBATGlzdCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyTGlzdChRdWVzdGlvbklEID0+ICRRdWVzdGlvbklEKTsKCiAgICAgICAgICAgIGlmICgkU3VydmV5e1N0YXR1c30gZXEgJ05ldycpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJEFuc3dlcjIoQExpc3QpIHsKICAgICAgICAgICAgICAgICAgICAkQW5zd2VyMi0+e1N1cnZleUlEfSA9ICRTdXJ2ZXlJRDsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUXVlc3Rpb25FZGl0MicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEFuc3dlcjIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUXVlc3Rpb25FZGl0MmInLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyVRdWVzdGlvbn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkQW5zd2VyMihATGlzdCkgewogICAgICAgICAgICAgICAgICAgICRBbnN3ZXIyLT57U3VydmV5SUR9ID0gJFN1cnZleUlEOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQyVmFsaWRPbmNlJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQW5zd2VyMiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkUXVlc3Rpb257VHlwZX0gZXEgJ0NoZWNrYm94JykgewogICAgICAgICAgICBteSBATGlzdCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyTGlzdChRdWVzdGlvbklEID0+ICRRdWVzdGlvbklEKTsKCiAgICAgICAgICAgIGlmICgkU3VydmV5e1N0YXR1c30gZXEgJ05ldycpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJEFuc3dlcjMoQExpc3QpIHsKICAgICAgICAgICAgICAgICAgICAkQW5zd2VyMy0+e1N1cnZleUlEfSA9ICRTdXJ2ZXlJRDsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUXVlc3Rpb25FZGl0MycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEFuc3dlcjMsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUXVlc3Rpb25FZGl0M2InLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyVRdWVzdGlvbn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkQW5zd2VyMyhATGlzdCkgewogICAgICAgICAgICAgICAgICAgICRBbnN3ZXIzLT57U3VydmV5SUR9ID0gJFN1cnZleUlEOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdRdWVzdGlvbkVkaXQzVmFsaWRPbmNlJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQW5zd2VyMywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkUXVlc3Rpb257VHlwZX0gZXEgJ1RleHRhcmVhJykgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUXVlc3Rpb25FZGl0NCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50U3VydmV5JywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfQogICAgICAgICk7CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdRdWVzdGlvblNhdmUnKSB7CiAgICAgICAgbXkgJFF1ZXN0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uSUQiKTsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJFF1ZXN0aW9uID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJRdWVzdGlvbiIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGFuZCBxdWVzdGlvbiBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CgogICAgICAgIGlmICgkUXVlc3Rpb24pIHsKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5RdWVzdGlvblNhdmUoCiAgICAgICAgICAgICAgICBRdWVzdGlvbklEID0+ICRRdWVzdGlvbklELAogICAgICAgICAgICAgICAgU3VydmV5SUQgPT4gJFN1cnZleUlELAogICAgICAgICAgICAgICAgUXVlc3Rpb24gPT4gJFF1ZXN0aW9uLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1TdXJ2ZXlFZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCNRdWVzdGlvbiIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVF1ZXN0aW9uRWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQmUXVlc3Rpb25JRD0kUXVlc3Rpb25JRCIpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Fuc3dlckFkZCcpIHsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJFF1ZXN0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uSUQiKTsKICAgICAgICBteSAkQW5zd2VyID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJBbnN3ZXIiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSBhbmQgcXVlc3Rpb24gZXhpc3RzCiAgICAgICAgaWYgKCRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFN1cnZleUlELCBFbGVtZW50ID0+ICdTdXJ2ZXknKSBuZSAnWWVzJyB8fAogICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRRdWVzdGlvbklELCBFbGVtZW50ID0+ICdRdWVzdGlvbicpIG5lICdZZXMnCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICBpZiAoJEFuc3dlcikgewogICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlckFkZCgKICAgICAgICAgICAgICAgIFN1cnZleUlEID0+ICRTdXJ2ZXlJRCwKICAgICAgICAgICAgICAgIFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQsCiAgICAgICAgICAgICAgICBBbnN3ZXIgPT4gJEFuc3dlciwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlclNvcnQoUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249UXVlc3Rpb25FZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCZRdWVzdGlvbklEPSRRdWVzdGlvbklEI05ld0Fuc3dlciIpOwogICAgfQogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQW5zd2VyRGVsZXRlJykgewogICAgICAgIG15ICRBbnN3ZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiQW5zd2VySUQiKTsKICAgICAgICBteSAkUXVlc3Rpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVlc3Rpb25JRCIpOwogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSwgcXVlc3Rpb24gYW5kIGFuc3dlciBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkQW5zd2VySUQsIEVsZW1lbnQgPT4gJ0Fuc3dlcicpIG5lICdZZXMnCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlckRlbGV0ZSgKICAgICAgICAgICAgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCwKICAgICAgICAgICAgQW5zd2VySUQgPT4gJEFuc3dlcklELAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyU29ydChRdWVzdGlvbklEID0+ICRRdWVzdGlvbklEKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0mU3ViYWN0aW9uPVF1ZXN0aW9uRWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQmUXVlc3Rpb25JRD0kUXVlc3Rpb25JRCNBbnN3ZXIiKTsKICAgIH0KICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Fuc3dlclVwJykgewogICAgICAgIG15ICRBbnN3ZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiQW5zd2VySUQiKTsKICAgICAgICBteSAkUXVlc3Rpb25JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUXVlc3Rpb25JRCIpOwogICAgICAgIG15ICRTdXJ2ZXlJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VydmV5SUQiKTsKICAgICAgICAjIGNoZWNrIGlmIHN1cnZleSwgcXVlc3Rpb24gYW5kIGFuc3dlciBleGlzdHMKICAgICAgICBpZiAoJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkU3VydmV5SUQsIEVsZW1lbnQgPT4gJ1N1cnZleScpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFF1ZXN0aW9uSUQsIEVsZW1lbnQgPT4gJ1F1ZXN0aW9uJykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkQW5zd2VySUQsIEVsZW1lbnQgPT4gJ0Fuc3dlcicpIG5lICdZZXMnCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259Iik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlclNvcnQoUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCk7CgogICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+QW5zd2VyVXAoCiAgICAgICAgICAgIFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQsCiAgICAgICAgICAgIEFuc3dlcklEID0+ICRBbnN3ZXJJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249UXVlc3Rpb25FZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCZRdWVzdGlvbklEPSRRdWVzdGlvbklEI0Fuc3dlciIpOwogICAgfQogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQW5zd2VyRG93bicpIHsKICAgICAgICBteSAkQW5zd2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkFuc3dlcklEIik7CiAgICAgICAgbXkgJFF1ZXN0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uSUQiKTsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXksIHF1ZXN0aW9uIGFuZCBhbnN3ZXIgZXhpc3RzCiAgICAgICAgaWYgKCRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFN1cnZleUlELCBFbGVtZW50ID0+ICdTdXJ2ZXknKSBuZSAnWWVzJyB8fAogICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRRdWVzdGlvbklELCBFbGVtZW50ID0+ICdRdWVzdGlvbicpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJEFuc3dlcklELCBFbGVtZW50ID0+ICdBbnN3ZXInKSBuZSAnWWVzJwogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJTb3J0KFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQpOwoKICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlckRvd24oCiAgICAgICAgICAgIFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uSUQsCiAgICAgICAgICAgIEFuc3dlcklEID0+ICRBbnN3ZXJJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249UXVlc3Rpb25FZGl0JlN1cnZleUlEPSRTdXJ2ZXlJRCZRdWVzdGlvbklEPSRRdWVzdGlvbklEI0Fuc3dlciIpOwogICAgfQogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQW5zd2VyRWRpdCcpIHsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJFF1ZXN0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uSUQiKTsKICAgICAgICBteSAkQW5zd2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkFuc3dlcklEIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXksIHF1ZXN0aW9uIGFuZCBhbnN3ZXIgZXhpc3RzCiAgICAgICAgaWYgKCRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFN1cnZleUlELCBFbGVtZW50ID0+ICdTdXJ2ZXknKSBuZSAnWWVzJyB8fAogICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRRdWVzdGlvbklELCBFbGVtZW50ID0+ICdRdWVzdGlvbicpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJEFuc3dlcklELCBFbGVtZW50ID0+ICdBbnN3ZXInKSBuZSAnWWVzJwogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdBbnN3ZXIgRWRpdCcpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgIG15ICVBbnN3ZXIgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlckdldChBbnN3ZXJJRCA9PiAkQW5zd2VySUQpOwogICAgICAgICRBbnN3ZXJ7U3VydmV5SUR9ID0gJFN1cnZleUlEOwoKICAgICAgICAjIHByaW50IHRoZSBtYWluIHRhYmxlLgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Fuc3dlckVkaXQnLAogICAgICAgICAgICBEYXRhID0+IHslQW5zd2VyfSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50U3VydmV5JywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQW5zd2VyU2F2ZScpIHsKICAgICAgICBteSAkQW5zd2VySUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIkFuc3dlcklEIik7CiAgICAgICAgbXkgJFF1ZXN0aW9uSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlF1ZXN0aW9uSUQiKTsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgbXkgJEFuc3dlciA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiQW5zd2VyIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXksIHF1ZXN0aW9uIGFuZCBhbnN3ZXIgZXhpc3RzCiAgICAgICAgaWYgKCRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFN1cnZleUlELCBFbGVtZW50ID0+ICdTdXJ2ZXknKSBuZSAnWWVzJyB8fAogICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRRdWVzdGlvbklELCBFbGVtZW50ID0+ICdRdWVzdGlvbicpIG5lICdZZXMnIHx8CiAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJEFuc3dlcklELCBFbGVtZW50ID0+ICdBbnN3ZXInKSBuZSAnWWVzJwogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRBbnN3ZXIpIHsKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJTYXZlKAogICAgICAgICAgICAgICAgQW5zd2VySUQgPT4gJEFuc3dlcklELAogICAgICAgICAgICAgICAgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb25JRCwKICAgICAgICAgICAgICAgIEFuc3dlciA9PiAkQW5zd2VyLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259JlN1YmFjdGlvbj1RdWVzdGlvbkVkaXQmU3VydmV5SUQ9JFN1cnZleUlEJlF1ZXN0aW9uSUQ9JFF1ZXN0aW9uSUQjQW5zd2VyIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249QW5zd2VyRWRpdCZTdXJ2ZXlJRD0kU3VydmV5SUQmUXVlc3Rpb25JRD0kUXVlc3Rpb25JRCZBbnN3ZXJJRD0kQW5zd2VySUQiKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdGF0cycpIHsKICAgICAgICBteSAkU3VydmV5SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlN1cnZleUlEIik7CiAgICAgICAgIyBjaGVjayBpZiBzdXJ2ZXkgZXhpc3RzCiAgICAgICAgaWYgKCRTZWxmLT57U3VydmV5T2JqZWN0fS0+RWxlbWVudEV4aXN0cyhFbGVtZW50SUQgPT4gJFN1cnZleUlELCBFbGVtZW50ID0+ICdTdXJ2ZXknKSBuZSAnWWVzJykgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIpOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKFRpdGxlID0+ICdTdGF0cyBPdmVydmlldycpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgcHJpbnQgdGhlIG1haW4gdGFibGUuCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdHMnLAogICAgICAgICAgICBEYXRhID0+IHtTdXJ2ZXlJRCA9PiAkU3VydmV5SUR9LAogICAgICAgICk7CgogICAgICAgIG15IEBMaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5Wb3RlTGlzdChTdXJ2ZXlJRCA9PiAkU3VydmV5SUQpOwoKICAgICAgICBmb3JlYWNoIG15ICRWb3RlKEBMaXN0KSB7CiAgICAgICAgICAgICRWb3RlLT57U3VydmV5SUR9ID0gJFN1cnZleUlEOwogICAgICAgICAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoVGlja2V0SUQgPT4gJFZvdGUtPntUaWNrZXRJRH0pOwogICAgICAgICAgICAkVm90ZS0+e1RpY2tldE51bWJlcn0gPSAkVGlja2V0e1RpY2tldE51bWJlcn07CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdHNWb3RlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJFZvdGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50U3VydmV5JywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RhdHNEZXRhaWwnKSB7CiAgICAgICAgbXkgJFN1cnZleUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJTdXJ2ZXlJRCIpOwogICAgICAgIG15ICRSZXF1ZXN0SUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlJlcXVlc3RJRCIpOwogICAgICAgICMgY2hlY2sgaWYgc3VydmV5IGV4aXN0cwogICAgICAgIGlmICgkU2VsZi0+e1N1cnZleU9iamVjdH0tPkVsZW1lbnRFeGlzdHMoRWxlbWVudElEID0+ICRTdXJ2ZXlJRCwgRWxlbWVudCA9PiAnU3VydmV5JykgbmUgJ1llcycgfHwKICAgICAgICAgICAgJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5FbGVtZW50RXhpc3RzKEVsZW1lbnRJRCA9PiAkUmVxdWVzdElELCBFbGVtZW50ID0+ICdSZXF1ZXN0JykgbmUgJ1llcycKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAnU3RhdHMgRGV0YWlsJyk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBwcmludCB0aGUgbWFpbiB0YWJsZS4KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0c0RldGFpbCcsCiAgICAgICAgICAgIERhdGEgPT4ge1N1cnZleUlEID0+ICRTdXJ2ZXlJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFF1ZXN0aW9uTGlzdCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UXVlc3Rpb25MaXN0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CgogICAgICAgIGZvcmVhY2ggbXkgJFF1ZXN0aW9uKEBRdWVzdGlvbkxpc3QpIHsKICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdHNEZXRhaWxRdWVzdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRRdWVzdGlvbiwKICAgICAgICAgICApOwoKICAgICAgICAgICBteSBAQW5zd2VycyA9ICgpOwoKICAgICAgICAgICBpZiAoJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1JhZGlvJyB8fCAkUXVlc3Rpb24tPntUeXBlfSBlcSAnQ2hlY2tib3gnKSB7CiAgICAgICAgICAgICAgIG15IEBBbnN3ZXJMaXN0ID0gKCk7CgogICAgICAgICAgICAgICBAQW5zd2VyTGlzdCA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+Vm90ZUdldChSZXF1ZXN0SUQgPT4gJFJlcXVlc3RJRCwgUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb24tPntRdWVzdGlvbklEfSk7CgogICAgICAgICAgICAgICBmb3JlYWNoIG15ICRSb3cgKEBBbnN3ZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICBteSAlQW5zd2VyID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5BbnN3ZXJHZXQoQW5zd2VySUQgPT4gJFJvdy0+e1ZvdGVWYWx1ZX0pOwogICAgICAgICAgICAgICAgICAgbXkgJURhdGEgPSAoKTsKICAgICAgICAgICAgICAgICAgICREYXRhe0Fuc3dlcn0gPSAkQW5zd2Vye0Fuc3dlcn07CgogICAgICAgICAgICAgICAgICAgcHVzaChAQW5zd2VycyxcJURhdGEpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRRdWVzdGlvbi0+e1R5cGV9IGVxICdZZXNObycgfHwgJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1RleHRhcmVhJykgewogICAgICAgICAgICAgICAgbXkgQExpc3QgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlZvdGVHZXQoUmVxdWVzdElEID0+ICRSZXF1ZXN0SUQsIFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uLT57UXVlc3Rpb25JRH0pOwogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAoKTsKCiAgICAgICAgICAgICAgICAkRGF0YXtBbnN3ZXJ9ID0gJExpc3RbMF0tPntWb3RlVmFsdWV9OwoKICAgICAgICAgICAgICAgIHB1c2goQEFuc3dlcnMsXCVEYXRhKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yZWFjaCBteSAkUm93IChAQW5zd2VycykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0c0RldGFpbEFuc3dlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkUm93LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFN1cnZleScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNob3cgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ092ZXJ2aWV3Jyk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgcHJpbnQgdGhlIG1haW4gdGFibGUuCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IHt9LAogICAgKTsKICAgIG15IEBMaXN0ID0gJFNlbGYtPntTdXJ2ZXlPYmplY3R9LT5TdXJ2ZXlMaXN0KCk7CgogICAgZm9yZWFjaCBteSAkU3VydmV5SUQgKEBMaXN0KSB7CiAgICAgICAgbXkgJVN1cnZleSA9ICRTZWxmLT57U3VydmV5T2JqZWN0fS0+U3VydmV5R2V0KFN1cnZleUlEID0+ICRTdXJ2ZXlJRCk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdTdXJ2ZXknLAogICAgICAgICAgICBEYXRhID0+IFwlU3VydmV5LAogICAgICAgICk7CiAgICB9CgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50U3VydmV5JywKICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL1B1YmxpY1N1cnZleS5wbSAtIGEgc3VydmV5IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBQdWJsaWNTdXJ2ZXkucG0sdiAxLjEwIDIwMDYvMTAvMjQgMTA6NTY6MjUgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6UHVibGljU3VydmV5OwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xMCAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgT3BqZWN0cwogICAgZm9yZWFjaCAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCkpIHsKICAgICAgICBpZiAoISRTZWxmLT57JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcihNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIik7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57U3VydmV5T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTdXJ2ZXktPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkT3V0cHV0OwoKICAgIGlmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1B1YmxpY1N1cnZleVZvdGUnKSB7CiAgICAgICAgbXkgJFB1YmxpY1N1cnZleUtleSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUHVibGljU3VydmV5S2V5Iik7CgogICAgICAgIG15ICVTdXJ2ZXkgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlB1YmxpY1N1cnZleUdldChQdWJsaWNTdXJ2ZXlLZXkgPT4gJFB1YmxpY1N1cnZleUtleSk7CgogICAgICAgIGlmICgkU3VydmV5e1N1cnZleUlEfSA+IDAgKSB7CiAgICAgICAgICAgIG15IEBRdWVzdGlvbkxpc3QgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlF1ZXN0aW9uTGlzdChTdXJ2ZXlJRCA9PiAkU3VydmV5e1N1cnZleUlEfSk7CgogICAgICAgICAgICBmb3JlYWNoIG15ICRRdWVzdGlvbihAUXVlc3Rpb25MaXN0KSB7CiAgICAgICAgICAgICAgICBpZiAoJFF1ZXN0aW9uLT57VHlwZX0gZXEgJ1llc05vJyApIHsKICAgICAgICAgICAgICAgICAgICBteSAkUHVibGljU3VydmV5Vm90ZTEgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlB1YmxpY1N1cnZleVZvdGUxWyRRdWVzdGlvbi0+e1F1ZXN0aW9uSUR9XSIpOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlB1YmxpY0Fuc3dlclNhdmUoCiAgICAgICAgICAgICAgICAgICAgICAgIFB1YmxpY1N1cnZleUtleSA9PiAkUHVibGljU3VydmV5S2V5LAogICAgICAgICAgICAgICAgICAgICAgICBRdWVzdGlvbklEID0+ICRRdWVzdGlvbi0+e1F1ZXN0aW9uSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBWb3RlVmFsdWUgPT4gJFB1YmxpY1N1cnZleVZvdGUxCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkUXVlc3Rpb24tPntUeXBlfSBlcSAnUmFkaW8nICkgewogICAgICAgICAgICAgICAgICAgIG15ICRQdWJsaWNTdXJ2ZXlWb3RlMiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiUHVibGljU3VydmV5Vm90ZTJbJFF1ZXN0aW9uLT57UXVlc3Rpb25JRH1dIik7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57U3VydmV5T2JqZWN0fS0+UHVibGljQW5zd2VyU2F2ZSgKICAgICAgICAgICAgICAgICAgICAgICAgUHVibGljU3VydmV5S2V5ID0+ICRQdWJsaWNTdXJ2ZXlLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXN0aW9uSUQgPT4gJFF1ZXN0aW9uLT57UXVlc3Rpb25JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZvdGVWYWx1ZSA9PiAkUHVibGljU3VydmV5Vm90ZTIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCRRdWVzdGlvbi0+e1R5cGV9IGVxICdDaGVja2JveCcgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFuc3dlckxpc3QgPSAkU2VsZi0+e1N1cnZleU9iamVjdH0tPkFuc3dlckxpc3QoUXVlc3Rpb25JRCA9PiAkUXVlc3Rpb24tPntRdWVzdGlvbklEfSk7CgogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJEFuc3dlcihAQW5zd2VyTGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkUHVibGljU3VydmV5Vm90ZTMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlB1YmxpY1N1cnZleVZvdGUzWyRBbnN3ZXItPntBbnN3ZXJJRH1dIik7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFB1YmxpY1N1cnZleVZvdGUzIGVxICdZZXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1N1cnZleU9iamVjdH0tPlB1YmxpY0Fuc3dlclNhdmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHVibGljU3VydmV5S2V5ID0+ICRQdWJsaWNTdX