WebMail
0.11.3
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Improved intro and fixed html formating problem in compose email mask under Mac OS X.
Fixed bug# 2119 - Fixed incorrect introduction.
Upgrade to 2.2.x. Added .fr translation.
A web mail (IMAP) program.
Ein Web Email (IMAP) Programm.
2.2.x
The WebMail Application will be found at the navigation bar. It handles mails of an IMAP account which can be configured in the agent preferences.
Die WebMail Applikation ist in der Navigationsleiste zu finden. Mit ihr können Emails eines IMAP-Kontos verwaltet werden welche in den Agenten-Einstellungen konfiguriert werden können.
2008-02-17 16:48:03
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q1ZTPiRJZDogV2ViTWFpbC54bWwsdiAxLjEzIDIwMDgvMDIvMTcgMTU6NDI6MjQgbWFydGluIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRXZWJNYWlsIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+QWxsIHBhcmFtZXRlcnMgZm9yIHRoZSBBZ2VudFdlYm1haWwgb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkFsbGUgUGFyYW1ldGVyIGb8ciBkYXMgQWdlbnRXZWJtYWlsLU9iamVrdCBpbm5lcmhhbGIgZGVzIEFnZW50LUludGVyZmFjZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+V2ViTWFpbDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPFRpdGxlPldlYk1haWw8L1RpdGxlPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPldlYk1haWwgbW9kdWxlIHJlZ2lzdHJhdGlvbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5XZWJNYWlsPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QSB3ZWIgbWFpbCBjbGllbnQ8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPldlYk1haWw8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPndlYm1haWwucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRXZWJNYWlsPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+V2ViTWFpbDwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5JdGVtQXJlYTwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+TWVudTwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5Pnc8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz44MjAwPC9QcmlvPgogICAgICAgICAgICAgICAgPC9OYXZCYXI+CiAgICAgICAgICAgICAgICA8TmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5JbmJveCBPdmVydmlldzwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+SW5ib3g8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEltYWdlPmxpc3QucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRXZWJNYWlsPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPldlYk1haWw8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5Pm88L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4xMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkNvbXBvc2UgbmV3IGVtYWlsPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5Db21wb3NlPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5tYWlsX25ldy5wbmc8L0ltYWdlPgogICAgICAgICAgICAgICAgICAgIDxMaW5rPkFjdGlvbj1BZ2VudFdlYk1haWwmYW1wO1N1YmFjdGlvbj1Db21wb3NlPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPldlYk1haWw8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5Pm48L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4yMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlNlYXJjaCBhbiBlbWFpbDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+U2VhcmNoPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5zZWFyY2gucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRXZWJNYWlsJmFtcDtTdWJhY3Rpb249U2VhcmNoPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPldlYk1haWw8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PnM8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz4zMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkZvbGRlciBhZGQvcmVuYW1lL2RlbGV0ZTwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+Rm9sZGVyPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxJbWFnZT5mb2xkZXIucG5nPC9JbWFnZT4KICAgICAgICAgICAgICAgICAgICA8TGluaz5BY3Rpb249QWdlbnRXZWJNYWlsJmFtcDtTdWJhY3Rpb249Rm9sZGVyPC9MaW5rPgogICAgICAgICAgICAgICAgICAgIDxUeXBlPjwvVHlwZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8TmF2QmFyPldlYk1haWw8L05hdkJhcj4KICAgICAgICAgICAgICAgICAgICA8QWNjZXNzS2V5PmY8L0FjY2Vzc0tleT4KICAgICAgICAgICAgICAgICAgICA8UHJpbz45MDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhcj4KICAgICAgICAgICAgICAgIDxOYXZCYXI+CiAgICAgICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRyYXNoPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8TmFtZT5FbXB0eSBUcmFzaDwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8SW1hZ2U+ZWRpdHRyYXNoLnBuZzwvSW1hZ2U+CiAgICAgICAgICAgICAgICAgICAgPExpbms+QWN0aW9uPUFnZW50V2ViTWFpbCZhbXA7U3ViYWN0aW9uPUV4cHVuZ2U8L0xpbms+CiAgICAgICAgICAgICAgICAgICAgPFR5cGU+PC9UeXBlPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz48L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxOYXZCYXI+V2ViTWFpbDwvTmF2QmFyPgogICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NLZXk+ZTwvQWNjZXNzS2V5PgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjkxMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlByZWZlcmVuY2VzR3JvdXBzIyMjV2ViTWFpbCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkFsbCBwYXJhbWV0ZXJzIGZvciB0aGUgV2ViTWFpbCBvYmplY3QgaW4gdGhlIHByZWZlcmVuY2UgdmlldyBvZiB0aGUgQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5BbGxlIFBhcmFtZXRlciBkZXMgV2ViTWFpbC1PYmpla3RzIGlubmVyaGFsYiBkZXIgQW5zaWNodCBm/HIgZGllIEVpbnN0ZWxsdW5nZW4gaW0gQWdlbnQtSW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPldlYk1haWw8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlByZWZlcmVuY2VzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlByZWZlcmVuY2VzV2ViTWFpbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ29sdW0iPk90aGVyIE9wdGlvbnM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIj5XZWJNYWlsPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjIj5Zb3VyIElNQVAgV2ViTWFpbCBzZXR0aW5ncy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByaW8iPjgzMDA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGl2Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV2ViTWFpbDo6SU1BUEZvbGRlclByZWZpeCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlByZWZpeCBmb3IgSU1BUCBmb2xkZXJzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5QcuRmaXggZvxyIGRpZSBJTUFQLU9yZG5lci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5XZWJNYWlsPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+TWFpbC88L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXZWJNYWlsOjpJTUFQSG9zdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPklNQVAgaG9zdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+SU1BUC1TZXJ2ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+V2ViTWFpbDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPmxvY2FsaG9zdDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldlYk1haWw6OklNQVBQcm90b2NvbCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmF1bHQgSU1BUCBwcm90b2NvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN0YW5kYXJkIElNQVAtUHJvdG9rb2wuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iaW1hcCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImltYXAiPmltYXA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImltYXBzIj5pbWFwczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iV2ViTWFpbDo6VHJhc2hGb2xkZXIiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5UcmFzaCBmb2xkZXIgaW4gd2VibWFpbC4gRGVsZXRlZCBtZXNzYWdlcyB3aWxsIGJlIG1vdmVkIHRvIHRoaXMgZm9sZGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5PcmRuZXIgZvxyIGdlbPZzY2h0ZSBOYWNocmljaHRlbiBpbSBXZWItTWFpbGVyLiBBbGxlIGdlbPZzY2h0ZW4gTmFjaHJpY2h0ZW4gd2VyZGVuIGluIGRpZXNlbiBPcmRuZXIgdmVyc2Nob2Jlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5XZWJNYWlsPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+VHJhc2g8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXZWJNYWlsOjpTZW50Rm9sZGVyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmYXVsdCBJTUFQIGZvbGRlciBmb3Igc2VudCBtZXNzYWdlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+T3JkbmVyIGb8ciBnZXNlbmRldGUgTmFjaHJpY2h0ZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+V2ViTWFpbDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPlNlbnQ8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXZWJNYWlsOjpQYWdlU2hvd24iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Ib3cgbWFueSBtZXNzYWdlcyB3b3VsZCB5b3UgbGlrZSB0byBkaXNwbGF5IHBlciBwYWdlPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5XaWUgdmllbGUgTmFjaHJpY2h0ZW4gc29sbGVuIHBybyBTZWl0ZSBhbmdlemVpZ3Qgd2VyZGVuPzwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPldlYk1haWw8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz4yNTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IldlYk1haWw6OlNob3duSGVhZGVycyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNob3cgdGhlIGZvbGxvd2luZyBtZXNzYWdlIGhlYWRlcnMgZm9yIGV2ZXJ5IG1haWwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkRpZSBmb2xnZW5kZW4gS29wZnplaWxlbiBiZWkgamVkZXIgTmFjaHJpY2h0IGFuemVpZ2VuLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPldlYk1haWw8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+RnJvbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlRvPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q2M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5TdWJqZWN0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+T3JnYW5pc2F0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+UmVwbHktVG88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5YLVNwYW0tU3RhdHVzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+WC1Qcmlvcml0eTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPlByaW9yaXR5PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+SW1wb3J0YW5jZTwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJXZWJNYWlsOjpNYWlsRm9vdGVyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+U3BlY2lmeSBhIE1haWxmb290ZXIuIFRoaXMgdGV4dCB3aWxsIGJlIGFwcGVuZGVkIHRvIGV2ZXJ5IG91dGdvaW5nIG1lc3NhZ2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPkZlc3RsZWdlbiBlaW5lciBTaWduYXR1ci4gRGllc2VyIFRleHQgd2lyZCBhdXRvbWF0aXNjaCB1bnRlciBqZWRlIGF1c2dlaGVuZGUgTmFjaHJpY2h0IGVpbmdlZvxndC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5XZWJNYWlsPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxUZXh0QXJlYT4tLQpUaGlzIG1lc3NhZ2Ugd2FzIHNlbnQgdXNpbmcgT1RSUyAyLnggQXBwbGljYXRpb24gTW9kdWxlIFdlYk1haWwgKGh0dHA6Ly9vdHJzLm9yZy8pLgogICAgICAgICAgICA8L1RleHRBcmVhPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4K
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9BZ2VudFdlYk1haWwucG0gLSB0aGUgZnIgbGFuZ3VhZ2UgZm9yIEFnZW50Q2FsZW5kYXIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZnJfQWdlbnRXZWJNYWlsLnBtLHYgMS4xIDIwMDcvMDYvMjcgMjM6MzA6NTEgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmcl9BZ2VudFdlYk1haWw7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgJCRTVEFSVCQkCgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCd9ID0gJ0x1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VucmVhZCd9ID0gJ05vbi1MdSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb2xkZXInfSA9ICdS6XBlcnRvaXJlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01lc3NhZ2VzJ30gPSAnTWVzc2FnZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgVHJhc2gnfSA9ICdQb3ViZWxsZSB2aWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbXBvc2UgbmV3IGVtYWlsISd9ID0gJ0NvbXBvc2VyIHVuIG5vdXZlYXUgbWVzc2FnZSAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luYm94IE92ZXJuZXcnfSA9ICdOb3V2ZWxsZSBib+50ZSDgIGxldHRyZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VhcmNoIGEgZW1haWwhJ30gPSAnUmVjaGVyY2hlciB1biBtZXNzYWdlICEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwbHknfSA9ICdS6XBvbmRyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBseSBBbGwnfSA9ICdS6XBvbmRyZSDgIHRvdXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5ib3gnfSA9ICdJbmJveCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eycnfSA9ICcnOwoKICAgICMgJCRTVE9QJCQKfQoxOwo=
cGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9BZ2VudFdlYk1haWw7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMyAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgJCRTVEFSVCQkCgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCd9ID0gJ0dlbGVzZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVW5yZWFkJ30gPSAnVW5nZWxlc2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZvbGRlcid9ID0gJ09yZG5lcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZXNzYWdlcyd9ID0gJ05hY2hyaWNodGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VtcHR5IFRyYXNoJ30gPSAnUGFwaWVya29yYiBsZWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcG9zZSBuZXcgZW1haWwhJ30gPSAnTmV1ZSBOYWNocmljaHQgdmVyZmFzc2VuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmJveCBPdmVybmV3J30gPSAnSW5ib3gg3GJlcnNpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhbiBlbWFpbCEnfSA9ICdFaW5lIEVtYWlsIHN1Y2hlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwbHknfSA9ICdBbnR3b3J0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwbHkgQWxsJ30gPSAnQW50d29ydGVuIGFuIGFsbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5ib3gnfSA9ICdFaW5nYW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57Jyd9ID0gJyc7CgogICAgIyAkJFNUT1AkJAp9CjE7Cgo=
cGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpuYl9OT19BZ2VudFdlYk1haWw7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgJCRTVEFSVCQkCgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZCd9ID0gJ0xlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydVbnJlYWQnfSA9ICdVbGVzdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb2xkZXInfSA9ICdNYXBwZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZXNzYWdlcyd9ID0gJ0Jlc2tqZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1wdHkgVHJhc2gnfSA9ICdQYXBpcmt1cnYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tcG9zZSBuZXcgZW1haWwhJ30gPSAnU2tyaXYgbnkgZS1wb3N0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmJveCBPdmVybmV3J30gPSAnT3ZlcnNpa3Qgb3ZlciBJbm5ib2tzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlYXJjaCBhIGVtYWlsISd9ID0gJ1P4ayBpIGUtcG9zdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwbHknfSA9ICdTdmFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGx5IEFsbCd9ID0gJ1N2YXIgYWxsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmJveCd9ID0gJ0lubmJva3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnJ30gPSAnJzsKCiAgICAjICQkU1RPUCQkCn0KMTsKCg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50V2ViTWFpbC5wbSAtIHByb3ZpZGVzIGEgbWFpbCBpbnRlcmZhY2UKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRXZWJNYWlsLnBtLHYgMS4xNCAyMDA3LzA2LzI3IDIzOjI5OjQyIG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFdlYk1haWw7Cgp1c2Ugc3RyaWN0Owp1c2UgTWFpbDo6SU1BUFRhbGs7CnVzZSBNYWlsOjpBZGRyZXNzOwp1c2UgS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZWFyY2hQcm9maWxlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsOwp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xNCAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgZm9yZWFjaCAoa2V5cyAlUGFyYW0pIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgT3BqZWN0cwogICAgZm9yZWFjaCAocXcoUGFyYW1PYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBDb25maWdPYmplY3QpKSB7CiAgICAgICAgaWYgKCEkU2VsZi0+eyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoTWVzc2FnZSA9PiAiR290IG5vICRfISIpOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U2VhcmNoUHJvZmlsZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VhcmNoUHJvZmlsZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZW5kbWFpbE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbC0+bmV3KCVQYXJhbSk7CgogICAgJFNlbGYtPntGb2xkZXJQcmVmaXh9ID0gJFNlbGYtPntVc2VyV2ViTWFpbElNQVBGb2xkZXJQcmVmaXh9IHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdXZWJNYWlsOjpJTUFQRm9sZGVyUHJlZml4JykgfHwgJyc7CiAgICAkU2VsZi0+e1RyYXNoRm9sZGVyfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdXZWJNYWlsOjpUcmFzaEZvbGRlcicpIHx8ICdUcmFzaCc7CiAgICAkU2VsZi0+e1NlbnRGb2xkZXJ9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1dlYk1haWw6OlNlbnRGb2xkZXInKSB8fCAnU2VudCc7CiAgICAkU2VsZi0+e1BhZ2VTaG93bn0gPSAkU2VsZi0+e1VzZXJXZWJNYWlsUGFnZVNob3dufSB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6UGFnZVNob3duJykgfHwgMjU7CgogICAgJFNlbGYtPntVc2VyRnJvbX0gPSAiXCIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfVwiIDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICRTZWxmLT57TWFpbEZvb3Rlcn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6TWFpbEZvb3RlcicpOwogICAgJFNlbGYtPntTaG93bkhlYWRlcnN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1dlYk1haWw6OlNob3duSGVhZGVycycpOwogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIGlmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0ZvbGRlcicpKSB7CiAgICAgICAgJFBhcmFte0ZvbGRlcn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0ZvbGRlcicpOwogICAgICAgICRQYXJhbXtGb2xkZXJ9ID1+IHMvXC9cLy9cLy9nOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0ZvbGRlcn0gPSAnSU5CT1gnOwogICAgfQogICAgaWYgKCEkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUFByb3RvY29sfSkgewogICAgICAgICRTZWxmLT57VXNlcldlYk1haWxJTUFQUHJvdG9jb2x9ID0gJ2ltYXAnOwogICAgfQogICAgaWYgKCEkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUEhvc3R9KSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAnTmVlZCBVc2VyV2ViTWFpbElNQVBIb3N0IFBhcmFtJyk7CiAgICB9CiAgICBpZiAoISRTZWxmLT57VXNlcldlYk1haWxJTUFQVXNlcn0pIHsKICAgICAgICAkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUFVzZXJ9ID0gJFNlbGYtPnsnX1VzZXJMb2dpbid9OwogICAgfQogICAgaWYgKCEkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUFBhc3N3b3JkfSkgewogICAgICAgICRTZWxmLT57VXNlcldlYk1haWxJTUFQUGFzc3dvcmR9ID0gJFNlbGYtPnsnX1VzZXJQdyd9OwogICAgfQogICAgbXkgJElNQVA7CiAgICBpZiAoJFNlbGYtPntVc2VyV2ViTWFpbElNQVBQcm90b2NvbH0gZXEgJ2ltYXBzJykgewogICAgICAgIGlmICghJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgnSU86OlNvY2tldDo6U1NMJykpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgIH0KICAgICAgICBteSAkU1NMID0gSU86OlNvY2tldDo6U1NMLT5uZXcoIiRTZWxmLT57VXNlcldlYk1haWxJTUFQSG9zdH06aW1hcHMiKTsKICAgICAgICAkSU1BUCA9IE1haWw6OklNQVBUYWxrLT5uZXcoCiAgICAgICAgICAgIFVzZXJuYW1lID0+ICRTZWxmLT57VXNlcldlYk1haWxJTUFQVXNlcn0sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRTZWxmLT57VXNlcldlYk1haWxJTUFQUGFzc3dvcmR9LAojICAgICAgICAgICAgUm9vdEZvbGRlciA9PiAkU2VsZi0+e0ZvbGRlclByZWZpeH0sCiAgICAgICAgICAgIFNvY2tldCA9PiAkU1NMLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkSU1BUCA9IE1haWw6OklNQVBUYWxrLT5uZXcoCiAgICAgICAgICAgIFNlcnZlciA9PiAkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUEhvc3R9LAogICAgICAgICAgICBVc2VybmFtZSA9PiAkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUFVzZXJ9LAogICAgICAgICAgICBQYXNzd29yZCA9PiAkU2VsZi0+e1VzZXJXZWJNYWlsSU1BUFBhc3N3b3JkfSwKIyAgICAgICAgICAgIFJvb3RGb2xkZXIgPT4gJFNlbGYtPntGb2xkZXJQcmVmaXh9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoISRJTUFQKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oTWVzc2FnZSA9PiAiRmFpbGVkIHRvIGNvbm5lY3QvbG9naW4gdG8gSU1BUCBzZXJ2ZXIgJFNlbGYtPntVc2VyV2ViTWFpbElNQVBVc2VyfVxAJFNlbGYtPntVc2VyV2ViTWFpbElNQVBIb3N0fTokU2VsZi0+e1VzZXJXZWJNYWlsSU1BUFByb3RvY29sfTogJCEiKTsKICAgIH0KIyAgICAkSU1BUC0+c2V0X3RyYWNpbmcoMSk7CiAgICBteSBAYm94ZXMgPSAoKTsKICAgIG15IEBib3hlc0wgPSAkSU1BUC0+bGlzdCgiIiwgIiRTZWxmLT57Rm9sZGVyUHJlZml4fSUiKTsKICAgIGZvcmVhY2ggbXkgJEZvbGRlciAoQGJveGVzTCkgewogICAgICAgIGlmICgkRm9sZGVyICYmIHJlZigkRm9sZGVyKSBlcSAnQVJSQVknKSB7CiAgICAgICAgICAgIG15IEBBID0gQHskRm9sZGVyfTsKIyAgICAgICAgcHJpbnQgIiRBWzJdIFxuIjsKICAgICAgICAgICAgcHVzaCAoQGJveGVzLCAkQVsyXSk7CiAgICAgICAgfQogICAgfQogICAgcHVzaCAoQGJveGVzLCAnSU5CT1gnKTsKICAgIG15ICVGb2xkZXJzID0gKCk7CiAgICBmb3JlYWNoIG15ICRGb2xkZXIgKEBib3hlcykgewogICAgICAgIG15ICRPcmlnRm9sZGVyID0gJEZvbGRlcjsKICAgICAgICAkRm9sZGVyID1+IHMvXFEkU2VsZi0+e0ZvbGRlclByZWZpeH1cRS8vOwogICAgICAgICRGb2xkZXIgPX4gcy9eXC8vLzsKIyAgICAgICAgJFNlbGYtPntGb2xkZXJQcmVmaXh9ID0gJyc7CiMgICAgICAgIG15ICROdW0gPSAkSU1BUC0+bWVzc2FnZV9jb3VudCgkRm9sZGVyKTsKIyAgICAgICAgaWYgKGRlZmluZWQoJE51bSkpIHsKIyAgICAgICAgICAgICRGb2xkZXJzeyRGb2xkZXJ9ID0gIiRGb2xkZXIgKCROdW0pIjsKICAgICAgICAgICAgJEZvbGRlcnN7JE9yaWdGb2xkZXJ9ID0gJEZvbGRlcjsKIyAgICAgICAgfQogICAgfQogICAgJFBhcmFteydGb2xkZXJzJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgIERhdGEgPT4gXCVGb2xkZXJzLAogICAgICAgIE5hbWUgPT4gJ0ZvbGRlcicsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17Rm9sZGVyfSwKICAgICk7CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNvbXBvc2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdDb21wb3NlJykgewogICAgICAgIG15ICVFcnJvciA9ICgpOwogICAgICAgIG15ICVHZXRQYXJhbSA9ICgpOwogICAgICAgIGZvcmVhY2ggKHF3KFRvIENjIEJjYyBTdWJqZWN0IEJvZHkgU2VuZCBJblJlcGx5VG8gRm9ybUlEIEF0dGFjaG1lbnRVcGxvYWQgTWVzc2FnZQogICAgICAgICAgICBBdHRhY2htZW50RGVsZXRlMSBBdHRhY2htZW50RGVsZXRlMiBBdHRhY2htZW50RGVsZXRlMyBBdHRhY2htZW50RGVsZXRlNAogICAgICAgICAgICBBdHRhY2htZW50RGVsZXRlNSBBdHRhY2htZW50RGVsZXRlNiBBdHRhY2htZW50RGVsZXRlNyBBdHRhY2htZW50RGVsZXRlOAogICAgICAgICAgICBBdHRhY2htZW50RGVsZXRlOSBBdHRhY2htZW50RGVsZXRlMTApKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KICAgICAgICAjIGNoZWNrIHRyYXNoIGZvbGRlcgogICAgICAgIGlmICghJElNQVAtPnNlbGVjdCgkU2VsZi0+e1NlbnRGb2xkZXJ9KSkgewogICAgICAgICAgICAkSU1BUC0+Y3JlYXRlKCRTZWxmLT57U2VudEZvbGRlcn0pOwogICAgICAgIH0KICAgICAgICAjIGNoZWNrIGFuZCBjcmVhdGUgZm9ybSBpZAogICAgICAgIGlmICghJEdldFBhcmFte0Zvcm1JRH0pIHsKICAgICAgICAgICAgJEdldFBhcmFte0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCEkR2V0UGFyYW17U2VuZH0pIHsKIyAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdNZXNzYWdlJykgfHwgJyc7CiAgICAgICAgICAgIG15ICRSZXBseVRvQWxsID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdSZXBseVRvQWxsJykgfHwgJyc7CiAgICAgICAgICAgIGlmICgkR2V0UGFyYW17TWVzc2FnZX0pIHsKICAgICAgICAgICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0pOwogICAgICAgICAgICAgICAgbXkgQEFEYXRhID0gJElNQVAtPmZldGNoKCRHZXRQYXJhbXtNZXNzYWdlfSwgJ3JmYzgyMicpOwogICAgICAgICAgICAgICAgbXkgJFBsYWluID0gJEFEYXRhWzBdLT57JEdldFBhcmFte01lc3NhZ2V9fS0+eydyZmM4MjInfTsKICAgICAgICAgICAgICAgIG15IEBFbWFpbCA9IHNwbGl0KC9cbi8sICRQbGFpbik7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgwLi4kI0VtYWlsKSB7CiAgICAgICAgICAgICAgICAgICAgJEVtYWlsWyRfXSAuPSAiXG4iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJFBhcnNlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fSwKICAgICAgICAgICAgICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgICAgICAgICAgICAgIEVtYWlsID0+IFxARW1haWwsCiAgICAgICAgICAgICAgICAgICAgRGVidWcgPT4gMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoISRHZXRQYXJhbXtTdWJqZWN0fSkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAnU3ViamVjdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEkR2V0UGFyYW17VG99KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAnUmVwbHktVG8nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghJEdldFBhcmFte1RvfSkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAkUGFyc2VPYmplY3QtPkdldFBhcmFtKFdIQVQgPT4gJ0Zyb20nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkUmVwbHlUb0FsbCkgewogICAgICAgICAgICAgICAgICAgIG15ICRSZXBseSA9ICcnOwogICAgICAgICAgICAgICAgICAgIG15ICRSZXBseUNsZWFyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAnVG8nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkUmVwbHkgLj0gJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICdUbycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICdDYycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkUmVwbHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZXBseSAuPSAiLCAiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRSZXBseSAuPSAkUGFyc2VPYmplY3QtPkdldFBhcmFtKFdIQVQgPT4gJ0NjJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJEVtYWlsIChNYWlsOjpBZGRyZXNzLT5wYXJzZSgkUmVwbHkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRW1haWwtPmFkZHJlc3MoKSAhfiAvXiRTZWxmLT57VXNlckVtYWlsfSQvaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRSZXBseUNsZWFyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJlcGx5Q2xlYXIgLj0gIiwgIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZXBseUNsZWFyIC49ICRFbWFpbC0+Zm9ybWF0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSA9ICRSZXBseUNsZWFyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEkR2V0UGFyYW17J0luUmVwbHlUbyd9KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteydJblJlcGx5VG8nfSA9ICRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAnTWVzc2FnZS1JZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCEkR2V0UGFyYW17Qm9keX0pIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkUGFyc2VPYmplY3QtPkdldE1lc3NhZ2VCb2R5KCk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKFxuXHJ8XHJcclxufFxyXG4pL1xuL2c7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvXHIvXG4vZzsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oXj4uK3wuezQsNzh9KSg/OlxzfFx6KS8kMVxuL2dtOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzL1xuL1xuPiAvZzsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAiXG4+ICIgLiAkR2V0UGFyYW17Qm9keX07CiAgICAgICAgICAgICAgICAgICAgaWYgKCRQYXJzZU9iamVjdC0+R2V0UGFyYW0oV0hBVCA9PiAnRnJvbScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRGcm9tID0gJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICdGcm9tJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRGcm9tID1+IHMvKDwuKz9ALis/PnxcKC4rP0AuKz9cKSkvL2c7CiAgICAgICAgICAgICAgICAgICAgICAgICRGcm9tID1+IHMvXHMkLy9nOwogICAgICAgICAgICAgICAgICAgICAgICAkRnJvbSAuPSAnICcuJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ3dyb3RlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICIkRnJvbTpcbiIgLiAkR2V0UGFyYW17Qm9keX07CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgZm9yZWFjaCAoMS4uMTApIHsKICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXsiQXR0YWNobWVudERlbGV0ZSRfIn0pIHsKICAgICAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50RGVsZXRlfSA9IDE7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURSZW1vdmVGaWxlKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkR2V0UGFyYW17Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJF8sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoJEdldFBhcmFte0F0dGFjaG1lbnRVcGxvYWR9KSB7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAiZmlsZV91cGxvYWQiLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRHZXRQYXJhbXtGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJEdldFBhcmFte0Zvcm1JRH0sCiAgICAgICAgKTsKICAgICAgICAjIGNoZWNrIHNvbWUgdmFsdWVzCiAgICAgICAgZm9yZWFjaCAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBpZiAoJEdldFBhcmFteyRffSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkRW1haWwgKE1haWw6OkFkZHJlc3MtPnBhcnNlKCRHZXRQYXJhbXskX30pKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeyIkXyBpbnZhbGlkIn0gLj0gJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5DaGVja0Vycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yIHx8ICEkR2V0UGFyYW17U2VuZH0pIHsKICAgICAgICAgICAgIyBjb21wb3NlIGJsb2NrCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDb21wb3NlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVHZXRQYXJhbSwgJUVycm9yLCBGcm9tID0+ICRTZWxmLT57VXNlckZyb219LCB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAjIHNob3cgYXR0YWNobWVudHMKICAgICAgICAgICAgZm9yZWFjaCBteSAkRGF0YVJlZiAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgc2hvdyBwYWdlCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAnQ29tcG9zZScpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFdlYk1haWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgICAgICBteSBAQXR0YWNobWVudERhdGEgPSAkU2VsZi0+e1VwbG9hZENhY2hPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJEdldFBhcmFte0Zvcm1JRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICBwdXNoIChAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgYWRkIG1haWwgZm9vdGVyCiAgICAgICAgICAgIGlmICgkU2VsZi0+e01haWxGb290ZXJ9KSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gLj0gIlxuIi4kU2VsZi0+e01haWxGb290ZXJ9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNlbmQgZW1haWwKICAgICAgICAgICAgbXkgKCRIZWFkZXIsICRCb2R5KSA9ICRTZWxmLT57U2VuZG1haWxPYmplY3R9LT5TZW5kKAogICAgICAgICAgICAgICAgRnJvbSA9PiAkU2VsZi0+e1VzZXJGcm9tfSwKICAgICAgICAgICAgICAgIFRvID0+ICRHZXRQYXJhbXtUb30gfHwgJycsCiAgICAgICAgICAgICAgICBDYyA9PiAkR2V0UGFyYW17Q2N9IHx8ICcnLAogICAgICAgICAgICAgICAgQmNjID0+ICRHZXRQYXJhbXtCY2N9IHx8ICcnLAogICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkR2V0UGFyYW17U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICAgICBUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgIENoYXJzZXQgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgQm9keSA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICBBdHRhY2htZW50ID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFwcGVuZCBtZXNzYWdlIHRvIHNlbnQgYm94CiAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJHskSGVhZGVyfS4iXG4iLiR7JEJvZHl9OwogICAgICAgICAgICAkSU1BUC0+YXBwZW5kKCRTZWxmLT57U2VudEZvbGRlcn0sIFsnTGl0ZXJhbCcsICRNZXNzYWdlXSk7CgogICAgICAgICAgICAjIHN0b3JlIGFuc3dlcmVkCiAgICAgICAgICAgIGlmICgkR2V0UGFyYW17TWVzc2FnZX0gJiYgJFBhcmFte0ZvbGRlcn0pIHsKICAgICAgICAgICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0pOwogICAgICAgICAgICAgICAgJElNQVAtPnN0b3JlKCRHZXRQYXJhbXtNZXNzYWdlfSwgJytmbGFncycsICcoXFxBbnN3ZXJlZCknKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9KTsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGV4cHVuZ2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdFeHB1bmdlJykgewogICAgICAgICMgY2hlY2sgdHJhc2ggZm9sZGVyCiAgICAgICAgaWYgKCEkSU1BUC0+c2VsZWN0KCRTZWxmLT57VHJhc2hGb2xkZXJ9KSkgewogICAgICAgICAgICAkSU1BUC0+Y3JlYXRlKCRTZWxmLT57VHJhc2hGb2xkZXJ9KTsKICAgICAgICAgICAgJElNQVAtPnNlbGVjdCgkU2VsZi0+e1RyYXNoRm9sZGVyfSk7CiAgICAgICAgfQogICAgICAgIG15ICROdW0gPSAkSU1BUC0+Z2V0X3Jlc3BvbnNlX2NvZGUoJ2V4aXN0cycpOwogICAgICAgIGlmICgkTnVtKSB7CiAgICAgICAgICAgIG15ICRSZXMgPSAkSU1BUC0+ZmV0Y2goIjE6JE51bSIsICcoZW52ZWxvcGUpJyk7CiAgICAgICAgICAgIGlmICgkSU1BUC0+Z2V0X2xhc3RfZXJyb3IoKSkgewogICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJFUlJPUiAkUGFyYW17Rm9sZGVyfSAiLiRJTUFQLT5nZXRfbGFzdF9lcnJvcigpLiJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRNZXNzYWdlIChrZXlzICV7JFJlc30pIHsKICAgICAgICAgICAgICAgICAgICAkSU1BUC0+c3RvcmUoJE1lc3NhZ2UsICcrZmxhZ3MnLCAnKFxcZGVsZXRlZCknKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRJTUFQLT5leHB1bmdlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9KTsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGVsZXRlJykgewogICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdNZXNzYWdlJykgfHwgJyc7CiAgICAgICAgIyBjaGVjayB0cmFzaCBmb2xkZXIKICAgICAgICBpZiAoISRJTUFQLT5zZWxlY3QoJFNlbGYtPntUcmFzaEZvbGRlcn0pKSB7CiAgICAgICAgICAgICRJTUFQLT5jcmVhdGUoJFNlbGYtPntUcmFzaEZvbGRlcn0pOwogICAgICAgIH0KICAgICAgICAjIGNvcHkgYW5kIGRlbGV0ZSBvbGQgbWVzc2FnZQogICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0pOwogICAgICAgICRJTUFQLT5jb3B5KCRNZXNzYWdlLCAkU2VsZi0+e1RyYXNoRm9sZGVyfSk7CiAgICAgICAgJElNQVAtPnN0b3JlKCRNZXNzYWdlLCAnK2ZsYWdzJywgJyhcXGRlbGV0ZWQpJyk7CiAgICAgICAgJElNQVAtPmV4cHVuZ2UoKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdChPUCA9PiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30pOwogICAgfQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBidWxrCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQnVsaycpIHsKICAgICAgICBteSBATWVzc2FnZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheShQYXJhbSA9PiAnTWVzc2FnZUlEJyk7CiAgICAgICAgbXkgJFJlYWQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1JlYWQnKSB8fCAnJzsKICAgICAgICBteSAkVW5yZWFkID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdVbnJlYWQnKSB8fCAnJzsKICAgICAgICBteSAkRGVsZXRlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdEZWxldGUnKSB8fCAnJzsKICAgICAgICAjIGNoZWNrIHRyYXNoIGZvbGRlcgogICAgICAgIGlmICghJElNQVAtPnNlbGVjdCgkU2VsZi0+e1RyYXNoRm9sZGVyfSkpIHsKICAgICAgICAgICAgJElNQVAtPmNyZWF0ZSgkU2VsZi0+e1RyYXNoRm9sZGVyfSk7CiAgICAgICAgfQogICAgICAgICMgZGVsZXRlCiAgICAgICAgaWYgKCREZWxldGUpIHsKICAgICAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSk7CiAgICAgICAgICAgIGZvcmVhY2ggKEBNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAjIGNvcHkgYW5kIGRlbGV0ZSBvbGQgbWVzc2FnZQogICAgICAgICAgICAgICAgJElNQVAtPmNvcHkoJF8sICRTZWxmLT57VHJhc2hGb2xkZXJ9KTsKICAgICAgICAgICAgICAgICRJTUFQLT5zdG9yZSgkXywgJytmbGFncycsICcoXFxkZWxldGVkKScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRJTUFQLT5leHB1bmdlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkUmVhZCkgewogICAgICAgICAgICAkSU1BUC0+c2VsZWN0KCRQYXJhbXtGb2xkZXJ9KTsKICAgICAgICAgICAgZm9yZWFjaCAoQE1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICRJTUFQLT5zdG9yZSgkXywgJytmbGFncycsICcoXFxTZWVuKScpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICgkVW5yZWFkKSB7CiAgICAgICAgICAgICRJTUFQLT5zZWxlY3QoJFBhcmFte0ZvbGRlcn0pOwogICAgICAgICAgICBmb3JlYWNoIChATWVzc2FnZSkgewogICAgICAgICAgICAgICAgJElNQVAtPnN0b3JlKCRfLCAnLWZsYWdzJywgJyhcXFNlZW4pJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoT1AgPT4gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9KTsKICAgIH0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1ZpZXcnKSB7CiAgICAgICAgbXkgJFByaW50ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdQcmludCcpIHx8ICcnOwogICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdNZXNzYWdlJykgfHwgJyc7CiAgICAgICAgbXkgJFN0YXJ0SGl0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdTdGFydEhpdCcpIHx8IDE7CiAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSk7CiAgICAgICAgJElNQVAtPnN0b3JlKCRNZXNzYWdlLCAnK2ZsYWdzJywgJyhcXFNlZW4pJyk7CiAgICAgICAgbXkgQEFEYXRhID0gJElNQVAtPmZldGNoKCRNZXNzYWdlLCAncmZjODIyJyk7CiAgICAgICAgbXkgJFBsYWluID0gJEFEYXRhWzBdLT57JE1lc3NhZ2V9LT57J3JmYzgyMid9OwogICAgICAgIG15IEBFbWFpbCA9IHNwbGl0KC9cbi8sICRQbGFpbik7CiAgICAgICAgZm9yZWFjaCAoMC4uJCNFbWFpbCkgewogICAgICAgICAgICAkRW1haWxbJF9dIC49ICJcbiI7CiAgICAgICAgfQogICAgICAgIG15ICRQYXJzZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgICAgICBFbWFpbCA9PiBcQEVtYWlsLAogICAgICAgICAgICBEZWJ1ZyA9PiAwLAogICAgICAgICk7CiAgICAgICAgbXkgJURhdGEgPSAoKTsKICAgICAgICBpZiAoISRQcmludCkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmlldycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBNZXNzYWdlID0+ICRNZXNzYWdlLCB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKEB7JFNlbGYtPntTaG93bkhlYWRlcnN9fSkgewogICAgICAgICAgICAkRGF0YXskX30gPSAkUGFyc2VPYmplY3QtPkdldFBhcmFtKFdIQVQgPT4gJF8pOwogICAgICAgICAgICBpZiAoJERhdGF7JF99KSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlcicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7IEtleSA9PiAkXywgVmFsdWUgPT4gJERhdGF7JF99LCB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkRGF0YXtGcm9tfSA9fiBzLygifCcpLy9nOwogICAgICAgICREYXRhe0RhdGV9ID0gJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICdEYXRlJyk7CiAgICAgICAgaWYgKCREYXRhe0RhdGV9KSB7CiAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7RGF0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICREYXRhe0RhdGVOaWNlfSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0hlYWRlckRhdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IEtleSA9PiAnRGF0ZScsIFZhbHVlID0+ICREYXRhe0RhdGVOaWNlfSB8fCAkRGF0YXtEYXRlfSwgRGF0ZSA9PiAkRGF0YXtEYXRlfX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRCb2R5ID0gJFBhcnNlT2JqZWN0LT5HZXRNZXNzYWdlQm9keSgpOwogICAgICAgICRCb2R5ID1+IHMvXHIvL2c7CiAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIE5ld0xpbmUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TmV3TGluZScpIHx8IDg1LAogICAgICAgICAgICBUZXh0ID0+ICRCb2R5LAogICAgICAgICAgICBWTWF4ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld0xpbmVzJykgfHwgNTAwMCwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICApOwogICAgICAgICMgbGluayBxdW90aW5nCiAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtRdW90ZSgKICAgICAgICAgICAgVGV4dCA9PiAkQm9keSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JvZHknLAogICAgICAgICAgICBEYXRhID0+IHsgQm9keSA9PiAkQm9keSwgfSwKICAgICAgICApOwogICAgICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRQYXJzZU9iamVjdC0+R2V0QXR0YWNobWVudHMoKTsKICAgICAgICBpZiAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBmb3JlYWNoIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgaWYgKCRBdHRhY2htZW50LT57RmlsZXNpemV9ID4gKDEwMjQqMTAyNCkpIHsKICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RmlsZXNpemV9ID0gc3ByaW50ZiAiJS4xZiBNQnl0ZXMiLCAoJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0vKDEwMjQqMTAyNCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkQXR0YWNobWVudC0+e0ZpbGVzaXplfSA+IDEwMjQpIHsKICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RmlsZXNpemV9ID0gc3ByaW50ZiAiJS4xZiBLQnl0ZXMiLCAoKCRBdHRhY2htZW50LT57RmlsZXNpemV9LzEwMjQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RmlsZXNpemV9ID0gJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0uJyBCeXRlcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkQXR0YWNobWVudCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnRSb3dMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAnRG93bmxvYWQnLAogICAgICAgICAgICAgICAgICAgIExpbmsgPT4gIlwkRW52e1wiQmFzZWxpbmtcIn1BY3Rpb249XCRFbnZ7XCJBY3Rpb25cIn0mU3ViYWN0aW9uPUF0dGFjaG1lbnQmRm9sZGVyPSRQYXJhbXtGb2xkZXJ9Jk1lc3NhZ2U9JE1lc3NhZ2UmRmlsZUlEPSRDb3VudGVyIiwKICAgICAgICAgICAgICAgICAgICBJbWFnZSA9PiAnZGlzay1zLnBuZycsCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0ID0+ICd0YXJnZXQ9Il9ibGFuayIgJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICghJFByaW50KSB7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcihUaXRsZSA9PiAnTWVzc2FnZScpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFdlYk1haWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRIZWFkZXIoVGl0bGUgPT4gJ1ByaW50Jyk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50V2ViTWFpbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGF0dGFjaG1lbnQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdBdHRhY2htZW50JykgewogICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdNZXNzYWdlJykgfHwgJyc7CiAgICAgICAgbXkgJEZpbGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRmlsZUlEJykgfHwgJyc7CiAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSwxKTsKICAgICAgICBteSBAQURhdGEgPSAkSU1BUC0+ZmV0Y2goJE1lc3NhZ2UsICdyZmM4MjInKTsKICAgICAgICBteSAkUGxhaW4gPSAkQURhdGFbMF0tPnskTWVzc2FnZX0tPnsncmZjODIyJ307CiAgICAgICAgbXkgQEVtYWlsID0gc3BsaXQoL1xuLywgJFBsYWluKTsKICAgICAgICBmb3JlYWNoICgwLi4kI0VtYWlsKSB7CiAgICAgICAgICAgICRFbWFpbFskX10gLj0gIlxuIjsKICAgICAgICB9CiAgICAgICAgbXkgJFBhcnNlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyLT5uZXcoCiAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgIExvZ09iamVjdCA9PiAkU2VsZi0+e0xvZ09iamVjdH0sCiAgICAgICAgICAgIEVtYWlsID0+IFxARW1haWwsCiAgICAgICAgICAgIERlYnVnID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXR0YWNobWVudHMKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkUGFyc2VPYmplY3QtPkdldEF0dGFjaG1lbnRzKCk7CiAgICAgICAgaWYgKCRBdHRhY2htZW50c1skRmlsZUlELTFdKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoJXskQXR0YWNobWVudHNbJEZpbGVJRC0xXX0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNlYXJjaAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaCcpIHsKICAgICAgICBteSAlU2VhcmNoID0gKCk7CiAgICAgICAgIyBsb2FkIGxhc3Qgc2VhcmNoIG9wdGlvbnMKICAgICAgICBpZiAoJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdQcm9maWxlJykpIHsKICAgICAgICAgICAgJVNlYXJjaCA9ICRTZWxmLT57U2VhcmNoUHJvZmlsZU9iamVjdH0tPlNlYXJjaFByb2ZpbGVHZXQoCiAgICAgICAgICAgICAgICBCYXNlICAgICAgPT4gJ1dlYk1haWxTZWFyY2gnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdsYXN0LXNlYXJjaCcsCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZWFyY2gnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlU2VhcmNoIH0sCiAgICAgICAgKTsKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ1NlYXJjaCcpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFdlYk1haWwnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNlYXJjaCByZXN1bHQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdTZWFyY2hSZXN1bHQnKSB7CiAgICAgICAgbXkgJVNlYXJjaCA9ICgpOwogICAgICAgIG15IEBTZWFyY2hRdWVyeSA9ICgpOwogICAgICAgIG15ICRQYWdlU2hvd24gPSAkU2VsZi0+e1BhZ2VTaG93bn0gfHwgMjA7CiAgICAgICAgbXkgJFN0YXJ0SGl0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdTdGFydEhpdCcpIHx8IDE7CiAgICAgICAgIyBnZXQgc2VhcmNoIHBhcmFtcwogICAgICAgIGZvcmVhY2ggKHF3KEZyb20gVG8gQ2MgU3ViamVjdCBCb2R5IFNvcnRCeSBPcmRlcikpIHsKICAgICAgICAgICAgJFNlYXJjaHskX30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJF8pOwogICAgICAgIH0KICAgICAgICAjIGNoZWNrIGlmIG9sZCBwcm9maWxlIGlzIG5lZWRlZAogICAgICAgIGlmICgkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1Byb2ZpbGUnKSkgewogICAgICAgICAgICBteSAkT3JkZXIgPSAnJzsKICAgICAgICAgICAgbXkgJFNvcnRCeSA9ICcnOwogICAgICAgICAgICBpZiAoJFNlYXJjaHtPcmRlcn0pIHsKICAgICAgICAgICAgICAgICRPcmRlciA9ICRTZWFyY2h7T3JkZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkU2VhcmNoe1NvcnRCeX0pIHsKICAgICAgICAgICAgICAgICRTb3J0QnkgPSAkU2VhcmNoe1NvcnRCeX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJVNlYXJjaCA9ICRTZWxmLT57U2VhcmNoUHJvZmlsZU9iamVjdH0tPlNlYXJjaFByb2ZpbGVHZXQoCiAgICAgICAgICAgICAgICBCYXNlICAgICAgPT4gJ1dlYk1haWxTZWFyY2gnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICdsYXN0LXNlYXJjaCcsCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJE9yZGVyKSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoe09yZGVyfSA9ICRPcmRlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFNvcnRCeSkgewogICAgICAgICAgICAgICAgJFNlYXJjaHtTb3J0Qnl9ID0gJFNvcnRCeTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBkZWxldGUgb2xkIHNlYXJjaCBwYXJhbXMKICAgICAgICAgICAgJFNlbGYtPntTZWFyY2hQcm9maWxlT2JqZWN0fS0+U2VhcmNoUHJvZmlsZURlbGV0ZSgKICAgICAgICAgICAgICAgIEJhc2UgICAgICA9PiAnV2ViTWFpbFNlYXJjaCcsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJ2xhc3Qtc2VhcmNoJywKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgcmVtZW1iZXIgbmV3IHNlYXJjaCBvcHRpb25zCiAgICAgICAgICAgIGZvcmVhY2ggKGtleXMgJVNlYXJjaCkgewogICAgICAgICAgICAgICAgJFNlbGYtPntTZWFyY2hQcm9maWxlT2JqZWN0fS0+U2VhcmNoUHJvZmlsZUFkZCgKICAgICAgICAgICAgICAgICAgICBCYXNlID0+ICdXZWJNYWlsU2VhcmNoJywKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdsYXN0LXNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICRfLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZWFyY2h7JF99LAogICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICRTb3J0QnkgPSAkU2VhcmNoe1NvcnRCeX0gfHwgJ0RhdGUnOwogICAgICAgIG15ICRPcmRlckJ5ID0gJFNlYXJjaHtPcmRlcn0gfHwgJ1VwJzsKCiAgICAgICAgIyByZW1lbWJlciBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICBWYWx1ZSA9PiAiQWN0aW9uPVwkRW52e1wiQWN0aW9uXCJ9JlN1YmFjdGlvbj1TZWFyY2hSZXN1bHQmUHJvZmlsZT1sYXN0LXNlYXJjaCZGb2xkZXI9JFBhcmFte0ZvbGRlcn0mU3RhcnRIaXQ9JFN0YXJ0SGl0JiIsCiAgICAgICAgKTsKICAgICAgICBmb3JlYWNoIG15ICRLZXkgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCBCb2R5KSkgewogICAgICAgICAgICBpZiAoJFNlYXJjaHskS2V5fSkgewogICAgICAgICAgICAgICAgcHVzaCAoQFNlYXJjaFF1ZXJ5LCB1YygkS2V5KSwgJFNlYXJjaHskS2V5fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSwxKTsKICAgICAgICBteSBAUmVzdXRsTUlEID0gJElNQVAtPnNlYXJjaChAU2VhcmNoUXVlcnkpOwogICAgICAgICMgYnVpbGQgc2VhcmNoIG5hdmlnYXRpb24gYmFyCiAgICAgICAgbXkgJVBhZ2VOYXYgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlBhZ2VOYXZCYXIoCiAgICAgICAgICAgIExpbWl0ID0+IDIwMDAsCiAgICAgICAgICAgIFN0YXJ0SGl0ID0+ICRTdGFydEhpdCwKICAgICAgICAgICAgUGFnZVNob3duID0+ICRQYWdlU2hvd24sCiAgICAgICAgICAgIEFsbEhpdHMgPT4gJCNSZXN1dGxNSUQrMSwKICAgICAgICAgICAgQWN0aW9uID0+ICJBY3Rpb249XCRFbnZ7XCJBY3Rpb25cIn0iLAogICAgICAgICAgICBMaW5rID0+ICJTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRQYXJhbXtGb2xkZXJ9JiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlUGFnZU5hdn0sCiAgICAgICAgKTsKICAgICAgICAjIGZldGNoIG1haWxib3gKICAgICAgICBteSAkTWVzc2FnZXMgPSAnJzsKICAgICAgICBmb3JlYWNoIChAUmVzdXRsTUlEKSB7CiAgICAgICAgICAgIGlmICgkTWVzc2FnZXMpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlcyAuPSAiLCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE1lc3NhZ2VzIC49ICRfOwogICAgICAgIH0KICAgICAgICBteSAlT3JkZXIgPSAoKTsKICAgICAgICBteSAkUmVzOwogICAgICAgIGlmIChAUmVzdXRsTUlEKSB7CiAgICAgICAgICAgICRSZXMgPSAkSU1BUC0+ZmV0Y2goJE1lc3NhZ2VzLCAnKGZsYWdzIHJmYzgyMi5oZWFkZXIgcmZjODIyLnNpemUgZW52ZWxvcGUpJyk7CiAgICAgICAgICAgIGlmICgkSU1BUC0+Z2V0X2xhc3RfZXJyb3IoKSkgewogICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJFUlJPUiAkUGFyYW17Rm9sZGVyfSAiLiRJTUFQLT5nZXRfbGFzdF9lcnJvcigpLiJcbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc29ydAogICAgICAgICAgICBmb3JlYWNoIG15ICRNZXNzYWdlIChrZXlzICV7JFJlc30pIHsKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJXskUmVzLT57JE1lc3NhZ2V9LT57J2VudmVsb3BlJ319OwogICAgICAgICAgICAgICAgIyBvcmRlciBieSBmcm9tCiAgICAgICAgICAgICAgICBpZiAoJFNvcnRCeSBlcSAnRnJvbScpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7RnJvbX0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7RnJvbX0gPX4gcy8oPHw+fCx8O3w6fFwufCJ8J3xcKHxcKXwmfD1cPy4rP1w/fFw/Lis/PVw/fFw/KS8vZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0Zyb219ID0gJz8nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkT3JkZXJ7JE1lc3NhZ2V9ID0gbGMoJERhdGF7RnJvbX0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvcmRlciBieSBzdWJqZWN0CiAgICAgICAgICAgICAgICBlbHNpZiAoJFNvcnRCeSBlcSAnU3ViamVjdCcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7U3ViamVjdH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7U3ViamVjdH0gPX4gcy8oPHw+fCx8O3w6fFwufCJ8J3xcKHxcKXwmfD1cPy4rP1w/fFw/Lis/PVw/fFw/KS8vZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1N1YmplY3R9ID0gJz8nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkT3JkZXJ7JE1lc3NhZ2V9ID0gbGMoJERhdGF7U3ViamVjdH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvcmRlciBieSBzdWJqZWN0CiAgICAgICAgICAgICAgICBlbHNpZiAoJFNvcnRCeSBlcSAnU2l6ZScpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU2l6ZSA9ICRSZXMtPnskTWVzc2FnZX0tPnsncmZjODIyLnNpemUnfTsKICAgICAgICAgICAgICAgICAgICAkT3JkZXJ7JE1lc3NhZ2V9ID0gc3ByaW50ZigiJTAxMDBkIiwgJFNpemUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvcmRlciBieSBkYXRlCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7RGF0ZX0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRGF0YXtEYXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IHNwcmludGYoIiUwNDBkIiwgJFN5c3RlbVRpbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgZ2V0IHNob3duIG1lc3NhZ2VzCiAgICAgICAgbXkgQFNob3duID0gKCk7CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGlmICgoJE9yZGVyQnkgZXEgJ0Rvd24nICYmICRTb3J0QnkgbmUgJ0RhdGUnKSB8fCAkT3JkZXJCeSBlcSAnVXAnICYmICRTb3J0QnkgZXEgJ0RhdGUnKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKHJldmVyc2Ugc29ydCB7JE9yZGVyeyRhfSBjbXAgJE9yZGVyeyRifX0ga2V5cyAlT3JkZXIpIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIgPj0gJFN0YXJ0SGl0ICYmICRDb3VudGVyIDwgKCRQYWdlU2hvd24rJFN0YXJ0SGl0KSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIChAU2hvd24sICRfKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yZWFjaCAoc29ydCB7JE9yZGVyeyRhfSBjbXAgJE9yZGVyeyRifX0ga2V5cyAlT3JkZXIpIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIgPj0gJFN0YXJ0SGl0ICYmICRDb3VudGVyIDwgKCRQYWdlU2hvd24rJFN0YXJ0SGl0KSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIChAU2hvd24sICRfKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IG1lc3NhZ2VzCiAgICAgICAgZm9yZWFjaCBteSAkTWVzc2FnZSAoQFNob3duKSB7CiAgICAgICAgICAgIG15ICVEYXRhID0gKCk7CiAgICAgICAgICAgICMgZ2V0IGFuZCBwYXJzZSBoZWFkZXJzCiAgICAgICAgICAgIG15ICRQbGFpbiA9ICRSZXMtPnskTWVzc2FnZX0tPnsncmZjODIyLmhlYWRlcid9OwogICAgICAgICAgICBteSBARW1haWwgPSBzcGxpdCgvXG4vLCAkUGxhaW4pOwogICAgICAgICAgICBteSAkUGFyc2VPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXItPm5ldygKICAgICAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgICAgICAgICAgRW1haWwgPT4gXEBFbWFpbCwKICAgICAgICAgICAgICAgIERlYnVnID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvcmVhY2ggKHF3KEZyb20gVG8gQ2MgU3ViamVjdCBEYXRlKSkgewogICAgICAgICAgICAgICAgJERhdGF7JF99ID0gJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICRfKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YXtGcm9tfSA9fiBzLygifCcpLy9nOwogICAgICAgICAgICAkRGF0YXtOdW1iZXJ9ID0gJE1lc3NhZ2U7CiAgICAgICAgICAgICREYXRhe0ZvbGRlcn0gPSAkUGFyYW17Rm9sZGVyfTsKICAgICAgICAgICAgbXkgQEZsYWdzID0gQHskUmVzLT57JE1lc3NhZ2V9LT57ZmxhZ3N9fTsKICAgICAgICAgICAgIyBzaG93IGh1bWFuIHNpemUKICAgICAgICAgICAgbXkgJFNpemUgPSAkUmVzLT57JE1lc3NhZ2V9LT57J3JmYzgyMi5zaXplJ307CiAgICAgICAgICAgIGlmICgkU2l6ZSA+ICgxMDI0KjEwMjQpKSB7CiAgICAgICAgICAgICAgICAkU2l6ZSA9IHNwcmludGYgIiUuMWYgTUJ5dGVzIiwgKCRTaXplLygxMDI0KjEwMjQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFNpemUgPiAxMDI0KSB7CiAgICAgICAgICAgICAgICAkU2l6ZSA9IHNwcmludGYgIiUuMWYgS0J5dGVzIiwgKCgkU2l6ZS8xMDI0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2l6ZSA9ICRTaXplLicgQnl0ZXMnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXRhe1NpemV9ID0gJFNpemU7CiAgICAgICAgICAgICMgY29udmVydCBkYXRlCiAgICAgICAgICAgIGlmICgkRGF0YXtEYXRlfSkgewogICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7RGF0ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRTeXN0ZW1UaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7RGF0ZX0gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU2hvcnQnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCAoQEZsYWdzKSB7CiAgICAgICAgICAgICAgICBpZiAoJF8gPX4gLyhEZWxldGV8U2VlbnxKdW5rKSQvaSkgewogICAgICAgICAgICAgICAgICAgICREYXRhe2xjKCQxKX0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJERhdGF7J3NlZW4nfSkgewogICAgICAgICAgICAgICAgJERhdGF7IkJvbGRTdGFydCJ9ID0gJzxiPic7CiAgICAgICAgICAgICAgICAkRGF0YXsiQm9sZEVuZCJ9ID0gJzwvYj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hNZXNzYWdlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBzaG93IHBlcnNvbmFsIGltYWdlCiAgICAgICAgICAgIGlmICgkU2VsZi0+X0NoZWNrUGVyc29uYWxNZXNzYWdlKCVEYXRhKSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hNZXNzYWdlRmxhZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVEYXRhLCBGbGFnID0+ICdwZXJzb25hbCcsIFRpdGxlID0+ICdwZXJzb25hbCcsIEltYWdlID0+ICdwZXJzb25hbCcsIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgc2hvdyBhbnN3ZXJlZHxmb3J3YXJlZHxkZWxldGUgaW1hZ2VzCiAgICAgICAgICAgIGZvcmVhY2ggbXkgJEZsYWcgKEBGbGFncykgewogICAgICAgICAgICAgICAgaWYgKCRGbGFnID1+IC8oYW5zd2VyZWR8Zm9yd2FyZGVkfGRlbGV0ZWQpL2kpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hNZXNzYWdlRmxhZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgRmxhZyA9PiAkRmxhZywgVGl0bGUgPT4gbGMoJDEpLCBJbWFnZSA9PiBsYygkMSksIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoVGl0bGUgPT4gJ1NlYXJjaCcpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFdlYk1haWwnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHBsYWluCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVmlld1BsYWluJykgewogICAgICAgIG15ICRNZXNzYWdlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdNZXNzYWdlJykgfHwgJyc7CiAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSwgMSk7CiAgICAgICAgbXkgQEFEYXRhID0gJElNQVAtPmZldGNoKCRNZXNzYWdlLCAncmZjODIyJyk7CiAgICAgICAgbXkgJFBsYWluID0gJEFEYXRhWzBdLT57JE1lc3NhZ2V9LT57J3JmYzgyMid9OwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICcnLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgIENvbnRlbnQgPT4gJFBsYWluLAogICAgICAgICk7CiAgICB9CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpbmRleAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewogICAgICAgIG15ICRQYWdlU2hvd24gPSAkU2VsZi0+e1BhZ2VTaG93bn0gfHwgMjA7CiAgICAgICAgbXkgJFN0YXJ0SGl0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdTdGFydEhpdCcpIHx8IDE7CiAgICAgICAgbXkgJFNvcnRCeSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnU29ydEJ5JykgfHwgJ0RhdGUnOwogICAgICAgIG15ICRPcmRlckJ5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdPcmRlcicpIHx8ICdVcCc7CiAgICAgICAgIyByZW1lbWJlciBsYXN0IHNjcmVlbgogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICBWYWx1ZSA9PiAiQWN0aW9uPVwkRW52e1wiQWN0aW9uXCJ9JkZvbGRlcj0kUGFyYW17Rm9sZGVyfSZTdGFydEhpdD0kU3RhcnRIaXQmU29ydEJ5PSRTb3J0QnkmT3JkZXI9JE9yZGVyQnkiLAogICAgICAgICk7CiAgICAgICAgJElNQVAtPnNlbGVjdCgkUGFyYW17Rm9sZGVyfSwxKTsKIyAgICAgICAgbXkgJE51bSA9ICRJTUFQLT5tZXNzYWdlX2NvdW50KCRQYXJhbXtGb2xkZXJ9KTsKICAgICAgICBteSAkTnVtID0gJElNQVAtPmdldF9yZXNwb25zZV9jb2RlKCdleGlzdHMnKTsKCiAgICAgICAgIyBidWlsZCBzZWFyY2ggbmF2aWdhdGlvbiBiYXIKICAgICAgICBteSAlUGFnZU5hdiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UGFnZU5hdkJhcigKICAgICAgICAgICAgTGltaXQgPT4gMjAwMCwKICAgICAgICAgICAgU3RhcnRIaXQgPT4gJFN0YXJ0SGl0LAogICAgICAgICAgICBQYWdlU2hvd24gPT4gJFBhZ2VTaG93biwKICAgICAgICAgICAgQWxsSGl0cyA9PiAkTnVtLAogICAgICAgICAgICBBY3Rpb24gPT4gIkFjdGlvbj1cJEVudntcIkFjdGlvblwifSIsCiAgICAgICAgICAgIExpbmsgPT4gIkZvbGRlcj0kUGFyYW17Rm9sZGVyfSZTb3J0Qnk9JFNvcnRCeSZPcmRlcj0kT3JkZXJCeSYiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW5kZXgnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlUGFnZU5hdn0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCBtYWlsYm94CiAgICAgICAgbXkgJU9yZGVyID0gKCk7CiAgICAgICAgbXkgJFJlczsKICAgICAgICBpZiAoJE51bSkgewogICAgICAgICAgICAkUmVzID0gJElNQVAtPmZldGNoKCIxOiROdW0iLCAnKGZsYWdzIHJmYzgyMi5oZWFkZXIgcmZjODIyLnNpemUgZW52ZWxvcGUpJyk7CiAgICAgICAgICAgIGlmICgkSU1BUC0+Z2V0X2xhc3RfZXJyb3IoKSkgewogICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJFUlJPUiAkUGFyYW17Rm9sZGVyfSAiLiRJTUFQLT5nZXRfbGFzdF9lcnJvcigpLiJcbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc29ydAogICAgICAgICAgICBmb3JlYWNoIG15ICRNZXNzYWdlIChrZXlzICV7JFJlc30pIHsKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJXskUmVzLT57JE1lc3NhZ2V9LT57J2VudmVsb3BlJ319OwogICAgICAgICAgICAgICAgIyBvcmRlciBieSBmcm9tCiAgICAgICAgICAgICAgICBpZiAoJFNvcnRCeSBlcSAnRnJvbScpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7RnJvbX0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7RnJvbX0gPX4gcy8oPHw+fCx8O3w6fFwufCJ8J3xcKHxcKXwmfD1cPy4rP1w/fFw/Lis/PVw/fFw/KS8vZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0Zyb219ID0gJz8nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkT3JkZXJ7JE1lc3NhZ2V9ID0gbGMoJERhdGF7RnJvbX0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvcmRlciBieSBzdWJqZWN0CiAgICAgICAgICAgICAgICBlbHNpZiAoJFNvcnRCeSBlcSAnU3ViamVjdCcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7U3ViamVjdH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7U3ViamVjdH0gPX4gcy8oPHw+fCx8O3w6fFwufCJ8J3xcKHxcKXwmfD1cPy4rP1w/fFw/Lis/PVw/fFw/KS8vZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1N1YmplY3R9ID0gJz8nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkT3JkZXJ7JE1lc3NhZ2V9ID0gbGMoJERhdGF7U3ViamVjdH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvcmRlciBieSBzdWJqZWN0CiAgICAgICAgICAgICAgICBlbHNpZiAoJFNvcnRCeSBlcSAnU2l6ZScpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU2l6ZSA9ICRSZXMtPnskTWVzc2FnZX0tPnsncmZjODIyLnNpemUnfTsKICAgICAgICAgICAgICAgICAgICAkT3JkZXJ7JE1lc3NhZ2V9ID0gc3ByaW50ZigiJTAxMDBkIiwgJFNpemUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBvcmRlciBieSBkYXRlCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJERhdGF7RGF0ZX0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRGF0YXtEYXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IHNwcmludGYoIiUwNDBkIiwgJFN5c3RlbVRpbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE9yZGVyeyRNZXNzYWdlfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgZ2V0IHNob3duIG1lc3NhZ2VzCiAgICAgICAgbXkgQFNob3duID0gKCk7CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIGlmICgoJE9yZGVyQnkgZXEgJ0Rvd24nICYmICRTb3J0QnkgbmUgJ0RhdGUnKSB8fCAkT3JkZXJCeSBlcSAnVXAnICYmICRTb3J0QnkgZXEgJ0RhdGUnKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKHJldmVyc2Ugc29ydCB7JE9yZGVyeyRhfSBjbXAgJE9yZGVyeyRifX0ga2V5cyAlT3JkZXIpIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIgPj0gJFN0YXJ0SGl0ICYmICRDb3VudGVyIDwgKCRQYWdlU2hvd24rJFN0YXJ0SGl0KSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIChAU2hvd24sICRfKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yZWFjaCAoc29ydCB7JE9yZGVyeyRhfSBjbXAgJE9yZGVyeyRifX0ga2V5cyAlT3JkZXIpIHsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIgPj0gJFN0YXJ0SGl0ICYmICRDb3VudGVyIDwgKCRQYWdlU2hvd24rJFN0YXJ0SGl0KSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIChAU2hvd24sICRfKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IG1lc3NhZ2VzCiAgICAgICAgZm9yZWFjaCBteSAkTWVzc2FnZSAoQFNob3duKSB7CiAgICAgICAgICAgIG15ICVEYXRhID0gKCk7CiAgICAgICAgICAgICMgZ2V0IGFuZCBwYXJzZSBoZWFkZXJzCiAgICAgICAgICAgIG15ICRQbGFpbiA9ICRSZXMtPnskTWVzc2FnZX0tPnsncmZjODIyLmhlYWRlcid9OwogICAgICAgICAgICBteSBARW1haWwgPSBzcGxpdCgvXG4vLCAkUGxhaW4pOwogICAgICAgICAgICBteSAkUGFyc2VPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXItPm5ldygKICAgICAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgICAgICAgICAgRW1haWwgPT4gXEBFbWFpbCwKICAgICAgICAgICAgICAgIERlYnVnID0+IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvcmVhY2ggKHF3KEZyb20gVG8gQ2MgU3ViamVjdCBEYXRlKSkgewogICAgICAgICAgICAgICAgJERhdGF7JF99ID0gJFBhcnNlT2JqZWN0LT5HZXRQYXJhbShXSEFUID0+ICRfKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF0YXtGcm9tfSA9fiBzLygifCcpLy9nOwogICAgICAgICAgICAkRGF0YXtOdW1iZXJ9ID0gJE1lc3NhZ2U7CiAgICAgICAgICAgICREYXRhe0ZvbGRlcn0gPSAkUGFyYW17Rm9sZGVyfTsKICAgICAgICAgICAgbXkgQEZsYWdzID0gQHskUmVzLT57JE1lc3NhZ2V9LT57ZmxhZ3N9fTsKICAgICAgICAgICAgIyBzaG93IGh1bWFuIHNpemUKICAgICAgICAgICAgbXkgJFNpemUgPSAkUmVzLT57JE1lc3NhZ2V9LT57J3JmYzgyMi5zaXplJ307CiAgICAgICAgICAgIGlmICgkU2l6ZSA+ICgxMDI0KjEwMjQpKSB7CiAgICAgICAgICAgICAgICAkU2l6ZSA9IHNwcmludGYgIiUuMWYgTUJ5dGVzIiwgKCRTaXplLygxMDI0KjEwMjQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJFNpemUgPiAxMDI0KSB7CiAgICAgICAgICAgICAgICAkU2l6ZSA9IHNwcmludGYgIiUuMWYgS0J5dGVzIiwgKCgkU2l6ZS8xMDI0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2l6ZSA9ICRTaXplLicgQnl0ZXMnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXRhe1NpemV9ID0gJFNpemU7CiAgICAgICAgICAgICMgY29udmVydCBkYXRlCiAgICAgICAgICAgIGlmICgkRGF0YXtEYXRlfSkgewogICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7RGF0ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRTeXN0ZW1UaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7RGF0ZX0gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU3lzdGVtVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU2hvcnQnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCAoQEZsYWdzKSB7CiAgICAgICAgICAgICAgICBpZiAoJF8gPX4gLyhEZWxldGV8U2VlbnxKdW5rKSQvaSkgewogICAgICAgICAgICAgICAgICAgICREYXRhe2xjKCQxKX0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJERhdGF7J3NlZW4nfSkgewogICAgICAgICAgICAgICAgJERhdGF7IkJvbGRTdGFydCJ9ID0gJzxiPic7CiAgICAgICAgICAgICAgICAkRGF0YXsiQm9sZEVuZCJ9ID0gJzwvYj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBzaG93IHBlcnNvbmFsIGltYWdlCiAgICAgICAgICAgIGlmICgkU2VsZi0+X0NoZWNrUGVyc29uYWxNZXNzYWdlKCVEYXRhKSkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdNZXNzYWdlRmxhZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVEYXRhLCBGbGFnID0+ICdwZXJzb25hbCcsIFRpdGxlID0+ICdwZXJzb25hbCcsIEltYWdlID0+ICdwZXJzb25hbCcsIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgc2hvdyBhbnN3ZXJlZHxmb3J3YXJlZHxkZWxldGUgaW1hZ2VzCiAgICAgICAgICAgIGZvcmVhY2ggbXkgJEZsYWcgKEBGbGFncykgewogICAgICAgICAgICAgICAgaWYgKCRGbGFnID1+IC8oYW5zd2VyZWR8Zm9yd2FyZGVkfGRlbGV0ZWQpL2kpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdNZXNzYWdlRmxhZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlRGF0YSwgRmxhZyA9PiAkRmxhZywgVGl0bGUgPT4gbGMoJDEpLCBJbWFnZSA9PiBsYygkMSksIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoCiAgICAgICAgICAgIFRpdGxlID0+ICdNYWlsYm94JywKICAgICAgICAgICAgUmVmcmVzaCA9PiA2MCo1LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50V2ViTWFpbCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9DaGVja1BlcnNvbmFsTWVzc2FnZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiMgICAgaWYgKCgkUGFyYW17VG99ICYmICRQYXJhbXtUb30gPX4gL1xRJFNlbGYtPntVc2VyRW1haWx9XEUvaSkgfHwKIyAgICAgICAgKCRQYXJhbXtDY30gJiYgJFBhcmFte0NjfSA9fiAvXFEkU2VsZi0+e1VzZXJFbWFpbH1cRS9pKSkgewogICAgaWYgKCRQYXJhbXtUb30gJiYgJFBhcmFte1RvfSA9fiAvXFEkU2VsZi0+e1VzZXJFbWFpbH1cRS9pKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9QcmVmZXJlbmNlc1dlYk1haWwucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBNYXJ0aW4gRWRlbmhvZmVyIDxtYXJ0aW4rY29kZUBvdHJzLm9yZz4KIyAtLQojICRJZDogUHJlZmVyZW5jZXNXZWJNYWlsLnBtLHYgMS4yIDIwMDUvMDEvMDYgMTA6MTE6MjAgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6UHJlZmVyZW5jZXNXZWJNYWlsOwoKdXNlIHN0cmljdDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjIgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCiMgLS0Kc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CgogICAgIyBnZXQgZW52CiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklEIFBhcmFtT2JqZWN0KSkgewogICAgICAgIGRpZSAiR290IG5vICRfISIgaWYgKCEkU2VsZi0+eyRffSk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CiMgLS0Kc3ViIFBhcmFtIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15IEBQYXJhbXMgPSAoKTsKICAgIHB1c2ggKEBQYXJhbXMsCiAgICAgICAgewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEJsb2NrID0+ICdJbnB1dEtleScsCiAgICAgICAgICAgIEtleSA9PiAnSG9zdCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJXZWJNYWlsSU1BUEhvc3QnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtVc2VyRGF0YX0tPntVc2VyV2ViTWFpbElNQVBIb3N0fSB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6SU1BUEhvc3QnKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIGltYXAgPT4gJ2ltYXAnLAogICAgICAgICAgICAgICAgaW1hcHMgPT4gJ2ltYXBzJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQmxvY2sgPT4gJ09wdGlvbicsCiAgICAgICAgICAgIEtleSA9PiAnUHJvdG9jb2wnLAogICAgICAgICAgICBOYW1lID0+ICdVc2VyV2ViTWFpbElNQVBQcm90b2NvbCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1VzZXJEYXRhfS0+e1VzZXJXZWJNYWlsSU1BUFByb3RvY29sfSB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6SU1BUFByb3RvY29sJykgfHwgJycsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQmxvY2sgPT4gJ0lucHV0S2V5JywKICAgICAgICAgICAgS2V5ID0+ICdGb2xkZXIgUHJlZml4JywKICAgICAgICAgICAgTmFtZSA9PiAnVXNlcldlYk1haWxJTUFQRm9sZGVyUHJlZml4JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcldlYk1haWxJTUFQRm9sZGVyUHJlZml4fSB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnV2ViTWFpbDo6SU1BUEZvbGRlclByZWZpeCcpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgMTUgPT4gJzE1JywKICAgICAgICAgICAgICAgIDI1ID0+ICcyNScsCiAgICAgICAgICAgICAgICAzNSA9PiAnMzUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBCbG9jayA9PiAnT3B0aW9uJywKICAgICAgICAgICAgS2V5ID0+ICdNZXNzYWdlIGEgcGFnZScsCiAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJXZWJNYWlsUGFnZVNob3duJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcldlYk1haWxQYWdlU2hvd259IHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdXZWJNYWlsOjpQYWdlU2hvd24nKSB8fCAnJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBCbG9jayA9PiAnSW5wdXRLZXknLAogICAgICAgICAgICBLZXkgPT4gJ1VzZXInLAogICAgICAgICAgICBOYW1lID0+ICdVc2VyV2ViTWFpbElNQVBVc2VyJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcldlYk1haWxJTUFQVXNlcn0gfHwgJycsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQmxvY2sgPT4gJ1Bhc3N3b3JkJywKICAgICAgICAgICAgS2V5ID0+ICdQYXNzd29yZCcsCiAgICAgICAgICAgIE5hbWUgPT4gJ1VzZXJXZWJNYWlsSU1BUFBhc3N3b3JkJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcldlYk1haWxJTUFQUGFzc3dvcmR9IHx8ICcnLAogICAgICAgIH0sCiAgICApOwogICAgcmV0dXJuIEBQYXJhbXM7Cn0KIyAtLQpzdWIgUnVuIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICBmb3JlYWNoIG15ICRLZXkgKGtleXMgJXskUGFyYW17R2V0UGFyYW19fSkgewogICAgICAgIG15IEBBcnJheSA9IEB7JFBhcmFte0dldFBhcmFtfS0+eyRLZXl9fTsKICAgICAgICBmb3JlYWNoIChAQXJyYXkpIHsKICAgICAgICAgICAgIyBwcmVmIHVwZGF0ZSBkYgogICAgICAgICAgICBpZiAoISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZW1vU3lzdGVtJykpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlck9iamVjdH0tPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlckRhdGF9LT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkXywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyB1cGRhdGUgU2Vzc2lvbklECiAgICAgICAgICAgIGlmICgkUGFyYW17VXNlckRhdGF9LT57VXNlcklEfSBlcSAkU2VsZi0+e1VzZXJJRH0pIHsKICAgICAgICAgICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgICAgIEtleSA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRfLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57TWVzc2FnZX0gPSAnUHJlZmVyZW5jZXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkhJzsKICAgIHJldHVybiAxOwp9CnN1YiBFcnJvciB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICByZXR1cm4gJFNlbGYtPntFcnJvcn0gfHwgJyc7Cn0Kc3ViIE1lc3NhZ2UgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgcmV0dXJuICRTZWxmLT57TWVzc2FnZX0gfHwgJyc7Cn0KMTsK
IyAtLQojIEFnZW50V2ViTWFpbC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFnZW50V2ViTWFpCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFdlYk1haWwuZHRsLHYgMS45IDIwMDgvMDIvMTcgMTU6NDA6NDEgbWFydGluIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KPCEtLSBkdGw6YmxvY2s6VmlldyAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJWaWV3In0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JEVudnsiTGFzdFNjcmVlbk92ZXJ2aWV3In0iPiRUZXh0eyJCYWNrIn08L2E+IC0KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249Q29tcG9zZSZGb2xkZXI9JExRRGF0YXsiRm9sZGVyIn0mTWVzc2FnZT0kTFFEYXRheyJNZXNzYWdlIn0iPiRUZXh0eyJSZXBseSJ9PC9hPiAtCiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPUNvbXBvc2UmRm9sZGVyPSRMUURhdGF7IkZvbGRlciJ9Jk1lc3NhZ2U9JExRRGF0YXsiTWVzc2FnZSJ9JlJlcGx5VG9BbGw9MSI+JFRleHR7IlJlcGx5IEFsbCJ9PC9hPiAtCiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVZpZXcmUHJpbnQ9MSZGb2xkZXI9JExRRGF0YXsiRm9sZGVyIn0mTWVzc2FnZT0kTFFEYXRheyJNZXNzYWdlIn0iIHRhcmdldD0icHJpbnQiPiRUZXh0eyJQcmludCJ9PC9hPiAtCiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVZpZXdQbGFpbiZGb2xkZXI9JExRRGF0YXsiRm9sZGVyIn0mTWVzc2FnZT0kTFFEYXRheyJNZXNzYWdlIn0iIHRhcmdldD0iX2JsYW5rIj4kVGV4dHsiUGxhaW4ifTwvYT4gLQogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1EZWxldGUmRm9sZGVyPSRMUURhdGF7IkZvbGRlciJ9Jk1lc3NhZ2U9JExRRGF0YXsiTWVzc2FnZSJ9Ij4kVGV4dHsiRGVsZXRlIn08L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9Ijc2MCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik9wdGlvbnMifTwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SGVhZGVyIC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIHdpZHRoPSI4MCIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkUURhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kUURhdGF7IlZhbHVlIiwiMTIwMCJ9PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpIZWFkZXIgLS0+CjwhLS0gZHRsOmJsb2NrOkhlYWRlckRhdGUgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgd2lkdGg9IjgwIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRRRGF0YXsiRGF0ZSJ9Ij4kVGltZUxvbmd7IiRRRGF0YXsiVmFsdWUifSJ9PC9kaXY+PC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpIZWFkZXJEYXRlIC0tPgojIHNob3cgYXR0YWNobWVudHMKPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCB3aWR0aD0iMTUlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkF0dGFjaG1lbnQifTo8L3RkPgogICAgICAgICAgPHRkIHdpZHRoPSI4NSUiIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjEiPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50Um93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVuYW1lIn08L3RkPgogICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50Um93TGluayAtLT4KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJERhdGF7IkxpbmsifSIgJERhdGF7IlRhcmdldCJ9IG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In06ICRRRGF0YXsiRmlsZW5hbWUifSc7cmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBzcmM9IiRFbnZ7IkltYWdlcyJ9JFFEYXRheyJJbWFnZSJ9IiBib3JkZXI9IjAiIGFsdD0iJFRleHR7IiRRRGF0YXsiQWN0aW9uIn0ifSIgdGl0bGU9IiRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In0iPjwvYT4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvd0xpbmsgLS0+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3dOb0xpbmsgLS0+CiAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIkRW52eyJJbWFnZXMifSRRRGF0YXsiSW1hZ2UifSIgYm9yZGVyPSIwIiBhbHQ9IiRUZXh0eyIkUURhdGF7IkFjdGlvbiJ9In0iIHRpdGxlPSIkVGV4dHsiJFFEYXRheyJBY3Rpb24ifSJ9Ij4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudFJvd05vTGluayAtLT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGhyPjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Qm9keSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+JERhdGF7IkJvZHkifTwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpCb2R5IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGJyPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpWaWV3IC0tPgoKPCEtLSBkdGw6YmxvY2s6UHJpbnQgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiUHJpbnQifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNzAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgo8IS0tIGR0bDpibG9jazpIZWFkZXIgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgd2lkdGg9IjgwIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHRpdGxlPSIkUURhdGF7IlZhbHVlIn0iPiRRRGF0YXsiVmFsdWUiLCIxMjAwIn08L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6SGVhZGVyRGF0ZSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCB3aWR0aD0iODAiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJFFEYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFFEYXRheyJEYXRlIn0iPiRUaW1lTG9uZ3siJFFEYXRheyJWYWx1ZSJ9In08L2Rpdj48L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkhlYWRlckRhdGUgLS0+CiMgc2hvdyBhdHRhY2htZW50cwo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgPHRkIHdpZHRoPSIxNSUiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICA8dGQgd2lkdGg9Ijg1JSIgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3dMaW5rIC0tPgogICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRGF0YXsiTGluayJ9IiAkRGF0YXsiVGFyZ2V0In0gb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IiRRRGF0YXsiQWN0aW9uIn0ifTogJFFEYXRheyJGaWxlbmFtZSJ9JztyZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij4kVGV4dHsiJFFEYXRheyJBY3Rpb24ifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50Um93TGluayAtLT4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0IiBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnRSb3cgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICA8L3RkPgogICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGhyPjwvdGQ+CiAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Qm9keSAtLT4KICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+JERhdGF7IkJvZHkifTwvZGl2PgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpCb2R5IC0tPgogICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiZuYnNwOzwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6UHJpbnQgLS0+Cgo8IS0tIGR0bDpibG9jazpDb21wb3NlIC0tPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIHN1Ym1pdF9jb21wb3NlKCkKewogICAgaWYgKGRvY3VtZW50LmNvbXBvc2UuVG8udmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgVG86IHJlY2lwaWVudCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuVG8uZm9jdXMoKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlIGlmIChkb2N1bWVudC5jb21wb3NlLlN1YmplY3QudmFsdWUgPT0gIiIpIHsKICAgICAgICBhbGVydCgnJEpTVGV4dHsiQSBtZXNzYWdlIHNob3VsZCBoYXZlIGEgc3ViamVjdCEifScpOwogICAgICAgIGRvY3VtZW50LmNvbXBvc2UuU3ViamVjdC5mb2N1cygpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ci8vLS0+Cjwvc2NyaXB0Pgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8IS0tCmZ1bmN0aW9uIFNwZWxsQ2hlY2tTdWJtaXQoKQp7CiAgICBkb2N1bWVudC5zcGVsbGluZy5Cb2R5LnZhbHVlID0gZG9jdW1lbnQuY29tcG9zZS5Cb2R5LnZhbHVlOwogICAgd2luZG93Lm9wZW4oJycsICdzcGVsbGluZycsICd0b29sYmFyPW5vLGxvY2F0aW9uPW5vLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD03MDAsaGVpZ2h0PTU1MCxsZWZ0PTEwMCx0b3A9MTAwJyk7CiAgICBkb2N1bWVudC5zcGVsbGluZy5zdWJtaXQoKQp9Ci8vIC0tPgo8L3NjcmlwdD4KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KPCEtLQpmdW5jdGlvbiBCb29rQ2hlY2tTdWJtaXQoKQp7CiAgICBkb2N1bWVudC5ib29rLlRvLnZhbHVlID0gZG9jdW1lbnQuY29tcG9zZS5Uby52YWx1ZTsKICAgIGRvY3VtZW50LmJvb2suQ2MudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkNjLnZhbHVlOwogICAgZG9jdW1lbnQuYm9vay5CY2MudmFsdWUgPSBkb2N1bWVudC5jb21wb3NlLkJjYy52YWx1ZTsKICAgIHdpbmRvdy5vcGVuKCcnLCAnYm9vaycsICd0b29sYmFyPW5vLGxvY2F0aW9uPW5vLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyx3aWR0aD03MDAsaGVpZ2h0PTU1MCxsZWZ0PTEwMCx0b3A9MTAwJyk7CiAgICBkb2N1bWVudC5ib29rLnN1Ym1pdCgpCn0KLy8gLS0+Cjwvc2NyaXB0Pgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IkNvbXBvc2UifSRFbnZ7IkJveDEifQogICAgPC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWVudSI+CiAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRW52eyJMYXN0U2NyZWVuT3ZlcnZpZXcifSI+JFRleHR7IkJhY2sifTwvYT4KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgICAgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJDb21wb3NlIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZW5kIiAgICAgIHZhbHVlPSIxIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJNZXNzYWdlIiAgIHZhbHVlPSIkUURhdGF7Ik1lc3NhZ2UifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSW5SZXBseVRvIiB2YWx1ZT0iJFFEYXRheyJJblJlcGx5VG8ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9sZGVyIiAgICB2YWx1ZT0iJFFEYXRheyJGb2xkZXIifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiAgICB2YWx1ZT0iJFFEYXRheyJGb3JtSUQifSI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iNzYwIj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJPcHRpb25zIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGcm9tIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiRnJvbSJ9IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kRGF0YXsiRnJvbSBpbnZhbGlkIn08L2ZvbnQ+PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiVG8ifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRvIiB2YWx1ZT0iJFFEYXRheyJUbyJ9IiBzaXplPSI4MCI+IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kRGF0YXsiVG8gaW52YWxpZCJ9PC9mb250PgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYyJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ2MiIHZhbHVlPSIkUURhdGF7IkNjIn0iIHNpemU9IjgwIj4gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiREYXRheyJDYyBpbnZhbGlkIn08L2ZvbnQ+PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQmNjIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJCY2MiIHZhbHVlPSIkUURhdGF7IkJjYyJ9IiBzaXplPSI4MCI+IDxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4kRGF0YXsiQmNjIGludmFsaWQifTwvZm9udD48L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJqZWN0In06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iJFFEYXRheyJTdWJqZWN0In0iIHNpemU9IjgwIj48L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3B0aW9uIC0tPgogICAgICAgICAgPHRyIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRRRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgJERhdGF7IlZhbHVlIn0gPGZvbnQgY29sb3I9InJlZCIgc2l6ZT0iLTIiPiREYXRheyJJbnZhbGlkIn08L2ZvbnQ+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIiIG9uY2xpY2s9IlNwZWxsQ2hlY2tTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IlNwZWxsIENoZWNrIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXNwZWxsLnBuZyI+JFRleHR7IlNwZWxsIENoZWNrIn08L2E+JEVudnsiQm94MSJ9CiAgICAgICAgICAgICAgJEVudnsiQm94MCJ9PGEgaHJlZj0iIiBvbmNsaWNrPSJCb29rQ2hlY2tTdWJtaXQoKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkFkZHJlc3MgQm9vayJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1jb250ZW50cy5wbmciPiRUZXh0eyJBZGRyZXNzIEJvb2sifTwvYT4kRW52eyJCb3gxIn0KICAgICAgICAgICAgICAkRW52eyJCb3gwIn08YSBocmVmPSIjYXR0YWNobWVudCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7IkF0dGFjaG1lbnRzIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWF0dGFjaC5wbmciPiRUZXh0eyJBdHRhY2htZW50cyJ9PC9hPiRFbnZ7IkJveDEifQogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUZXh0In06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJCb2R5IiByb3dzPSIyNSIgY29scz0iNzgiIHdyYXA9IiRFbnZ7IkJyb3dzZXJXcmFwIn0iPiRRRGF0YXsiQm9keSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICA8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iNDAwIj4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPiRRRGF0YXsiRmlsZW5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZD4kUURhdGF7IkZpbGVzaXplIn08L3RkPgogICAgICAgICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnV0dG9uIiBuYW1lPSJBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9ImZpbGVfdXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgY2xhc3M9ImZpeGVkIj4KICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IiRUZXh0eyJBdHRhY2gifSI+CiAgICAgICAgICAgICAgICAgICAgPGEgbmFtZT0iYXR0YWNobWVudCI+PC9hPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU2VuZCBtYWlsISJ9IiBvbmNsaWNrPSJyZXR1cm4gc3VibWl0X2NvbXBvc2UoKTsiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0ic3BlbGxpbmciIHRhcmdldD0ic3BlbGxpbmciPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50U3BlbGxpbmciPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSIiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWxsX2xhbmciIHZhbHVlPSIiPgogICAgICA8L2Zvcm0+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgbmFtZT0iYm9vayIgdGFyZ2V0PSJib29rIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudEJvb2siPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRvIiB2YWx1ZT0iIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDYyIgdmFsdWU9IiI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQmNjIiB2YWx1ZT0iIj4KICAgICAgPC9mb3JtPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkNvbXBvc2UgLS0+Cgo8IS0tIGR0bDpibG9jazpTZWFyY2ggLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAkRW52eyJCb3gwIn0kVGV4dHsiU2VhcmNoIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTZWFyY2hSZXN1bHQiPgogICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjcwMCI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiT3B0aW9ucyJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiRm9sZGVyIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiREYXRheyJGb2xkZXJzIn08L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJGcm9tIn06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJGcm9tIiB2YWx1ZT0iJERhdGF7IkZyb20ifSIgc2l6ZT0iNTAiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUbyJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iVG8iIHZhbHVlPSIkRGF0YXsiVG8ifSIgc2l6ZT0iNTAiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDYyJ9OjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ2MiIHZhbHVlPSIkRGF0YXsiQ2MifSIgc2l6ZT0iNTAiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJqZWN0In06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iJERhdGF7IlN1YmplY3QifSIgc2l6ZT0iNTAiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUZXh0In06PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJCb2R5IiB2YWx1ZT0iJERhdGF7IkJvZHkifSIgc2l6ZT0iNTAiPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgYWNjZXNza2V5PSJnIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU2VhcmNoIn0iPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICA8L3RhYmxlPgogICAgICA8L2Zvcm0+CiAgICAgIDxicj4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6U2VhcmNoIC0tPgoKPCEtLSBkdGw6YmxvY2s6U2VhcmNoUmVzdWx0IC0tPgo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICAgJEVudnsiQm94MCJ9JFRleHR7IlNlYXJjaCJ9OiAkUURhdGF7IkZvbGRlciJ9JEVudnsiQm94MSJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtZW51Ij4KICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoJlByb2ZpbGU9bGFzdC1zZWFyY2giIGNsYXNzPSJtZW51aXRlbSI+CiAgICAgICRUZXh0eyJDaGFuZ2Ugc2VhcmNoIG9wdGlvbnMifQogICAgICA8L2E+CiAgICAgIC0gJFRleHR7Ik1lc3NhZ2VzIn06IDxiPiRRRGF0YXsiUmVzdWx0In08L2I+IC0gJFRleHR7IlRvdGFsIn06IDxiPiREYXRheyJUb3RhbEhpdHMifTwvYj4KICAgICAgLSAkVGV4dHsiUGFnZSJ9OiAkRGF0YXsiU2l0ZU5hdkJhciJ9CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSI+CiAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiAgICB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkJ1bGsiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvbGRlciIgICAgdmFsdWU9IiRRRGF0YXsiRm9sZGVyIn0iPgojICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJEZWxldGUiIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iPgojICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJSZWFkIiAgIHZhbHVlPSIkVGV4dHsiUmVhZCJ9Ij4KIyAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iVW5yZWFkIiB2YWx1ZT0iJFRleHR7IlVucmVhZCJ9Ij4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIj4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGhlYWQiPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxMCI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTAiPiRUZXh0eyIjIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyMCI+Jm5ic3A7PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMzUlIj4kVGV4dHsiRnJvbSJ9CiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PUZyb20mT3JkZXI9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCB1cHdhcmQifSIgYWx0PSIkVGV4dHsic29ydCB1cHdhcmQifSI+PC9hPiAvCiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PUZyb20mT3JkZXI9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9ZG93bi1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCBkb3dud2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iPjwvYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiU3ViamVjdCJ9CiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PVN1YmplY3QmT3JkZXI9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCB1cHdhcmQifSIgYWx0PSIkVGV4dHsic29ydCB1cHdhcmQifSI+PC9hPiAvCiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PVN1YmplY3QmT3JkZXI9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9ZG93bi1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCBkb3dud2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iPjwvYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiRGF0ZSJ9CiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PURhdGUmT3JkZXI9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCB1cHdhcmQifSIgYWx0PSIkVGV4dHsic29ydCB1cHdhcmQifSI+PC9hPiAvCiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PURhdGUmT3JkZXI9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9ZG93bi1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCBkb3dud2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iPjwvYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTAwIj4kVGV4dHsiU2l6ZSJ9CiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PVNpemUmT3JkZXI9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCB1cHdhcmQifSIgYWx0PSIkVGV4dHsic29ydCB1cHdhcmQifSI+PC9hPiAvCiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZTdWJhY3Rpb249U2VhcmNoUmVzdWx0JlByb2ZpbGU9bGFzdC1zZWFyY2gmRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PVNpemUmT3JkZXI9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9ZG93bi1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCBkb3dud2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iPjwvYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlYXJjaE1lc3NhZ2UgLS0+CiAgICAgICAgICA8ZHRsIGlmICgkRW52eyJDb2xvciJ9IGVxICIiKSB7ICRFbnZ7IkNvbG9yIn0gPSAic2VhcmNocGFzc2l2ZSI7IH0+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Ik1lc3NhZ2VJRCIgdmFsdWU9IiRRRGF0YXsiTnVtYmVyIn0iPjwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSI+JERhdGF7IkJvbGRTdGFydCJ9JFFEYXRheyJOdW1iZXIifSREYXRheyJCb2xkRW5kIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPgogICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgICAgICAgICAgICAgICA8dHI+CjwhLS0gZHRsOmJsb2NrOlNlYXJjaE1lc3NhZ2VGbGFnIC0tPgogICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9IiRFbnZ7IkltYWdlcyJ9d2VibWFpbF8kUURhdGF7IkltYWdlIn0ucG5nIiBib3JkZXI9IjAiIHRpdGxlPSIkUURhdGF7IlRpdGxlIn0iPgogICAgICAgICAgICAgICAgICA8L3RkPgojJFFEYXRheyJGbGFnIn0KPCEtLSBkdGw6YmxvY2s6U2VhcmNoTWVzc2FnZUZsYWcgLS0+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSIgdGl0bGU9IiRRRGF0YXsiRnJvbSJ9Ij4kRGF0YXsiQm9sZFN0YXJ0In08YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1WaWV3JkZvbGRlcj0kTFFEYXRheyJGb2xkZXIifSZNZXNzYWdlPSRMUURhdGF7Ik51bWJlciJ9Ij4kUURhdGF7IkZyb20iLCI0MCJ9PC9hPiREYXRheyJCb2xkRW5kIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iIHRpdGxlPSIkUURhdGF7IlN1YmplY3QifSI+JERhdGF7IkJvbGRTdGFydCJ9JFFEYXRheyJTdWJqZWN0IiwiNDAifSREYXRheyJCb2xkRW5kIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPiREYXRheyJCb2xkU3RhcnQifSRUaW1lTG9uZ3siJFFEYXRheyJEYXRlIn0ifSREYXRheyJCb2xkRW5kIn08L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPiREYXRheyJCb2xkU3RhcnQifSRRRGF0YXsiU2l6ZSJ9JERhdGF7IkJvbGRFbmQifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPGR0bCBpZiAoJEVudnsiQ29sb3IifSBlcSAic2VhcmNoYWN0aXZlIikgeyAkRW52eyJDb2xvciJ9ID0gIiI7IH0+CiAgICAgICAgICA8ZHRsIGlmICgkRW52eyJDb2xvciJ9IGVxICJzZWFyY2hwYXNzaXZlIikgeyAkRW52eyJDb2xvciJ9ID0gInNlYXJjaGFjdGl2ZSI7IH0+CjwhLS0gZHRsOmJsb2NrOlNlYXJjaE1lc3NhZ2UgLS0+CiAgICAgICAgPC90YWJsZT4KICAgICAgPC9mb3JtPgogICAgPC90ZD4KICA8L3RyPgo8L3RhYmxlPgo8IS0tIGR0bDpibG9jazpTZWFyY2hSZXN1bHQgLS0+Cgo8IS0tIGR0bDpibG9jazpJbmRleCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+CiAgICAgICRFbnZ7IkJveDAifSRUZXh0eyJNYWlsYm94In06ICRRRGF0YXsiRm9sZGVyIn0kRW52eyJCb3gxIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICAkVGV4dHsiTWVzc2FnZXMifTogPGI+JFFEYXRheyJSZXN1bHQifTwvYj4gLSAkVGV4dHsiVG90YWwifTogPGI+JERhdGF7IlRvdGFsSGl0cyJ9PC9iPgogICAgICAtICRUZXh0eyJQYWdlIn06ICREYXRheyJTaXRlTmF2QmFyIn0KICAgIDwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkPgogICAgICAgICAgICAmbmJzcDsKICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgJFRleHR7IkZvbGRlciJ9OiAkRGF0YXsiRm9sZGVycyJ9CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTZWxlY3QifSI+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQnVsayI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9sZGVyIiB2YWx1ZT0iJFFEYXRheyJGb2xkZXIifSI+CiAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+CiAgICAgICAgICA8dHIgY2xhc3M9ImNvbnRlbnRoZWFkIj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTAiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjEwIj4kVGV4dHsiIyJ9PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAiPiZuYnNwOzwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjM1JSI+JFRleHR7IkZyb20ifQogICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PUZyb20mT3JkZXI9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCB1cHdhcmQifSIgYWx0PSIkVGV4dHsic29ydCB1cHdhcmQifSI+PC9hPiAvCiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZGb2xkZXI9JFFEYXRheyJGb2xkZXIifSZTb3J0Qnk9RnJvbSZPcmRlcj1Eb3duIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgZG93bndhcmQifSI+PC9hPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTdWJqZWN0In0KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1TdWJqZWN0Jk9yZGVyPVVwIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCB1cHdhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9dXAtc21hbGwucG5nIiB0aXRsZT0iJFRleHR7InNvcnQgdXB3YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgdXB3YXJkIn0iPjwvYT4gLwogICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PVN1YmplY3QmT3JkZXI9RG93biIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgZG93bndhcmQifSc7IHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz0nJzsiPjxpbWcgYm9yZGVyPSIwIiBzcmM9IiRFbnZ7IkltYWdlcyJ9ZG93bi1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCBkb3dud2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iPjwvYT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUwIj4kVGV4dHsiRGF0ZSJ9CiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZGb2xkZXI9JFFEYXRheyJGb2xkZXIifSZTb3J0Qnk9RGF0ZSZPcmRlcj1VcCIgb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9JyRKU1RleHR7InNvcnQgdXB3YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifXVwLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9IiBhbHQ9IiRUZXh0eyJzb3J0IHVwd2FyZCJ9Ij48L2E+IC8KICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JkZvbGRlcj0kUURhdGF7IkZvbGRlciJ9JlNvcnRCeT1EYXRlJk9yZGVyPURvd24iIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IGRvd253YXJkIn0nOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9Jyc7Ij48aW1nIGJvcmRlcj0iMCIgc3JjPSIkRW52eyJJbWFnZXMifWRvd24tc21hbGwucG5nIiB0aXRsZT0iJFRleHR7InNvcnQgZG93bndhcmQifSIgYWx0PSIkVGV4dHsic29ydCBkb3dud2FyZCJ9Ij48L2E+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjEwMCI+JFRleHR7IlNpemUifQogICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mRm9sZGVyPSRRRGF0YXsiRm9sZGVyIn0mU29ydEJ5PVNpemUmT3JkZXI9VXAiIG9ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPSckSlNUZXh0eyJzb3J0IHVwd2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn11cC1zbWFsbC5wbmciIHRpdGxlPSIkVGV4dHsic29ydCB1cHdhcmQifSIgYWx0PSIkVGV4dHsic29ydCB1cHdhcmQifSI+PC9hPiAvCiAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifSZGb2xkZXI9JFFEYXRheyJGb2xkZXIifSZTb3J0Qnk9U2l6ZSZPcmRlcj1Eb3duIiBvbm1vdXNlb3Zlcj0id2luZG93LnN0YXR1cz0nJEpTVGV4dHsic29ydCBkb3dud2FyZCJ9JzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPScnOyI+PGltZyBib3JkZXI9IjAiIHNyYz0iJEVudnsiSW1hZ2VzIn1kb3duLXNtYWxsLnBuZyIgdGl0bGU9IiRUZXh0eyJzb3J0IGRvd253YXJkIn0iIGFsdD0iJFRleHR7InNvcnQgZG93bndhcmQifSI+PC9hPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TWVzc2FnZSAtLT4KICAgICAgICAgIDxkdGwgaWYgKCRFbnZ7IkNvbG9yIn0gZXEgIiIpIHsgJEVudnsiQ29sb3IifSA9ICJzZWFyY2hwYXNzaXZlIjsgfT4KICAgICAgICAgIDx0ciBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICA8dGQgY2xhc3M9IiRFbnZ7IkNvbG9yIn0iPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iTWVzc2FnZUlEIiB2YWx1ZT0iJFFEYXRheyJOdW1iZXIifSI+PC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9Ij4kRGF0YXsiQm9sZFN0YXJ0In0kUURhdGF7Ik51bWJlciJ9JERhdGF7IkJvbGRFbmQifTwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSI+CiAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICAgICAgICAgIDx0cj4KPCEtLSBkdGw6YmxvY2s6TWVzc2FnZUZsYWcgLS0+CiAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iJEVudnsiSW1hZ2VzIn13ZWJtYWlsXyRRRGF0YXsiSW1hZ2UifS5wbmciIGJvcmRlcj0iMCIgdGl0bGU9IiRRRGF0YXsiVGl0bGUifSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiMkUURhdGF7IkZsYWcifQo8IS0tIGR0bDpibG9jazpNZXNzYWdlRmxhZyAtLT4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPHRkIGNsYXNzPSIkRW52eyJDb2xvciJ9IiB0aXRsZT0iJFFEYXRheyJGcm9tIn0iPiREYXRheyJCb2xkU3RhcnQifTxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn0mU3ViYWN0aW9uPVZpZXcmRm9sZGVyPSRMUURhdGF7IkZvbGRlciJ9Jk1lc3NhZ2U9JExRRGF0YXsiTnVtYmVyIn0iPiRRRGF0YXsiRnJvbSIsIjQwIn08L2E+JERhdGF7IkJvbGRFbmQifTwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSIgdGl0bGU9IiRRRGF0YXsiU3ViamVjdCJ9Ij4kRGF0YXsiQm9sZFN0YXJ0In0kUURhdGF7IlN1YmplY3QiLCI0MCJ9JERhdGF7IkJvbGRFbmQifTwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSI+JERhdGF7IkJvbGRTdGFydCJ9JFRpbWVMb25neyIkUURhdGF7IkRhdGUifSJ9JERhdGF7IkJvbGRFbmQifTwvdGQ+CiAgICAgICAgICAgIDx0ZCBjbGFzcz0iJEVudnsiQ29sb3IifSI+JERhdGF7IkJvbGRTdGFydCJ9JFFEYXRheyJTaXplIn0kRGF0YXsiQm9sZEVuZCJ9PC90ZD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgICA8ZHRsIGlmICgkRW52eyJDb2xvciJ9IGVxICJzZWFyY2hhY3RpdmUiKSB7ICRFbnZ7IkNvbG9yIn0gPSAiIjsgfT4KICAgICAgICAgIDxkdGwgaWYgKCRFbnZ7IkNvbG9yIn0gZXEgInNlYXJjaHBhc3NpdmUiKSB7ICRFbnZ7IkNvbG9yIn0gPSAic2VhcmNoYWN0aXZlIjsgfT4KPCEtLSBkdGw6YmxvY2s6TWVzc2FnZSAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjciIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IkRlbGV0ZSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iUmVhZCIgdmFsdWU9IiRUZXh0eyJSZWFkIn0iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlVucmVhZCIgdmFsdWU9IiRUZXh0eyJVbnJlYWQifSI+CiAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZm9ybT4KICAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPCEtLSBkdGw6YmxvY2s6SW5kZXggLS0+Cg==
IyEvdXNyL2Jpbi9wZXJsIC13CnBhY2thZ2UgTWFpbDo6SU1BUFRhbGs7Cgo9aGVhZDEgTkFNRQoKTWFpbDo6SU1BUFRhbGsgLSBJTUFQIGNsaWVudCBpbnRlcmZhY2Ugd2l0aCBsb3RzIG9mIGZlYXR1cmVzCgo9aGVhZDEgU1lOT1BTSVMKCiAgdXNlIE1haWw6OklNQVBUYWxrOwoKICAkSU1BUCA9IE1haWw6OklNQVBUYWxrLT5uZXcoCiAgICAgIFNlcnZlciA9PiAkUG9wU2VydmVyLAogICAgICBVc2VybmFtZSA9PiAnZm9vJywKICAgICAgUGFzc3dvcmQgPT4gJ2JhcicsCiAgICAgIFVpZCA9PiAxICkKICAgIHx8IGRpZSAiRmFpbGVkIHRvIGNvbm5lY3QvbG9naW4gdG8gSU1BUCBzZXJ2ZXIiOwoKICAjIEFwcGVuZCBtZXNzYWdlIHRvIGZvbGRlcgogIG9wZW4obXkgJEYsICdyZmM4MjJtc2cudHh0Jyk7CiAgJElNQVAtPmFwcGVuZCgkRm9sZGVyTmFtZSwgJEYpIHx8IGRpciAkQDsKICBjbG9zZSgkRik7CgogICMgU2VsZWN0IGZvbGRlciBhbmQgZ2V0IGZpcnN0IHVuc2VlbiBtZXNzYWdlCiAgJElNQVAtPnNlbGVjdCgkRm9sZGVyTmFtZSkgfHwgZGllICRAOwogICRNc2dJZCA9ICRJTUFQLT5zZWFyY2goJ25vdCcsICdzZWVuJyktPlswXTsKCiAgIyBHZXQgbWVzc2FnZSBlbnZlbG9wZSBhbmQgcHJpbnQgc29tZSBkZXRhaWxzCiAgJE1zZ0VWID0gJElNQVAtPmZldGNoKCRNc2dJZCwgJ2VudmVsb3BlJyktPnskTXNnSWR9LT57ZW52ZWxvcGV9OwogIHByaW50ICJGcm9tOiAiIC4gJE1zZ0V2LT57RnJvbX07CiAgcHJpbnQgIlRvOiAiIC4gJE1zZ0V2LT57VG99OwogIHByaW50ICJTdWJqZWN0OiAiIC4gJE1zZ0V2LT57U3ViamVjdH07CgogICMgR2V0IG1lc3NhZ2UgYm9keSBzdHJ1Y3R1cmUKICAkTXNnQlMgPSAkSU1BUC0+ZmV0Y2goJE1zZ0lkLCAnYm9keXN0cnVjdHVyZScpLT57JE1zZ0lkfS0+e2JvZHlzdHJ1Y3R1cmV9OwoKICAjIEZpbmQgaW1hcCBwYXJ0IG51bWJlciBvZiB0ZXh0IHBhcnQgb2YgbWVzc2FnZQogICRNc2dUeHRIYXNoID0gTWFpbDo6SU1BUFRhbGs6OmZpbmRfbWVzc2FnZSgkTXNnQlMpOwogICRNc2dQYXJ0ID0gJE1zZ1R4dEhhc2gtPntwbGFpbn0tPnsnSU1BUC1QYXJ0bnVtJ307CgogICMgUmV0cmlldmUgbWVzc2FnZSB0ZXh0IGJvZHkKICAkTXNnVHh0ID0gJElNQVAtPmZldGNoKCRNc2dJZCwgImJvZHlbJE1zZ1BhcnRdIiktPnskTXNnSWR9LT57Ym9keX07CgogICRJTUFQLT5sb2dvdXQoKTsKCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyBtb2R1bGUgY29tbXVuaWNhdGVzIHdpdGggYW4gSU1BUCBzZXJ2ZXIuIEVhY2ggSU1BUCBzZXJ2ZXIgY29tbWFuZAppcyBtYXBwZWQgdG8gYSBtZXRob2Qgb2YgdGhpcyBvYmplY3QuCgpBbHRob3VnaCBvdGhlciBJTUFQIG1vZHVsZXMgZXhpc3Qgb24gQ1BBTiwgdGhpcyBoYXMgc2V2ZXJhbCBhZHZhbnRhZ2VzCm92ZXIgb3RoZXIgbW9kdWxlcy4KCj1vdmVyIDQKCj1pdGVtICoKCkl0IHBhcnNlcyB0aGUgbW9yZSBjb21wbGV4IElNQVAgc3RydWN0dXJlcyBsaWtlIGVudmVsb3BlcyBhbmQgYm9keQpzdHJ1Y3R1cmVzIGludG8gbmljZSBQRVJMIGRhdGEgc3RydWN0dXJlcwoKPWl0ZW0gKgoKSXQgY29ycmVjdGx5IHN1cHBvcnRzIGF0b21zLCBxdW90ZWQgc3RyaW5ncyBhbmQgbGl0ZXJhbHMgYXQgYW55CnBvaW50LiBTb21lIHBhcnNlcnMgaW4gb3RoZXIgbW9kdWxlcyBhcmVuJ3QgZnVsbHkgSU1BUCBjb21wYXRpYWJsZQphbmQgbWF5IGJyZWFrIGF0IG9kZCB0aW1lcyB3aXRoIGNlcnRhaW4gbWVzc2FnZXMgb24gc29tZSBzZXJ2ZXJzCgo9aXRlbSAqCgpJdCBhbGxvd3MgbGFyZ2UgcmV0dXJuIHZhbHVlcyAoZWcuIGF0dGFjaG1lbnRzIG9uIGEgbWVzc2FnZSkKdG8gYmUgcmVhZCBkaXJlY3RseSBpbnRvIGEgZmlsZSwgcmF0aGVyIHRoYW4gaW50byBtZW1vcnkuCgo9aXRlbSAqCgpJdCBpbmNsdWRlcyBzb21lIGhlbHBlciBmdW5jdGlvbnMgdG8gZmluZCB0aGUgYWN0dWFsIHRleHQvcGxhaW4Kb3IgdGV4dC9odG1sIHBhcnQgb2YgYSBtZXNzYWdlIG91dCBvZiBhIGNvbXBsZXggTUlNRSBzdHJ1Y3R1cmUuCkl0IGFsc28gY2FuIGZpbmQgYSBsaXN0IG9mIGF0dGFjaGVtZW50cywgYW5kIENJRCBsaW5rcyBmb3IgSFRNTAptZXNzYWdlcyB3aXRoIGF0dGFjaGVkIGltYWdlcwoKPWl0ZW0gKgoKSXQgc3VwcG9ydHMgZGVjb2Rpbmcgb2YgTUlNRSBoZWFkZXJzIHRvIHBlcmwgdXRmLTggc3RyaW5ncyBhdXRvbWF0aWNhbGx5LApzbyB5b3UgZG9uJ3QgaGF2ZSB0byBkZWFsIHdpdGggTUlNRSBlbmNvZGVkIGhlYWRlcnMgKGVuYWJsZWQgb3B0aW9uYWxseSkKCj1iYWNrCgpXaGlsZSB0aGUgSU1BUCBwcm90b2NvbCBkb2VzIGFsbG93IGZvciBhc3luY2hyb25vdXMgcnVubmluZyBvZiBjb21tYW5kcywgdGhpcwptb2R1bGUgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBpbiBhIHN5bmNocm9ub3VzIG1hbm5lci4gVGhhdCBpcywgeW91IGlzc3VlIGEKY29tbWFuZCBieSBjYWxsaW5nIGEgbWV0aG9kLCBhbmQgdGhlIGNvbW1hbmQgd2lsbCBibG9jayB1bnRpbCB0aGUgYXBwcm9wcmlhdGUKcmVzcG9uc2UgaXMgcmV0dXJuZWQuIFRoZSBtZXRob2Qgd2lsbCB0aGVuIHJldHVybiB0aGUgcGFyc2VkIHJlc3VsdHMgZnJvbQp0aGUgZ2l2ZW4gY29tbWFuZC4KCj1jdXQKCiMgRXhwb3J0IHt7ewpyZXF1aXJlIEV4cG9ydGVyOwpASVNBID0gcXcoRXhwb3J0ZXIpOwolRVhQT1JUX1RBR1MgPSAoCiAgRGVmYXVsdCA9PiBbIHF3KGdldF9ib2R5X3BhcnQgZmluZF9tZXNzYWdlIGJ1aWxkX2NpZF9tYXApIF0KKTsKRXhwb3J0ZXI6OmV4cG9ydF9va190YWdzKCdEZWZhdWx0Jyk7CgpzdWIgaW1wb3J0IHsKICAjIFRlc3QgZm9yIHNwZWNpYWwgY2FzZSBpZiBuZWVkIFVURjggc3VwcG9ydAogIG91ciAkQWxyZWFkeUxvYWRlZEVuY29kZTsKICBpZiAoQF8+MSAmJiAkX1sxXSAmJiAkX1sxXSBlcSAnOnV0ZjhzdXBwb3J0JykgewogICAgc3BsaWNlIEBfLCAxLCAxOwogICAgaWYgKCEkQWxyZWFkeUxvYWRlZEVuY29kZSkgewogICAgICBldmFsICJ1c2UgRW5jb2RlIHF3KGRlY29kZSk7IjsKICAgICAgJEFscmVhZHlMb2FkZWRFbmNvZGUgPSAxOwogICAgfQogIH0KCiAgZ290byAmRXhwb3J0ZXI6OmltcG9ydDsKfQoKb3VyICRWRVJTSU9OID0gJzEuMDInOwojIH19fQoKIyBVc2UgbW9kdWxlcyB7e3sKdXNlIEZjbnRsIHF3KDpERUZBVUxUKTsKdXNlIFNvY2tldDsKdXNlIElPOjpTZWxlY3Q7CnVzZSBJTzo6SGFuZGxlOwp1c2UgSU86OlNvY2tldDsKdXNlIERhdGE6OkR1bXBlcjsKdXNlIHN0cmljdDsKIyB9fX0KCj1oZWFkMSBDTEFTUyBPVkVSVklFVwoKVGhlIG9iamVjdCBtZXRob2RzIGhhdmUgYmVlbiBicm9rZW4gaW4gc2V2ZXJhbCBzZWN0aW9ucy4KCj1oZWFkMiBTZWN0aW9ucwoKPW92ZXIgNAoKPWl0ZW0gQ09OU1RBTlRTCgpMaXN0cyB0aGUgYXZhaWxhYmxlIGNvbnN0YW50cyB0aGUgY2xhc3MgdXNlcwoKPWl0ZW0gQ09OU1RSVUNUT1IKCkV4cGxhaW5zIGFsbCB0aGUgb3B0aW9ucyBhdmFpbGFibGUgd2hlbiBjb25zdHJ1Y3RpbmcgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlCkM8TWFpbDo6SU1BUFRhbGs+IGNsYXNzCgo9aXRlbSBDT05ORUNUSU9OIENPTlRST0wgTUVUSE9EUwoKVGhlc2UgYXJlIG1ldGhvZHMgd2hpY2ggY29udHJvbCB0aGUgb3ZlcmFsbCBJTUFQIGNvbm5lY3Rpb24gb2JqZWN0LCBzdWNoCmFzIGxvZ2dpbmcgaW4gYW5kIGxvZ2dpbmcgb3V0LCBob3cgcmVzdWx0cyBhcmUgcGFyc2VkLCBob3cgZm9sZGVyIG5hbWVzIGFuZAptZXNzYWdlIGlkJ3MgYXJlIHRyZWF0ZWQsIGV0Yy4KCj1pdGVtIElNQVAgRk9MREVSIENPTU1BTkQgTUVUSE9EUwoKVGhlc2UgYXJlIG1ldGhvZHMgdG8gaW5zcGVjdCwgYWRkLCBkZWxldGUgYW5kIHJlbmFtZSBJTUFQIGZvbGRlcnMgb24gdGhlIHNlcnZlcgoKPWl0ZW0gSU1BUCBNRVNTQUdFIENPTU1BTkQgTUVUSE9EUwoKVGhlc2UgYXJlIG1ldGhvZHMgdG8gcmV0cmlldmUsIGRlbGV0ZSwgbW92ZSBhbmQgYWRkIG1lc3NhZ2VzIHRvL2Zyb20gSU1BUCBmb2xkZXJzCgo9aXRlbSBIRUxQRVIgTUVUSE9EUwoKVGhlc2UgYXJlIGV4dHJhIG1ldGhvZHMgdGhhdCB1c2VycyBvZiB0aGlzIGNsYXNzIG1pZ2h0IGZpbmQgdXNlZnVsLiBUaGV5CmdlbmVyYWxseSBkbyBleHRyYSBwYXJzaW5nIG9uIHJldHVybmVkIHN0cnVjdHVyZXMgdG8gcHJvdmlkZSBoaWdoZXIKbGV2ZWwgZnVuY3Rpb25hbGl0eS4KCj1pdGVtIElOVEVSTkFMIE1FVEhPRFMKClRoZXNlIGFyZSBtZXRob2RzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgQzxNYWlsOjpJTUFQVGFsaz4gb2JqZWN0IHRvIGdldCB3b3JrCmRvbmUuIFRoZXkgbWF5IGJlIHVzZWZ1bCBpZiB5b3UgbmVlZCB0byBleHRlbmQgdGhlIGNsYXNzIHlvdXJzZWxmLiBOb3RlIHRoYXQKaW50ZXJuYWwgbWV0aG9kcyB3aWxsIGFsd2F5cyAnZGllJyBpZiB0aGV5IGVuY291bnRlciBhbnkgZXJyb3JzLgoKPWl0ZW0gSU5URVJOQUwgU09DS0VUIEZVTkNUSU9OUwoKVGhlc2UgYXJlIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkgdGhlIEM8TWFpbDo6SU1BUFRhbGs+IG9iamVjdCAKdG8gcmVhZC93cml0ZSBkYXRhIHRvL2Zyb20gdGhlIElNQVAgY29ubmVjdGlvbiBzb2NrZXQuIFRoZSBjbGFzcyBkb2VzCml0J3Mgb3duIGJ1ZmZlcmluZyBzbyBpZiB5b3Ugd2FudCB0byByZWFkL3dyaXRlIHRvIHRoZSBJTUFQIHNvY2tldCwgeW91CnNob3VsZCB1c2UgdGhlc2UgZnVuY3Rpb25zLgoKPWl0ZW0gSU5URVJOQUwgUEFSU0lORyBGVU5DVElPTlMKClRoZXNlIGFyZSBmdW5jdGlvbnMgdXNlZCB0byBwYXJzZSB0aGUgcmVzdWx0cyByZXR1cm5lZCBmcm9tIHRoZSBJTUFQIHNlcnZlcgppbnRvIHBlcmwgc3R5bGUgZGF0YSBzdHJ1Y3R1cmVzLgoKPWJhY2sKCj1oZWFkMiBNZXRob2QgcmVzdWx0cwoKQWxsIG1ldGhvZHMgcmV0dXJuIHVuZGVmIG9uIGZhaWx1cmUuIFRoZXJlIGFyZSBmb3VyIG1haW4gbW9kZXMgb2YgZmFpbHVyZToKCj1vdmVyIDQKCj1pdGVtIDEuIEFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcvd3JpdGluZyB0byBhIHNvY2tldC4gTWF5YmUgdGhlIHNlcnZlcgpjbG9zZWQgaXQsIG9yIHlvdSdyZSBub3QgY29ubmVjdGVkIHRvIGFueSBzZXJ2ZXIuCgo9aXRlbSAyLiBBbiBlcnJvciBvY2N1cnJlZCBwYXJzaW5nIHRoZSByZXNwb25zZSBvZiBhbiBJTUFQIGNvbW1hbmQuIFRoaXMgaXMKdXN1YWxseSBvbmx5IGEgcHJvYmxlbSBpZiB5b3VyIElNQVAgc2VydmVyIHJldHVybnMgaW52YWxpZCBkYXRhLgoKPWl0ZW0gMy4gQW4gSU1BUCBjb21tYW5kIGRpZG4ndCByZXR1cm4gYW4gJ09LJyByZXNwb25zZS4KCj1pdGVtIDQuIFRoZSBzb2NrZXQgcmVhZCBvcGVyYXRpb24gdGltZWQgb3V0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbQp0aGUgc2VydmVyLgoKPWJhY2sKCkluIGVhY2ggY2FzZSwgc29tZSByZWFkYWJsZSBmb3JtIG9mIGVycm9yIHRleHQgaXMgcGxhY2VkIGluICRALCBvciB5b3UKY2FuIGNhbGwgdGhlIEM8Z2V0X2xhc3RfZXJyb3IoKT4gbWV0aG9kLiBGb3IgY29tbWFuZHMgd2hpY2ggcmV0dXJuCnJlc3BvbnNlcyAoZWcgZmV0Y2gsIGdldGFjbCwgZXRjKSwgdGhlIHJlc3VsdCBpcyByZXR1cm5lZC4gU2VlIGVhY2gKY29tbWFuZCBmb3IgZGV0YWlscyBvZiB0aGUgcmVzcG9uc2UgcmVzdWx0LiBGb3IgY29tbWFuZHMKd2l0aCBubyByZXNwb25zZSBidXQgd2hpY2ggc3VjY2VlZCAoZWcgc2V0YWNsLCByZW5hbWUsIGV0YykgdGhlIHJlc3VsdAonb2snIGlzIGdlbmVyYWxseSByZXR1cm5lZC4KCj1oZWFkMiBNZXRob2QgcGFyYW1ldGVycwoKQWxsIG1ldGhvZHMgd2hpY2ggc2VuZCBkYXRhIHRvIHRoZSBJTUFQIHNlcnZlciAoZWcuIEM8ZmV0Y2goKT4sIEM8c2VhcmNoKCk+LApldGMpIGhhdmUgdGhlaXIgYXJndW1lbnRzIHByb2Nlc3NlZCBiZWZvcmUgdGhleSBhcmUgc2VudC4gQXJndW1lbnRzIG1heSBiZQpzcGVjaWZpZWQgaW4gc2V2ZXJhbCB3YXlzOgoKPW92ZXIgNAoKPWl0ZW0gQjxzY2FsYXI+CgpUaGUgdmFsdWUgaXMgZmlyc3QgY2hlY2tlZCBhbmQgcXVvdGVkIGlmIHJlcXVpcmVkLiBWYWx1ZXMgY29udGFpbmluZwpbXDAwMFwwMTJcMDE1XSBhcmUgdHVybmVkIGludG8gbGl0ZXJhbHMsIHZhbHVlcyBjb250YWluaW5nCltcMDAwLVwwNDBce1x9IFwlXCpcIl0gYXJlIHF1b3RlZCBieSBzdXJyb3VuZGluZyB3aXRoIGEgIi4uLiIgcGFpcgooYW55ICIgdGhlbXNlbHZlcyBhcmUgdHVybmVkIGludG8gXCIpLgoKPWl0ZW0gQjxmaWxlIHJlZj4KClRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBpcyBzZW50IGFzIGFuIElNQVAgbGl0ZXJhbC4gTm90ZSB0aGF0CmJlY2F1c2UgSU1BUFRhbGsgaGFzIHRvIGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSBiZWluZyBzZW50LAp0aGlzIG11c3QgYmUgYSB0cnVlIGZpbGUgcmVmZXJlbmNlIHRoYXQgY2FuIGJlIHNlZWtlZCBhbmQgbm90Cmp1c3Qgc29tZSBzdHJlYW0uIFRoZSBlbnRpcmUgZmlsZSB3aWxsIGJlIHNlbnQgcmVnYXJkbGVzcyBvZiB0aGUKY3VycmVudCBzZWVrIHBvaW50LgoKPWl0ZW0gQjxhcnJheSByZWY+CgpUaGUgYXJyYXkgcmVmZXJlbmNlIHNob3VsZCBjb250YWluIG9ubHkgMiBpdGVtcy4gVGhlIGZpcnN0IGl0ZW0gaXMgYSB0ZXh0CnN0cmluZyB3aGljaCBzcGVjaWZpZXMgd2hhdCB0byBkbyB3aXRoIHRoZSBzZWNvbmQgaXRlbSBvZiB0aGUgYXJyYXkgcmVmCgo9b3ZlciA0Cgo9aXRlbSAqICdMaXRlcmFsJwoKVGhlIHN0cmluZy9kYXRhIGluIHRoZSBzZWNvbmQgaXRlbSBzaG91bGQgYmUgc2VudCBhcyBhbiBJTUFQIGxpdGVyYWwKcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsbHkgZGF0YSBpbiB0aGUgc3RyaW5nL2RhdGEKCj1pdGVtICogJ05vUXVvdGUnCgpUaGUgc3RyaW5nL2RhdGEgaW4gdGhlIHNlY29uZCBpdGVtIHNob3VsZCBiZSBzZW50IGFzIGlzLCBubyBxdW90aW5nIHdpbGwKb2NjdXIsIGFuZCB0aGUgZGF0YSB3b24ndCBiZSBzZW50IGFzIHF1b3RlZCBvciBhcyBhIGxpdGVyYWwgcmVnYXJkbGVzcwpvZiB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZy9kYXRhLgoKRXhhbXBsZXM6CiAgICAjIFBhc3N3b3JkIGlzIGF1dG9tYXRpY2FsbHkgcXVvdGVkIHRvICJuYXN0eSUqXCJwYXNzd2QiCiAgICAkSU1BUC0+bG9naW4oImpvZSIsICduYXN0eSUqInBhc3N3ZCcpOwogICAgIyBBcHBlbmQgJE1zZ1R4dCBhcyBzdHJpbmcKICAgICRJTUFQLT5hcHBlbmQoImluYm94IiwgWyAnTGl0ZXJhbCcsICRNc2dUeHQgXSkKICAgICMgQXBwZW5kIE1TR0ZJTEUgY29udGVudHMgYXMgbmV3IG1lc3NhZ2UKICAgICRJTUFQLT5hcHBlbmQoImluYm94IiwgXCpNU0dGSUxFIF0pCgo9YmFjawoKPWJhY2sKCj1jdXQKCj1oZWFkMSBDT05TVEFOVFMKClRoZXNlIGNvbnN0YW50cyByZWxhdGUgdG8gdGhlIHN0YW5kYXJkIDQgc3RhdGVzIHRoYXQgYW4gSU1BUCBjb25uZWN0aW9uIGNhbgpiZSBpbi4gVGhleSBhcmUgcGFzc2VkIGFuZCByZXR1cm5lZCBmcm9tIHRoZSBDPHN0YXRlKCk+IG1ldGhvZC4gU2VlIFJGQzIwNjAKZm9yIG1vcmUgZGV0YWlscyBhYm91dCBJTUFQIGNvbm5lY3Rpb24gc3RhdGVzLgoKPW92ZXIgNAoKPWl0ZW0gSTxVbmNvbm5lY3RlZD4KCkN1cnJlbnQgbm90IGNvbm5lY3RlZCB0byBhbnkgc2VydmVyCgo9aXRlbSBJPENvbm5lY3RlZD4KCkNvbm5lY3RlZCB0byBhIHNlcnZlciwgYnV0IG5vdCBsb2dnZWQgaW4KCj1pdGVtIEk8QXV0aGVudGljYXRlZD4KCkNvbm5lY3RlZCBhbmQgbG9nZ2VkIGludG8gYSBzZXJ2ZXIsIGJ1dCBub3QgY3VycmVudCBmb2xkZXIKCj1pdGVtIEk8U2VsZWN0ZWQ+CgpDb25uZWN0ZWQsIGxvZ2dlZCBpbiBhbmQgaGF2ZSAnc2VsZWN0J2VkIGEgY3VycmVudCBmb2xkZXIKCj1iYWNrCgo9Y3V0CgojIENvbnN0YW50cyBmb3IgdGhlIHBvc3NpYmxlIHN0YXRlcyB0aGUgY29ubmVjdGlvbiBjYW4gYmUgaW4ge3t7CiMgT2JqZWN0IG5vdCBjb25uZWN0ZWQKdXNlIGNvbnN0YW50IFVuY29ubmVjdGVkID0+IDA7CiMgY29ubmVjdGVkOyBub3QgbG9nZ2VkIGluCnVzZSBjb25zdGFudCBDb25uZWN0ZWQgPT4gMTsKIyBsb2dnZWQgaW47IG5vIG1haWxib3ggc2VsZWN0ZWQKdXNlIGNvbnN0YW50IEF1dGhlbnRpY2F0ZWQgPT4gMjsKIyBtYWlsYm94IHNlbGVjdGVkCnVzZSBjb25zdGFudCBTZWxlY3RlZCA9PiAzOwoKIyBXaGF0IGEgbGluayBicmVhayBpcyBvbiB0aGUgbmV0d29yayBjb25uZWN0aW9uCnVzZSBjb25zdGFudCBMQiA9PiAiXDAxNVwwMTIiOwoKIyBSZWdleHBzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGhlYWRlciBpcyBNSU1FIGVuY29kZWQKbXkgJFJGQzE1MjJUb2tlbiA9IHFyL1teXHgwMC1ceDFmXChcKVw8XD5cQFwsXDtcOlwiXC9cW1xdXD9cLlw9XCBdKy87Cm15ICROZWVkRGVjb2RlVVRGOFJlZ2V4cCA9IHFyLz1cPyRSRkMxNTIyVG9rZW5cPyRSRkMxNTIyVG9rZW5cP1teXD9dKlw/PS87CgojIH19fQoKPWhlYWQxIENPTlNUUlVDVE9SCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBJPDwgTWFpbDo6SU1BUFRhbGstbmV3KCVPcHRpb25zKSA+PgoKQ3JlYXRlcyBuZXcgTWFpbDo6SU1BUFRhbGsgb2JqZWN0LiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZC4KCj1pdGVtIEI8Q29ubmVjdGlvbiBPcHRpb25zPgoKPW92ZXIgNAoKPWl0ZW0gQjxTZXJ2ZXI+CgpUaGUgaG9zdG5hbWUgb3IgaXAgYWRkcmVzcyB0byBjb25uZWN0IHRvLiBUaGlzIG11c3QgYmUgc3VwcGxpZWQgdW5sZXNzCnRoZSBCPFNvY2tldD4gb3B0aW9uIGlzIHN1cHBsaWVkLgoKPWl0ZW0gQjxQb3J0PgoKVGhlIHBvcnQgbnVtYmVyIG9uIHRoZSBob3N0IHRvIGNvbm5lY3QgdG8uIERlZmF1bHRzIHRvIDE0MyBpZiBub3Qgc3VwcGxpZWQuCgo9aXRlbSBCPFNvY2tldD4KCkFuIGV4aXN0aW5nIHNvY2tldCB0byB1c2UgYXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIElNQVAgc2VydmVyLiBJZiB5b3UKc3VwcGx5IHRoZSBCPFNvY2tldD4gb3B0aW9uLCB5b3Ugc2hvdWxkIG5vdCBzdXBwbHkgYSBCPFNlcnZlcj4gb3IgQjxQb3J0PgpvcHRpb24uCgpUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYW4gU1NMIHNvY2tldCBjb25uZWN0aW9uIHVzaW5nCklPOjpTb2NrZXQ6OlNTTCBhbmQgdGhlbiBwYXNzIGluIHRoZSBjb25uZWN0ZWQgc29ja2V0IHRvIHRoZSBuZXcoKSBjYWxsLgoKSXQncyBhbHNvIHVzZWZ1bCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBDPHJlbGVhc2Vfc29ja2V0KCk+IG1ldGhvZApkZXNjcmliZWQgYmVsb3cgZm9yIHJldXNpbmcgdGhlIHNhbWUgc29ja2V0IGJleW9uZCB0aGUgbGlmZXRpbWUgb2YgdGhlIElNQVBUYWxrCm9iamVjdC4gU2VlIGEgZGVzY3JpcHRpb24gaW4gdGhlIHNlY3Rpb24gQzxyZWxlYXNlX3NvY2tldCgpPiBtZXRob2QgZm9yCm1vcmUgaW5mb3JtYXRpb24uCgpZb3UgbXVzdCBoYXZlIHdyaXRlIGZsdXNoaW5nIGVuYWJsZWQgZm9yIGFueQpzb2NrZXQgeW91IHBhc3MgaW4gaGVyZSBzbyB0aGF0IGNvbW1hbmRzIHdpbGwgYWN0dWFsbHkgYmUgc2VudCwKYW5kIHJlc3BvbnNlcyByZWNlaXZlZCwgcmF0aGVyIHRoYW4ganVzdCB3YWl0aW5nIGFuZCBldmVudHVhbGx5CnRpbWluZyBvdXQuIHlvdSBjYW4gZG8gdGhpcyB1c2luZyB0aGUgcGVybCBDPHNlbGVjdCgpPiBjYWxsIGFuZAokfCB2YXJpYWJsZSBhcyBzaG93biBiZWxvdy4KCiAgbXkgJG9maCA9IHNlbGVjdCgkU29ja2V0KTsgJHwgPSAxOyBzZWxlY3QgKCRvZmgpOwoKPWl0ZW0gQjxTdGF0ZT4KCklmIHlvdSBzdXBwbHkgYSBDPFNvY2tldD4gb3B0aW9uLCB5b3UgY2FuIHNwZWNpZnkgdGhlIElNQVAgc3RhdGUgdGhlCnNvY2tldCBpcyBjdXJyZW50bHkgaW4sIG5hbWVseSBvbmUgb2YgJ1VuY29ubmVjdGVkJywgJ0Nvbm5lY3RlZCcsCidBdXRoZW50aWNhdGVkJyBvciAnU2VsZWN0ZWQnLiBUaGlzIGRlZmF1bHRzIHRvICdDb25uZWN0ZWQnIGlmIG5vdApzdXBwbGllZCBhbmQgdGhlIEM8U29ja2V0PiBvcHRpb24gaXMgc3VwcGxpZWQuCgo9aXRlbSBCPEV4cGVjdEdyZWV0aW5nPgoKSWYgc3VwcGxpZWQgYW5kIHRydWUsIGFuZCBhIHNvY2tldCBpcyBzdXBwbGllZCB2aWEgdGhlIEM8U29ja2V0PgpvcHRpb24sIGNoZWNrcyB0aGF0IGEgZ3JlZXRpbmcgbGluZSBpcyBzdXBwbGllZCBieSB0aGUgc2VydmVyCmFuZCByZWFkcyB0aGUgZ3JlZXRpbmcgbGluZS4KCj1iYWNrCgo9aXRlbSBCPExvZ2luIE9wdGlvbnM+Cgo9b3ZlciA0Cgo9aXRlbSBCPFVzZXJuYW1lPgoKVGhlIHVzZXJuYW1lIHRvIGNvbm5lY3QgdG8gdGhlIElNQVAgc2VydmVyIGFzLiBJZiBub3Qgc3VwcGxpZWQsIG5vIGxvZ2luCmlzIGF0dGVtcHRlZCBhbmQgdGhlIElNQVAgb2JqZWN0IGlzIGxlZnQgaW4gdGhlIEI8Q09OTkVDVEVEPiBzdGF0ZS4KSWYgc3VwcGxpZWQsIHlvdSBtdXN0IGFsc28gc3VwcGx5IHRoZSBCPFBhc3N3b3JkPiBvcHRpb24gYW5kIGEgbG9naW4KaXMgYXR0ZW1wdGVkLiBJZiB0aGUgbG9naW4gZmFpbHMsIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBhbmQgQjx1bmRlZj4KaXMgcmV0dXJuZWQuIElmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyB3aXRoIGEgY29ubmVjdGlvbiBldmVuIGlmIHRoZQpsb2dpbiBmYWlscywgZG9uJ3QgcGFzcyBhIEI8VXNlcm5hbWU+IG9wdGlvbiwgYnV0IGluc3RlYWQgdXNlIHRoZSBCPGxvZ2luPgptZXRob2QgZGVzY3JpYmVkIGJlbG93LgoKPWl0ZW0gQjxQYXNzd29yZD4KClRoZSBwYXNzd29yZCB0byB1c2UgdG8gbG9naW4gdG8gdGhlIGFjY291bnQuCgo9YmFjawoKPWl0ZW0gQjxJTUFQIG1lc3NhZ2UvZm9sZGVyIG9wdGlvbnM+Cgo9b3ZlciA0Cgo9aXRlbSBCPFVpZD4KCkNvbnRyb2wgd2hldGhlciBtZXNzYWdlIGlkcyBhcmUgbWVzc2FnZSB1aWRzIG9yIG5vdC4gVGhpcyBpcyAxIChvbikgYnkKZGVmYXVsdCBiZWNhdXNlIGdlbmVyYWxseSB0aGF0J3MgaG93IG1vc3QgcGVvcGxlIHdhbnQgdG8gdXNlIGl0LiBUaGlzIGFmZmVjdHMKbW9zdCBjb21tYW5kcyB0aGF0IHJlcXVpcmUvdXNlL3JldHVybiBtZXNzYWdlIGlkcyAoZWcuIEI8ZmV0Y2g+LCBCPHNlYXJjaD4sCkI8c29ydD4sIGV0YykgCgo9aXRlbSBCPFJvb3RGb2xkZXI+CgpJZiBzdXBwbGllZCwgc2V0cyB0aGUgcm9vdCBmb2xkZXIgcHJlZml4LiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcKQzxzZXRfcm9vdF9mb2xkZXIoKT4gd2l0aCB0aGUgdmFsdWUgcGFzc2VkLiBJZiBubyB2YWx1ZSBpcyBzdXBwbGllZCwKQzxzZXRfcm9vdF9mb2xkZXIoKT4gaXMgY2FsbGVkIHdpdGggbm8gdmFsdWUuIFNlZSB0aGUgQzxzZXRfcm9vdF9mb2xkZXIoKT4KbWV0aG9kIGZvciBtb3JlIGRldGFpbHMuCgo9aXRlbSBCPFNlcGFyYXRvcj4KCklmIHN1cHBsaWVkLCBzZXRzIHRoZSBmb2xkZXIgbmFtZSB0ZXh0IHN0cmluZyBzZXBhcmF0b3IgY2hhcmFjdGVyLiAKUGFzc2VkIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvIHRoZSBDPHNldF9yb290X2ZvbGRlcigpPiBtZXRob2QuCgo9aXRlbSBCPENhc2VJbnNlbnNpdGl2ZT4KCklmIHN1cHBsaWVkLCBwYXNzZWQgYWxvbmcgd2l0aCBSb290Rm9sZGVyIHRvIHRoZSBDPHNldF9yb290X2ZvbGRlcigpPgptZXRob2QuCgo9aXRlbSBCPEFsdFJvb3RGb2xkZXI+CgpJZiBzdXBwbGllZCwgcGFzc2VkIGFsb25nIHdpdGggUm9vdEZvbGRlciB0byB0aGUgQzxzZXRfcm9vdF9mb2xkZXIoKT4KbWV0aG9kLgoKPWJhY2sKCj1pdGVtIEI8RXhhbXBsZXM+CgogICRpbWFwID0gTWFpbDo6SU1BUFRhbGstPm5ldygKICAgICAgICAgICAgU2VydmVyID0+ICdmb28uY29tJywKICAgICAgICAgICAgUG9ydCA9PiAxNDMsCiAgICAgICAgICAgIFVzZXJuYW1lID0+ICdqb2VibG9nZ3MnLAogI