<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>CustomerTemplates</Name>
    <Version>11.0.3</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-04-27 14:03:14" Version="11.0.3">Update to OTOBO 11.0.16.</ChangeLog>
    <ChangeLog Date="2026-02-05 13:20:38" Version="11.0.2">Updated to OTOBO 11.0.15.</ChangeLog>
    <ChangeLog Date="2024-11-05 15:09:32" Version="11.0.1">Initial Release.</ChangeLog>
    <Description Lang="en">Provides the Customer interface with the standard templates feature.</Description>
    <Framework>11.0.x</Framework>
    <BuildCommitID>79842e91d93c53f3a90fea53349e1928efe9f7eb</BuildCommitID>
    <BuildDate>2026-04-27 14:03:17</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Kernel/Config/Files/XML/CustomerTemplate.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90b2JvX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KCiAgICA8U2V0dGluZyBOYW1lPSJTdGFuZGFyZFRlbXBsYXRlOjpDdXN0b21lclR5cGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGxpc3Qgb2YgY3VzdG9tZXIgdHlwZXMgZm9yIHRlbXBsYXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlRpY2tldDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21lckFuc3dlciIgVHJhbnNsYXRhYmxlPSIxIj5DdXN0b21lciBBbnN3ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1c3RvbWVyQ3JlYXRlIiBUcmFuc2xhdGFibGU9IjEiPkN1c3RvbWVyIENyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSMjIzAwMy1TdGFuZGFyZFRlbXBsYXRlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpDdXN0b21lcjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuRmllbGRFeHBsYW5hdGlvblJvdy5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkN1c3RvbWVyLlRpY2tldEFjdGlvbi5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6Q3VzdG9tZXJUaWNrZXRab29tIyMjMDAzLVN0YW5kYXJkVGVtcGxhdGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkN1c3RvbWVyOjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJKYXZhU2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQ3VzdG9tZXIuVGlja2V0QWN0aW9uLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pblNlcnZpY2VUZW1wbGF0ZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5hZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5UaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBhZG1pbiBhcmVhIG9mIE9UT0JPLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlRlbXBsYXRlcyDihpQgU2VydmljZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5BZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWRtaW5TZXJ2aWNlVGVtcGxhdGVzIyMjMDAyLVRpY2tldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkFkbWluLlNlcnZpY2VUZW1wbGF0ZXMuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FkbWluU2VydmljZVRlbXBsYXRlcyMjIzAwMi1UaWNrZXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbk1vZHVsZSMjI0FkbWluU2VydmljZVRlbXBsYXRlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BZG1pbiBhcmVhIG5hdmlnYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6QWRtaW5PdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5hZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyOjpNb2R1bGVBZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5UZW1wbGF0ZXMg4oaUIFNlcnZpY2VzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5MaW5rIHRlbXBsYXRlcyB0byBzZXJ2aWNlcy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikljb25CaWciPmZhLWZpbGUtdGV4dC1vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uU21hbGwiPmZhLWZvbGRlcjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDdXN0b21lclRlbXBsYXRlOjpSZWZlcmVuY2VBdHRyaWJ1dGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgc3RhbmRhcmQgdGVtcGxhdGVzIGRlcGVuZHMgb24gdGhlIHF1ZXVlIG9yIG9uIHRoZSBzZXJ2aWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6VGlja2V0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IlF1ZXVlIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUXVldWUiIFRyYW5zbGF0YWJsZT0iMSI+UXVldWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlNlcnZpY2UiIFRyYW5zbGF0YWJsZT0iMSI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDdXN0b21lclRlbXBsYXRlOjpBdXRvc2VsZWN0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgYSBzdGFuZGFyZCB0ZW1wbGF0ZSBzaG91bGQgYmUgYXV0b21hdGljYWxseSBzZWxlY3RlZCB3aGVuIGl0IGlzIHRoZSBvbmx5IG9uZSBhdmFpbGFibGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpUaWNrZXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="Kernel/Modules/AdminServiceTemplates.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5TZXJ2aWNlVGVtcGxhdGVzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICBpZiAoICEkUGFyYW17QWNjZXNzUnd9ICYmICRQYXJhbXtBY2Nlc3NSb30gKSB7CiAgICAgICAgJFNlbGYtPntMaWdodEFkbWlufSA9IDE7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRTZXJ2aWNlT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIDwtPiBzZXJ2aWNlcyAxOm4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZScgKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICBteSAkSUQgICAgICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICk7CiAgICAgICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVEYXRhID0gJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPlN0YW5kYXJkVGVtcGxhdGVHZXQoIElEID0+ICRJRCApOwoKICAgICAgICAjIGdldCBzZXJ2aWNlcwogICAgICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXNzaWduZWQgc2VydmljZXMKICAgICAgICBteSAlTWVtYmVyID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRJRCwKICAgICAgICApOwoKICAgICAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZVR5cGUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICRTdGFuZGFyZFRlbXBsYXRlRGF0YXtUZW1wbGF0ZVR5cGV9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKCiAgICAgICAgICAgICMgRmlsdGVyIG91dCBzZXJ2aWNlcyB3aXRob3V0IHBlcm1pc3Npb24uCiAgICAgICAgICAgIG15ICVSd1NlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPkdldEFsbFNlcnZpY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlRGF0YSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2VydmljZURhdGF7JFNlcnZpY2VJRH0gaWYgISRSd1NlcnZpY2VzeyRTZXJ2aWNlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIHRoZSBwZXJtaXNzaW9uLgogICAgICAgICAgICBteSAlU2VydmljZXMgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkSUQgKTsKICAgICAgICAgICAgbXkgJFBlcm1pc3Npb24gPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3RQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbIGtleXMgJVNlcnZpY2VzIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIERlZmF1bHQgICAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKICAgICAgICAgICAgICAgIHVuZGVmICVTdGFuZGFyZFRlbXBsYXRlRGF0YTsKICAgICAgICAgICAgICAgIHVuZGVmICVNZW1iZXI7CiAgICAgICAgICAgICAgICAkU3RhbmRhcmRUZW1wbGF0ZVR5cGUgPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9DaGFuZ2UoCiAgICAgICAgICAgIFNlbGVjdGVkID0+IFwlTWVtYmVyLAogICAgICAgICAgICBEYXRhICAgICA9PiBcJVNlcnZpY2VEYXRhLAogICAgICAgICAgICBJRCAgICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZURhdGF7SUR9LAogICAgICAgICAgICBOYW1lICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZVR5cGUgLiAnIC0gJyAuICRTdGFuZGFyZFRlbXBsYXRlRGF0YXtOYW1lfSwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ1RlbXBsYXRlJywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZXMgPC0+IFNlcnZpY2UgbjoxCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZScgKSB7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgIG15ICRJRCAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKICAgICAgICBteSAlU2VydmljZURhdGEgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZXMKICAgICAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+X0N1c3RvbWVyU3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIFR5cGUgID0+IFsgIkN1c3RvbWVyQ3JlYXRlIiwgIkN1c3RvbWVyQW5zd2VyIiBdLAogICAgICAgICk7CgogICAgICAgIGlmICglU3RhbmRhcmRUZW1wbGF0ZURhdGEpIHsKICAgICAgICAgICAgZm9yIG15ICRTdGFuZGFyZFRlbXBsYXRlSUQgKCBzb3J0IGtleXMgJVN0YW5kYXJkVGVtcGxhdGVEYXRhICkgewogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+U3RhbmRhcmRUZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkU3RhbmRhcmRUZW1wbGF0ZUlECiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0YW5kYXJkVGVtcGxhdGVEYXRheyRTdGFuZGFyZFRlbXBsYXRlSUR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRGF0YXtUZW1wbGF0ZVR5cGV9ICkKICAgICAgICAgICAgICAgICAgICAuICcgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkRGF0YXtOYW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXNzaWduZWQgdGVtcGxhdGVzCiAgICAgICAgbXkgJU1lbWJlciA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkSUQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewoKICAgICAgICAgICAgIyBGaWx0ZXIgb3V0IHRlbXBsYXRlcyB3aXRob3V0IHBlcm1pc3Npb24uCiAgICAgICAgICAgIGZvciBteSAkU3RhbmRhcmRUZW1wbGF0ZUlEICgga2V5cyAlU3RhbmRhcmRUZW1wbGF0ZURhdGEgKSB7CiAgICAgICAgICAgICAgICBteSAlU2VydmljZXMgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkU3RhbmRhcmRUZW1wbGF0ZUlEICk7CiAgICAgICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbIGtleXMgJVNlcnZpY2VzIF0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgICA9PiAncncnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJFN0YW5kYXJkVGVtcGxhdGVEYXRheyRTdGFuZGFyZFRlbXBsYXRlSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIHRoZSBwZXJtaXNzaW9uLgogICAgICAgICAgICBteSAlUndTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5HZXRBbGxTZXJ2aWNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSd1NlcnZpY2VzeyRJRH0gKSB7CiAgICAgICAgICAgICAgICB1bmRlZiAlU2VydmljZURhdGE7CiAgICAgICAgICAgICAgICB1bmRlZiAlTWVtYmVyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0NoYW5nZSgKICAgICAgICAgICAgU2VsZWN0ZWQgPT4gXCVNZW1iZXIsCiAgICAgICAgICAgIERhdGEgICAgID0+IFwlU3RhbmRhcmRUZW1wbGF0ZURhdGEsCiAgICAgICAgICAgIElEICAgICAgID0+ICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBOYW1lICAgICA9PiAkU2VydmljZURhdGF7TmFtZX0sCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdTZXJ2aWNlJywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhZGQgdGVtcGxhdGVzIHRvIHNlcnZpY2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDaGFuZ2VTZXJ2aWNlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgbmV3IHRlbXBsYXRlcwogICAgICAgIG15IEBUZW1wbGF0ZXNTZWxlY3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJdGVtc1NlbGVjdGVkJyApOwogICAgICAgIG15IEBUZW1wbGF0ZXNBbGwgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJdGVtc0FsbCcgKTsKCiAgICAgICAgbXkgJFNlcnZpY2VJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKCiAgICAgICAgIyBjcmVhdGUgaGFzaCB3aXRoIHNlbGVjdGVkIHRlbXBsYXRlcwogICAgICAgIG15ICVUZW1wbGF0ZXNTZWxlY3RlZCA9IG1hcCB7ICRfID0+IDEgfSBAVGVtcGxhdGVzU2VsZWN0ZWQ7CgogICAgICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgIGZvciBteSAkU3RhbmRhcmRUZW1wbGF0ZUlEICgga2V5cyAlVGVtcGxhdGVzU2VsZWN0ZWQgKSB7CiAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkU3RhbmRhcmRUZW1wbGF0ZUlEOyAgICAjIENhbiBjb250YWluIGVtcHR5IHN0cmluZy4KCiAgICAgICAgICAgICAgICBteSAlU2VydmljZXMgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkU3RhbmRhcmRUZW1wbGF0ZUlEICk7CiAgICAgICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbIGtleXMgJVNlcnZpY2VzIF0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgICA9PiAncncnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgYWxsIHVzZWQgdGVtcGxhdGVzCiAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUlEIChAVGVtcGxhdGVzQWxsKSB7CiAgICAgICAgICAgIG15ICRBY3RpdmUgPSAkVGVtcGxhdGVzU2VsZWN0ZWR7JFRlbXBsYXRlSUR9ID8gMSA6IDA7CgogICAgICAgICAgICAjIHNldCBjdXN0b21lciB1c2VyIHNlcnZpY2UgbWVtYmVyCiAgICAgICAgICAgICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckFkZCgKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgQWN0aXZlICAgICAgICAgICAgID0+ICRBY3RpdmUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGUgdXNlciB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIHRlbXBsYXRlcyAtIHNlcnZpY2UgcmVsYXRpb24ganVzdCByZWRpcmVjdCB0byB0aGUgZWRpdCBzY3JlZW4KICAgICAgICAjIG90aGVyd2lzZSByZXR1cm4gdG8gcmVsYXRpb25zIG92ZXJ2aWV3CiAgICAgICAgaWYgKAogICAgICAgICAgICBkZWZpbmVkICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKQogICAgICAgICAgICAmJiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKSBlcSAnMScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249U2VydmljZTtJRD0kU2VydmljZUlEIgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkIHNlcnZpY2VzIHRvIHRlbXBsYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlVGVtcGxhdGUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCBuZXcgc2VydmljZXMKICAgICAgICBteSBAU2VydmljZXNTZWxlY3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJdGVtc1NlbGVjdGVkJyApOwogICAgICAgIG15IEBTZXJ2aWNlc0FsbCAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ0l0ZW1zQWxsJyApOwoKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKCiAgICAgICAgIyBjcmVhdGUgaGFzaCB3aXRoIHNlbGVjdGVkIHNlcnZpY2VzCiAgICAgICAgbXkgJVNlcnZpY2VzU2VsZWN0ZWQgPSBtYXAgeyAkXyA9PiAxIH0gQFNlcnZpY2VzU2VsZWN0ZWQ7CgogICAgICAgICMgYmFja2VuZCBjaGVjayB0byBwcmV2ZW50IHNhdmluZyB3aXRob3V0IHBlcm1pc3Npb24uCiAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICBteSAlUndTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5HZXRBbGxTZXJ2aWNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgIGZvciBteSAkU2VydmljZUlEICgga2V5cyAlU2VydmljZXNTZWxlY3RlZCApIHsKICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRTZXJ2aWNlSUQ7ICAgICMgQ2FuIGNvbnRhaW4gZW1wdHkgc3RyaW5nLgogICAgICAgICAgICAgICAgaWYgKCAhJFJ3U2VydmljZXN7JFNlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGFsbCB1c2VkIHNlcnZpY2VzCiAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKEBTZXJ2aWNlc0FsbCkgewogICAgICAgICAgICBteSAkQWN0aXZlID0gJFNlcnZpY2VzU2VsZWN0ZWR7JFNlcnZpY2VJRH0gPyAxIDogMDsKCiAgICAgICAgICAgICMgc2V0IGN1c3RvbWVyIHVzZXIgc2VydmljZSBtZW1iZXIKICAgICAgICAgICAgJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyQWRkKAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICBBY3RpdmUgICAgICAgICAgICAgPT4gJEFjdGl2ZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoZSB1c2VyIHdvdWxkIGxpa2UgdG8gY29udGludWUgZWRpdGluZyB0aGUgc2VydmljZSAtIHRlbXBsYXRlcyByZWxhdGlvbiBqdXN0IHJlZGlyZWN0IHRvIHRoZSBlZGl0IHNjcmVlbgogICAgICAgICMgb3RoZXJ3aXNlIHJldHVybiB0byByZWxhdGlvbnMgb3ZlcnZpZXcKICAgICAgICBpZiAoCiAgICAgICAgICAgIGRlZmluZWQgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbnRpbnVlQWZ0ZXJTYXZlJyApCiAgICAgICAgICAgICYmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbnRpbnVlQWZ0ZXJTYXZlJyApIGVxICcxJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1UZW1wbGF0ZTtJRD0kVGVtcGxhdGVJRCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IgogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPl9PdmVydmlldygpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0NoYW5nZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICAgPSAleyAkUGFyYW17RGF0YX0gfTsKICAgIG15ICRUeXBlICAgPSAkUGFyYW17VHlwZX0gfHwgJ1RlbXBsYXRlJzsKICAgIG15ICROZVR5cGUgPSAkVHlwZSBlcSAnU2VydmljZScgPyAnVGVtcGxhdGUnIDogJ1NlcnZpY2UnOwoKICAgIG15ICVWaXNpYmxlVHlwZSA9ICgKICAgICAgICBUZW1wbGF0ZSA9PiAnVGVtcGxhdGUnLAogICAgICAgIFNlcnZpY2UgID0+ICdTZXJ2aWNlJywKICAgICk7CgogICAgbXkgJE15VHlwZSAgICAgICA9ICRWaXNpYmxlVHlwZXskVHlwZX07CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIG15ICRCcmVhZGNydW1iVGl0bGUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NoYW5nZSBTZXJ2aWNlIFJlbGF0aW9ucyBmb3IgVGVtcGxhdGUnKTsKCiAgICBpZiAoICRWaXNpYmxlVHlwZXskVHlwZX0gZXEgJ1NlcnZpY2UnICkgewogICAgICAgICRCcmVhZGNydW1iVGl0bGUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NoYW5nZSBUZW1wbGF0ZSBSZWxhdGlvbnMgZm9yIFNlcnZpY2UnKTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIEJyZWFkY3J1bWJUaXRsZSA9PiAkQnJlYWRjcnVtYlRpdGxlLAogICAgICAgIH0sCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRmlsdGVyJyApOwoKICAgICNmaXhlZCBsaW5rCiAgICBteSAkU2VydmljZVRhZzsKCiAgICAkU2VydmljZVRhZyA9ICRUeXBlIGVxICdTZXJ2aWNlJyA/ICdTZXJ2aWNlJyA6ICcnOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NoYW5nZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uSG9tZSAgICAgID0+ICdBZG1pbicgLiAkVHlwZSwKICAgICAgICAgICAgTmVUeXBlICAgICAgICAgID0+ICROZVR5cGUsCiAgICAgICAgICAgIFZpc2libGVUeXBlICAgICA9PiAkVmlzaWJsZVR5cGV7JFR5cGV9LAogICAgICAgICAgICBWaXNpYmxlTmVUeXBlICAgPT4gJFZpc2libGVUeXBleyROZVR5cGV9LAogICAgICAgICAgICBTZXJ2aWNlICAgICAgICAgPT4gJFNlcnZpY2VUYWcsCiAgICAgICAgICAgIEJyZWFkY3J1bWJUaXRsZSA9PiAkQnJlYWRjcnVtYlRpdGxlLAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgdGhlcmUgYXJlIHNlcnZpY2UvdGVtcGxhdGUKICAgIGlmICggISVEYXRhICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZ0xpc3QnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbFNwYW4gPT4gMiwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NoYW5nZUhlYWRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgTmVUeXBlICAgICAgICA9PiAkTmVUeXBlLAogICAgICAgICAgICBWaXNpYmxlVHlwZSAgID0+ICRWaXNpYmxlVHlwZXskVHlwZX0sCiAgICAgICAgICAgIFZpc2libGVOZVR5cGUgPT4gJFZpc2libGVUeXBleyROZVR5cGV9LAogICAgICAgIH0sCiAgICApOwoKICAgIGZvciBteSAkSUQgKCBzb3J0IHsgdWMoICREYXRheyRhfSApIGNtcCB1YyggJERhdGF7JGJ9ICkgfSBrZXlzICVEYXRhICkgewoKICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICBteSAkU2VsZWN0ZWQgPSAkUGFyYW17U2VsZWN0ZWR9LT57JElEfSA/ICcgY2hlY2tlZCAnIDogJyc7CgogICAgICAgICRTZXJ2aWNlVGFnID0gJFR5cGUgbmUgJ1NlcnZpY2UnID8gJ1NlcnZpY2UnIDogJyc7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57JElEfSwKICAgICAgICAgICAgICAgIE5lVHlwZSAgICAgICAgPT4gJE5lVHlwZSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICBJRCAgICAgICAgICAgID0+ICRJRCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkICAgICAgPT4gJFNlbGVjdGVkLAogICAgICAgICAgICAgICAgVmlzaWJsZVR5cGUgICA9PiAkVmlzaWJsZVR5cGV7JFR5cGV9LAogICAgICAgICAgICAgICAgVmlzaWJsZU5lVHlwZSA9PiAkVmlzaWJsZVR5cGV7JE5lVHlwZX0sCiAgICAgICAgICAgICAgICBTZXJ2aWNlICAgICAgID0+ICRTZXJ2aWNlVGFnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU2VydmljZVRlbXBsYXRlcycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgVmlzaWJsZVR5cGUgID0+ICRNeVR5cGUsCiAgICApOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4ge30sCiAgICApOwoKICAgICMgbm8gYWN0aW9ucyBpbiBhY3Rpb24gbGlzdAogICAgIyAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayhOYW1lPT4nQWN0aW9uTGlzdCcpOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0ZpbHRlclRlbXBsYXRlJyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0ZpbHRlclNlcnZpY2UnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnICk7CgogICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZScpOwoKICAgICMgZ2V0IHN0ZCB0ZW1wbGF0ZSBsaXN0CiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+X0N1c3RvbWVyU3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICBUeXBlICA9PiBbICJDdXN0b21lckNyZWF0ZSIsICJDdXN0b21lckFuc3dlciIgXSwKCiAgICApOwoKICAgICMgaWYgdGhlcmUgYXJlIHJlc3VsdHMgdG8gc2hvdwogICAgaWYgKCVTdGFuZGFyZFRlbXBsYXRlRGF0YSkgewogICAgICAgIGZvciBteSAkU3RhbmRhcmRUZW1wbGF0ZUlEICggc29ydCBrZXlzICVTdGFuZGFyZFRlbXBsYXRlRGF0YSApIHsKICAgICAgICAgICAgbXkgJURhdGEgPSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+U3RhbmRhcmRUZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRTdGFuZGFyZFRlbXBsYXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTdGFuZGFyZFRlbXBsYXRlRGF0YXskU3RhbmRhcmRUZW1wbGF0ZUlEfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJERhdGF7VGVtcGxhdGVUeXBlfSApCiAgICAgICAgICAgICAgICAuICcgLSAnCiAgICAgICAgICAgICAgICAuICREYXRhe05hbWV9OwogICAgICAgIH0KICAgICAgICBJRDoKICAgICAgICBmb3IgbXkgJFN0YW5kYXJkVGVtcGxhdGVJRCAoCiAgICAgICAgICAgIHNvcnQgeyB1YyggJFN0YW5kYXJkVGVtcGxhdGVEYXRheyRhfSApIGNtcCB1YyggJFN0YW5kYXJkVGVtcGxhdGVEYXRheyRifSApIH0KICAgICAgICAgICAga2V5cyAlU3RhbmRhcmRUZW1wbGF0ZURhdGEKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICAgICAgbXkgJVNlcnZpY2VzICAgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KCBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJFN0YW5kYXJkVGVtcGxhdGVJRCApOwogICAgICAgICAgICAgICAgbXkgJFBlcm1pc3Npb24gPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3RQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gWyBrZXlzICVTZXJ2aWNlcyBdLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgICAgPT4gJ3J3JywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uIG5lICdydycgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlzdDFuJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZURhdGF7JFN0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgID0+ICRTdGFuZGFyZFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vVGVtcGxhdGVzRm91bmRNc2cnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICBteSAlU2VydmljZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlTGlzdCgKICAgICAgICBWYWxpZCAgPT4gMSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKCiAgICAgICAgIyBGaWx0ZXIgb3V0IHNlcnZpY2VzIHdpdGhvdXQgcGVybWlzc2lvbi4KICAgICAgICBteSAlUndTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5HZXRBbGxTZXJ2aWNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlRGF0YSApIHsKICAgICAgICAgICAgZGVsZXRlICRTZXJ2aWNlRGF0YXskU2VydmljZUlEfSBpZiAhJFJ3U2VydmljZXN7JFNlcnZpY2VJRH07CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlcmUgYXJlIHJlc3VsdHMgdG8gc2hvdwogICAgaWYgKCVTZXJ2aWNlRGF0YSkgewogICAgICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCB7IHVjKCAkU2VydmljZURhdGF7JGF9ICkgY21wIHVjKCAkU2VydmljZURhdGF7JGJ9ICkgfSBrZXlzICVTZXJ2aWNlRGF0YSApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpc3RuMScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VEYXRheyRTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vU2VydmljZXNGb3VuZE1zZycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblNlcnZpY2VUZW1wbGF0ZXMnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKc3ViIF9DdXN0b21lclN0YW5kYXJkVGVtcGxhdGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRlbXBsYXRlVHlwZXMgPSAiJyIgLiAoIGpvaW4gJywnLCBAeyAkUGFyYW17VHlwZX0gfSApIC4gIiciOwogICAgJFRlbXBsYXRlVHlwZXMgPX4gcy8sLycsJy9nOwoKICAgIG15ICRWYWxpZCA9IDE7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1ZhbGlkfSAmJiAkUGFyYW17VmFsaWR9IGVxICcwJyApIHsKICAgICAgICAkVmFsaWQgPSAwOwogICAgfQoKICAgIG15ICRTUUwgPSAnCiAgICAgICAgU0VMRUNUIGlkLCBuYW1lCiAgICAgICAgRlJPTSBzdGFuZGFyZF90ZW1wbGF0ZSc7CgogICAgaWYgKCRWYWxpZCkgewogICAgICAgICRTUUwgLj0gJyBXSEVSRSB2YWxpZF9pZCBJTiAoJyAuIGpvaW4gJywgJywKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCkgLiAnKSc7CiAgICB9CgogICAgbXkgQEJpbmQ7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1R5cGV9ICYmICRQYXJhbXtUeXBlfSBuZSAnJyApIHsKICAgICAgICBpZiAoJFZhbGlkKSB7CiAgICAgICAgICAgICRTUUwgLj0gJyBBTkQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNRTCAuPSAnIFdIRVJFJzsKICAgICAgICB9CiAgICAgICAgJFNRTCAuPSAiIHRlbXBsYXRlX3R5cGUgSU4gKCRUZW1wbGF0ZVR5cGVzKSI7CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/CustomerTicketMessage.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBlNDIzZWUzZjRmMGZhZjc5OTVkYjI3MDE4NTY3NzQ2MDU0ZGE5N2U1IC0gS2VybmVsL01vZHVsZXMvQ3VzdG9tZXJUaWNrZXRNZXNzYWdlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldE1lc3NhZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgIG15ICREZWZpbml0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6TWFzaycpLT5EZWZpbml0aW9uR2V0KAogICAgICAgIE1hc2sgPT4gJFNlbGYtPntBY3Rpb259LAogICAgKSB8fCB7fTsKCiAgICAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSA9ICREZWZpbml0aW9uLT57TWFza307CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gICA9IHt9OwoKICAgICMgYWxpZ24gc3lzY29uZmlnIGFuZCB0aWNrZXQgbWFzayBkYXRhIEkKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHsgJER5bmFtaWNGaWVsZExpc3QgLy8gW10gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZCk7CgogICAgICAgIG15ICRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUnLAogICAgICAgICk7CgogICAgICAgICMgcmVkdWNlIHRoZSBkeW5hbWljIGZpZWxkcyB0byBvbmx5IHRoZSBvbmVzIHRoYXQgYXJlIGRlc2lnbmVkIGZvciBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICBpZiAoIGV4aXN0cyAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgbXkgJFBhcmFtZXRlcnMgPSBkZWxldGUgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gLy8ge307CgogICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIGtleXMgJFBhcmFtZXRlcnMtPiUqICkgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZC0+eyRBdHRyaWJ1dGV9ID0gJFBhcmFtZXRlcnMtPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCAkU2VsZi0+e01hc2tEZWZpbml0aW9ufS0+QCosIHsKICAgICAgICAgICAgICAgIERGICAgICAgICA9PiAkRHluYW1pY0ZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgPyAxIDogMCwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57TWFuZGF0b3J5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgICMgYWxpZ24gc3lzY29uZmlnIGFuZCB0aWNrZXQgbWFzayBkYXRhIElJCiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCBrZXlzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc30tPiUqICkgewogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXskRHluYW1pY0ZpZWxkTmFtZX0gPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFBhcmFtZXRlcnMgPSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyREeW5hbWljRmllbGROYW1lfSAvLyB7fTsKCiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICRQYXJhbWV0ZXJzLT4lKiApIHsKICAgICAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfXskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5QcmVwYXJlRm9ybUlEKAogICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKSwKICAgICk7CgogICAgIyBtZXRob2RzIHdoaWNoIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICRTZWxmLT57RmllbGRNZXRob2RzfSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ0Rlc3QnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFRvcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRQcmlvcml0aWVzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0U2VydmljZXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnU0xBSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFNMQXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnVHlwZUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRUeXBlcwogICAgICAgIH0sCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0U3RhbmRhcmRUZW1wbGF0ZXMKICAgICAgICB9LAojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgIF07CgogICAgIyBkZXBlbmRlbmNpZXMgb2Ygc3RhbmRhcmQgZmllbGRzIHdoaWNoIGFyZSBub3QgZGVmaW5lZCB2aWEgQUNMcwogICAgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9ID0gewogICAgICAgIFNlcnZpY2VJRCA9PiB7CiAgICAgICAgICAgIFNMQUlEID0+IDEsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IDEsCiAgICAgICAgfSwKICAgICAgICBEZXN0ID0+IHsKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IDEsCiAgICAgICAgfSwKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQojICAgIGZvciBteSAkS2V5IChxdyggU3ViamVjdCBCb2R5IFByaW9yaXR5SUQgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBEZXN0IEZyb21DaGF0SUQpKSB7CgogICAgZm9yIG15ICRLZXkgKHF3KCBTdWJqZWN0IEJvZHkgUHJpb3JpdHlJRCBUeXBlSUQgU2VydmljZUlEIFNMQUlEIERlc3QgRnJvbUNoYXRJRCBTdGFuZGFyZFRlbXBsYXRlSUQpKSB7CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZnJvbSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQmFja2VuZE9iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpGaWVsZFJlc3RyaWN0aW9ucycpOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZCB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkUXVldWVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoYXRFbmdpbmU6OkFjdGl2ZScpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDaGF0IGlzIG5vdCBhY3RpdmUuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGNoYXQgcGFydGljaXBhbnQKICAgICAgICBteSAlQ2hhdFBhcnRpY2lwYW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXQnKS0+Q2hhdFBhcnRpY2lwYW50Q2hlY2soCiAgICAgICAgICAgIENoYXRJRCAgICAgID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgQ2hhdHRlclR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgQ2hhdHRlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISVDaGF0UGFydGljaXBhbnQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24uJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKCiAgICAgICAgIyBHZXQgZGVmYXVsdCBRdWV1ZSBJRCBpZiBub25lIGlzIHNldAogICAgICAgIG15ICRRdWV1ZURlZmF1bHRJRDsKICAgICAgICBpZiAoICEkR2V0UGFyYW17RGVzdH0gKSB7CiAgICAgICAgICAgIG15ICRRdWV1ZURlZmF1bHQgPSAkQ29uZmlnLT57J1F1ZXVlRGVmYXVsdCd9IHx8ICcnOwogICAgICAgICAgICBpZiAoJFF1ZXVlRGVmYXVsdCkgewogICAgICAgICAgICAgICAgJFF1ZXVlRGVmYXVsdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFF1ZXVlRGVmYXVsdCApOwogICAgICAgICAgICAgICAgaWYgKCRRdWV1ZURlZmF1bHRJRCkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEZXN0fSA9ICRRdWV1ZURlZmF1bHRJRCAuICd8fCcgLiAkUXVldWVEZWZhdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlRGVmYXVsdElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdhcm4gaWYgdGhlcmUgaXMgbm8gKHZhbGlkKSBkZWZhdWx0IHF1ZXVlIGFuZCB0aGUgY3VzdG9tZXIgY2FuJ3Qgc2VsZWN0IG9uZQogICAgICAgICAgICBlbHNpZiAoICEkQ29uZmlnLT57J1F1ZXVlJ30gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDaGVjayBTeXNDb25maWcgc2V0dGluZyBmb3IgJXM6OlF1ZXVlRGVmYXVsdC4nLCAkU2VsZi0+e0FjdGlvbn0gKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEdldFBhcmFte0Rlc3R9ICkgewogICAgICAgICAgICBteSAoICRRdWV1ZUlEUGFyYW0sICRRdWV1ZVBhcmFtICkgPSBzcGxpdCggL1x8XHwvLCAkR2V0UGFyYW17RGVzdH0gKTsKICAgICAgICAgICAgbXkgJFF1ZXVlSURMb29rdXAgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUXVldWVQYXJhbSApOwogICAgICAgICAgICBpZiAoICRRdWV1ZUlETG9va3VwICYmICRRdWV1ZUlETG9va3VwIGVxICRRdWV1ZUlEUGFyYW0gKSB7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbicpOwogICAgICAgICAgICAgICAgaWYgKCAleyAkQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbiAvLyB7fSB9ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEZXN0fSA9ICRRdWV1ZUlEUGFyYW0gLiAnfHwnIC4gJEN1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb24tPnskUXVldWVQYXJhbX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVJRExvb2t1cDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICMgaWYgdGVtcGxhdGVzIHNob3VsZCBiZSBhdXRvc2VsZWN0ZWQsIGF1dG9tYXRpY2FsbHkgaGlkZSB0aGVtCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVGVtcGxhdGU6OkF1dG9zZWxlY3QnKSApIHsKICAgICAgICAgICAgJEF1dG9zZWxlY3QtPntTdGFuZGFyZFRlbXBsYXRlSUR9ID0gMjsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAjIGdhdGhlciBmaWVsZHMgd2hpY2ggYXJlIHN1cHBvc2VkIHRvIGJlIGhpZGRlbiB3aGVuIGF1dG9zZWxlY3RlZAogICAgICAgIG15ICRIaWRlQXV0b3NlbGVjdGVkSlNPTjsKICAgICAgICBpZiAoJEF1dG9zZWxlY3QpIHsKICAgICAgICAgICAgbXkgQEhpZGVBdXRvc2VsZWN0ZWQgPSBncmVwIHsgIXJlZiggJEF1dG9zZWxlY3QtPnskX30gKSAmJiAkQXV0b3NlbGVjdC0+eyRffSA9PSAyIH0ga2V5cyAleyRBdXRvc2VsZWN0fTsKICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBIaWRlQXV0b3NlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIG1hcCB7ICJEeW5hbWljRmllbGRfIiAuICRfIH0KICAgICAgICAgICAgICAgICAgICAoIGdyZXAgeyAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH17JF99ID09IDIgfSBrZXlzICV7ICRBdXRvc2VsZWN0LT57RHluYW1pY0ZpZWxkfSB9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChASGlkZUF1dG9zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgICAgICAgICAgICAgJEhpZGVBdXRvc2VsZWN0ZWRKU09OID0gJEpTT05PYmplY3QtPkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxASGlkZUF1dG9zZWxlY3RlZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdHJhY2sgY2hhbmdpbmcgc3RhbmRhcmQgZmllbGRzCiAgICAgICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBQ0xQcmVzZWxlY3Rpb24nKSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNhY2hlZCBwcmVzZWxlY3Rpb24gcnVsZXMKICAgICAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldEFDTCcsCiAgICAgICAgICAgICAgICBLZXkgID0+ICdQcmVzZWxlY3Rpb24nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+U2V0QUNMUHJlc2VsZWN0aW9uQ2FjaGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUNvbnZlcmdlbmNlID0gKAogICAgICAgICAgICBTdGRGaWVsZHMgPT4gMCwKICAgICAgICAgICAgRmllbGRzICAgID0+IDAsCiAgICAgICAgKTsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0OwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzOwoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICAgICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICgKICAgICAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICBteSAkSW5pdGlhbFJ1biA9IDE7CgogICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle0ZpZWxkc30gKSB7CgogICAgICAgICAgICAjIGRldGVybWluZSBzdGFuZGFyZCBmaWVsZCBpbnB1dAogICAgICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ICkgewoKICAgICAgICAgICAgICAgIG15ICVOZXdDaGFuZ2VkRWxlbWVudHM7CgogICAgICAgICAgICAgICAgIyB3aGljaCBzdGFuZGFyZCBmaWVsZHMgdG8gY2hlY2sgLSBGaWVsZElEID0+IEdldFBhcmFtVmFsdWUgKG5lY2Vzc2FyeSBmb3IgRGVzdCkKICAgICAgICAgICAgICAgIG15ICVDaGVjayA9ICgKICAgICAgICAgICAgICAgICAgICBEZXN0ICAgICAgID0+ICdRdWV1ZUlEJywKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eUlEID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICAgID0+ICdUeXBlSUQnLAojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRBQ0xQcmVzZWxlY3Rpb24gJiYgISRJbml0aWFsUnVuICkgewogICAgICAgICAgICAgICAgICAgIEZJRUxEOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGRJRCAoIHNvcnQga2V5cyAlQ2hlY2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRGaWVsZElEIG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyRGaWVsZElEfSAmJiAkQ2hhbmdlZEVsZW1lbnRzeyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICggc29ydCBrZXlzICVDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbi0+e1J1bGVzfXtUaWNrZXR9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX17JEVsZW1lbnR9eyRGaWVsZElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEVsZW1lbnR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEVsZW1lbnQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB1bmFmZmVjdGVkIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJENoZWNreyRGaWVsZElEfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmb3IgZWFjaCBzdGFuZGFyZCBmaWVsZCB3aGljaCBoYXMgdG8gYmUgY2hlY2tlZCwgcnVuIHRoZSBkZWZpbmVkIG1ldGhvZAogICAgICAgICAgICAgICAgTUVUSE9EOgogICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRTZWxmLT57RmllbGRNZXRob2RzfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgTUVUSE9EIGlmICEkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH07CgogICAgICAgICAgICAgICAgICAgICMgdXNlICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSBmb3IgRGVzdD0+UXVldWVJRAogICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3sgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IH0gPSAkRmllbGQtPntNZXRob2R9LT4oCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJEdldFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7U2VydmljZUlEfSB8fCB1bmRlZiwgICAgIyBuZWVkZWQgZm9yIFNMQUlECiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIHN0dWZmIGZvciBRdWV1ZUlEL0Rlc3Q6IERlc3QgaXMgIlF1ZXVlSUR8fFF1ZXVlTmFtZSIgPT4gIlF1ZXVlTmFtZSI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRmllbGQtPntGaWVsZElEfSBlcSAnRGVzdCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRPczoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICV7ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBUT3MgaWYgKCAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9IGVxICctJyApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyIkUXVldWVJRHx8JFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyAkUXVldWVJRCB9In0gPSAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGN1cnJlbnQgc2VsZWN0aW9uIG9mIFF1ZXVlSUQgKERlc3Qgd2lsbCBiZSBkb25lIHRvZ2V0aGVyIHdpdGggdGhlIG90aGVyIGZpZWxkcykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UXVldWVJRH0gJiYgISRTdGRGaWVsZFZhbHVlc3tEZXN0fXsgJEdldFBhcmFte0Rlc3R9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+e0Rlc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgd2hldGhlciBjdXJyZW50IHNlbGVjdGVkIHZhbHVlIGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9eyAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5vdCBlbXB0eSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICAgICAgICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9LAogICAgICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAhJU5ld0NoYW5nZWRFbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gJU5ld0NoYW5nZWRFbGVtZW50czsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICgKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCwKICAgICAgICAgICAgICAgICAgICAlTmV3Q2hhbmdlZEVsZW1lbnRzLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRMb29wUHJvdGVjdGlvbi0tIDwgMSApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJhbiBpbnRvIHVucmVzb2x2YWJsZSBsb29wISIsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBpcyByZXR1cm5pbmcgYW4gZW1wdHkgbGlzdCByZWFzb25hYmxlPwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgICAgICAgID0gJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQ7CiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKCk7CgogICAgICAgICAgICAjIGNoZWNrIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICVDdXJGaWVsZFN0YXRlczsKICAgICAgICAgICAgaWYgKCAlQ2hhbmdlZEVsZW1lbnRzIHx8ICRJbml0aWFsUnVuICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY29tYmluZSBGaWVsZFN0YXRlcwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIyBzdG9yZSBuZXcgdmFsdWVzCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIGR5bmFtaWMgZmllbGRzIGNoYW5nZWQsIGNoZWNrIHN0YW5kYXJkIGZpZWxkcyBhZ2FpbgogICAgICAgICAgICBpZiAoICVDdXJGaWVsZFN0YXRlcyAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gKSApIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMDsKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSBtYXAgeyAkXyA9PiAxIH0ga2V5cyAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle0ZpZWxkc30gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkSW5pdGlhbFJ1biA9IDA7CiAgICAgICAgfQoKICAgICAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMgPSBtYXAgewogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkXyA9PiBkZWZpbmVkICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRffQogICAgICAgICAgICAgICAgPyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskX317UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICA6IHVuZGVmCiAgICAgICAgfSAoIGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApOwoKICAgICAgICBteSAkQUNMUmVzdWx0U3RkID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnRm9ybVN0ZCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICctJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiAnQXJ0aWNsZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVZpc2liaWxpdHlTdGQ7CgogICAgICAgIGlmICgkQUNMUmVzdWx0U3RkKSB7CiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVBY2xEYXRhICkgewogICAgICAgICAgICAgICAgJFZpc2liaWxpdHlTdGR7JEZpZWxkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkVmlzaWJpbGl0eVN0ZHtBcnRpY2xlfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tOZXcoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgVG9TZWxlY3RlZCAgICAgICA9PiAkR2V0UGFyYW17RGVzdH0sCiAgICAgICAgICAgIEZyb21DaGF0SUQgICAgICAgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9IHx8ICcnLAogICAgICAgICAgICBIaWRlQXV0b3NlbGVjdGVkID0+ICRIaWRlQXV0b3NlbGVjdGVkSlNPTiwKICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICA9PiAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0sCiAgICAgICAgICAgIFZpc2liaWxpdHlTdGQgICAgPT4gXCVWaXNpYmlsaXR5U3RkLAogICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzID0+IFwlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZU5ldycgKSB7CgogICAgICAgIG15ICRBcnRpY2xlT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdJbnRlcm5hbCcgKTsKCiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkQ29uZmlnLT57TmV4dFNjcmVlbkFmdGVyTmV3VGlja2V0fTsKICAgICAgICBteSAlRXJyb3I7CgogICAgICAgICMgZ2V0IGRlc3RpbmF0aW9uIHF1ZXVlCiAgICAgICAgbXkgJERlc3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICBteSAoICROZXdRdWV1ZUlELCAkVG8gKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgaWYgKCAhJFRvICkgewogICAgICAgICAgICAkTmV3UXVldWVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdRdWV1ZUlEJyApIHx8ICcnOwogICAgICAgICAgICAkVG8gICAgICAgICA9ICdTeXN0ZW0nOwogICAgICAgIH0KCiAgICAgICAgIyBmYWxsYmFjaywgaWYgbm8gZGVzdGluYXRpb24gaXMgZ2l2ZW4KICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgbXkgJFF1ZXVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1F1ZXVlJyApCiAgICAgICAgICAgICAgICB8fCAkQ29uZmlnLT57J1F1ZXVlRGVmYXVsdCd9CiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgaWYgKCRRdWV1ZSkgewogICAgICAgICAgICAgICAgbXkgJFF1ZXVlSUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUXVldWUgKTsKICAgICAgICAgICAgICAgICROZXdRdWV1ZUlEID0gJFF1ZXVlSUQ7CiAgICAgICAgICAgICAgICAkVG8gICAgICAgICA9ICRRdWV1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte05ld1F1ZXVlSUR9ID0gJE5ld1F1ZXVlSUQ7CgogICAgICAgICMgdXNlIGRlZmF1bHQgaWYgdGlja2V0IHR5cGUgaXMgbm90IGF2YWlsYWJsZSBpbiBzY3JlZW4gYnV0IGFjdGl2YXRlZCBvbiBzeXN0ZW0KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgJiYgISRDb25maWctPnsnVGlja2V0VHlwZSd9ICkgewogICAgICAgICAgICBteSAlVHlwZUxpc3QgPSByZXZlcnNlICRUaWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkR2V0UGFyYW17VHlwZUlEfSA9ICRUeXBlTGlzdHsgJENvbmZpZy0+eydUaWNrZXRUeXBlRGVmYXVsdCd9IH07CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ2hlY2sgU3lzQ29uZmlnIHNldHRpbmcgZm9yICVzOjpUaWNrZXRUeXBlRGVmYXVsdC4nLCAkU2VsZi0+e0FjdGlvbn0gKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBza2lwIHZhbGlkYXRpb24gb2YgaGlkZGVuIGZpZWxkcwogICAgICAgIG15ICVWaXNpYmlsaXR5OwoKICAgICAgICAjIHRyYW5zZm9ybSBkeW5hbWljIGZpZWxkIGRhdGEgaW50byBERk5hbWUgPT4gREZOYW1lIHBhaXIKICAgICAgICBteSAlRHluYW1pY0ZpZWxkQWNsID0gbWFwIHsgJF8gPT4gJF8gfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CgogICAgICAgICMgY2FsbCB0aWNrZXQgQUNMcyBmb3IgRHluYW1pY0ZpZWxkcyB0byBjaGVjayBmaWVsZCB2aXNpYmlsaXR5CiAgICAgICAgbXkgJEFDTFJlc3VsdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdGb3JtJywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJy0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZEFjbCwKICAgICAgICApOwogICAgICAgIGlmICgkQUNMUmVzdWx0KSB7CiAgICAgICAgICAgICVWaXNpYmlsaXR5ID0gbWFwIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8gPT4gMCB9IGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKjsKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBzb3J0IGtleXMgJUFjbERhdGEgKSB7CiAgICAgICAgICAgICAgICAkVmlzaWJpbGl0eXsgJ0R5bmFtaWNGaWVsZF8nIC4gJEZpZWxkIH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfID0+IDEgfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CiAgICAgICAgfQoKICAgICAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGQgdmFsaWRhdGlvbiByZXN1bHRzIGlmIGVycm9uZW91cwogICAgICAgIG15ICVEeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0OwogICAgICAgIG15ICVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgb24gaW5zaXNpYmxlIGZpZWxkcwogICAgICAgICAgICBpZiAoICRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKCiAgICAgICAgICAgICAgICAgICAgIyBNYW5kYXRvcnkgaXMgYWRkZWQgdG8gdGhlIGNvbmZpZ3MgYnkgJFNlbGYtPm5ldwogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TWFuZGF0b3J5fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHR7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmV3cmFwIGJvZHkgaWYgbm8gcmljaCB0ZXh0IGlzIHVzZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSAmJiAhJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPldyYXBQbGFpblRleHQoCiAgICAgICAgICAgICAgICBNYXhDaGFyYWN0ZXJzID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJyksCiAgICAgICAgICAgICAgICBQbGFpblRleHQgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlcmUgaXMgRnJvbUNoYXRJRCwgZ2V0IHJlbGF0ZWQgbWVzc2FnZXMgYW5kIHByZXBlbmQgdGhlbSB0byBib2R5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgICAgIG15IEBDaGF0TWVzc2FnZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5DaGF0TWVzc2FnZUxpc3QoCiAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRNZXNzYWdlIChAQ2hhdE1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZS0+e01lc3NhZ2VUZXh0fSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgPT4gJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0sCiAgICAgICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcXVldWUKICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgJEVycm9ye1F1ZXVlSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBwcmV2ZW50IHRhbXBlciB3aXRoIChRdWV1ZS9EZXN0KSwgc2VlIGJ1ZyM5NDA4CiAgICAgICAgaWYgKCROZXdRdWV1ZUlEKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgb3JpZ2luYWwgbGlzdCBvZiBxdWV1ZXMgdG8gZGlzcGxheQogICAgICAgICAgICBteSAkVG9zID0gJFNlbGYtPl9HZXRUb3MoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBjdXJyZW50IHNlbGVjdGVkIFF1ZXVlSUQgZXhpc3RzIGluIHRoZSBsaXN0IG9mIHF1ZXVlcyxcCiAgICAgICAgICAgICMgb3RoZXJ3aXNlIHJpc2UgYW4gZXJyb3IKICAgICAgICAgICAgaWYgKCAhJFRvcy0+eyROZXdRdWV1ZUlEfSApIHsKCiAgICAgICAgICAgICAgICAjIENoZWNrIGlmIHF1ZXVlIGlzIGFjY2Vzc2libGUgYnkgY3VzdG9tZXIgdXNlciAoc2VlIGJ1ZyMxNDg4NikuCiAgICAgICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRNZXNzYWdlJyktPntRdWV1ZX0gPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7UXVldWVEaXNhYmxlZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9ye1F1ZXVlSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCB0aGUgY29ycmVjdCBxdWV1ZSBuYW1lIGluICRUbyBpZiBpdCB3YXMgYWx0ZXJlZAogICAgICAgICAgICBpZiAoICRUbyBuZSAkVG9zLT57JE5ld1F1ZXVlSUR9ICkgewogICAgICAgICAgICAgICAgJFRvID0gJFRvcy0+eyROZXdRdWV1ZUlEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEFDTFJlc3VsdFN0ZCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ0Zvcm1TdGQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnLScsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEFydGljbGUgPT4gJ0FydGljbGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIG15ICVWaXNpYmlsaXR5U3RkOwoKICAgICAgICBpZiAoJEFDTFJlc3VsdFN0ZCkgewogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlQWNsRGF0YSApIHsKICAgICAgICAgICAgICAgICRWaXNpYmlsaXR5U3RkeyRGaWVsZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFZpc2liaWxpdHlTdGR7QXJ0aWNsZX0gPSAxOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVmlzaWJpbGl0eVN0ZHtBcnRpY2xlfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7U3ViamVjdEludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcntCb2R5SW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzZXJ2aWNlCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRDb25maWctPntTZXJ2aWNlfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0KICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUlESW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNsYQogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U0xBfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3J7J1NMQUlESW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdHlwZQogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAhJEdldFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgICAgICRFcnJvcntUeXBlSURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigpOwoKICAgICAgICAgICAgaWYgKCAkRXJyb3J7UXVldWVEaXNhYmxlZH0gKSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+IFRyYW5zbGF0YWJsZSgiWW91IGRvbid0IGhhdmUgc3VmZmljaWVudCBwZXJtaXNzaW9ucyBmb3IgdGlja2V0IGNyZWF0aW9uIGluIGRlZmF1bHQgcXVldWUuIiksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza05ldygKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBUb1NlbGVjdGVkICAgICAgID0+ICREZXN0LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgIFZpc2liaWxpdHkgICAgICAgPT4gXCVWaXNpYmlsaXR5LAogICAgICAgICAgICAgICAgVmlzaWJpbGl0eVN0ZCAgICA9PiBcJVZpc2liaWxpdHlTdGQsCiAgICAgICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzID0+IFwlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBERkVycm9ycyAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjayggVHlwZSA9PiAnQ3VzdG9tZXInICk7CgogICAgICAgICMgaWYgY3VzdG9tZXIgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHByaW9yaXR5LCBzZXQgaXQgdG8gZGVmYXVsdAogICAgICAgIGlmICggISRDb25maWctPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHl9ICAgPSAkQ29uZmlnLT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIFByaW9yaXR5SUQgICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgIFByaW9yaXR5ICAgICA9PiAkR2V0UGFyYW17UHJpb3JpdHl9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSwKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRTZWxmLT57VXNlckN1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnVGlja2V0JzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWaXNpYmlsaXR5eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntSZWFkb25seX07CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIGFydGljbGUgaGFzIHRvIGJlIGNyZWF0ZWQgY2xlYW4gdXAgYW5kIHJldHVybgogICAgICAgIGlmICggISRWaXNpYmlsaXR5U3Rke0FydGljbGV9ICkgewoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIGZvcm0gZGF0YQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICAgICAjIGRlbGV0ZSBoaWRkZW4gZmllbGRzIGNhY2hlCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdIaWRkZW5GaWVsZHMnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRQbGFpbkJvZHkgPSAkR2V0UGFyYW17Qm9keX07CgogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRQbGFpbkJvZHkgPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dDJBc2NpaSggU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgYXJ0aWNsZQogICAgICAgIG15ICRGdWxsTmFtZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJOYW1lKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICk7CiAgICAgICAgbXkgJEZyb20gICAgICA9ICJcIiRGdWxsTmFtZVwiIDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICRDb25maWctPntTZW5kZXJUeXBlfSwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICRUbywKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICRDb25maWctPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICRDb25maWctPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCiAgICAgICAgICAgID8gJ2F1dG8gcmVwbHknCiAgICAgICAgICAgIDogJycsCiAgICAgICAgICAgIE9yaWdIZWFkZXIgPT4gewogICAgICAgICAgICAgICAgRnJvbSAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgIFRvICAgICAgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICRQbGFpbkJvZHksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFF1ZXVlID0+ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnQXJ0aWNsZSc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmlzaWJpbGl0eXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9OwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUGVybWlzc2lvbnMgY2hlY2sgd2VyZSBkb25lIGVhcmxpZXIKICAgICAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICAgICAgbXkgJENoYXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0Jyk7CiAgICAgICAgICAgIG15IEBDaGF0TWVzc2FnZUxpc3QgPSAkQ2hhdE9iamVjdC0+Q2hhdE1lc3NhZ2VMaXN0KAogICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJENoYXRBcnRpY2xlSUQ7CgogICAgICAgICAgICBpZiAoQENoYXRNZXNzYWdlTGlzdCkgewogICAgICAgICAgICAgICAgZm9yIG15ICRNZXNzYWdlIChAQ2hhdE1lc3NhZ2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICA9PiAkTWVzc2FnZS0+e01lc3NhZ2VUZXh0fSwKICAgICAgICAgICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRBcnRpY2xlQ2hhdEJhY2tlbmQgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdDaGF0JyApOwoKICAgICAgICAgICAgICAgICRDaGF0QXJ0aWNsZUlEID0gJEFydGljbGVDaGF0QmFja2VuZC0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICAgICAgICAgIENoYXRNZXNzYWdlTGlzdCAgICAgID0+IFxAQ2hhdE1lc3NhZ2VMaXN0LAogICAgICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJENvbmZpZy0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQ2hhdEFydGljbGVJRCkgewogICAgICAgICAgICAgICAgJENoYXRPYmplY3QtPkNoYXREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdHRlZCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgKTsKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnREYXRhLCBcJVVwbG9hZFN0dWZmOwogICAgICAgIH0KCiAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKCiAgICAgICAgICAgICMgc2tpcCwgZGVsZXRlZCBub3QgdXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgIG15ICRDb250ZW50SUQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICMgaWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5CiAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgd3JpdGUgZXhpc3RpbmcgZmlsZSB0byBiYWNrZW5kCiAgICAgICAgICAgICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0dGVkIGF0dGFjaG1lbnRzCiAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBkZWxldGUgaGlkZGVuIGZpZWxkcyBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJ0hpZGRlbkZpZWxkcycsCiAgICAgICAgICAgIEtleSAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICApOwogICAgfQoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgaWYgKCAkQ29uZmlnLT57J1F1ZXVlJ30gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICcnOwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtEZXN0fSA9fiAvXihcZHsxLDEwMH0pXHxcfC4rPyQvICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXNlIFF1ZXVlRGVmYXVsdCBhcyBmYWxsYmFjayBpZiBRdWV1ZSBzZWxlY3Rpb24gaXMgZGlzYWJsZWQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJFF1ZXVlRGVmYXVsdCA9ICRDb25maWctPnsnUXVldWVEZWZhdWx0J30gfHwgJyc7CiAgICAgICAgICAgIGlmICgkUXVldWVEZWZhdWx0KSB7CiAgICAgICAgICAgICAgICBteSAkUXVldWVEZWZhdWx0SUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUXVldWVEZWZhdWx0ICk7CiAgICAgICAgICAgICAgICBpZiAoJFF1ZXVlRGVmYXVsdElEKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Rlc3R9ID0gJFF1ZXVlRGVmYXVsdElEIC4gJ3x8JyAuICRRdWV1ZURlZmF1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVEZWZhdWx0SUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRDdXN0b21lclVzZXIgICA9ICRTZWxmLT57VXNlcklEfTsKICAgICAgICBteSAkRWxlbWVudENoYW5nZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICMgaWYgdGVtcGxhdGVzIHNob3VsZCBiZSBhdXRvc2VsZWN0ZWQsIGF1dG9tYXRpY2FsbHkgaGlkZSB0aGVtCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVGVtcGxhdGU6OkF1dG9zZWxlY3QnKSApIHsKICAgICAgICAgICAgJEF1dG9zZWxlY3QtPntTdGFuZGFyZFRlbXBsYXRlSUR9ID0gMjsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAjIHRyYWNrIGNoYW5naW5nIHN0YW5kYXJkIGZpZWxkcwogICAgICAgIG15ICRBQ0xQcmVzZWxlY3Rpb247CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QUNMUHJlc2VsZWN0aW9uJykgKSB7CgogICAgICAgICAgICAjIGdldCBjYWNoZWQgcHJlc2VsZWN0aW9uIHJ1bGVzCiAgICAgICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdUaWNrZXRBQ0wnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAnUHJlc2VsZWN0aW9uJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbiApIHsKICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPlNldEFDTFByZXNlbGVjdGlvbkNhY2hlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVDb252ZXJnZW5jZSA9ICgKICAgICAgICAgICAgU3RkRmllbGRzID0+IDAsCiAgICAgICAgICAgIEZpZWxkcyAgICA9PiAwLAogICAgICAgICk7CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50cyA9ICRFbGVtZW50Q2hhbmdlZCA/ICggJEVsZW1lbnRDaGFuZ2VkID0+IDEgKSA6ICgpOwogICAgICAgIGlmICggJENoYW5nZWRFbGVtZW50c3tTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAkQ2hhbmdlZEVsZW1lbnRze0N1c3RvbWVyVXNlcklEfSA9IDE7CiAgICAgICAgICAgICRDaGFuZ2VkRWxlbWVudHN7Q3VzdG9tZXJJRH0gICAgID0gMTsKCiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lcklEfSAgICAgPSAkU2VsZi0+e1VzZXJDdXN0b21lcklEfTsKICAgICAgICB9CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAlQ2hhbmdlZEVsZW1lbnRzOwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzICAgICAgID0gJEVsZW1lbnRDaGFuZ2VkICYmICRFbGVtZW50Q2hhbmdlZCAhfiAvXkR5bmFtaWNGaWVsZF8vID8gJUNoYW5nZWRFbGVtZW50cyA6ICgpOwoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICAgICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICgKICAgICAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICAgICAgICAgU2V0cyAgICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtGaWVsZHN9ICkgewoKICAgICAgICAgICAgIyBkZXRlcm1pbmUgc3RhbmRhcmQgZmllbGQgaW5wdXQKICAgICAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSApIHsKCiAgICAgICAgICAgICAgICBteSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwoKICAgICAgICAgICAgICAgICMgd2hpY2ggc3RhbmRhcmQgZmllbGRzIHRvIGNoZWNrIC0gRmllbGRJRCA9PiBHZXRQYXJhbVZhbHVlIChuZWNlc3NhcnkgZm9yIERlc3QpCiAgICAgICAgICAgICAgICBteSAlQ2hlY2sgPSAoCiAgICAgICAgICAgICAgICAgICAgRGVzdCAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBTTEFJRCAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgICA9PiAnVHlwZUlEJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0xQcmVzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9yIGVhY2ggc3RhbmRhcmQgZmllbGQgd2hpY2ggaGFzIHRvIGJlIGNoZWNrZWQsIHJ1biB0aGUgZGVmaW5lZCBtZXRob2QKICAgICAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IE1FVEhPRCBpZiAhJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9OwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7ICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSB9ID0gJEZpZWxkLT57TWV0aG9kfS0+KAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkR2V0UGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tTZXJ2aWNlSUR9IHx8IHVuZGVmLCAgICAjIG5lZWRlZCBmb3IgU0xBSUQKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgc3R1ZmYgZm9yIFF1ZXVlSUQvRGVzdDogRGVzdCBpcyAiUXVldWVJRHx8UXVldWVOYW1lIiA9PiAiUXVldWVOYW1lIjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVE9zOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJXsgJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7RGVzdH17IiRRdWV1ZUlEfHwkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17ICRRdWV1ZUlEIH0ifSA9ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCBzZWxlY3Rpb24gb2YgUXVldWVJRCAoRGVzdCB3aWxsIGJlIGRvbmUgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXIgZmllbGRzKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAhJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyAkR2V0UGFyYW17RGVzdH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1F1ZXVlSUR9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57RGVzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgc2VsZWN0ZWQgdmFsdWUgaXMgc3RpbGwgdmFsaWQgZm9yIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH17ICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbm90IGVtcHR5IHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICElTmV3Q2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKAogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0LAogICAgICAgICAgICAgICAgICAgICVOZXdDaGFuZ2VkRWxlbWVudHMsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJExvb3BQcm90ZWN0aW9uLS0gPCAxICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmFuIGludG8gdW5yZXNvbHZhYmxlIGxvb3AhIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIFRPRE86IGlzIHJldHVybmluZyBhbiBlbXB0eSBsaXN0IHJlYXNvbmFibGU/CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydDsKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJUN1ckZpZWxkU3RhdGVzOwogICAgICAgICAgICBpZiAoJUNoYW5nZWRFbGVtZW50cykgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY29tYmluZSBGaWVsZFN0YXRlcwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7U2V0c30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJE5hbWUgKCBzb3J0IGtleXMgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkfXskTmFtZX07CgogICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e011bHRpVmFsdWV9ICYmIHJlZiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJGkgKCAwIC4uICQjeyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17Tm90QUNMUmVkdWNpYmxlfQogICAgICAgICAgICAgICAgICAgICAgICA/ICggJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifVskaV0gLy8gJycgKQogICAgICAgICAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyROYW1lfXtQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+IFsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifVskaV0gXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyROYW1lfXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfV8kaSIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9WyRpXSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGFkZCB0ZW1wbGF0ZSB2YWx1ZSBmb3Iga2VlcGluZyB0ZW1wbGF0ZXMgaW4gbGluZSB3aXRoIEFDTHMKICAgICAgICAgICAgICAgIGlmICggISREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyROYW1lfXtOb3RBQ0xSZWR1Y2libGV9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gKAogICAgICAgICAgICAgICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiBbICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0RlZmF1bHRWYWx1ZX0gLy8gJycgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyROYW1lfXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9X1RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0RlZmF1bHRWYWx1ZX0gLy8gJycsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e05vdEFDTFJlZHVjaWJsZX0KICAgICAgICAgICAgICAgID8gKCAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9IC8vICcnICkKICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyROYW1lfXtQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9LAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB8fCAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkU2V0RmllbGQgKCB2YWx1ZXMgJER5bkZpZWxkU3RhdGVze1NldHN9LT4lKiApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZXRGaWVsZC0+e0R5bmFtaWNGaWVsZENvbmZpZ307CgogICAgICAgICAgICAjIHRoZSBmcm9udGVuZCBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBpbm5lciBmaWVsZCBpbmNsdWRpbmcgaXRzIGluZGV4IG9yIHRoZSAnX1RlbXBsYXRlJyBzdWZmaXgKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEZyb250ZW5kTmFtZSAoIGtleXMgJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9LT4lKiApIHsKCiAgICAgICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e011bHRpVmFsdWV9ICYmIHJlZiAkU2V0RmllbGQtPntWYWx1ZXN9eyRGcm9udGVuZE5hbWV9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRpICggMCAuLiAkI3sgJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfXskRnJvbnRlbmROYW1lfXtOb3RBQ0xSZWR1Y2libGV9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICggJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfVskaV0gLy8gJycgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+IFsgJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfVskaV0gXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRnJvbnRlbmROYW1lIC4gIl8kaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRTZXRGaWVsZC0+e1ZhbHVlc317JEZyb250ZW5kTmFtZX1bJGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGVtcGxhdGUgdmFsdWUgZm9yIGtlZXBpbmcgdGVtcGxhdGVzIGluIGxpbmUgd2l0aCBBQ0xzCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e05vdEFDTFJlZHVjaWJsZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gWyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtEZWZhdWx0VmFsdWV9IC8vICcnIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfXskRnJvbnRlbmROYW1lfXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRnJvbnRlbmROYW1lIC4gIl9UZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0RlZmF1bHRWYWx1ZX0gLy8gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfXskRnJvbnRlbmROYW1lfXtOb3RBQ0xSZWR1Y2libGV9CiAgICAgICAgICAgICAgICAgICAgPyAoICRTZXRGaWVsZC0+e1ZhbHVlc317JEZyb250ZW5kTmFtZX0gLy8gJycgKQogICAgICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgICRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17UG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRTZXRGaWVsZC0+e1ZhbHVlc317JEZyb250ZW5kTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJEZyb250ZW5kTmFtZSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkU2V0RmllbGQtPntWYWx1ZXN9eyRGcm9udGVuZE5hbWV9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gKSApIHsKICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzdHJpY3Rpb25zX1Zpc2liaWxpdHknLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBteSAkQUNMUmVzdWx0U3RkID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnRm9ybVN0ZCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICctJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiAnQXJ0aWNsZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVZpc2liaWxpdHlTdGQgPSAoCiAgICAgICAgICAgIEFydGljbGUgPT4gMCwKICAgICAgICApOwoKICAgICAgICBpZiAoJEFDTFJlc3VsdFN0ZCkgewogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlQWNsRGF0YSApIHsKICAgICAgICAgICAgICAgICRWaXNpYmlsaXR5U3RkeyRGaWVsZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFZpc2liaWxpdHlTdGR7QXJ0aWNsZX0gPSAxOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICBOYW1lID0+ICdSZXN0cmljdGlvbnNfVmlzaWJpbGl0eV9TdGQnLAogICAgICAgICAgICBEYXRhID0+IFwlVmlzaWJpbGl0eVN0ZCwKICAgICAgICB9OwoKICAgICAgICAjIGJ1aWxkIEFKQVggcmV0dXJuIGZvciB0aGUgc3RhbmRhcmQgZmllbGRzCiAgICAgICAgbXkgQFN0ZEZpZWxkQUpBWDsKICAgICAgICBteSAlQXR0cmlidXRlcyA9ICgKICAgICAgICAgICAgRGVzdCA9PiB7CiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiB7CiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gewogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNMQUlEID0+IHsKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBUeXBlSUQgPT4gewogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICApOwogICAgICAgIGRlbGV0ZSAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH07CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlU3RkRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgICAgIHB1c2ggQFN0ZEZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRmllbGQsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3skRmllbGR9LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17JEZpZWxkfSwKICAgICAgICAgICAgICAgICV7ICRBdHRyaWJ1dGVzeyRGaWVsZH0gfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgbXkgQFRlbXBsYXRlQUpBWDsKICAgICAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICAgICAjIHVwZGF0ZSB0aWNrZXQgYm9keSBhbmQgYXR0YWNoZW1lbnRzIGlmIG5lZWRlZC4KCiAgICAgICAgaWYgKCAkQ2hhbmdlZFN0ZEZpZWxkc3tTdGFuZGFyZFRlbXBsYXRlSUR9ICkgewoKICAgICAgICAgICAgbXkgQFRpY2tldEF0dGFjaG1lbnRzOwogICAgICAgICAgICBteSAkVGVtcGxhdGVUZXh0OwoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIGF0dGFjaG1lbnRzIGZyb20gdGhlIFVwbG9hZCBjYWNoZQogICAgICAgICAgICBteSAkUmVtb3ZlU3VjY2VzcyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFJlbW92ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGb3JtIGF0dGFjaG1lbnRzIGNvdWxkIG5vdCBiZSBkZWxldGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgdGVtcGxhdGUgdGV4dCBhbmQgc2V0IG5ldyBhdHRhY2htZW50cyBpZiBhIHRlbXBsYXRlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgKSB7CgogICAgICAgICAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CgogICAgICAgICAgICAgICAgIyBzZXQgdGVtcGxhdGUgdGV4dCwgcmVwbGFjZSBzbWFydCB0YWdzIChsaW1pdGVkIGFzIHRpY2tldCBpcyBub3QgY3JlYXRlZCkKICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlRlbXBsYXRlKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBTdGRBdHRhY2htZW50T2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50Jyk7CgogICAgICAgICAgICAgICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byB0aWNrZXQKICAgICAgICAgICAgICAgIG15ICVBbGxTdGRBdHRhY2htZW50cyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlQWxsU3RkQXR0YWNobWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzRGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50R2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICVBdHRhY2htZW50c0RhdGEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNlbmQgYSBsaXN0IG9mIGF0dGFjaG1lbnRzIGluIHRoZSB1cGxvYWQgY2FjaGUgYmFjayB0byB0aGUgY2xpZW50c2lkZSBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAjIHdoaWNoIHJlbmRlcnMgdGhlbiB0aGUgbGlzdCBvZiBjdXJyZW50bHkgdXBsb2FkZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIEBUaWNrZXRBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQFRpY2tldEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0gPSAkTGF5b3V0T2JqZWN0LT5IdW1hblJlYWRhYmxlRGF0YVNpemUoCiAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPT4gJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCA9ICgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VUZW1wbGF0ZUNyZWF0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAnMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRUZW1wbGF0ZVRleHQgfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdUaWNrZXRBdHRhY2htZW50cycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBUaWNrZXRBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICAgICBLZWVwRGF0YSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgQFN0ZEZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCwKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBTdWJhY3Rpb24hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQp9CgpzdWIgX0dldFByaW9yaXRpZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlIGlmIG5vbmUgaXMgcHJvdmlkZWQKICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAxOwoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBteSAlUHJpb3JpdGllczsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVByaW9yaXRpZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0VHlwZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlIGlmIG5vbmUgaXMgcHJvdmlkZWQKICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAxOwoKICAgICMgZ2V0IHR5cGUKICAgIG15ICVUeXBlOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlIGlmIG5vbmUgaXMgcHJvdmlkZWQKICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAxOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIG15ICVTZXJ2aWNlOwoKICAgICMgY2hlY2sgbmVlZGVkCiAgICByZXR1cm4gXCVTZXJ2aWNlIGlmICEkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgIyBnZXQgb3B0aW9ucyBmb3IgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgdW5rbm93biBjdXN0b21lcnMKICAgIG15ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpEZWZhdWx0OjpVbmtub3duQ3VzdG9tZXInKTsKCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSB8fCAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlIGlmIG5vbmUgaXMgcHJvdmlkZWQKICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAxOwoKICAgICMgZ2V0IHNlcnZpY2VzIGlmIHRoZXkgd2VyZSBub3QgZGV0ZXJtaW5lZCBpbiBhbiBBSkFYIGNhbGwKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1NlcnZpY2VzfSApIHsKICAgICAgICAkUGFyYW17U2VydmljZXN9ID0gJFNlbGYtPl9HZXRTZXJ2aWNlcyglUGFyYW0pOwogICAgfQoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQTsKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gJiYgJFBhcmFte1NlcnZpY2VzfSAmJiAleyAkUGFyYW17U2VydmljZXN9IH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZXN9LT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlU0xBOwp9CgpzdWIgX0dldFRvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgb3duIHNlbGVjdGlvbgogICAgbXkgJU5ld1RvcyA9ICggJycsICctJyApOwogICAgbXkgJE1vZHVsZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJQYW5lbDo6TmV3VGlja2V0UXVldWVTZWxlY3Rpb25Nb2R1bGUnKQogICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6Q3VzdG9tZXJOZXdUaWNrZXQ6OlF1ZXVlU2VsZWN0aW9uR2VuZXJpYyc7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgIFN5c3RlbUFkZHJlc3MgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKSwKICAgICAgICAgICAgRGVidWcgICAgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICApOwoKICAgICAgICAjIGxvZyBsb2FkZWQgbW9kdWxlCiAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSAmJiAkU2VsZi0+e0RlYnVnfSA+IDEgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJNb2R1bGU6ICRNb2R1bGUgbG9hZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICVOZXdUb3MgPSAoCiAgICAgICAgICAgICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgIEVudiAgICAgICA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIEFDTFBhcmFtcyA9PiBcJVBhcmFtCiAgICAgICAgICAgICksCiAgICAgICAgICAgICggJycsID0+ICctJyApCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyktPkZhdGFsRGllKAogICAgICAgICAgICBNZXNzYWdlID0+ICJDb3VsZCBub3QgbG9hZCAkTW9kdWxlISIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gXCVOZXdUb3M7Cn0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKc3ViIF9HZXRTdGFuZGFyZFRlbXBsYXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJFF1ZXVlSUQgICAgICAgPSAkUGFyYW17UXVldWVJRH0gICB8fCAnJzsKICAgIG15ICRTZXJ2aWNlSUQgICAgID0gJFBhcmFte1NlcnZpY2VJRH0gfHwgJyc7CiAgICBteSAkQ29uZmlnT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUXVldWVPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlczsKICAgIG15ICRSZWZlcmVuY2VBdHRyaWJ1dGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVGVtcGxhdGU6OlJlZmVyZW5jZUF0dHJpYnV0ZScpIHx8ICdRdWV1ZSc7CiAgICBpZiAoICRSZWZlcmVuY2VBdHRyaWJ1dGUgZXEgJ1F1ZXVlJyApIHsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQKICAgICAgICByZXR1cm4ge30gaWYgISRRdWV1ZUlEOwoKICAgICAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgICAgICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRRdWV1ZU9iamVjdC0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRSZWZlcmVuY2VBdHRyaWJ1dGUgZXEgJ1NlcnZpY2UnICkgewoKICAgICAgICAjIGNoZWNrIG5lZWRlZAogICAgICAgIHJldHVybiB7fSBpZiAhJFNlcnZpY2VJRDsKCiAgICAgICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgICAgICAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIFRlbXBsYXRlVHlwZXMgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBmZXRjaCBzdGFuZGFyZCB0ZW1wbGF0ZXMgbGlzdCEgSW52YWxpZCByZWZlcmVuY2UgYXR0cmlidXRlICckUmVmZXJlbmNlQXR0cmlidXRlJyIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXR1cm4gZW1wdHkgaGFzaCBpZiB0aGVyZSBhcmUgbm8gdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuIHt9IGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFN0YW5kYXJkVGVtcGxhdGVze0N1c3RvbWVyQ3JlYXRlfSApOwoKICAgICMgcmV0dXJuIGp1c3QgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBzY3JlZW4KICAgIHJldHVybiAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3VzdG9tZXJDcmVhdGV9Owp9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKc3ViIF9NYXNrTmV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFBhcmFte0Zvcm1JRH0gPSAkU2VsZi0+e0Zvcm1JRH07CiAgICAkUGFyYW17RXJyb3JzfS0+e1F1ZXVlSW52YWxpZH0gPSAkUGFyYW17RXJyb3JzfS0+e1F1ZXVlSW52YWxpZH0gfHwgJyc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWcgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIGlmICggJENvbmZpZy0+e1F1ZXVlfSApIHsKCiAgICAgICAgIyBjaGVjayBvd24gc2VsZWN0aW9uCiAgICAgICAgbXkgJU5ld1RvcyA9ICggJycsICctJyApOwogICAgICAgIG15ICRNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWw6Ok5ld1RpY2tldFF1ZXVlU2VsZWN0aW9uTW9kdWxlJykKICAgICAgICAgICAgfHwgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpDdXN0b21lck5ld1RpY2tldDo6UXVldWVTZWxlY3Rpb25HZW5lcmljJzsKICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIFN5c3RlbUFkZHJlc3MgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKSwKICAgICAgICAgICAgICAgIERlYnVnICAgICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGxvZyBsb2FkZWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gJiYgJFNlbGYtPntEZWJ1Z30gPiAxICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTW9kdWxlOiAkTW9kdWxlIGxvYWRlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAlTmV3VG9zID0gKAogICAgICAgICAgICAgICAgJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgIEVudiAgICAgICA9PiAkU2VsZiwKICAgICAgICAgICAgICAgICAgICBBQ0xQYXJhbXMgPT4gXCVQYXJhbQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICggJycsID0+ICctJyApCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCB0byBzdHJpbmcKICAgICAgICBpZiAoJU5ld1RvcykgewogICAgICAgICAgICBmb3IgKCBzb3J0IGtleXMgJU5ld1RvcyApIHsKICAgICAgICAgICAgICAgICROZXdUb3N7IiRffHwkTmV3VG9zeyRffSJ9ID0gJE5ld1Rvc3skX307CiAgICAgICAgICAgICAgICBkZWxldGUgJE5ld1Rvc3skX307CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRQYXJhbXtUb1N0cmd9ID0gJExheW91dE9iamVjdC0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVOZXdUb3MsCiAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAwLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAiVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplIEZvcm1VcGRhdGUgIiAuICRQYXJhbXtFcnJvcnN9LT57UXVldWVJbnZhbGlkfSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VG9TZWxlY3RlZH0gfHwgJFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICBUcmVlVmlldyAgID0+ICRUcmVlVmlldywKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUXVldWUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFF1ZXVlSW52YWxpZCA9PiAkUGFyYW17RXJyb3JzfS0+e1F1ZXVlSW52YWxpZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICB9CgogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkQ29uZmlnLT57UHJpb3JpdHl9ICkgewogICAgICAgIG15ICVQcmlvcml0aWVzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgcHJpb3JpdHkgc3RyaW5nCiAgICAgICAgbXkgJVByaW9yaXR5U2VsZWN0ZWQ7CiAgICAgICAgaWYgKCAkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICRQcmlvcml0eVNlbGVjdGVke1NlbGVjdGVkSUR9ID0gJFBhcmFte1ByaW9yaXR5SUR9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFByaW9yaXR5U2VsZWN0ZWR7U2VsZWN0ZWRWYWx1ZX0gPSAkQ29uZmlnLT57UHJpb3JpdHlEZWZhdWx0fSB8fCAnMyBub3JtYWwnOwogICAgICAgIH0KICAgICAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICA9PiBcJVByaW9yaXRpZXMsCiAgICAgICAgICAgIE5hbWUgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZSBGb3JtVXBkYXRlJywKICAgICAgICAgICAgJVByaW9yaXR5U2VsZWN0ZWQsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHR5cGVzCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJENvbmZpZy0+eydUaWNrZXRUeXBlJ30gKSB7CiAgICAgICAgbXkgJVR5cGUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRDb25maWctPnsnVGlja2V0VHlwZURlZmF1bHQnfSAmJiAhJFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgICAgIG15ICVSZXZlcnNlVHlwZSA9IHJldmVyc2UgJVR5cGU7CiAgICAgICAgICAgICRQYXJhbXtUeXBlSUR9ID0gJFJldmVyc2VUeXBleyAkQ29uZmlnLT57J1RpY2tldFR5cGVEZWZhdWx0J30gfTsKICAgICAgICB9CgogICAgICAgICRQYXJhbXtUeXBlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAiVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplIEZvcm1VcGRhdGUgIiAuICggJFBhcmFte0Vycm9yc30tPntUeXBlSURJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFR5cGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFR5cGVJREludmFsaWQgPT4gJFBhcmFte0Vycm9yc30tPntUeXBlSURJbnZhbGlkfSwKICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgIyBzZXJ2aWNlcwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRDb25maWctPntTZXJ2aWNlfSApIHsKCiAgICAgICAgIyB1c2UgZWl0aGVyIHRoZSByZWFsIFF1ZXVlSUQsIG9yIHRoZSBUaWNrZXRJRCwgb3IgMSBhcyBRdWV1ZUlECiAgICAgICAgbXkgJFRtcFF1ZXVlSUQgPSAkUGFyYW17UXVldWVJRH0gPyAkUGFyYW17UXVldWVJRH0gOgogICAgICAgICAgICAkUGFyYW17VGlja2V0SUR9ID8gdW5kZWYgOiAxOwoKICAgICAgICBteSAlU2VydmljZXMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkVG1wUXVldWVJRCwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2VydmljZXMsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBGb3JtVXBkYXRlICcKICAgICAgICAgICAgICAgIC4gKCAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gPyAnVmFsaWRhdGVfUmVxdWlyZWQgJyA6ICcnICkKICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17RXJyb3JzfS0+e1NlcnZpY2VJREludmFsaWR9IHx8ICcnICksCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+ICRUcmVlVmlldywKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuZGF0b3J5ID0+ICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgcmVzZXQgcHJldmlvdXMgU2VydmljZUlEIHRvIHJlc2V0IFNMQS1MaXN0IGlmIG5vIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoICEkU2VydmljZXN7ICRQYXJhbXtTZXJ2aWNlSUR9IHx8ICcnIH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtTZXJ2aWNlSUR9ID0gJyc7CiAgICAgICAgfQogICAgICAgIG15ICVTTEE7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57U0xBfSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgICVTTEEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gMSwgICAgIyB1c2UgZGVmYXVsdCBRdWV1ZUlEIGlmIG5vbmUgaXMgcHJvdmlkZWQgaW4gJVBhcmFtCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgRm9ybVVwZGF0ZSAnCiAgICAgICAgICAgICAgICAgICAgLiAoICRDb25maWctPntTTEFNYW5kYXRvcnl9ID8gJ1ZhbGlkYXRlX1JlcXVpcmVkICcgOiAnJyApCiAgICAgICAgICAgICAgICAgICAgLiAoICRQYXJhbXtFcnJvcnN9LT57U0xBSW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFNMQU1hbmRhdG9yeSA9PiAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBwcmVwYXJlIGVycm9ycwogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Vycm9yc30gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRffSA9ICRQYXJhbXtFcnJvcnN9LT57JF99OwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlbmRlciBkeW5hbWljIGZpZWxkcwogICAgJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkR5bmFtaWNGaWVsZDo6TWFzaycpLT5FZGl0U2VjdGlvblJlbmRlcigKICAgICAgICBDb250ZW50ICAgICAgICAgICAgICA9PiAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSwKICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgRHluYW1pY0ZpZWxkVmFsdWVzICAgPT4gJFBhcmFte0R5bmFtaWNGaWVsZH0sCiAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBhcmFte0RGUG9zc2libGVWYWx1ZXN9LAogICAgICAgIEVycm9ycyAgICAgICAgICAgICAgID0+ICRQYXJhbXtERkVycm9yc30sCiAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgICAgPT4gJFBhcmFte1Zpc2liaWxpdHl9LAogICAgICAgIEN1c3RvbWVySW50ZXJmYWNlICAgID0+IDEsCiAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICBDdXN0b21lcklEICAgICA9PiAkU2VsZi0+e1VzZXJDdXN0b21lcklEfSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkfS0+JSosCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAhJFBhcmFte1Zpc2liaWxpdHlTdGR9e0FydGljbGV9ICkgewogICAgICAgICRQYXJhbXtTdWJqZWN0VmFsaWRhdGV9ICAgICAgICA9ICdWYWxpZGF0ZV9SZXF1aXJlZF9JZlZpc2libGUnOwogICAgICAgICRQYXJhbXtCb2R5VmFsaWRhdGV9ICAgICAgICAgICA9ICdWYWxpZGF0ZV9SZXF1aXJlZF9JZlZpc2libGUnOwogICAgICAgICRQYXJhbXtTdWJqZWN0SGlkZGVuQ2xhc3N9ICAgICA9ICcgb29vQUNMSGlkZGVuJzsKICAgICAgICAkUGFyYW17Qm9keUhpZGRlbkNsYXNzfSAgICAgICAgPSAnIG9vb0FDTEhpZGRlbic7CiAgICAgICAgJFBhcmFte0F0dGFjaG1lbnRzSGlkZGVuQ2xhc3N9ID0gJyBvb29BQ0xIaWRkZW4nOwogICAgfQoKICAgIGVsc2UgewogICAgICAgICRQYXJhbXtTdWJqZWN0VmFsaWRhdGV9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkX0lmVmlzaWJsZSc7CiAgICAgICAgJFBhcmFte0JvZHlWYWxpZGF0ZX0gICAgPSAnVmFsaWRhdGVfUmVxdWlyZWRfSWZWaXNpYmxlJzsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICMgY2hlY2sgaWYgZXhpc3RzIGN1c3RvbWVyIGNyZWF0ZSB0ZW1wbGF0ZXMgcmVnYXJkbGVzcyB0aGUgcXVldWUgYW5kIHRoZSBzZXJ2aWNlCiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZScpLT5TdGFuZGFyZFRlbXBsYXRlTGlzdCgKICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgIFR5cGUgID0+ICdDdXN0b21lckNyZWF0ZScsCiAgICApOwoKICAgICMgYnVpbGQgdGV4dCB0ZW1wbGF0ZSBzdHJpbmcKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlU3RhbmRhcmRUZW1wbGF0ZXMgKSApIHsKCiAgICAgICAgIyBmZXRjaCBhbGwgYXZhaWxhYmxlIHN0ZC4gdGVtcGxhdGVzCiAgICAgICAgbXkgJEF2YWlsYWJsZVN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEF2YWlsYWJsZVN0YW5kYXJkVGVtcGxhdGVzIHx8IHt9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSB8fCAnJywKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YW5kYXJkVGVtcGxhdGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICB9CgogICAgICAgIHB1c2ggQHsgJFBhcmFte0F0dGFjaG1lbnRMaXN0fSB9LCAkQXR0YWNobWVudDsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJENvbmZpZy0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICMgc2V0IHVwIGN1c3RvbWVyIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lclNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBQZXJtaXNzaW9ucyBoYXZlIGJlZW4gY2hlY2tlZCBiZWZvcmUgaW4gUnVuKCkKICAgIGlmICggJFBhcmFte0Zyb21DaGF0SUR9ICkgewogICAgICAgIG15IEBDaGF0TWVzc2FnZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5DaGF0TWVzc2FnZUxpc3QoCiAgICAgICAgICAgIENoYXRJRCA9PiAkUGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRNZXNzYWdlIChAQ2hhdE1lc3NhZ2VzKSB7CiAgICAgICAgICAgICRNZXNzYWdlLT57TWVzc2FnZVRleHR9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIFRleHQgICAgICAgID0+ICRNZXNzYWdlLT57TWVzc2FnZVRleHR9LAogICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDaGF0QXJ0aWNsZVByZXZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENoYXRNZXNzYWdlcyA9PiBcQENoYXRNZXNzYWdlcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0hpZGVBdXRvc2VsZWN0ZWR9ICkgewoKICAgICAgICAjIGFkZCBBdXRvc2VsZWN0IEpTCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNPbkRvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgIENvZGUgPT4gIkNvcmUuRm9ybS5Jbml0SGlkZUF1dG9zZWxlY3RlZCh7IEZpZWxkSURzOiAkUGFyYW17SGlkZUF1dG9zZWxlY3RlZH0gfSk7IiwKICAgICAgICApOwogICAgfQoKICAgICMgZXhwbGFuYXRvcnkgbWVzc2FnZSBhYm91dCBhc3RlcmlzawogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFzdGVyaXNrRXhwbGFuYXRpb24nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXN0ZXJpc2tFeHBsYW5hdGlvbicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyVGlja2V0TWVzc2FnZScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/CustomerTicketZoom.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiYTJiOGQ0YzNkMWQyYzc1YWMzZTQ3NWFmMWFkYjVmYWZkNTBmMzc4IC0gS2VybmVsL01vZHVsZXMvQ3VzdG9tZXJUaWNrZXRab29tLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFpvb207Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCnVzZSBEaWdlc3Q6Ok1ENSBxdyhtZDVfaGV4KTsKdXNlIExpc3Q6OlV0aWwgIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgbXkgJERlZmluaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpNYXNrJyktPkRlZmluaXRpb25HZXQoCiAgICAgICAgTWFzayA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICApIHx8IHt9OwoKICAgICRTZWxmLT57TWFza0RlZmluaXRpb259ICAgICAgID0gJERlZmluaXRpb24tPntNYXNrfTsKICAgICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9ID0ge307CgogICAgIyBhbGlnbiBzeXNjb25maWcgYW5kIHRpY2tldCBtYXNrIGRhdGEgSQogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyAkRHluYW1pY0ZpZWxkTGlzdCAvLyBbXSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkKTsKCiAgICAgICAgbXkgJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWR1Y2UgdGhlIGR5bmFtaWMgZmllbGRzIHRvIG9ubHkgdGhlIG9uZXMgdGhhdCBhcmUgZGVzaWduZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGU7CgogICAgICAgIGlmICggZXhpc3RzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc317ICREeW5hbWljRmllbGQtPntOYW1lfSB9ICkgewogICAgICAgICAgICBteSAkUGFyYW1ldGVycyA9IGRlbGV0ZSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSAvLyB7fTsKCiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAkUGFyYW1ldGVycy0+JSogKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57JEF0dHJpYnV0ZX0gPSAkUGFyYW1ldGVycy0+eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoICRTZWxmLT57TWFza0RlZmluaXRpb259LT5AKiwgewogICAgICAgICAgICAgICAgREYgICAgICAgID0+ICREeW5hbWljRmllbGQtPntOYW1lfSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkQ29uZmlnLT57Rm9sbG93VXBEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9PSAyID8gMSA6IDAsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoICRDb25maWctPntGb2xsb3dVcER5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57TWFuZGF0b3J5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgIyBhbGlnbiBzeXNjb25maWcgYW5kIHRpY2tldCBtYXNrIGRhdGEgSUkKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIGtleXMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfS0+JSogKSB7CiAgICAgICAgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH17JER5bmFtaWNGaWVsZE5hbWV9ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROYW1lLAogICAgICAgICk7CgogICAgICAgIG15ICRQYXJhbWV0ZXJzID0gJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXskRHluYW1pY0ZpZWxkTmFtZX0gLy8ge307CgogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAkUGFyYW1ldGVycy0+JSogKSB7CiAgICAgICAgICAgICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfXskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5QcmVwYXJlRm9ybUlEKAogICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKSwKICAgICk7CgogICAgIyBtZXRob2RzIHdoaWNoIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICRTZWxmLT57RmllbGRNZXRob2RzfSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFByaW9yaXRpZXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldE5leHRTdGF0ZXMKICAgICAgICB9LAoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRTdGFuZGFyZFRlbXBsYXRlcwogICAgICAgIH0sCgojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgIF07CgogICAgIyBkZXBlbmRlbmNpZXMgb2Ygc3RhbmRhcmQgZmllbGRzIHdoaWNoIGFyZSBub3QgZGVmaW5lZCB2aWEgQUNMcyAtIGhlcmUgZm9yIGNvbnNpc3RlbmN5CiAgICAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX0gPSB7fTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICBteSAkVGlja2V0TnVtYmVyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldE51bWJlcicgKTsKCiAgICAjIHRpY2tldCBpZCBsb29rdXAKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICYmICRUaWNrZXROdW1iZXIgKSB7CiAgICAgICAgJFNlbGYtPntUaWNrZXRJRH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRJRExvb2t1cCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXROdW1iZXInICksCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY3VzdG9tZXJzIHNob3VsZCBub3QgZ2V0IHRvIGtub3cgdGhhdCB3aGV0aGVyIGFuIHRpY2tldCBleGlzdHMgb3Igbm90CiAgICAjIGlmIGEgdGlja2V0IGRvZXMgbm90IGV4aXN0LCBzaG93IGEgIm5vIHBlcm1pc3Npb24iIHNjcmVlbgogICAgaWYgKCAkVGlja2V0TnVtYmVyICYmICEkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkIFRpY2tldElEIScpLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3VzdG9tZXJQZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBwcm9jZXNzIG1hbmFnZW1lbnQKICAgIG15ICVBY3Rpdml0eUVycm9ySFRNTDsKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZUFjdGl2aXR5RGlhbG9nJyApIHsKICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCJLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyVGlja2V0UHJvY2VzcyIpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgbG9hZCBwcm9jZXNzIG1vZHVsZS4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRQcm9jZXNzTW9kdWxlID0gKCdLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyVGlja2V0UHJvY2VzcycpLT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICBBY3Rpb24gICAgPT4gJ0N1c3RvbWVyVGlja2V0UHJvY2VzcycsCiAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAkU2VsZi0+e1N1YmFjdGlvbn0sCiAgICAgICAgICAgIE1vZHVsZVJlZyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpLT57J0N1c3RvbWVyVGlja2V0UHJvY2Vzcyd9LAogICAgICAgICk7CgogICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0FjdGl2aXR5RGlhbG9nRW50aXR5SUQnICk7CiAgICAgICAgJEFjdGl2aXR5RXJyb3JIVE1MeyRBY3Rpdml0eURpYWxvZ0VudGl0eUlEfSA9ICRQcm9jZXNzTW9kdWxlLT5SdW4oJVBhcmFtKTsKCiAgICAgICAgIyByZXR1cm4gZGlyZWN0bHkgaW4gY2FzZSBvZiBhbiBlcnJvciBkaWFsb2cKICAgICAgICByZXR1cm4gJEFjdGl2aXR5RXJyb3JIVE1MeyRBY3Rpdml0eURpYWxvZ0VudGl0eUlEfSBpZiAkQWN0aXZpdHlFcnJvckhUTUx7JEFjdGl2aXR5RGlhbG9nRW50aXR5SUR9ID1+IC9ePCFET0NUWVBFIGh0bWw+LzsKICAgIH0KCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgJiYgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0FjdGl2aXR5RGlhbG9nRW50aXR5SUQnICkgKSB7CiAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgiS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFByb2Nlc3MiKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBsb2FkIHByb2Nlc3MgbW9kdWxlLiIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgJFByb2Nlc3NNb2R1bGUgPSAoJ0tlcm5lbDo6TW9kdWxlczo6Q3VzdG9tZXJUaWNrZXRQcm9jZXNzJyktPm5ldygKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgIEFjdGlvbiAgICA9PiAnQ3VzdG9tZXJUaWNrZXRQcm9jZXNzJywKICAgICAgICAgICAgU3ViYWN0aW9uID0+ICRTZWxmLT57U3ViYWN0aW9ufSwKICAgICAgICAgICAgTW9kdWxlUmVnID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsnQ3VzdG9tZXJUaWNrZXRQcm9jZXNzJ30sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRQcm9jZXNzTW9kdWxlLT5SdW4oJVBhcmFtKTsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9uczsKICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAjIGdldCBhbGwgcmVnaXN0ZXJlZCBBY3Rpb25zCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpIGVxICdIQVNIJyApIHsKCiAgICAgICAgbXkgJUFjdGlvbnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpIH07CgogICAgICAgICMgb25seSB1c2UgdGhvc2UgQWN0aW9ucyB0aGF0IHN0YXJ0cyB3aXRoIEN1c3RvbWVyCiAgICAgICAgJVBvc3NpYmxlQWN0aW9ucyA9IG1hcCB7ICsrJENvdW50ZXIgPT4gJF8gfQogICAgICAgICAgICBncmVwIHsgc3Vic3RyKCAkXywgMCwgbGVuZ3RoICdDdXN0b21lcicgKSBlcSAnQ3VzdG9tZXInIH0KICAgICAgICAgICAgc29ydCBrZXlzICVBY3Rpb25zOwogICAgfQogICAgJFBvc3NpYmxlQWN0aW9uc3sgKyskQ291bnRlciB9ID0gJ0N1c3RvbWVyVGlja2V0Wm9vbVJlcGx5JzsKCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnLScsCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAlQWNsQWN0aW9uID0gJVBvc3NpYmxlQWN0aW9uczsKICAgIGlmICgkQUNMKSB7CiAgICAgICAgJUFjbEFjdGlvbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgIyBzaG93IGVycm9yIHNjcmVlbiBpZiBBQ0wgcHJvaGliaXRzIHRoaXMgYWN0aW9uCiAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgIyBnZXQgYWxsIGFydGljbGVzIG9mIHRoaXMgdGlja2V0LCB0aGF0IGFyZSB2aXNpYmxlIGZvciB0aGUgY3VzdG9tZXIKICAgIG15IEBBcnRpY2xlTGlzdCA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgID0+IDAsCiAgICApOwoKICAgIG15IEBBcnRpY2xlQm94OwogICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0OwoKICAgIEFSVElDTEVNRVRBREFUQToKICAgIGZvciBteSAkQXJ0aWNsZU1ldGFEYXRhIChAQXJ0aWNsZUxpc3QpIHsKCiAgICAgICAgbmV4dCBBUlRJQ0xFTUVUQURBVEEgaWYgISRBcnRpY2xlTWV0YURhdGE7CiAgICAgICAgbmV4dCBBUlRJQ0xFTUVUQURBVEEgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBcnRpY2xlTWV0YURhdGEpOwoKICAgICAgICAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7JEFydGljbGVNZXRhRGF0YX0gKTsKCiAgICAgICAgbXkgJUFydGljbGVEYXRhID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZU1ldGFEYXRhLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgUmVhbE5hbWVzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgY2hhbm5lbCBzcGVjaWZpYyBmaWVsZHMKICAgICAgICBteSAlQXJ0aWNsZUZpZWxkcyA9ICRMYXlvdXRPYmplY3QtPkFydGljbGVGaWVsZHMoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlTWV0YURhdGEtPntBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgICRBcnRpY2xlRGF0YXtTdWJqZWN0fSAgICAgID0gJEFydGljbGVGaWVsZHN7U3ViamVjdH07CiAgICAgICAgJEFydGljbGVEYXRhe0Zyb21SZWFsbmFtZX0gPSAkQXJ0aWNsZUZpZWxkc3tTZW5kZXJ9OwoKICAgICAgICAjIEdldCBhdHRhY2htZW50IGluZGV4LgogICAgICAgIG15ICVBdG1JbmRleCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUF0dGFjaG1lbnRJbmRleCgKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICA9PiAkQXJ0aWNsZU1ldGFEYXRhLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRXhjbHVkZVBsYWluVGV4dCA9PiAxLAogICAgICAgICAgICBFeGNsdWRlSFRNTEJvZHkgID0+IDEsCiAgICAgICAgICAgIEV4Y2x1ZGVJbmxpbmUgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJUF0bUluZGV4ICkgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRGF0YXtBdHRhY2htZW50fSA9IFwlQXRtSW5kZXg7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBBcnRpY2xlQm94LCBcJUFydGljbGVEYXRhOwogICAgfQoKICAgIG15ICVHZXRQYXJhbTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKIyAgICBmb3IgbXkgJEtleSAocXcoU3ViamVjdCBCb2R5IFN0YXRlSUQgUHJpb3JpdHlJRCBGcm9tQ2hhdElEIEZyb21DaGF0KSkgewoKICAgIGZvciBteSAkS2V5IChxdyhTdWJqZWN0IEJvZHkgU3RhdGVJRCBQcmlvcml0eUlEIEZyb21DaGF0SUQgRnJvbUNoYXQgU3RhbmRhcmRUZW1wbGF0ZUlEKSkgewojIEVPIEN1c3RvbWVyVGVtcGxhdGUKCiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgfQoKICAgICMgZ2V0IER5bmFtaWMgZmllbGRzIGZyb20gUGFyYW1PYmplY3QKICAgIG15ICVEeW5hbWljRmllbGRWYWx1ZXM7CgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgaWYgKCAkR2V0UGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdDaGF0RW5naW5lOjpBY3RpdmUnKSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ2hhdCBpcyBub3QgYWN0aXZlLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBjaGF0IHBhcnRpY2lwYW50CiAgICAgICAgbXkgJUNoYXRQYXJ0aWNpcGFudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0JyktPkNoYXRQYXJ0aWNpcGFudENoZWNrKAogICAgICAgICAgICBDaGF0SUQgICAgICA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgIENoYXR0ZXJUeXBlID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgIENoYXR0ZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICElQ2hhdFBhcnRpY2lwYW50ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwogICAgfQoKICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICBteSAlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGQ7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewoKICAgICAgICAjIGdldCBUaWNrZXRJRAogICAgICAgIGlmICggISRHZXRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtUaWNrZXRJRH0gPQogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRJRH0gfHwKICAgICAgICAgICAgICAgICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXRJRCcgKTsKICAgICAgICB9CgogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgIG15ICRFbGVtZW50Q2hhbmdlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcgKTsKCiAgICAgICAgIyB1c2UgdGhlIEZpZWxkSURzLCB3aGljaCBhcmUgZm91bmQgaW4gQWdlbnRUaWNrZXRQaG9uZS9FbWFpbCwgYW5kIEN1c3RvbWVyVGlja2V0TWVzc2FnZQogICAgICAgIG15ICVVbmlmb3JtaXR5ID0gKAogICAgICAgICAgICBTdGF0ZUlEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRFbGVtZW50Q2hhbmdlZCAmJiAkVW5pZm9ybWl0eXskRWxlbWVudENoYW5nZWR9ICkgewogICAgICAgICAgICAkRWxlbWVudENoYW5nZWQgPSAkVW5pZm9ybWl0eXskRWxlbWVudENoYW5nZWR9OwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJERpdmVyc0lEICgga2V5cyAlVW5pZm9ybWl0eSApIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkVW5pZm9ybWl0eXskRGl2ZXJzSUR9IH0gPSAkR2V0UGFyYW17JERpdmVyc0lEfTsKICAgICAgICB9CgogICAgICAgIG15ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkZpZWxkUmVzdHJpY3Rpb25zJyk7CiAgICAgICAgbXkgJEF1dG9zZWxlY3QgICAgICAgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkF1dG9zZWxlY3QnKSB8fCB1bmRlZjsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAjIGlmIHRlbXBsYXRlcyBzaG91bGQgYmUgYXV0b3NlbGVjdGVkLCBhdXRvbWF0aWNhbGx5IGhpZGUgdGhlbQogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclRlbXBsYXRlOjpBdXRvc2VsZWN0JykgKSB7CiAgICAgICAgICAgICRBdXRvc2VsZWN0LT57U3RhbmRhcmRUZW1wbGF0ZUlEfSA9IDI7CiAgICAgICAgfQojIEVPIEN1c3RvbWVyVGVtcGxhdGUKCiAgICAgICAgIyB0cmFjayBjaGFuZ2luZyBzdGFuZGFyZCBmaWVsZHMKICAgICAgICBteSAkQUNMUHJlc2VsZWN0aW9uOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkFDTFByZXNlbGVjdGlvbicpICkgewoKICAgICAgICAgICAgIyBnZXQgY2FjaGVkIHByZXNlbGVjdGlvbiBydWxlcwogICAgICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGlja2V0QUNMJywKICAgICAgICAgICAgICAgIEtleSAgPT4gJ1ByZXNlbGVjdGlvbicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24gKSB7CiAgICAgICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5TZXRBQ0xQcmVzZWxlY3Rpb25DYWNoZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlQ29udmVyZ2VuY2UgPSAoCiAgICAgICAgICAgIFN0ZEZpZWxkcyA9PiAwLAogICAgICAgICAgICBGaWVsZHMgICAgPT4gMCwKICAgICAgICApOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHMgPSAkRWxlbWVudENoYW5nZWQgPyAoICRFbGVtZW50Q2hhbmdlZCA9PiAxICkgOiAoKTsKICAgICAgICBpZiAoICRDaGFuZ2VkRWxlbWVudHN7U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJENoYW5nZWRFbGVtZW50c3tDdXN0b21lclVzZXJJRH0gPSAxOwogICAgICAgICAgICAkQ2hhbmdlZEVsZW1lbnRze0N1c3RvbWVySUR9ICAgICA9IDE7CgogICAgICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJJRH0gICAgID0gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH07CiAgICAgICAgfQogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gJUNoYW5nZWRFbGVtZW50czsKICAgICAgICBteSAlQ2hhbmdlZFN0ZEZpZWxkcyAgICAgICA9ICRFbGVtZW50Q2hhbmdlZCAmJiAkRWxlbWVudENoYW5nZWQgIX4gL15EeW5hbWljRmllbGRfLyA/ICVDaGFuZ2VkRWxlbWVudHMgOiAoKTsKCiAgICAgICAgbXkgJExvb3BQcm90ZWN0aW9uID0gMTAwOwogICAgICAgIG15ICVTdGRGaWVsZFZhbHVlczsKICAgICAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAoCiAgICAgICAgICAgIFZpc2liaWxpdHkgPT4ge30sCiAgICAgICAgICAgIEZpZWxkcyAgICAgPT4ge30sCiAgICAgICAgICAgIFNldHMgICAgICAgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7RmllbGRzfSApIHsKCiAgICAgICAgICAgICMgZGV0ZXJtaW5lIHN0YW5kYXJkIGZpZWxkIGlucHV0CiAgICAgICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gKSB7CgogICAgICAgICAgICAgICAgbXkgJU5ld0NoYW5nZWRFbGVtZW50czsKCiAgICAgICAgICAgICAgICAjIHdoaWNoIHN0YW5kYXJkIGZpZWxkcyB0byBjaGVjayAtIEZpZWxkSUQgPT4gR2V0UGFyYW1WYWx1ZSAobmVjZXNzYXJ5IGZvciBEZXN0KQogICAgICAgICAgICAgICAgbXkgJUNoZWNrID0gKAogICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgPT4gJ1ByaW9yaXR5SUQnLAoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0xQcmVzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9yIGVhY2ggc3RhbmRhcmQgZmllbGQgd2hpY2ggaGFzIHRvIGJlIGNoZWNrZWQsIHJ1biB0aGUgZGVmaW5lZCBtZXRob2QKICAgICAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IE1FVEhPRCBpZiAhJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9OwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7ICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSB9ID0gJEZpZWxkLT57TWV0aG9kfS0+KAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgc3R1ZmYgZm9yIFF1ZXVlSUQvRGVzdDogRGVzdCBpcyAiUXVldWVJRHx8UXVldWVOYW1lIiA9PiAiUXVldWVOYW1lIjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVE9zOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJXsgJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7RGVzdH17IiRRdWV1ZUlEfHwkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17ICRRdWV1ZUlEIH0ifSA9ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCBzZWxlY3Rpb24gb2YgUXVldWVJRCAoRGVzdCB3aWxsIGJlIGRvbmUgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXIgZmllbGRzKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAhJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyAkR2V0UGFyYW17RGVzdH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1F1ZXVlSUR9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57RGVzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgc2VsZWN0ZWQgdmFsdWUgaXMgc3RpbGwgdmFsaWQgZm9yIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH17ICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbm90IGVtcHR5IHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICElTmV3Q2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKAogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0LAogICAgICAgICAgICAgICAgICAgICVOZXdDaGFuZ2VkRWxlbWVudHMsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJExvb3BQcm90ZWN0aW9uLS0gPCAxICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmFuIGludG8gdW5yZXNvbHZhYmxlIGxvb3AhIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIFRPRE86IGlzIHJldHVybmluZyBhbiBlbXB0eSBsaXN0IHJlYXNvbmFibGU/CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzICAgICAgICA9ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0OwogICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICgpOwoKICAgICAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICBteSAlQ3VyRmllbGRTdGF0ZXM7CiAgICAgICAgICAgIGlmICglQ2hhbmdlZEVsZW1lbnRzKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdmFsdWVzIGFuZCB2aXNpYmlsaXR5IG9mIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICAlQ3VyRmllbGRTdGF0ZXMgPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkdldEZpZWxkU3RhdGVzKAogICAgICAgICAgICAgICAgICAgIFRpY2tldE9iamVjdCAgICAgICAgICAgICAgPT4gJFRpY2tldE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPT4gJEJhY2tlbmRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZEVsZW1lbnRzICAgICAgICAgICA9PiBcJUNoYW5nZWRFbGVtZW50cywgICAgICAgICAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICAgICA9PiB7JUdldFBhcmFtfSwKICAgICAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgICAgICAgICAgID0+ICRBdXRvc2VsZWN0LAogICAgICAgICAgICAgICAgICAgIEFDTFByZXNlbGVjdGlvbiAgICAgICAgICAgPT4gJEFDTFByZXNlbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgICAgICAgICAgID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY29tYmluZSBGaWVsZFN0YXRlcwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7U2V0c30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJE5hbWUgKCBzb3J0IGtleXMgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9eyROYW1lfTsKCiAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317TXVsdGlWYWx1ZX0gJiYgcmVmICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkaSAoIDAgLi4gJCN7ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In0gfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyROYW1lfXtOb3RBQ0xSZWR1Y2libGV9CiAgICAgICAgICAgICAgICAgICAgICAgID8gKCAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9WyRpXSAvLyAnJyApCiAgICAgICAgICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gWyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9WyRpXSBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9XyRpIiwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In1bJGldLAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgYWRkIHRlbXBsYXRlIHZhbHVlIGZvciBrZWVwaW5nIHRlbXBsYXRlcyBpbiBsaW5lIHdpdGggQUNMcwogICAgICAgICAgICAgICAgaWYgKCAhJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e05vdEFDTFJlZHVjaWJsZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgICRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17UG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+IFsgJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317RGVmYXVsdFZhbHVlfSAvLyAnJyBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gIkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX1fVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317RGVmYXVsdFZhbHVlfSAvLyAnJywKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17Tm90QUNMUmVkdWNpYmxlfQogICAgICAgICAgICAgICAgPyAoICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In0gLy8gJycgKQogICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In0sCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHx8ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyROYW1lfXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRTZXRGaWVsZCAoIHZhbHVlcyAkRHluRmllbGRTdGF0ZXN7U2V0c30tPiUqICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNldEZpZWxkLT57RHluYW1pY0ZpZWxkQ29uZmlnfTsKCiAgICAgICAgICAgICMgdGhlIGZyb250ZW5kIG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGlubmVyIGZpZWxkIGluY2x1ZGluZyBpdHMgaW5kZXggb3IgdGhlICdfVGVtcGxhdGUnIHN1ZmZpeAogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRnJvbnRlbmROYW1lICgga2V5cyAkU2V0RmllbGQtPntGaWVsZFN0YXRlc30tPiUqICkgewoKICAgICAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317TXVsdGlWYWx1ZX0gJiYgcmVmICRTZXRGaWVsZC0+e1ZhbHVlc317JEZyb250ZW5kTmFtZX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJGkgKCAwIC4uICQjeyAkU2V0RmllbGQtPntWYWx1ZXN9eyRGcm9udGVuZE5hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e05vdEFDTFJlZHVjaWJsZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKCAkU2V0RmllbGQtPntWYWx1ZXN9eyRGcm9udGVuZE5hbWV9WyRpXSAvLyAnJyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17UG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gWyAkU2V0RmllbGQtPntWYWx1ZXN9eyRGcm9udGVuZE5hbWV9WyRpXSBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICRGcm9udGVuZE5hbWUgLiAiXyRpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfVskaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGFkZCB0ZW1wbGF0ZSB2YWx1ZSBmb3Iga2VlcGluZyB0ZW1wbGF0ZXMgaW4gbGluZSB3aXRoIEFDTHMKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17Tm90QUNMUmVkdWNpYmxlfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17UG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiBbICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0RlZmF1bHRWYWx1ZX0gLy8gJycgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICRGcm9udGVuZE5hbWUgLiAiX1RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317RGVmYXVsdFZhbHVlfSAvLyAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e05vdEFDTFJlZHVjaWJsZX0KICAgICAgICAgICAgICAgICAgICA/ICggJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfSAvLyAnJyApCiAgICAgICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgJEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfXskRnJvbnRlbmROYW1lfXtQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB8fCAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRnJvbnRlbmROYW1lLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRTZXRGaWVsZC0+e1ZhbHVlc317JEZyb250ZW5kTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSApICkgewogICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXN0cmljdGlvbnNfVmlzaWJpbGl0eScsCiAgICAgICAgICAgICAgICBEYXRhID0+ICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgQUpBWCByZXR1cm4gZm9yIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICAgICBteSBAU3RkRmllbGRBSkFYOwogICAgICAgIG15ICVBdHRyaWJ1dGVzID0gKAogICAgICAgICAgICBQcmlvcml0eUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICk7CiAgICAgICAgbXkgJURpdmVyc2l0eSA9IHJldmVyc2UgJVVuaWZvcm1pdHk7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlU3RkRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgICAgIHB1c2ggQFN0ZEZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRGl2ZXJzaXR5eyRGaWVsZH0gfHwgJEZpZWxkLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7JEZpZWxkfSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFteyRGaWVsZH0sCiAgICAgICAgICAgICAgICAleyAkQXR0cmlidXRlc3skRmllbGR9IH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgIG15IEBUZW1wbGF0ZUFKQVg7CiAgICAgICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAgICAgIyB1cGRhdGUgdGlja2V0IGJvZHkgYW5kIGF0dGFjaGVtZW50cyBpZiBuZWVkZWQuCgogICAgICAgIGlmICggJENoYW5nZWRTdGRGaWVsZHN7U3RhbmRhcmRUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgbXkgQFRpY2tldEF0dGFjaG1lbnRzOwogICAgICAgICAgICBteSAkVGVtcGxhdGVUZXh0OwoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIGF0dGFjaG1lbnRzIGZyb20gdGhlIFVwbG9hZCBjYWNoZQogICAgICAgICAgICBteSAkUmVtb3ZlU3VjY2VzcyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFJlbW92ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGb3JtIGF0dGFjaG1lbnRzIGNvdWxkIG5vdCBiZSBkZWxldGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgdGVtcGxhdGUgdGV4dCBhbmQgc2V0IG5ldyBhdHRhY2htZW50cyBpZiBhIHRlbXBsYXRlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgKSB7CgogICAgICAgICAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CgogICAgICAgICAgICAgICAgIyBzZXQgdGVtcGxhdGUgdGV4dCwgcmVwbGFjZSBzbWFydCB0YWdzIChsaW1pdGVkIGFzIHRpY2tldCBpcyBub3QgY3JlYXRlZCkKICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlRlbXBsYXRlKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBTdGRBdHRhY2htZW50T2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50Jyk7CgogICAgICAgICAgICAgICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byB0aWNrZXQKICAgICAgICAgICAgICAgIG15ICVBbGxTdGRBdHRhY2htZW50cyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlQWxsU3RkQXR0YWNobWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzRGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50R2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICVBdHRhY2htZW50c0RhdGEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNlbmQgYSBsaXN0IG9mIGF0dGFjaG1lbnRzIGluIHRoZSB1cGxvYWQgY2FjaGUgYmFjayB0byB0aGUgY2xpZW50c2lkZSBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAjIHdoaWNoIHJlbmRlcnMgdGhlbiB0aGUgbGlzdCBvZiBjdXJyZW50bHkgdXBsb2FkZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIEBUaWNrZXRBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQFRpY2tldEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0gPSAkTGF5b3V0T2JqZWN0LT5IdW1hblJlYWRhYmxlRGF0YVNpemUoCiAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgPT4gJEF0dGFjaG1lbnQtPntGaWxlc2l6ZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCA9ICgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VUZW1wbGF0ZUNyZWF0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAnMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRUZW1wbGF0ZVRleHQgfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdUaWNrZXRBdHRhY2htZW50cycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBUaWNrZXRBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICAgICBLZWVwRGF0YSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgQFN0ZEZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgXSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjICAgZW5kIEFKQVggVXBkYXRlCgogICAgIyBzYXZlLCBpZiBicm93c2VyIGxpbmsgbWVzc2FnZSB3YXMgY2xvc2VkCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQnJvd3NlckxpbmtNZXNzYWdlJyApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyQ3VzdG9tZXJEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2UnLAogICAgICAgICAgICBWYWx1ZSAgPT4gMSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+IDEsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBmb2xsb3cgdXAKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZScgKSB7CgogICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7Q3VzdG9tZXJUaWNrZXRab29tUmVwbHl9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCBUeXBlID0+ICdDdXN0b21lcicgKTsKCiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkU2VsZi0+e05leHRTY3JlZW59IHx8ICRDb25maWctPntOZXh0U2NyZWVuQWZ0ZXJGb2xsb3dVcH07CiAgICAgICAgbXkgJUVycm9yOwoKICAgICAgICAjIGdldCBmb2xsb3cgdXAgb3B0aW9uIChwb3NzaWJsZSBvciBub3QpCiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgICAgICBteSAkRm9sbG93VXBQb3NzaWJsZSA9ICRRdWV1ZU9iamVjdC0+R2V0Rm9sbG93VXBPcHRpb24oCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBsb2NrIG9wdGlvbiAoc2hvdWxkIGJlIHRoZSB0aWNrZXQgbG9ja2VkIC0gaWYgY2xvc2VkIC0gYWZ0ZXIgdGhlIGZvbGxvdyB1cCkKICAgICAgICBteSAkTG9jayA9ICRRdWV1ZU9iamVjdC0+R2V0Rm9sbG93VXBMb2NrT3B0aW9uKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFN0YXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyk7CgogICAgICAgICMgZ2V0IHRpY2tldCBzdGF0ZSBkZXRhaWxzCiAgICAgICAgbXkgJVN0YXRlID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldCgKICAgICAgICAgICAgSUQgPT4gJFRpY2tldHtTdGF0ZUlEfSwKICAgICAgICApOwogICAgICAgIGlmICggJEZvbGxvd1VwUG9zc2libGUgPX4gLyhuZXcgdGlja2V0fHJlamVjdCkvaSAmJiAkU3RhdGV7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyV2FybmluZygKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3QgcmVvcGVuIHRpY2tldCwgbm90IHBvc3NpYmxlIGluIHRoaXMgcXVldWUhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnQ3JlYXRlIGEgbmV3IHRpY2tldCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIHJld3JhcCBib2R5IGlmIG5vIHJpY2ggdGV4dCBpcyB1c2VkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gJiYgISRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5XcmFwUGxhaW5UZXh0KAogICAgICAgICAgICAgICAgTWF4Q2hhcmFjdGVycyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpLAogICAgICAgICAgICAgICAgUGxhaW5UZXh0ICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdH0gKSB7CiAgICAgICAgICAgICRFcnJvcntGcm9tQ2hhdH0gICAgICAgICAgID0gMTsKICAgICAgICAgICAgJEdldFBhcmFte0ZvbGxvd1VwVmlzaWJsZX0gPSAnVmlzaWJsZSc7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0Zyb21DaGF0SUR9ICkgewogICAgICAgICAgICAgICAgbXkgQENoYXRNZXNzYWdlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0JyktPkNoYXRNZXNzYWdlTGlzdCgKICAgICAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmIChAQ2hhdE1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRNZXNzYWdlIChAQ2hhdE1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRNZXNzYWdlLT57TWVzc2FnZVRleHR9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgICAgID0+ICRNZXNzYWdlLT57TWVzc2FnZVRleHR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NoYXRNZXNzYWdlc30gPSBcQENoYXRNZXNzYWdlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0Zyb21DaGF0fSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9IHx8ICRHZXRQYXJhbXtCb2R5fSBlcSAnPGJyIC8+JyApIHsKICAgICAgICAgICAgICAgICRFcnJvcntSaWNoVGV4dEludmFsaWR9ICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtGb2xsb3dVcFZpc2libGV9ID0gJ1Zpc2libGUnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNraXAgdmFsaWRhdGlvbiBvZiBoaWRkZW4gZmllbGRzCiAgICAgICAgbXkgJVZpc2liaWxpdHk7CgogICAgICAgICMgdHJhbnNmb3JtIGR5bmFtaWMgZmllbGQgZGF0YSBpbnRvIERGTmFtZSA9PiBERk5hbWUgcGFpcgogICAgICAgIG15ICVEeW5hbWljRmllbGRBY2wgPSBtYXAgeyAkXyA9PiAkXyB9IGtleXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqOwoKICAgICAgICAjIGNhbGwgdGlja2V0IEFDTHMgZm9yIER5bmFtaWNGaWVsZHMgdG8gY2hlY2sgZmllbGQgdmlzaWJpbGl0eQogICAgICAgIG15ICRBQ0xSZXN1bHQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdGb3JtJywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJy0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZEFjbCwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFDTFJlc3VsdCkgewogICAgICAgICAgICAlVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfID0+IDAgfSBrZXlzICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9LT4lKjsKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBzb3J0IGtleXMgJUFjbERhdGEgKSB7CiAgICAgICAgICAgICAgICAkVmlzaWJpbGl0eXsgJ0R5bmFtaWNGaWVsZF8nIC4gJEZpZWxkIH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfID0+IDEgfSBrZXlzICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9LT4lKjsKICAgICAgICB9CgogICAgICAgICMgcmVtZW1iZXIgZHluYW1pYyBmaWVsZCB2YWxpZGF0aW9uIHJlc3VsdCBpZiBlcnJvbmVvdXMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQ7CgogICAgICAgICAgICAjIGRvIG5vdCB2YWxpZGF0ZSBpbnZpc2libGUgZmllbGRzCiAgICAgICAgICAgIGlmICggJFZpc2liaWxpdHl7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25SZXN1bHQgPSAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCgogICAgICAgICAgICAgICAgICAgICMgTWFuZGF0b3J5IGlzIGFkZGVkIHRvIHRoZSBjb25maWdzIGJ5ICRTZWxmLT5uZXcKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e01hbmRhdG9yeX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnRXJyb3InKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHR7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CgogICAgICAgICAgICAgICAgICAgICMgbWFrZSBGb2xsb3dVcCB2aXNpYmxlIHRvIGNvcnJlY3RseSBzaG93IHRoZSBlcnJvcgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtGb2xsb3dVcFZpc2libGV9ID0gJ1Zpc2libGUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGVkaXQgYWdhaW4KICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlQm94ID0+IFxAQXJ0aWNsZUJveCwKICAgICAgICAgICAgICAgIEVycm9ycyAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICBUaWNrZXRTdGF0ZSAgID0+ICRUaWNrZXR7U3RhdGV9LAogICAgICAgICAgICAgICAgVGlja2V0U3RhdGVJRCA9PiAkVGlja2V0e1N0YXRlSUR9LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICA9PiBcJVZpc2liaWxpdHksCiAgICAgICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzID0+IFwlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBERkVycm9ycyAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgICAgIFJlcGx5ICAgICAgICAgICAgPT4gJEFjbEFjdGlvbkxvb2t1cHtDdXN0b21lclRpY2tldFpvb21SZXBseX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyB1bmxvY2sgdGlja2V0IGlmIGFnZW50IGlzIG9uIHZhY2F0aW9uIG9yIGludmFsaWQKICAgICAgICBteSAkTG9ja0FjdGlvbjsKICAgICAgICBpZiAoICRUaWNrZXR7T3duZXJJRH0gKSB7CiAgICAgICAgICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFRpY2tldHtPd25lcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAlVXNlciAmJiAoICRVc2Vye091dE9mT2ZmaWNlTWVzc2FnZX0gfHwgJFVzZXJ7VmFsaWRJRH0gbmUgJzEnICkgKSB7CiAgICAgICAgICAgICAgICAkTG9ja0FjdGlvbiA9ICd1bmxvY2snOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBsb2NrIGlmIHRpY2tldCB3YXMgY2xvc2VkCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJExvY2tBY3Rpb24KICAgICAgICAgICAgJiYgJExvY2sKICAgICAgICAgICAgJiYgJFN0YXRle1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgJiYgJFRpY2tldHtPd25lcklEfSBuZSAnMScKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICRMb2NrQWN0aW9uID0gJ2xvY2snOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRMb2NrQWN0aW9uKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICRMb2NrQWN0aW9uLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRnJvbSAgICAgPSAiXCIkU2VsZi0+e1VzZXJGdWxsbmFtZX1cIiA8JFNlbGYtPntVc2VyRW1haWx9PiI7CiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgc3RhdGUKICAgICAgICBteSAkTmV4dFN0YXRlID0gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0gfHwgJ29wZW4nOwogICAgICAgIGlmICggJEdldFBhcmFte1N0YXRlSUR9ICYmICRDb25maWctPntTdGF0ZX0gKSB7CiAgICAgICAgICAgIG15ICVOZXh0U3RhdGVEYXRhID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldCggSUQgPT4gJEdldFBhcmFte1N0YXRlSUR9ICk7CiAgICAgICAgICAgICROZXh0U3RhdGUgPSAkTmV4dFN0YXRlRGF0YXtOYW1lfTsKICAgICAgICB9CgogICAgICAgICMgY2hhbmdlIHN0YXRlIGlmCiAgICAgICAgIyBjdXN0b21lciBzZXQgYW5vdGhlciBzdGF0ZQogICAgICAgICMgb3IgdGhlIHRpY2tldCBpcyBub3QgbmV3CiAgICAgICAgaWYgKCAkVGlja2V0e1N0YXRlVHlwZX0gIX4gL15uZXcvIHx8ICRHZXRQYXJhbXtTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+U3RhdGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFN0YXRlICAgID0+ICROZXh0U3RhdGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IHVubG9jayBvbiBjbG9zZSBzdGF0ZQogICAgICAgICAgICBpZiAoICROZXh0U3RhdGUgPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UHJpb3JpdHl9ICYmICRHZXRQYXJhbXtQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGU6OkJhY2tlbmQ6OkludGVybmFsJyktPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAkQ29uZmlnLT57U2VuZGVyVHlwZX0sCiAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICRGcm9tLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgT3JpZ0hlYWRlciAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgRnJvbSAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgIFRvICAgICAgPT4gJ1N5c3RlbScsCiAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgIEJvZHkgICAgPT4gJExheW91dE9iamVjdC0+UmljaFRleHQyQXNjaWkoIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgID0+ICRDb25maWctPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSA9PiAoICRDb25maWdPYmplY3QtPkdldCgnQXV0b1Jlc3BvbnNlRm9yV2ViVGlja2V0cycpICkgPyAnYXV0byBmb2xsb3cgdXAnIDogJycsCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9CiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnRzCiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50RGF0YSkgewoKICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgIyBpZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdyaXRlIGV4aXN0aW5nIGZpbGUgdG8gYmFja2VuZAogICAgICAgICAgICAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgdGlja2V0IGR5bmFtaWMgZmllbGRzCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnVGlja2V0JzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWaXNpYmlsaXR5eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntSZWFkb25seX07CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdBcnRpY2xlJzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWaXNpYmlsaXR5eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntSZWFkb25seX07CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB1c2VyIGNsaWNrZWQgc3VibWl0IG9uIHRoZSBtYWluIHNjcmVlbgogICAgICAgICMgc3RvcmUgYWxzbyBjaGF0IHByb3RvY29sCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0Zyb21DaGF0fSAmJiAkR2V0UGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgICAgIG15ICRDaGF0T2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpOwogICAgICAgICAgICBteSBAQ2hhdE1lc3NhZ2VMaXN0ID0gJENoYXRPYmplY3QtPkNoYXRNZXNzYWdlTGlzdCgKICAgICAgICAgICAgICAgIENoYXRJRCA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRDaGF0QXJ0aWNsZUlEOwoKICAgICAgICAgICAgaWYgKEBDaGF0TWVzc2FnZUxpc3QpIHsKICAgICAgICAgICAgICAgIGZvciBteSAkTWVzc2FnZSAoQENoYXRNZXNzYWdlTGlzdCkgewogICAgICAgICAgICAgICAgICAgICRNZXNzYWdlLT57TWVzc2FnZVRleHR9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgPT4gJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0sCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtGZWF0dXJlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUNoYXRCYWNrZW5kID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnQ2hhdCcgKTsKCiAgICAgICAgICAgICAgICAkQ2hhdEFydGljbGVJRCA9ICRBcnRpY2xlQ2hhdEJhY2tlbmQtPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICAgICAgICAgIENoYXRNZXNzYWdlTGlzdCAgICAgID0+IFxAQ2hhdE1lc3NhZ2VMaXN0LAogICAgICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJENvbmZpZy0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQ2hhdEFydGljbGVJRCkgewogICAgICAgICAgICAgICAgJENoYXRPYmplY3QtPkNoYXREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVtb3ZlIGFsbCBmb3JtIGRhdGEKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICMgZGVsZXRlIGhpZGRlbiBmaWVsZHMgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICdIaWRkZW5GaWVsZHMnLAogICAgICAgICAgICBLZXkgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIHJlZGlyZWN0IHRvIHpvb20gdmlldwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbjtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfSIsCiAgICAgICAgKTsKICAgIH0KCiAgICAkVGlja2V0e1RtcENvdW50ZXJ9ICAgICAgPSAwOwogICAgJFRpY2tldHtUaWNrZXRUaW1lVW5pdHN9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudGVkVGltZUdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICk7CgogICAgIyBzZXQgcHJpb3JpdHkgZnJvbSB0aWNrZXQgYXMgZmFsbGJhY2sKICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSB8fD0gJFRpY2tldHtQcmlvcml0eUlEfTsKCiAgICAjIHNldCBpbml0aWFsIHN0YXRlCiAgICBpZiAoICRDb25maWctPntTdGF0ZX0gJiYgJENvbmZpZy0+e1N0YXRlUHJlc2V0fSApIHsKICAgICAgICBteSAlTmV4dFN0YXRlcyA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiB1bmRlZiwKICAgICAgICApOwoKICAgICAgICBpZiAoICROZXh0U3RhdGVzeyAkQ29uZmlnLT57U3RhdGVQcmVzZXR9IH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gPSAkTmV4dFN0YXRlc3sgJENvbmZpZy0+e1N0YXRlUHJlc2V0fSB9OwogICAgICAgIH0KICAgIH0KICAgICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gfHw9ICRHZXRQYXJhbXtTdGF0ZUlEfSB8fCAkVGlja2V0e1N0YXRlSUR9OwoKICAgIG15ICRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1VzZXJJRH07CgogICAgIyBHZXQgdmFsdWVzIGZvciBUaWNrZXQgZmllbGRzIGFuZCB1c2UgZGVmYXVsdCB2YWx1ZSBmb3IgQXJ0aWNsZSBmaWVsZHMsIGlmIGdpdmVuICh0aGlzCiAgICAjIHNjcmVlbiBnZW5lcmF0ZXMgYSBuZXcgYXJ0aWNsZSwgdGhlbiBhcnRpY2xlIGZpZWxkcyB3aWxsIGJlIGFsd2F5cyBkZWZhdWx0IHZhbHVlIG9yCiAgICAjIGVtcHR5IGF0IHRoZSBiZWdpbm5pbmcpLgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyApIHsKCiAgICAgICAgICAgICMgVmFsdWUgaXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZSBmcm9tIFRpY2tldC4KICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdBcnRpY2xlJyApIHsKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9IHx8ICcnOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpGaWVsZFJlc3RyaWN0aW9ucycpOwogICAgbXkgJEF1dG9zZWxlY3QgICAgICAgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkF1dG9zZWxlY3QnKSB8fCB1bmRlZjsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICMgaWYgdGVtcGxhdGVzIHNob3VsZCBiZSBhdXRvc2VsZWN0ZWQsIGF1dG9tYXRpY2FsbHkgaGlkZSB0aGVtCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJUZW1wbGF0ZTo6QXV0b3NlbGVjdCcpICkgewogICAgICAgICRBdXRvc2VsZWN0LT57U3RhbmRhcmRUZW1wbGF0ZUlEfSA9IDI7CiAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICMgZ2F0aGVyIGZpZWxkcyB3aGljaCBhcmUgc3VwcG9zZWQgdG8gYmUgaGlkZGVuIHdoZW4gYXV0b3NlbGVjdGVkCiAgICBteSAkSGlkZUF1dG9zZWxlY3RlZEpTT047CiAgICBpZiAoJEF1dG9zZWxlY3QpIHsKICAgICAgICBteSBASGlkZUF1dG9zZWxlY3RlZCA9IGdyZXAgeyAhcmVmKCAkQXV0b3NlbGVjdC0+eyRffSApICYmICRBdXRvc2VsZWN0LT57JF99ID09IDIgfSBrZXlzICV7JEF1dG9zZWxlY3R9OwogICAgICAgIGlmICggJEF1dG9zZWxlY3QtPntEeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBwdXNoIEBIaWRlQXV0b3NlbGVjdGVkLAogICAgICAgICAgICAgICAgbWFwIHsgIkR5bmFtaWNGaWVsZF8iIC4gJF8gfQogICAgICAgICAgICAgICAgKCBncmVwIHsgJEF1dG9zZWxlY3QtPntEeW5hbWljRmllbGR9eyRffSA9PSAyIH0ga2V5cyAleyAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH0gfSApOwogICAgICAgIH0KCiAgICAgICAgaWYgKEBIaWRlQXV0b3NlbGVjdGVkKSB7CiAgICAgICAgICAgIG15ICRKU09OT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKICAgICAgICAgICAgJEhpZGVBdXRvc2VsZWN0ZWRKU09OID0gJEpTT05PYmplY3QtPkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gXEBIaWRlQXV0b3NlbGVjdGVkLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRyYWNrIGNoYW5naW5nIHN0YW5kYXJkIGZpZWxkcwogICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkFDTFByZXNlbGVjdGlvbicpICkgewoKICAgICAgICAjIGdldCBjYWNoZWQgcHJlc2VsZWN0aW9uIHJ1bGVzCiAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICdUaWNrZXRBQ0wnLAogICAgICAgICAgICBLZXkgID0+ICdQcmVzZWxlY3Rpb24nLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbiApIHsKICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+U2V0QUNMUHJlc2VsZWN0aW9uQ2FjaGUoKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUNvbnZlcmdlbmNlID0gKAogICAgICAgIFN0ZEZpZWxkcyA9PiAwLAogICAgICAgIEZpZWxkcyAgICA9PiAwLAogICAgKTsKICAgIG15ICVDaGFuZ2VkRWxlbWVudHMgICAgICAgID0gKCk7CiAgICBteSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICgpOwogICAgbXkgJUNoYW5nZWRTdGRGaWVsZHM7CgogICAgbXkgJExvb3BQcm90ZWN0aW9uID0gMTAwOwogICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgbXkgJUR5bkZpZWxkU3RhdGVzID0gKAogICAgICAgIFZpc2liaWxpdHkgPT4ge30sCiAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICk7CgogICAgbXkgJEluaXRpYWxSdW4gPSAxOwoKICAgIHVudGlsICggJENvbnZlcmdlbmNle0ZpZWxkc30gKSB7CgogICAgICAgICMgZGV0ZXJtaW5lIHN0YW5kYXJkIGZpZWxkIGlucHV0CiAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSApIHsKCiAgICAgICAgICAgIG15ICVOZXdDaGFuZ2VkRWxlbWVudHM7CgogICAgICAgICAgICAjIHdoaWNoIHN0YW5kYXJkIGZpZWxkcyB0byBjaGVjayAtIEZpZWxkSUQgPT4gR2V0UGFyYW1WYWx1ZSAobmVjZXNzYXJ5IGZvciBEZXN0KQogICAgICAgICAgICBteSAlQ2hlY2sgPSAoCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVJRCA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgPT4gJ1ByaW9yaXR5SUQnLAojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRBQ0xQcmVzZWxlY3Rpb24gJiYgISRJbml0aWFsUnVuICkgewogICAgICAgICAgICAgICAgRklFTEQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRGaWVsZElEIG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57JEZpZWxkSUR9ICYmICRDaGFuZ2VkRWxlbWVudHN7JEZpZWxkSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBzb3J0IGtleXMgJUNoYW5nZWRFbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbi0+e1J1bGVzfXtUaWNrZXR9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57SW50ZXJuYWxEZXBlbmRhbmN5fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEVsZW1lbnR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEVsZW1lbnQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJENoZWNreyRGaWVsZElEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmb3IgZWFjaCBzdGFuZGFyZCBmaWVsZCB3aGljaCBoYXMgdG8gYmUgY2hlY2tlZCwgcnVuIHRoZSBkZWZpbmVkIG1ldGhvZAogICAgICAgICAgICBNRVRIT0Q6CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgTUVUSE9EIGlmICEkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH07CgogICAgICAgICAgICAgICAgIyB1c2UgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IGZvciBEZXN0PT5RdWV1ZUlECiAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7ICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSB9ID0gJEZpZWxkLT57TWV0aG9kfS0+KAogICAgICAgICAgICAgICAgICAgICRTZWxmLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc3BlY2lhbCBzdHVmZiBmb3IgUXVldWVJRC9EZXN0OiBEZXN0IGlzICJRdWV1ZUlEfHxRdWV1ZU5hbWUiID0+ICJRdWV1ZU5hbWUiOwogICAgICAgICAgICAgICAgaWYgKCAkRmllbGQtPntGaWVsZElEfSBlcSAnRGVzdCcgKSB7CiAgICAgICAgICAgICAgICAgICAgVE9zOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQga2V5cyAleyAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBUT3MgaWYgKCAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9IGVxICctJyApOwogICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7RGVzdH17IiRRdWV1ZUlEfHwkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17ICRRdWV1ZUlEIH0ifSA9ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGN1cnJlbnQgc2VsZWN0aW9uIG9mIFF1ZXVlSUQgKERlc3Qgd2lsbCBiZSBkb25lIHRvZ2V0aGVyIHdpdGggdGhlIG90aGVyIGZpZWxkcykKICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAhJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyAkR2V0UGFyYW17RGVzdH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17UXVldWVJRH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPntEZXN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIHdoZXRoZXIgY3VycmVudCBzZWxlY3RlZCB2YWx1ZSBpcyBzdGlsbCB2YWxpZCBmb3IgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9CiAgICAgICAgICAgICAgICAgICAgJiYgISRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfXsgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIyBpZiBub3QgZW1wdHkgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICAgICAgICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAhJU5ld0NoYW5nZWRFbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICgKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0LAogICAgICAgICAgICAgICAgJU5ld0NoYW5nZWRFbGVtZW50cywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJExvb3BQcm90ZWN0aW9uLS0gPCAxICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmFuIGludG8gdW5yZXNvbHZhYmxlIGxvb3AhIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBUT0RPOiBpcyByZXR1cm5pbmcgYW4gZW1wdHkgbGlzdCByZWFzb25hYmxlPwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzICAgICAgICA9ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0OwogICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKCk7CgogICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlQ3VyRmllbGRTdGF0ZXM7CiAgICAgICAgaWYgKCAlQ2hhbmdlZEVsZW1lbnRzIHx8ICRJbml0aWFsUnVuICkgewoKICAgICAgICAgICAgIyBnZXQgdmFsdWVzIGFuZCB2aXNpYmlsaXR5IG9mIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICVDdXJGaWVsZFN0YXRlcyA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+R2V0RmllbGRTdGF0ZXMoCiAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgIENoYW5nZWRFbGVtZW50cyAgICAgICAgICAgPT4gXCVDaGFuZ2VkRWxlbWVudHMsICAgICAgICAgICAgICAgIyBvcHRpb25hbCB0byByZWR1Y2UgQUNMIGV2YWx1YXRpb24KICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgICAgICAgID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgICAgICAgICAgID0+ICRBdXRvc2VsZWN0LAogICAgICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uICAgICAgICAgICA9PiAkQUNMUHJlc2VsZWN0aW9uLAogICAgICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gICAgICAgICAgICA9PiBcJExvb3BQcm90ZWN0aW9uLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb21iaW5lIEZpZWxkU3RhdGVzCiAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9ID0gewogICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tGaWVsZHN9IH0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1Zpc2liaWxpdHl9IH0sCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAjIHN0b3JlIG5ldyB2YWx1ZXMKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSB7CiAgICAgICAgICAgICAgICAleyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSB9LAogICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICMgaWYgZHluYW1pYyBmaWVsZHMgY2hhbmdlZCwgY2hlY2sgc3RhbmRhcmQgZmllbGRzIGFnYWluCiAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMDsKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9IG1hcCB7ICRfID0+IDEgfSBrZXlzICV7ICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9IH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ29udmVyZ2VuY2V7RmllbGRzfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAkSW5pdGlhbFJ1biA9IDA7CiAgICB9CgogICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkIHZhbGlkYXRpb24gcmVzdWx0IGlmIGVycm9uZW91cwogICAgbXkgJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzID0gbWFwIHsKICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkXyA9PiBkZWZpbmVkICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRffQogICAgICAgICAgICA/ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRffXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgOiB1bmRlZgogICAgfSAoIGtleXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqICk7CgogICAgIyByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gam9pbiAnJywKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICksCiAgICAgICAgJFNlbGYtPl9NYXNrKAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlQm94ID0+IFxAQXJ0aWNsZUJveCwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgVGlja2V0U3RhdGUgICA9PiAkVGlja2V0e1N0YXRlfSwKICAgICAgICAgICAgVGlja2V0U3RhdGVJRCA9PiAkVGlja2V0e1N0YXRlSUR9LAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFN0YXRlSUQgICAgICAgICAgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgIFRpY2tldFN0YXRlSUQgICAgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sICAgICAgICAgICAgICAgICAgICAgICMgVE9ETzogY2hlY2sgd2hldGhlciB0aGlzIHJpZ2h0CiAgICAgICAgICAgIEFjbEFjdGlvbiAgICAgICAgID0+IFwlQWNsQWN0aW9uLAogICAgICAgICAgICBIaWRlQXV0b3NlbGVjdGVkICA9PiAkSGlkZUF1dG9zZWxlY3RlZEpTT04sCiAgICAgICAgICAgIFZpc2liaWxpdHkgICAgICAgID0+ICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSwKICAgICAgICAgICAgQWN0aXZpdHlFcnJvckhUTUwgPT4gXCVBY3Rpdml0eUVycm9ySFRNTCwKICAgICAgICAgICAgREZQb3NzaWJsZVZhbHVlcyAgPT4gXCVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgUmVwbHkgICAgICAgICAgICAgPT4gJEFjbEFjdGlvbkxvb2t1cHtDdXN0b21lclRpY2tldFpvb21SZXBseX0sCiAgICAgICAgKSwKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIsCiAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXI7Cn0KCnN1YiBfR2V0TmV4dFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVOZXh0U3RhdGVzOwogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCgogICAgICAgICAgICAjICVQYXJhbSBjb3VsZCBjb250YWluIFRpY2tldCBUeXBlIGFzIG9ubHkgVHlwZSwgaXQgc2hvdWxkIG5vdCBiZSBzZW50CiAgICAgICAgICAgIFR5cGUgPT4gdW5kZWYsCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJU5leHRTdGF0ZXM7Cn0KCnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBteSAlUHJpb3JpdGllczsKICAgIGlmICggJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlUHJpb3JpdGllcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVQcmlvcml0aWVzOwp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgIG15ICVBY2xBY3Rpb25Mb29rdXA7CiAgICBpZiAoICRQYXJhbXtBY2xBY3Rpb259ICkgewogICAgICAgICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICV7ICRQYXJhbXtBY2xBY3Rpb259IH07CiAgICB9CgogICAgJFBhcmFte0Zvcm1JRH0gPSAkU2VsZi0+e0Zvcm1JRH07CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIHNob3cgYmFjayBsaW5rCiAgICBpZiAoICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmFjaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgYXJ0aWNsZSBzdHVmZgogICAgbXkgJFNlbGVjdGVkQXJ0aWNsZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0FydGljbGVJRCcgKSB8fCAnJzsKICAgIG15IEBBcnRpY2xlQm94ICAgICAgICA9IEB7ICRQYXJhbXtBcnRpY2xlQm94fSB9OwoKICAgICMgcHJlcGFyZSBlcnJvcnMhCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciBteSAkS2V5RXJyb3IgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Vycm9yc30gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRLZXlFcnJvcn0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRQYXJhbXtFcnJvcnN9LT57JEtleUVycm9yfSApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQXJ0aWNsZUlEICAgICAgICAgICA9ICcnOwogICAgbXkgJExhc3RDdXN0b21lckFydGljbGUgPSAnJzsKICAgIGlmIChAQXJ0aWNsZUJveCkgewoKICAgICAgICAjIGdldCBsYXN0IGN1c3RvbWVyIGFydGljbGUKICAgICAgICBteSAkQ291bnRlckFycmF5ID0gMDsKICAgICAgICBteSAkTGFzdEN1c3RvbWVyQXJ0aWNsZUlEOwogICAgICAgICRMYXN0Q3VzdG9tZXJBcnRpY2xlID0gJCNBcnRpY2xlQm94OwoKICAgICAgICBmb3IgbXkgJEFydGljbGVUbXAgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgICAgIG15ICVBcnRpY2xlID0gJXskQXJ0aWNsZVRtcH07CgogICAgICAgICAgICAjIGlmIGl0IGlzIGEgY3VzdG9tZXIgYXJ0aWNsZQogICAgICAgICAgICBpZiAoICRBcnRpY2xle1NlbmRlclR5cGV9IGVxICdjdXN0b21lcicgKSB7CiAgICAgICAgICAgICAgICAkTGFzdEN1c3RvbWVyQXJ0aWNsZUlEID0gJEFydGljbGV7QXJ0aWNsZUlEfTsKICAgICAgICAgICAgICAgICRMYXN0Q3VzdG9tZXJBcnRpY2xlICAgPSAkQ291bnRlckFycmF5OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDb3VudGVyQXJyYXkrKzsKICAgICAgICAgICAgaWYgKCAoJFNlbGVjdGVkQXJ0aWNsZUlEKSAmJiAoICRTZWxlY3RlZEFydGljbGVJRCBlcSAkQXJ0aWNsZXtBcnRpY2xlSUR9ICkgKSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUlEID0gJEFydGljbGV7QXJ0aWNsZUlEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB0cnkgdG8gdXNlIHRoZSBsYXRlc3Qgbm9uIGludGVybmFsIGFnZW50IGFydGljbGUKICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAkQXJ0aWNsZUlEICAgICAgICAgPSAkQXJ0aWNsZUJveFstMV0tPntBcnRpY2xlSUR9OwogICAgICAgICAgICAkU2VsZWN0ZWRBcnRpY2xlSUQgPSAkQXJ0aWNsZUlEOwogICAgICAgIH0KCiAgICAgICAgIyB0cnkgdG8gdXNlIHRoZSBsYXRlc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgICAgIGlmICggISRBcnRpY2xlSUQgJiYgJExhc3RDdXN0b21lckFydGljbGVJRCApIHsKICAgICAgICAgICAgJEFydGljbGVJRCAgICAgICAgID0gJExhc3RDdXN0b21lckFydGljbGVJRDsKICAgICAgICAgICAgJFNlbGVjdGVkQXJ0aWNsZUlEID0gJEFydGljbGVJRDsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBzZXQgZGlzcGxheSBvcHRpb25zCiAgICAkUGFyYW17SG9va30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9vaycpIHx8ICdUaWNrZXQjJzsKCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIHRpY2tldCBhY2NvdW50ZWQgdGltZQogICAgaWYgKCAkQ29uZmlnLT57Wm9vbVRpbWVEaXNwbGF5fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0VGltZVVuaXRzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0aWNrZXQgcHJpb3JpdHkgZmxhZwogICAgaWYgKCAkQ29uZmlnLT57QXR0cmlidXRlc1ZpZXd9LT57UHJpb3JpdHl9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eUZsYWcnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlbmRlciB0aWNrZXQgaW5mbyBoZWFkIGRlcGVuZGluZyBvbiBzeXNjb25maWcgc2V0dGluZwogICAgaWYgKCAkQ29uZmlnLT57VGlja2V0SW5mb0Rpc3BsYXlUeXBlfSBlcSAnSGVhZGVyJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVySW5mbycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCB0eXBlCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJENvbmZpZy0+e0F0dHJpYnV0ZXNWaWV3fS0+e1R5cGV9ICkgewoKICAgICAgICBteSAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBWYWxpZCA9PiAkVHlwZXtWYWxpZElEfSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgIyB0aWNrZXQgc2VydmljZQogICAgaWYgKAogICAgICAgICRQYXJhbXtTZXJ2aWNlfQogICAgICAgICYmCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICYmICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntTZXJ2aWNlfQogICAgICAgICkKICAgIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGlmICgKICAgICAgICAgICAgJFBhcmFte1NMQX0KICAgICAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkQ29uZmlnLT57QXR0cmlidXRlc1ZpZXd9LT57U0xBfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IHN0YXRlCiAgICBpZiAoICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntTdGF0ZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0aWNrZXQgcHJpb3JpdHkKICAgIGlmICggJENvbmZpZy0+e0F0dHJpYnV0ZXNWaWV3fS0+e1ByaW9yaXR5fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBxdWV1ZQogICAgaWYgKCAkQ29uZmlnLT57QXR0cmlidXRlc1ZpZXd9LT57UXVldWV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdRdWV1ZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRBZ2VudFVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwoKICAgICMgdGlja2V0IG93bmVyCiAgICBpZiAoICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntPd25lcn0gKSB7CiAgICAgICAgbXkgJE93bmVyTmFtZSA9ICRBZ2VudFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte093bmVySUR9LAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICAgICAgRGF0YSA9PiB7IE93bmVyTmFtZSA9PiAkT3duZXJOYW1lIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCByZXNwb25zaWJsZQogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpCiAgICAgICAgJiYKICAgICAgICAkQ29uZmlnLT57QXR0cmlidXRlc1ZpZXd9LT57UmVzcG9uc2libGV9CiAgICAgICAgKQogICAgewogICAgICAgIG15ICRSZXNwb25zaWJsZU5hbWUgPSAkQWdlbnRVc2VyT2JqZWN0LT5Vc2VyTmFtZSgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtSZXNwb25zaWJsZUlEfSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgUmVzcG9uc2libGVOYW1lID0+ICRSZXNwb25zaWJsZU5hbWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgY2hlY2sgaWYgdGlja2V0IGlzIG5vcm1hbCBvciBwcm9jZXNzIHRpY2tldAogICAgbXkgJElzUHJvY2Vzc1RpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENoZWNrRm9yUHJvY2Vzc1R5cGUoCiAgICAgICAgJ1RpY2tldElEJyA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICk7CgogICAgIyBzaG93IHByb2Nlc3Mgd2lkZ2V0ICBhbmQgYWN0aXZpdHkgZGlhbG9ncyBvbiBwcm9jZXNzIHRpY2tldHMKICAgIGlmICgkSXNQcm9jZXNzVGlja2V0KSB7CgogICAgICAgICMgZ2V0IHRoZSBERiB3aGVyZSB0aGUgUHJvY2Vzc0VudGl0eUlEIGlzIHN0b3JlZAogICAgICAgIG15ICRQcm9jZXNzRW50aXR5SURGaWVsZCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRQcm9jZXNzSUQiKTsKCiAgICAgICAgIyBnZXQgdGhlIERGIHdoZXJlIHRoZSBBdGl2aXR5RW50aXR5SUQgaXMgc3RvcmVkCiAgICAgICAgbXkgJEFjdGl2aXR5RW50aXR5SURGaWVsZCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRBY3Rpdml0eUlEIik7CgogICAgICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cyBmb3IgcHJvY2VzcyBtYW5hZ2VtZW50CiAgICAgICAgbXkgJEFjdGl2aXR5T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eScpOwogICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2cnKTsKICAgICAgICBteSAkUHJvY2Vzc09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MnKTsKICAgICAgICBteSAkUHJvY2Vzc0RhdGEgICAgICAgICAgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc0dldCgKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQYXJhbXskUHJvY2Vzc0VudGl0eUlERmllbGR9LAogICAgICAgICk7CgogICAgICAgIG15ICRBY3Rpdml0eURhdGEgPSAkQWN0aXZpdHlPYmplY3QtPkFjdGl2aXR5R2V0KAogICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJFBhcmFteyRBY3Rpdml0eUVudGl0eUlERmllbGR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHByb2Nlc3MgaW5mb3JtYXRpb24gaW4gdGhlIHNpZGViYXIKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFByb2Nlc3MgID0+ICRQcm9jZXNzRGF0YS0+e05hbWV9ICB8fCAnJywKICAgICAgICAgICAgICAgIEFjdGl2aXR5ID0+ICRBY3Rpdml0eURhdGEtPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCB0aGUgcHJvY2VzcyB3aWRnZXQgb24gdGhlIG1haW4gc2NyZWVuCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFdpZGdldFRpdGxlID0+ICRQYXJhbXtXaWRnZXRUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbmV4dCBhY3Rpdml0eSBkaWFsb2dzCiAgICAgICAgbXkgJE5leHRBY3Rpdml0eURpYWxvZ3M7CiAgICAgICAgaWYgKCAkUGFyYW17JEFjdGl2aXR5RW50aXR5SURGaWVsZH0gKSB7CiAgICAgICAgICAgICROZXh0QWN0aXZpdHlEaWFsb2dzID0gJEFjdGl2aXR5RGF0YTsKICAgICAgICB9CgogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJE5leHRBY3Rpdml0eURpYWxvZ3MpICkgewoKICAgICAgICAgICAgIyB3ZSBkb24ndCBuZWVkIHRoZSB3aG9sZSBBY3Rpdml0eSBjb25maWcsCiAgICAgICAgICAgICMganVzdCB0aGUgQWN0aXZpdHkgRGlhbG9ncyBvZiB0aGUgY3VycmVudCBBY3Rpdml0eQogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkTmV4dEFjdGl2aXR5RGlhbG9ncy0+e0FjdGl2aXR5RGlhbG9nfSApICkgewogICAgICAgICAgICAgICAgJXskTmV4dEFjdGl2aXR5RGlhbG9nc30gPSAleyAkTmV4dEFjdGl2aXR5RGlhbG9ncy0+e0FjdGl2aXR5RGlhbG9nfSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE5leHRBY3Rpdml0eURpYWxvZ3MgPSB7fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgiS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFByb2Nlc3MiKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgbG9hZCBwcm9jZXNzIG1vZHVsZS4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJFByb2Nlc3NNb2R1bGUgPSAoJ0tlcm5lbDo6TW9kdWxlczo6Q3VzdG9tZXJUaWNrZXRQcm9jZXNzJyktPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgID0+ICdDdXN0b21lclRpY2tldFByb2Nlc3MnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdEaXNwbGF5QWN0aXZpdHlEaWFsb2cnLAogICAgICAgICAgICAgICAgTW9kdWxlUmVnID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsnQ3VzdG9tZXJUaWNrZXRQcm9jZXNzJ30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHdlIGhhdmUgdG8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgdGhlIG5lZWRlZCBwZXJtaXNzaW9ucyB0byB2aWV3IHRoZQogICAgICAgICAgICAjIGRpZmZlcmVudCBhY3Rpdml0eSBkaWFsb2dzLCBzbyB3ZSBsb29wIG92ZXIgZXZlcnkgYWN0aXZpdHkgZGlhbG9nIGFuZCBjaGVjayBpZiB0aGVyZQogICAgICAgICAgICAjIGlzIGEgcGVybWlzc2lvbiBjb25maWd1cmVkLiBJZiB0aGVyZSBpcyBhIHBlcm1pc3Npb24gY29uZmlndXJlZCB3ZSBjaGVjayB0aGlzCiAgICAgICAgICAgICMgYW5kIGRpc3BsYXkvaGlkZSB0aGUgYWN0aXZpdHkgZGlhbG9nIGxpbmsKICAgICAgICAgICAgbXkgJVBlcm1pc3Npb25SaWdodHM7CiAgICAgICAgICAgIG15ICVQZXJtaXNzaW9uQWN0aXZpdHlEaWFsb2dMaXN0OwogICAgICAgICAgICBBQ1RJVklUWURJQUxPR1BFUk1JU1NJT046CiAgICAgICAgICAgIGZvciBteSAkSW5kZXggKCBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyROZXh0QWN0aXZpdHlEaWFsb2dzfSApIHsKICAgICAgICAgICAgICAgIG15ICRDdXJyZW50QWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JEluZGV4fTsKICAgICAgICAgICAgICAgIG15ICRDdXJyZW50QWN0aXZpdHlEaWFsb2cgICAgICAgICA9ICRBY3Rpdml0eURpYWxvZ09iamVjdC0+QWN0aXZpdHlEaWFsb2dHZXQoCiAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQ3VycmVudEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJbnRlcmZhY2UnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBhbiBpbnRlcmZhY2UgbG9va3VwLWxpc3QKICAgICAgICAgICAgICAgIG15ICVJbnRlcmZhY2VMb29rdXAgPSBtYXAgeyAkXyA9PiAxIH0gQHsgJEN1cnJlbnRBY3Rpdml0eURpYWxvZy0+e0ludGVyZmFjZX0gfTsKCiAgICAgICAgICAgICAgICBuZXh0IEFDVElWSVRZRElBTE9HUEVSTUlTU0lPTiBpZiAhJEludGVyZmFjZUxvb2t1cHtDdXN0b21lckludGVyZmFjZX07CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57UGVybWlzc2lvbn0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgcGVyZm9ybWFuY2UtYm9vc3QvY2FjaGUKICAgICAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRQZXJtaXNzaW9uUmlnaHRzeyAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57UGVybWlzc2lvbn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBlcm1pc3Npb25SaWdodHN7ICRDdXJyZW50QWN0aXZpdHlEaWFsb2ctPntQZXJtaXNzaW9ufSB9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3VzdG9tZXJQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEN1cnJlbnRBY3Rpdml0eURpYWxvZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICggISRQZXJtaXNzaW9uUmlnaHRzeyAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57UGVybWlzc2lvbn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBQ1RJVklUWURJQUxPR1BFUk1JU1NJT047CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRQZXJtaXNzaW9uQWN0aXZpdHlEaWFsb2dMaXN0eyRJbmRleH0gPSAkQ3VycmVudEFjdGl2aXR5RGlhbG9nRW50aXR5SUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVkdWNlIG5leHQgYWN0aXZpdHkgZGlhbG9ncyB0byB0aGUgb25lcyB0aGF0IGhhdmUgcGVybWlzc2lvbnMKICAgICAgICAgICAgJE5leHRBY3Rpdml0eURpYWxvZ3MgPSBcJVBlcm1pc3Npb25BY3Rpdml0eURpYWxvZ0xpc3Q7CgogICAgICAgICAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJVBlcm1pc3Npb25BY3Rpdml0eURpYWxvZ0xpc3QsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ0FjdGl2aXR5RGlhbG9nJywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICctJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAleyROZXh0QWN0aXZpdHlEaWFsb2dzfSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdOZXh0QWN0aXZpdGllcycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUGFyYW17QWN0aXZpdHlFcnJvckhUTUx9IC8vPSB7fTsKCiAgICAgICAgICAgIGZvciBteSAkTmV4dEFjdGl2aXR5RGlhbG9nS2V5ICggc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJXskTmV4dEFjdGl2aXR5RGlhbG9nc30gKSB7CiAgICAgICAgICAgICAgICBteSAkQWN0aXZpdHlEaWFsb2dEYXRhID0gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JE5leHRBY3Rpdml0eURpYWxvZ0tleX0sCiAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJbnRlcmZhY2UnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGRlY2lkZSB3aGV0aGVyIHRvIG91dHB1dCBkaXJlY3Qgc3VibWl0IG9yIGxpbmsgdG8gbmV3IHdpbmRvdwogICAgICAgICAgICAgICAgbXkgJERpcmVjdFN1Ym1pdCA9ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntEaXJlY3RTdWJtaXR9OwogICAgICAgICAgICAgICAgaWYgKCBhbnkgeyAkQWN0aXZpdHlEaWFsb2dEYXRhLT57RmllbGRzfXskX317RGlzcGxheX0gfSBrZXlzICRBY3Rpdml0eURpYWxvZ0RhdGEtPntGaWVsZHN9LT4lKiApIHsKICAgICAgICAgICAgICAgICAgICAkRGlyZWN0U3VibWl0ID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJERpcmVjdFN1Ym1pdCkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpdml0eURpYWxvZ0RpcmVjdFN1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JE5leHRBY3Rpdml0eURpYWxvZ0tleX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJEFjdGl2aXR5RGlhbG9nRGF0YS0+e1N1Ym1pdEJ1dHRvblRleHR9IHx8ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17JFByb2Nlc3NFbnRpdHlJREZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWN0aXZpdHlEaWFsb2cnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkTmV4dEFjdGl2aXR5RGlhbG9ncy0+eyROZXh0QWN0aXZpdHlEaWFsb2dLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17JFByb2Nlc3NFbnRpdHlJREZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEFjdGl2aXR5SFRNTCA9ICRQYXJhbXtBY3Rpdml0eUVycm9ySFRNTH17ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JE5leHRBY3Rpdml0eURpYWxvZ0tleX0gfSAvLyAkUHJvY2Vzc01vZHVsZS0+UnVuKAogICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJE5leHRBY3Rpdml0eURpYWxvZ3MtPnskTmV4dEFjdGl2aXR5RGlhbG9nS2V5fSwKICAgICAgICAgICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgICAgICAgID0+ICRQYXJhbXskUHJvY2Vzc0VudGl0eUlERmllbGR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NBY3Rpdml0eScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5SFRNTCAgICAgICAgICAgPT4gJEFjdGl2aXR5SFRNTCwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkTmV4dEFjdGl2aXR5RGlhbG9ncy0+eyROZXh0QWN0aXZpdHlEaWFsb2dLZXl9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkTmV4dEFjdGl2aXR5RGlhbG9ncykgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdOb0FjdGl2aXR5RGlhbG9nJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkRHluYW1pY0ZpZWxkRmlsdGVyID0gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH07CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIGdhdGhlciBjYXRlZ29yaWVzIHRvIGJlIHNob3duCiAgICBteSAlQ2F0ZWdvcmllczsKICAgIG15ICRDYXRlZ29yeUNvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRDYXRlZ29yaWVzIik7CgogICAgIyBzdGFuZGFyZCB0aWNrZXQgY2F0ZWdvcmllcwogICAgQ0FUOgogICAgZm9yIG15ICRDYXROYW1lIChxdy9Qcmlvcml0eSBUeXBlIFF1ZXVlIFNlcnZpY2UgU3RhdGUgT3duZXIvKSB7CiAgICAgICAgbmV4dCBDQVQgaWYgISRQYXJhbXskQ2F0TmFtZX07CiAgICAgICAgaWYgKCAkQ2F0ZWdvcnlDb25maWctPnskQ2F0TmFtZX0gKSB7CiAgICAgICAgICAgIG15ICRDb25mID0gJENhdGVnb3J5Q29uZmlnLT57JENhdE5hbWV9OwogICAgICAgICAgICBteSAkVGV4dCA9ICRDb25mLT57VGV4dH0gLy8gJFBhcmFteyRDYXROYW1lfTsKCiAgICAgICAgICAgICRDb25mLT57Q29sb3JTZWxlY3Rpb259IC8vPSB7fTsKICAgICAgICAgICAgbXkgJENvbG9yID0gJENvbmYtPntDb2xvclNlbGVjdGlvbn17ICRQYXJhbXskQ2F0TmFtZX0gfSAvLyAkQ29uZi0+e0NvbG9yRGVmYXVsdH07CgogICAgICAgICAgICBwdXNoIEB7ICRDYXRlZ29yaWVzeyAkQ29uZi0+e09yZGVyfSB9IH0sIHsKICAgICAgICAgICAgICAgIFRleHQgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgIENvbG9yICA9PiAkQ29sb3IsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJFBhcmFteyRDYXROYW1lfSwKICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkQ29uZiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUR5bmFtaWNGaWVsZENhdGVnb3JpZXMgPSAkQ2F0ZWdvcnlDb25maWctPntEeW5hbWljRmllbGR9CiAgICAgICAgPwogICAgICAgIG1hcCB7ICRDYXRlZ29yeUNvbmZpZy0+e0R5bmFtaWNGaWVsZH17JF99e0R5bmFtaWNGaWVsZH0gPT4gJF8gfSBrZXlzICV7ICRDYXRlZ29yeUNvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfQogICAgICAgIDogKCk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsnVGlja2V0J10sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJER5bmFtaWNGaWVsZEZpbHRlciB8fCB7fSwKICAgICk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBza2lwIHRoZSBkeW5hbWljIGZpZWxkIGlmIGlzIG5vdCBkZXNpZ25lZCBmb3IgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICAgICAgbXkgJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhZGVmaW5lZCAkVmFsdWU7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJFZhbHVlIGVxICIiOwoKICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkQmFja2VuZE9iamVjdC0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+IDI1LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwoKICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0xpbmt9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgTGlua1ByZXZpZXcgICAgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57TGlua1ByZXZpZXd9LAogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgJUNhdGVnb3JpZXMgYXMgJENhdGVnb3JpZXN7PE9yZGVyPn0gPSBbIHtUZXh0ID0+ICcnLCBDb2xvciA9PiAnJ30sIC4uLiBdCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ2F0ZWdvcmllc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgIG15ICRDb25mID0gJENhdGVnb3J5Q29uZmlnLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZENhdGVnb3JpZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9IH07CiAgICAgICAgICAgIG15ICRUZXh0ID0gJENvbmYtPntUZXh0fSAvLyAkVmFsdWVTdHJnLT57VmFsdWV9OwoKICAgICAgICAgICAgJENvbmYtPntDb2xvclNlbGVjdGlvbn0gLy89IHt9OwogICAgICAgICAgICBteSAkQ29sb3IgPSAkQ29uZi0+e0NvbG9yU2VsZWN0aW9ufXsgJFZhbHVlU3RyZy0+e1ZhbHVlfSB9IC8vICRDb25mLT57Q29sb3JEZWZhdWx0fTsKCiAgICAgICAgICAgIHB1c2ggQHsgJENhdGVnb3JpZXN7ICRDb25mLT57T3JkZXJ9IH0gfSwgewogICAgICAgICAgICAgICAgVGV4dCAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgQ29sb3IgID0+ICRDb2xvciwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgQ29uZmlnID0+ICRDb25mLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgY2F0ZWdvcmllcyBmb3IgaGVhZGVyIGFuZCBpbmZvIGJsb2NrCiAgICBpZiAoJUNhdGVnb3JpZXMpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnSW5mb0NhdGVnb3JpZXMnICk7CiAgICAgICAgZm9yIG15ICRPcmRlciAoIHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICVDYXRlZ29yaWVzICkgewogICAgICAgICAgICBmb3IgbXkgJENhdGVnb3J5ICggQHsgJENhdGVnb3JpZXN7JE9yZGVyfSB9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2F0ZWdvcmllcycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQ2F0ZWdvcnksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2F0ZWdvcmllc0knLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJENhdGVnb3J5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlzIGNoYXQgYXZhaWxhYmxlIGFuZCBpcyBzdGFydGluZyBhIGNoYXQgZnJvbSB0aWNrZXQgem9vbSBhdmFpbGFibGUKICAgIG15ICRDaGF0Q29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkN1c3RvbWVyOjpTdGFydENoYXRGcm9tVGlja2V0Jyk7CiAgICBpZiAoCiAgICAgICAgJENoYXRDb25maWctPntBbGxvd2VkfQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnQ2hhdEVuZ2luZTo6QWN0aXZlJykKICAgICAgICApCiAgICB7CiAgICAgICAgIyBnZXQgYWxsIHF1ZXVlcyB0byB0aWNrZXRzIHJlbGF0aW9ucwogICAgICAgIG15ICVRdWV1ZUNoYXRDaGFubmVsUmVsYXRpb25zID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXRDaGFubmVsJyktPkNoYXRDaGFubmVsUXVldWVzR2V0KAogICAgICAgICAgICBDdXN0b21lckludGVyZmFjZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgaWYgYSBzdXBwb3J0IGNoYXQgY2hhbm5lbCBpcyBzZXQgZm9yIHRoaXMgcXVldWUKICAgICAgICBpZiAoICRRdWV1ZUNoYXRDaGFubmVsUmVsYXRpb25zeyAkUGFyYW17UXVldWVJRH0gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgaXMgc3RhcnRpbmcgYSBjaGF0IGZyb20gdGlja2V0IHpvb20gYWxsb3dlZCB0byBhbGwgdXNlciBvciBvbmx5IHRvIHRpY2tldCBjdXN0b21lciB1c2VyX2FnZW50CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICEkQ2hhdENvbmZpZy0+e1Blcm1pc3Npb25zfQogICAgICAgICAgICAgICAgfHwgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9IGVxICRTZWxmLT57VXNlcklEfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgYWRkIGNoYXQgY2hhbm5lbElEIHRvIFBhcmFtCiAgICAgICAgICAgICAgICAkUGFyYW17Q2hhdENoYW5uZWxJRH0gPSAkUXVldWVDaGF0Q2hhbm5lbFJlbGF0aW9uc3sgJFBhcmFte1F1ZXVlSUR9IH07CgogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17Q2hhdENoYW5uZWxJRH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgc2hvdWxkIGNoYXQgYmUgYXZhaWxhYmxlIG9ubHkgaWYgdGhlcmUgYXJlIGF2YWlsYWJsZSBhZ2VudHMgaW4gdGhpcyBjaGF0IGNoYW5uZWxJRAogICAgICAgICAgICAgICAgICAgIGlmICggISRDaGF0Q29uZmlnLT57QWxsb3dDaGF0T25seUlmQWdlbnRzQXZhaWxhYmxlfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgc2hvdyBzdGFydCBhIGNoYXQgaWNvbgogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoYXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgR2V0IGNoYW5uZWxzIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUNoYXRDaGFubmVsRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0Q2hhbm5lbCcpLT5DaGF0Q2hhbm5lbEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXRDaGFubmVsSUQgPT4gJFBhcmFte0NoYXRDaGFubmVsSUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgYWxsIG9ubGluZSB1c2VycwogICAgICAgICAgICAgICAgICAgICAgICBteSAkQXZhaWxhYmlsaXR5Q2hlY2sgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIkNoYXRFbmdpbmU6OkN1c3RvbWVyRnJvbnRlbmQ6OkF2YWlsYWJpbGl0eUNoZWNrIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVBdmFpbGFibGVVc2VyczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRBdmFpbGFiaWxpdHlDaGVjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJUF2YWlsYWJsZVVzZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXQnKS0+QXZhaWxhYmxlVXNlcnNHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdFeHRlcm5hbENoYW5uZWxzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgUmVuYW1lIGhhc2gga2V5OiBDaGF0Q2hhbm5lbElEID0+IEtleQogICAgICAgICAgICAgICAgICAgICAgICAkQ2hhdENoYW5uZWxEYXRhe0tleX0gPSBkZWxldGUgJENoYXRDaGFubmVsRGF0YXtDaGF0Q2hhbm5lbElEfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkQXZhaWxhYmlsaXR5Q2hlY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRVc2VyQXZhaWxhYmxlID0gMDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkFJTEFCTEVfVVNFUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkQXZhaWxhYmxlVXNlciAoIHNvcnQga2V5cyAlQXZhaWxhYmxlVXNlcnMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBhbnkgey9eJENoYXRDaGFubmVsRGF0YXtLZXl9JC99IEB7ICRBdmFpbGFibGVVc2Vyc3skQXZhaWxhYmxlVXNlcn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJBdmFpbGFibGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IEFWQUlMQUJMRV9VU0VSOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFVzZXJBdmFpbGFibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2hhdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBwcmludCBvcHRpb24KICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpLT57Q3VzdG9tZXJUaWNrZXRQcmludH0KICAgICAgICAmJiAkQWNsQWN0aW9uTG9va3Vwe0N1c3RvbWVyVGlja2V0UHJpbnR9CiAgICAgICAgKQogICAgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmludCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJFpvb21FeHBhbmQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnWm9vbUV4cGFuZCcgKTsKICAgIGlmICggIWRlZmluZWQgJFpvb21FeHBhbmQgKSB7CiAgICAgICAgJFpvb21FeHBhbmQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0Wm9vbScpLT57Q3VzdG9tZXJab29tRXhwYW5kfSB8fCAnJzsKICAgIH0KCiAgICAjIEV4cGFuZCBvcHRpb24KICAgIG15ICRFeHBhbmRPcHRpb24gPSAoICRab29tRXhwYW5kID8gJ09uZScgICAgICAgICAgICAgIDogJ0FsbCcgKTsKICAgIG15ICRFeHBhbmRUZXh0ICAgPSAoICRab29tRXhwYW5kID8gJ1Nob3cgb25lIGFydGljbGUnIDogJ1Nob3cgYWxsIGFydGljbGVzJyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRXhwYW5kJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgWm9vbUV4cGFuZCAgID0+ICEkWm9vbUV4cGFuZCwKICAgICAgICAgICAgRXhwYW5kT3B0aW9uID0+ICRFeHBhbmRPcHRpb24sCiAgICAgICAgICAgIEV4cGFuZFRleHQgICA9PiAkRXhwYW5kVGV4dCwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkU2hvd25BcnRpY2xlczsKICAgIG15ICRMYXN0U2VuZGVyVHlwZSA9ICcnOwogICAgbXkgJEFydGljbGVIVE1MICAgID0gJyc7CgogICAgZm9yIG15ICRBcnRpY2xlVG1wICggcmV2ZXJzZSBAQXJ0aWNsZUJveCApIHsKICAgICAgICBteSAlQXJ0aWNsZSA9ICRBcnRpY2xlVG1wLT4lKjsKCiAgICAgICAgIyBjaGVjayBpZiBhcnRpY2xlIHNob3VsZCBiZSBleHBhbmRlZCAodmlzaWJsZSkKICAgICAgICBpZiAoICRTZWxlY3RlZEFydGljbGVJRCBlcSAkQXJ0aWNsZXtBcnRpY2xlSUR9IHx8ICRab29tRXhwYW5kICkgewogICAgICAgICAgICAkQXJ0aWNsZXtDbGFzc30gPSAnVmlzaWJsZSc7CiAgICAgICAgICAgICRTaG93bkFydGljbGVzKys7CiAgICAgICAgfQoKICAgICAgICAjIENhbGN1bGF0ZSBkaWZmZXJlbmNlIGJldHdlZW4gYXJ0aWNsZSBjcmVhdGUgdGltZSBhbmQgbm93IGluIHNlY29uZHMuCiAgICAgICAgbXkgJEFydGljbGVDcmVhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFydGljbGV7Q3JlYXRlVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAkRGVsdGEgPSAkQXJ0aWNsZUNyZWF0ZVRpbWVPYmplY3QtPkRlbHRhKAogICAgICAgICAgICBEYXRlVGltZU9iamVjdCA9PiAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKSwKICAgICAgICApOwoKICAgICAgICAjIGRvIHNvbWUgaHRtbCBxdW90aW5nCiAgICAgICAgJEFydGljbGV7QWdlfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICA9PiAkRGVsdGEtPntBYnNvbHV0ZVNlY29uZHN9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKCiAgICAgICAgJEFydGljbGV7U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkQXJ0aWNsZXtTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDE1MCwKICAgICAgICApOwoKICAgICAgICAkTGFzdFNlbmRlclR5cGUgPSAkQXJ0aWNsZXtTZW5kZXJUeXBlfTsKCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1Nob3dCcm93c2VyTGlua01lc3NhZ2V9ICkgewogICAgICAgICAgICBteSAlVXNlclByZWZlcmVuY2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7VXNlckN1c3RvbWVyRG9Ob3RTaG93QnJvd3NlckxpbmtNZXNzYWdlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntTaG93QnJvd3NlckxpbmtNZXNzYWdlfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQ2hhbm5lbE5hbWUgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkNoYW5uZWxOYW1lR2V0KCk7CgogICAgICAgICRBcnRpY2xlSFRNTCAuPSAkS2VybmVsOjpPTS0+R2V0KCJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0Wm9vbTo6Q3VzdG9tZXI6OiRDaGFubmVsTmFtZSIpLT5BcnRpY2xlUmVuZGVyKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgICAgICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgICA9PiAkQXJ0aWNsZXtDbGFzc30sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBTaG93QnJvd3NlckxpbmtNZXNzYWdlID0+ICRTZWxmLT57U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0sCiAgICAgICAgICAgIEFydGljbGVFeHBhbmRlZCAgICAgICAgPT4gJFNlbGVjdGVkQXJ0aWNsZUlEIGVxICRBcnRpY2xle0FydGljbGVJRH0gfHwgJFpvb21FeHBhbmQsCiAgICAgICAgICAgIEFydGljbGVBZ2UgICAgICAgICAgICAgPT4gJEFydGljbGV7QWdlfSwKICAgICAgICApOwogICAgfQoKICAgICMgVE9ETzogUmVmYWN0b3IKICAgICMgaWYgdGhlcmUgYXJlIG5vIHZpZXdhYmxlIGFydGljbGVzIHNob3cgTm9BcnRpY2xlcyBtZXNzYWdlCiAgICBpZiAoICFAQXJ0aWNsZUJveCApIHsKICAgICAgICAkUGFyYW17Tm9BcnRpY2xlc30gPSAxOwogICAgfQoKICAgIG15ICVBcnRpY2xlOwogICAgaWYgKEBBcnRpY2xlQm94KSB7CgogICAgICAgIG15ICRBcnRpY2xlT0IgPSB7fTsKICAgICAgICBpZiAoJExhc3RDdXN0b21lckFydGljbGUpIHsKICAgICAgICAgICAgJEFydGljbGVPQiA9ICRBcnRpY2xlQm94WyRMYXN0Q3VzdG9tZXJBcnRpY2xlXTsKICAgICAgICB9CgogICAgICAgICVBcnRpY2xlID0gJEFydGljbGVPQi0+JSo7CgogICAgICAgICMgaWYgbm8gY3VzdG9tZXIgYXJ0aWNsZXMgZm91bmQgdXNlIHRpY2tldCB2YWx1ZXMKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVBcnRpY2xlICkgKSB7CiAgICAgICAgICAgICVBcnRpY2xlID0gJVBhcmFtOwogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZXtTdGF0ZUlEfSApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xle1N0YXRlSUR9ID0gJFBhcmFte1RpY2tldFN0YXRlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEFydGljbGVUbXAgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgICAgIG15ICVBcnRpY2xlVG1wMSA9ICRBcnRpY2xlVG1wLT4lKjsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZUlEIGVxICRBcnRpY2xlVG1wMXtBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAgICAgJUFydGljbGUgPSAlQXJ0aWNsZVRtcDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBmYWxsYmFjayB0byB0aWNrZXQgaW5mbyBpZiB0aGVyZSBpcyBubyBhcnRpY2xlCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVBcnRpY2xlICkgKSB7CiAgICAgICAgJUFydGljbGUgPSAlUGFyYW07CiAgICAgICAgaWYgKCAhJEFydGljbGV7U3RhdGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1N0YXRlSUR9ID0gJFBhcmFte1RpY2tldFN0YXRlSUR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGZvbGxvdyB1cCBwZXJtaXNzaW9ucwogICAgbXkgJEZvbGxvd1VwUG9zc2libGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0Rm9sbG93VXBPcHRpb24oCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgKTsKICAgIG15ICVTdGF0ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldCgKICAgICAgICBJRCA9PiAkVGlja2V0e1N0YXRlSUR9LAogICAgKTsKICAgIGlmICgKICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRDdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICd1cGRhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICkKICAgICAgICAmJiAoCiAgICAgICAgICAgICggJEZvbGxvd1VwUG9zc2libGUgIX4gLyhuZXcgdGlja2V0fHJlamVjdCkvaSAmJiAkU3RhdGV7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApCiAgICAgICAgICAgIHx8ICRTdGF0ZXtUeXBlTmFtZX0gIX4gL15jbG9zZXxtZXJnZWQvaQogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgIGlmICggJFBhcmFte0hpZGVBdXRvc2VsZWN0ZWR9ICkgewoKICAgICAgICAgICAgIyBhZGQgQXV0b3NlbGVjdCBKUwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU09uRG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIENvZGUgPT4gIkNvcmUuRm9ybS5Jbml0SGlkZUF1dG9zZWxlY3RlZCh7IEZpZWxkSURzOiAkUGFyYW17SGlkZUF1dG9zZWxlY3RlZH0gfSk7IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGluZm9ybWF0aW9uIHdoZXRoZXIgYWN0aXZhdGVkIGFjdGl2aXR5IGRpYWxvZyBidXR0b24gc2hvdWxkIGJlIGhpZGRlbgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0hpZGVBY3RpdmF0ZWRBY3Rpdml0eURpYWxvZ0J1dHRvbicsCiAgICAgICAgICAgIFZhbHVlID0+ICRDb25maWctPnsnSGlkZUFjdGl2YXRlZEFjdGl2aXR5RGlhbG9nQnV0dG9uJ30gLy8gMCwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHN1YmplY3QKICAgICAgICBpZiAoICEkUGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtTdWJqZWN0fSA9ICJSZTogIiAuICggJFBhcmFte1RpdGxlfSAvLyAnJyApOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtSZXBseX0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVwbHlCdXR0b24nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRm9sbG93VXAnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAjIGNoZWNrIGlmIGV4aXN0cyBjdXN0b21lciBhbnN3ZXIgdGVtcGxhdGVzIHJlZ2FyZGxlc3MgdGhlIHF1ZXVlIGFuZCB0aGUgc2VydmljZQogICAgICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJyktPlN0YW5kYXJkVGVtcGxhdGVMaXN0KAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBUeXBlICA9PiAnQ3VzdG9tZXJBbnN3ZXInLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgdGV4dCB0ZW1wbGF0ZSBzdHJpbmcKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YW5kYXJkVGVtcGxhdGVzICkgKSB7CgogICAgICAgICAgICAjIGZldGNoIGFsbCBhdmFpbGFibGUgc3RkLiB0ZW1wbGF0ZXMKICAgICAgICAgICAgbXkgJEF2YWlsYWJsZVN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRBdmFpbGFibGVTdGFuZGFyZFRlbXBsYXRlcyB8fCB7fSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSB8fCAnJywKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhbmRhcmRUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgogICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICAgICAjIHNldCB1cCBjdXN0b21lciByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyU2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICBpZiAoICRDb25maWctPntTdGF0ZX0gKSB7CiAgICAgICAgICAgIG15ICROZXh0U3RhdGVzID0gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVTdGF0ZVNlbGVjdGVkOwogICAgICAgICAgICBpZiAoICRQYXJhbXtTdGF0ZUlEfSApIHsKICAgICAgICAgICAgICAgICRTdGF0ZVNlbGVjdGVke1NlbGVjdGVkSUR9ID0gJFBhcmFte1N0YXRlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFN0YXRlU2VsZWN0ZWR7U2VsZWN0ZWRWYWx1ZX0gPSAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17TmV4dFN0YXRlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhID0+ICROZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVJRCcsCiAgICAgICAgICAgICAgICAlU3RhdGVTZWxlY3RlZCwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUgRm9ybVVwZGF0ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZvbGxvd1VwU3RhdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRDb25maWctPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVQcmlvcml0eVNlbGVjdGVkOwogICAgICAgICAgICBpZiAoICRQYXJhbXtQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eVNlbGVjdGVke1NlbGVjdGVkSUR9ID0gJFBhcmFte1ByaW9yaXR5SUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFByaW9yaXR5U2VsZWN0ZWR7U2VsZWN0ZWRWYWx1ZX0gPSAkQ29uZmlnLT57UHJpb3JpdHlEZWZhdWx0fQogICAgICAgICAgICAgICAgICAgIHx8ICczIG5vcm1hbCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgPT4gJFByaW9yaXRpZXMsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICVQcmlvcml0eVNlbGVjdGVkLAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZSBGb3JtVXBkYXRlJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGb2xsb3dVcFByaW9yaXR5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRTZXBhcmF0ZUR5bmFtaWNGaWVsZHMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6Q3VzdG9tZXJGcm9udGVuZDo6U2VwYXJhdGVEeW5hbWljRmllbGRzJyk7CgogICAgICAgICMgcmVuZGVyIGR5bmFtaWMgZmllbGRzCiAgICAgICAgaWYgKCAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfS0+JSogKSB7CgogICAgICAgICAgICAjIGdyZXAgZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlcyA9IG1hcCB7ICRfID0+ICRQYXJhbXskX30gfSBncmVwIHsvXkR5bmFtaWNGaWVsZF8vfSBrZXlzICVQYXJhbTsKCiAgICAgICAgICAgICMgVE9ETyByZW5kZXJpbmcgdGhyb3dzIGVycm9yICdOZWVkIElEIGluIER5bmFtaWNGaWVsZENvbmZpZyEnIGluIHByb2Nlc3MgY2FzZSBiZWNhdXNlIGlkcyBpbiAlRHluYW1pY0ZpZWxkQ29uZmlnIGFyZSBjb25jYXRlbmF0ZWQgd2l0aCBhY3Rpdml0eWRpYWxvZ2lkCiAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGRIVE1MfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpEeW5hbWljRmllbGQ6Ok1hc2snKS0+RWRpdFNlY3Rpb25SZW5kZXIoCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICAgPT4gJFNlbGYtPntNYXNrRGVmaW5pdGlvbn0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgPT4gJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRWYWx1ZXMgICAgPT4gXCVEeW5hbWljRmllbGRWYWx1ZXMsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciAgPT4gJFBhcmFte0RGUG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICAgID0+ICRQYXJhbXtERkVycm9yc30sCiAgICAgICAgICAgICAgICBWaXNpYmlsaXR5ICAgICAgICAgICAgPT4gJFBhcmFte1Zpc2liaWxpdHl9LAogICAgICAgICAgICAgICAgU2VwYXJhdGVEeW5hbWljRmllbGRzID0+ICRTZXBhcmF0ZUR5bmFtaWNGaWVsZHMsCiAgICAgICAgICAgICAgICBDdXN0b21lckludGVyZmFjZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgICAgPT4gJFNlbGYtPntDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgJUR5bmFtaWNGaWVsZFZhbHVlcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRhY2htZW50TGlzdH0gfSwgJEF0dGFjaG1lbnQ7CiAgICAgICAgfQogICAgfQoKICAgICMgbmFtZSBhbmQgYXZhdGFyCiAgICBteSAlQ3VzdG9tZXJVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgIFVzZXIgPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9IHx8ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgKTsKICAgIG15ICggJEF2YXRhciwgJFVzZXJJbml0aWFscyApOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpBdmF0YXJFbmdpbmUnKSBlcSAnR3JhdmF0YXInICYmICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfSApIHsKICAgICAgICBteSAkRGVmYXVsdEljb24gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpHcmF2YXRhcjo6RGVmYXVsdEltYWdlJykgfHwgJ21tJzsKICAgICAgICAkQXZhdGFyID0gJy8vd3d3LmdyYXZhdGFyLmNvbS9hdmF0YXIvJyAuIG1kNV9oZXgoIGxjICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfSApIC4gJz9zPTEwMCZkPScgLiAkRGVmYXVsdEljb247CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkVXNlckluaXRpYWxzID0gc3Vic3RyKCAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdE5hbWV9LCAwLCAxICkgLiBzdWJzdHIoICRDdXN0b21lclVzZXJ7VXNlckxhc3ROYW1lfSwgMCwgMSApOwogICAgfQoKICAgICMgZXhwbGFuYXRvcnkgbWVzc2FnZSBhYm91dCBhc3RlcmlzawogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFzdGVyaXNrRXhwbGFuYXRpb24nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXN0ZXJpc2tFeHBsYW5hdGlvbicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlbGVjdCB0aGUgb3V0cHV0IHRlbXBsYXRlCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJUaWNrZXRab29tJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBUaWNrZXRJbmZvRGlzcGxheVR5cGUgPT4gJENvbmZpZy0+e1RpY2tldEluZm9EaXNwbGF5VHlwZX0gfHwgJ0hlYWRlcicsCiAgICAgICAgICAgIEFydGljbGVzICAgICAgICAgICAgICA9PiAkQXJ0aWNsZUhUTUwsCiAgICAgICAgICAgIEF2YXRhciAgICAgICAgICAgICAgICA9PiAkQXZhdGFyLAogICAgICAgICAgICBVc2VySW5pdGlhbHMgICAgICAgICAgPT4gJFVzZXJJbml0aWFscywKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSAgICAgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgICAgICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJMYXN0bmFtZX0sCiAgICAgICAgfSwKICAgICk7Cn0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKc3ViIF9HZXRTdGFuZGFyZFRlbXBsYXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJFF1ZXVlSUQgICAgICAgPSAkUGFyYW17UXVldWVJRH0gICB8fCAnJzsKICAgIG15ICRTZXJ2aWNlSUQgICAgID0gJFBhcmFte1NlcnZpY2VJRH0gfHwgJyc7CiAgICBteSAkQ29uZmlnT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUXVldWVPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKICAgIG15ICVBdmFpbGFibGVTdGFuZGFyZFRlbXBsYXRlczsKICAgIG15ICRSZWZlcmVuY2VBdHRyaWJ1dGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVGVtcGxhdGU6OlJlZmVyZW5jZUF0dHJpYnV0ZScpIHx8ICdRdWV1ZSc7CiAgICBpZiAoICRSZWZlcmVuY2VBdHRyaWJ1dGUgZXEgJ1F1ZXVlJyApIHsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQKICAgICAgICByZXR1cm4ge30gaWYgISRRdWV1ZUlEICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICAgICBpZiAoICEkUXVldWVJRCAmJiAkUGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAgICAgIyBnZXQgUXVldWVJRCBmcm9tIHRoZSB0aWNrZXQKICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJFRpY2tldHtRdWV1ZUlEfSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7fSBpZiAhJFF1ZXVlSUQ7CgogICAgICAgICMgZmV0Y2ggYWxsIHN0ZC4gdGVtcGxhdGVzCiAgICAgICAgJUF2YWlsYWJsZVN0YW5kYXJkVGVtcGxhdGVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFJlZmVyZW5jZUF0dHJpYnV0ZSBlcSAnU2VydmljZScgKSB7CgogICAgICAgICMgY2hlY2sgbmVlZGVkCiAgICAgICAgcmV0dXJuIHt9IGlmICEkU2VydmljZUlEICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICAgICBpZiAoICEkU2VydmljZUlEICYmICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBTZXJ2aWNlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VydmljZUlEID0gJFRpY2tldHtTZXJ2aWNlSUR9IHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHt9IGlmICEkU2VydmljZUlEOwoKICAgICAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgICAgICVBdmFpbGFibGVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGZldGNoIHN0YW5kYXJkIHRlbXBsYXRlcyBsaXN0ISBJbnZhbGlkIHJlZmVyZW5jZSBhdHRyaWJ1dGUgJyRSZWZlcmVuY2VBdHRyaWJ1dGUnIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4ge30gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkQXZhaWxhYmxlU3RhbmRhcmRUZW1wbGF0ZXN7Q3VzdG9tZXJBbnN3ZXJ9ICk7CgogICAgIyByZXR1cm4ganVzdCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuICRBdmFpbGFibGVTdGFuZGFyZFRlbXBsYXRlc3tDdXN0b21lckFuc3dlcn07Cn0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/AdminTemplate.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL01vZHVsZXMvQWRtaW5UZW1wbGF0ZS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5UZW1wbGF0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIGlmICggISRQYXJhbXtBY2Nlc3NSd30gJiYgJFBhcmFte0FjY2Vzc1JvfSApIHsKICAgICAgICAkU2VsZi0+e0xpZ2h0QWRtaW59ID0gMTsKICAgIH0KCiAgICAjIHNldCBwcmVmIGZvciBjb2x1bW5zIGtleQogICAgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9ID0gJ0luY2x1ZGVJbnZhbGlkJyAuICctJyAuICRTZWxmLT57QWN0aW9ufTsKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA9ICRQcmVmZXJlbmNlc3sgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9IH07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKTsKICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgbXkgJE5vdGlmaWNhdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOb3RpZmljYXRpb24nICkgfHwgJyc7CgogICAgJFBhcmFte0luY2x1ZGVJbnZhbGlkfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJbmNsdWRlSW52YWxpZCcgKTsKCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0luY2x1ZGVJbnZhbGlkfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57UHJlZktleUluY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgVmFsdWUgID0+ICRQYXJhbXtJbmNsdWRlSW52YWxpZH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntJbmNsdWRlSW52YWxpZH0gPSAkUGFyYW17SW5jbHVkZUludmFsaWR9OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2hhbmdlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlJyApIHsKICAgICAgICBteSAkSUQgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSB8fCAnJzsKICAgICAgICBteSAlRGF0YSA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5TdGFuZGFyZFRlbXBsYXRlR2V0KAogICAgICAgICAgICBJRCA9PiAkSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFNlbGVjdGVkQXR0YWNobWVudDsKICAgICAgICBteSAlU2VsZWN0ZWRBdHRhY2htZW50RGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkSUQsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlU2VsZWN0ZWRBdHRhY2htZW50RGF0YSApIHsKICAgICAgICAgICAgcHVzaCBAU2VsZWN0ZWRBdHRhY2htZW50LCAkS2V5OwogICAgICAgIH0KCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICBpZiAoICRTZWxmLT57TGlnaHRBZG1pbn0gKSB7CiAgICAgICAgICAgIG15ICVRdWV1ZXMgPSAkUXVldWVPYmplY3QtPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkSUQgKTsKICAgICAgICAgICAgJERhdGF7UGVybWlzc2lvbn0gPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBRdWV1ZUlEcyA9PiBbIGtleXMgJVF1ZXVlcyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgRGVmYXVsdCAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgTm8gcGVybWlzc2lvbiBmb3IgdGhlIHRlbXBsYXRlLgogICAgICAgICAgICBpZiAoICEkRGF0YXtQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICVEYXRhID0gKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRGF0YXtQZXJtaXNzaW9ufSBlcSAncm8nICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ05vdGljZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBwZXJtaXNzaW9uIHRvIGVkaXQgdGhpcyB0ZW1wbGF0ZS4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgdXBkYXRlZCEnKSApCiAgICAgICAgICAgIGlmICggJE5vdGlmaWNhdGlvbiAmJiAkTm90aWZpY2F0aW9uIGVxICdVcGRhdGUnICk7CgogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgU2VsZWN0ZWRBdHRhY2htZW50cyA9PiBcQFNlbGVjdGVkQXR0YWNobWVudCwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluVGVtcGxhdGUnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgQE5ld0lEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJRHMnICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICBteSBAQ2hlY2tlZElEczsKICAgICAgICAgICAgZm9yIG15ICRJRCAoQE5ld0lEcykgewogICAgICAgICAgICAgICAgbXkgJFBlcm1pc3Npb24gPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIElEICAgICA9PiAkSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uIGVxICdydycgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAQ2hlY2tlZElEcywgJElEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIEBOZXdJRHMgPSBAQ2hlY2tlZElEczsKICAgICAgICB9CgogICAgICAgIG15ICggJUdldFBhcmFtLCAlRXJyb3JzICk7CiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KElEIE5hbWUgQ29tbWVudCBWYWxpZElEIFRlbXBsYXRlVHlwZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFteydUZW1wbGF0ZSd9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSgKICAgICAgICAgICAgUGFyYW0gPT4gJ1RlbXBsYXRlJywKICAgICAgICAgICAgUmF3ICAgPT4gMQogICAgICAgICkgfHwgJyc7CgogICAgICAgICMgZ2V0IGNvbXBvc2VkIGNvbnRlbnQgdHlwZQogICAgICAgICRHZXRQYXJhbXtDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgZGF0YQogICAgICAgIGZvciBteSAkTmVlZGVkIChxdyhOYW1lIFZhbGlkSUQgVGVtcGxhdGVUeXBlKSkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3JzeyAkTmVlZGVkIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGEgc3RhbmRhcmQgdGVtcGxhdGUgZXhpc3Qgd2l0aCB0aGlzIG5hbWUKICAgICAgICBteSAkTmFtZUV4aXN0cyA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5OYW1lRXhpc3RzQ2hlY2soCiAgICAgICAgICAgIE5hbWUgPT4gJEdldFBhcmFte05hbWV9LAogICAgICAgICAgICBJRCAgID0+ICRHZXRQYXJhbXtJRH0KICAgICAgICApOwoKICAgICAgICBpZiAoJE5hbWVFeGlzdHMpIHsKICAgICAgICAgICAgJEVycm9yc3tOYW1lRXhpc3RzfSAgICA9IDE7CiAgICAgICAgICAgICRFcnJvcnN7J05hbWVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICBteSAlUXVldWVzICAgICA9ICRRdWV1ZU9iamVjdC0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCggU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtJRH0gKTsKICAgICAgICAgICAgbXkgJFBlcm1pc3Npb24gPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBRdWV1ZUlEcyA9PiBbIGtleXMgJVF1ZXVlcyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgRGVmYXVsdCAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgTm8gcGVybWlzc2lvbiB0byBjaGFuZ2UgdGhlIHRlbXBsYXRlLgogICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uIG5lICdydycgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3Jze05vUGVybWlzc2lvbn0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIGVycm9ycyBvY2N1cnJlZAogICAgICAgIGlmICggISVFcnJvcnMgKSB7CgogICAgICAgICAgICAjIHVwZGF0ZSBncm91cAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+U3RhbmRhcmRUZW1wbGF0ZVVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzQWxsID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRMaXN0KCk7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgaGFzaCB3aXRoIHNlbGVjdGVkIHF1ZXVlcwogICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzU2VsZWN0ZWQgPSBtYXAgeyAkXyA9PiAxIH0gQE5ld0lEczsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGFsbCB1c2VkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnRJRCAoIHNvcnQga2V5cyAlQXR0YWNobWVudHNBbGwgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFjdGl2ZSA9ICRBdHRhY2htZW50c1NlbGVjdGVkeyRBdHRhY2htZW50SUR9ID8gMSA6IDA7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IGF0dGFjaG1lbnQgdG8gc3RhbmRhcmQgdGVtcGxhdGUgcmVsYXRpb24KICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudElEICAgICAgID0+ICRBdHRhY2htZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBBY3RpdmUgICAgICAgICAgICAgPT4gJEFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgaWYgdGhlIHVzZXIgd291bGQgbGlrZSB0byBjb250aW51ZSBlZGl0aW5nIHRoZSB0ZW1wbGF0ZSwganVzdCByZWRpcmVjdCB0byB0aGUgZWRpdCBzY3JlZW4KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKQogICAgICAgICAgICAgICAgICAgICYmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbnRpbnVlQWZ0ZXJTYXZlJyApIGVxICcxJyApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1DaGFuZ2U7SUQ9JElEO05vdGlmaWNhdGlvbj1VcGRhdGUiCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSByZXR1cm4gdG8gb3ZlcnZpZXcKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O05vdGlmaWNhdGlvbj1VcGRhdGUiICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc29tZXRoaW5nIGhhcyBnb25lIHdyb25nCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBQcmlvcml0eSA9PiAnRXJyb3InICk7CiAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgID0+ICdDaGFuZ2UnLAogICAgICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3JzLAogICAgICAgICAgICBTZWxlY3RlZEF0dGFjaG1lbnRzID0+IFxATmV3SURzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkJyApIHsKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgJEdldFBhcmFte05hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hbWUnICk7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdBZGQnLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZEFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15IEBOZXdJRHMgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAnSURzJyApOwogICAgICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKICAgICAgICAgICAgbXkgQENoZWNrZWRJRHM7CiAgICAgICAgICAgIGZvciBteSAkSUQgKEBOZXdJRHMpIHsKICAgICAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBJRCAgICAgPT4gJElELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbiBlcSAncncnICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQENoZWNrZWRJRHMsICRJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBATmV3SURzID0gQENoZWNrZWRJRHM7CiAgICAgICAgfQoKICAgICAgICBteSAoICVHZXRQYXJhbSwgJUVycm9ycyApOwoKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAocXcoSUQgTmFtZSBDb21tZW50IFZhbGlkSUQgVGVtcGxhdGVUeXBlKSkgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAkR2V0UGFyYW17J1RlbXBsYXRlJ30gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICBQYXJhbSA9PiAnVGVtcGxhdGUnLAogICAgICAgICAgICBSYXcgICA9PiAxCiAgICAgICAgKSB8fCAnJzsKCiAgICAgICAgIyBnZXQgY29tcG9zZWQgY29udGVudCB0eXBlCiAgICAgICAgJEdldFBhcmFte0NvbnRlbnRUeXBlfSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Q29udGVudFR5cGV9ID0gJ3RleHQvaHRtbCc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBkYXRhCiAgICAgICAgZm9yIG15ICROZWVkZWQgKHF3KE5hbWUgVmFsaWRJRCBUZW1wbGF0ZVR5cGUpKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnN7ICROZWVkZWQgLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgYSBzdGFuZGFyZCB0ZW1wbGF0ZSBleGlzdHMgd2l0aCB0aGlzIG5hbWUKICAgICAgICBteSAkTmFtZUV4aXN0cyA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5OYW1lRXhpc3RzQ2hlY2soIE5hbWUgPT4gJEdldFBhcmFte05hbWV9ICk7CiAgICAgICAgaWYgKCROYW1lRXhpc3RzKSB7CiAgICAgICAgICAgICRFcnJvcnN7TmFtZUV4aXN0c30gICAgPSAxOwogICAgICAgICAgICAkRXJyb3JzeydOYW1lSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgaWYgbm8gZXJyb3JzIG9jY3VycmVkCiAgICAgICAgaWYgKCAhJUVycm9ycyApIHsKCiAgICAgICAgICAgICMgYWRkIHRlbXBsYXRlCiAgICAgICAgICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlSUQgPSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+U3RhbmRhcmRUZW1wbGF0ZUFkZCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU3RhbmRhcmRUZW1wbGF0ZUlEKSB7CgogICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzQWxsID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRMaXN0KCk7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgaGFzaCB3aXRoIHNlbGVjdGVkIHF1ZXVlcwogICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzU2VsZWN0ZWQgPSBtYXAgeyAkXyA9PiAxIH0gQE5ld0lEczsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGFsbCB1c2VkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnRJRCAoIHNvcnQga2V5cyAlQXR0YWNobWVudHNBbGwgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFjdGl2ZSA9ICRBdHRhY2htZW50c1NlbGVjdGVkeyRBdHRhY2htZW50SUR9ID8gMSA6IDA7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IGF0dGFjaG1lbnQgdG8gc3RhbmRhcmQgdGVtcGxhdGUgcmVsYXRpb24KICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudElEICAgICAgID0+ICRBdHRhY2htZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkU3RhbmRhcmRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgICAgICBBY3RpdmUgICAgICAgICAgICAgPT4gJEFjdGl2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoKTsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiBUcmFuc2xhdGFibGUoJ1RlbXBsYXRlIGFkZGVkIScpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5UZW1wbGF0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZwogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggUHJpb3JpdHkgPT4gJ0Vycm9yJyApOwogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICA9PiAnQWRkJywKICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICA9PiBcJUVycm9ycywKICAgICAgICAgICAgU2VsZWN0ZWRBdHRhY2htZW50cyA9PiBcQE5ld0lEcywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5UZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRlbGV0ZSBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEZWxldGUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAkSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICk7CgogICAgICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKICAgICAgICAgICAgbXkgJVF1ZXVlcyAgICAgPSAkUXVldWVPYmplY3QtPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkSUQgKTsKICAgICAgICAgICAgbXkgJFBlcm1pc3Npb24gPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBRdWV1ZUlEcyA9PiBbIGtleXMgJVF1ZXVlcyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgRGVmYXVsdCAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgTm8gcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIHRlbXBsYXRlLgogICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uIG5lICdydycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJERlbGV0ZSA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5TdGFuZGFyZFRlbXBsYXRlRGVsZXRlKAogICAgICAgICAgICBJRCA9PiAkSUQsCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkRGVsZXRlICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJERlbGV0ZSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoKTsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdUZW1wbGF0ZSB1cGRhdGVkIScpICkKICAgICAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uICYmICROb3RpZmljYXRpb24gZXEgJ1VwZGF0ZScgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5UZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9FZGl0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25PdmVydmlldycgKTsKCiAgICAjIGdldCB2YWxpZCBsaXN0CiAgICBteSAlVmFsaWRMaXN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgIG15ICVWYWxpZExpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwoKICAgICRQYXJhbXtWYWxpZE9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1ZhbGlkSUR9IHx8ICRWYWxpZExpc3RSZXZlcnNle3ZhbGlkfSwKICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQgJyAuICggJFBhcmFte0Vycm9yc30tPnsnVmFsaWRJREludmFsaWQnfSB8fCAnJyApLAogICAgKTsKCiAgICBteSAkVGVtcGxhdGVUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU3RhbmRhcmRUZW1wbGF0ZTo6VHlwZXMnKTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICMgcmV0cmlldmUgYW5kIGFkZCBjdXN0b21lciBzcGVjaWZpYyB0eXBlcwogICAgbXkgJFRlbXBsYXRlQ3VzdG9tZXJUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU3RhbmRhcmRUZW1wbGF0ZTo6Q3VzdG9tZXJUeXBlcycpOwogICAgJFRlbXBsYXRlVHlwZUxpc3QgPSB7CiAgICAgICAgJXsgJFRlbXBsYXRlVHlwZUxpc3QgLy8ge30gfSwKICAgICAgICAleyAkVGVtcGxhdGVDdXN0b21lclR5cGVMaXN0IC8vIHt9IH0sCiAgICB9OwojIEVPIEN1c3RvbWVyVGVtcGxhdGUKCiAgICAkUGFyYW17VGVtcGxhdGVUeXBlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJFRlbXBsYXRlVHlwZUxpc3QsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGVtcGxhdGVUeXBlJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtUZW1wbGF0ZVR5cGV9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gKCAkUGFyYW17RXJyb3JzfS0+eydUZW1wbGF0ZVR5cGVJbnZhbGlkJ30gfHwgJycgKSwKICAgICk7CgogICAgbXkgJFN0ZEF0dGFjaG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudCcpOwogICAgbXkgJUF0dGFjaG1lbnREYXRhICAgICAgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudExpc3QoIFZhbGlkID0+IDEgKTsKCiAgICBpZiAoICRTZWxmLT57TGlnaHRBZG1pbn0gKSB7CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJUF0dGFjaG1lbnREYXRhICkgewogICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZVBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBJRCAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQXR0YWNobWVudERhdGF7JEtleX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte0F0dGFjaG1lbnRPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlQXR0YWNobWVudERhdGEsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdJRHMnLAogICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgIFNpemUgICAgICAgICA9PiA2LAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U2VsZWN0ZWRBdHRhY2htZW50c30sCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICBteSAkSFRNTFV0aWxzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpOwoKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgcmVmb3JtYXQgZnJvbSBwbGFpbiB0byBodG1sCiAgICAgICAgaWYgKCAkUGFyYW17Q29udGVudFR5cGV9ICYmICRQYXJhbXtDb250ZW50VHlwZX0gPX4gL3RleHRcL3BsYWluL2kgKSB7CiAgICAgICAgICAgICRQYXJhbXtUZW1wbGF0ZX0gPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0hUTUwoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1RlbXBsYXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyByZWZvcm1hdCBmcm9tIGh0bWwgdG8gcGxhaW4KICAgICAgICBpZiAoICRQYXJhbXtDb250ZW50VHlwZX0gJiYgJFBhcmFte0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvaHRtbC9pICkgewogICAgICAgICAgICAkUGFyYW17VGVtcGxhdGV9ID0gJEhUTUxVdGlsc09iamVjdC0+VG9Bc2NpaSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17VGVtcGxhdGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1VwZGF0ZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte0Vycm9yc30gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgYXBwcm9wcmlhdGUgbWVzc2FnZXMgZm9yIFNlcnZlckVycm9yCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Vycm9yc30tPntOYW1lRXhpc3RzfSAmJiAkUGFyYW17RXJyb3JzfS0+e05hbWVFeGlzdHN9ID09IDEgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0V4aXN0TmFtZVNlcnZlckVycm9yJyApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ05hbWVTZXJ2ZXJFcnJvcicgKTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25BZGQnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJbmNsdWRlSW52YWxpZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEluY2x1ZGVJbnZhbGlkICAgICAgICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgSW5jbHVkZUludmFsaWRDaGVja2VkID0+ICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID8gJ2NoZWNrZWQnIDogJycsCiAgICAgICAgfSwKICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRmlsdGVyJyApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKTsKICAgIG15ICVMaXN0ICAgICAgICAgICAgICAgICAgID0gJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPlN0YW5kYXJkVGVtcGxhdGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIFZhbGlkICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA/IDAgOiAxLAogICAgKTsKCiAgICAjIGlmIHRoZXJlIGFyZSBhbnkgcmVzdWx0cywgdGhleSBhcmUgc2hvd24KICAgIGlmICglTGlzdCkgewoKICAgICAgICBteSAlTGlzdEdldDsKICAgICAgICBmb3IgbXkgJElEICggc29ydCBrZXlzICVMaXN0ICkgewogICAgICAgICAgICAleyAkTGlzdEdldHskSUR9IH0gPSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+U3RhbmRhcmRUZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExpc3RHZXR7JElEfS0+e1NvcnROYW1lfSA9ICRMaXN0R2V0eyRJRH0tPntUZW1wbGF0ZVR5cGV9IC4gJExpc3RHZXR7JElEfS0+e05hbWV9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICAgICAgSUQ6CiAgICAgICAgZm9yIG15ICRJRCAoIHNvcnQgeyAkTGlzdEdldHskYX0tPntTb3J0TmFtZX0gY21wICRMaXN0R2V0eyRifS0+e1NvcnROYW1lfSB9IGtleXMgJUxpc3RHZXQgKQogICAgICAgIHsKCiAgICAgICAgICAgIG15ICVEYXRhID0gJXsgJExpc3RHZXR7JElEfSB9OwoKICAgICAgICAgICAgIyBjaGVjayBxdWV1ZSBwZXJtaXNzaW9ucyBvZiBsaW5rZWQgdGVtcGxhdGVzLgogICAgICAgICAgICBpZiAoICRTZWxmLT57TGlnaHRBZG1pbn0gKSB7CiAgICAgICAgICAgICAgICBteSAlUXVldWVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KCBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJERhdGF7SUR9ICk7CiAgICAgICAgICAgICAgICAkRGF0YXtQZXJtaXNzaW9ufSA9ICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEcyA9PiBbIGtleXMgJVF1ZXVlcyBdLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ICA9PiAncncnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISREYXRhe1Blcm1pc3Npb259OwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSBAU2VsZWN0ZWRBdHRhY2htZW50OwogICAgICAgICAgICBteSAlU2VsZWN0ZWRBdHRhY2htZW50RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50JyktPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVTZWxlY3RlZEF0dGFjaG1lbnREYXRhICkgewogICAgICAgICAgICAgICAgcHVzaCBAU2VsZWN0ZWRBdHRhY2htZW50LCAkS2V5OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gJFZhbGlkTGlzdHsgJERhdGF7VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50cyA9PiBzY2FsYXIgQFNlbGVjdGVkQXR0YWNobWVudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb3RoZXJ3aXNlIGl0IGRpc3BsYXlzIGEgbm8gZGF0YSBmb3VuZCBtZXNzYWdlCiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9EYXRhRm91bmRNc2cnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="Kernel/Output/HTML/Templates/Standard/AdminServiceTemplates.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIk1hbmFnZSBUZW1wbGF0ZS1TZXJ2aWNlIFJlbGF0aW9ucyIpIHwgaHRtbCAlXTwvaDE+CgogICAgWyUgQnJlYWRjcnVtYlBhdGggPSBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRlKCdNYW5hZ2UgVGVtcGxhdGUtU2VydmljZSBSZWxhdGlvbnMnKSwKICAgICAgICAgICAgICAgIExpbmsgPT4gRW52KCJBY3Rpb24iKSwKICAgICAgICAgICAgfSwKICAgICAgICBdCiAgICAlXQoKICAgIFslIElGIERhdGEuQnJlYWRjcnVtYlRpdGxlICVdCiAgICAgICAgICAgIFslIFVTRSBFZGl0VGl0bGUgPSBTdHJpbmcoRGF0YS5CcmVhZGNydW1iVGl0bGUpICVdCiAgICAgICAgICAgIFslIEJyZWFkY3J1bWJQYXRoLnB1c2goeyBOYW1lID0+IEVkaXRUaXRsZS5hcHBlbmQoICIgJyIsIERhdGEuTmFtZSwgIiciICkgfSkgJV0KICAgIFslIEVORCAlXQoKICAgIFslIElOQ0xVREUgIkJyZWFkY3J1bWIudHQiIFBhdGggPSBCcmVhZGNydW1iUGF0aCAlXQoKICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uTGlzdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj48bGFiZWw+WyUgVHJhbnNsYXRlKCJBY3Rpb25zIikgfCBodG1sICVdPC9sYWJlbD48L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkxpc3QiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRmlsdGVyIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPjxsYWJlbCBmb3I9IkZpbHRlciI+WyUgVHJhbnNsYXRlKCJGaWx0ZXIiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyIiBjbGFzcz0iRmlsdGVyQm94IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIG5hbWU9IkZpbHRlciIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIikgfCBodG1sICVdIiAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZpbHRlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaWx0ZXJUZW1wbGF0ZSIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj48bGFiZWwgZm9yPSJGaWx0ZXJUZW1wbGF0ZXMiPlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciBUZW1wbGF0ZXMiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyVGVtcGxhdGVzIiBjbGFzcz0iRmlsdGVyQm94IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIG5hbWU9IkZpbHRlclRlbXBsYXRlcyIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciB0ZW1wbGF0ZXMiKSB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlsdGVyVGVtcGxhdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaWx0ZXJTZXJ2aWNlIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPjxsYWJlbCBmb3I9IkZpbHRlclNlcnZpY2VzIj5bJSBUcmFuc2xhdGUoIkZpbHRlciBmb3IgU2VydmljZXMiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyU2VydmljZXMiIGNsYXNzPSJGaWx0ZXJCb3giIHBsYWNlaG9sZGVyPSJbJSBUcmFuc2xhdGUoIkp1c3Qgc3RhcnQgdHlwaW5nIHRvIGZpbHRlci4uLiIpIHwgaHRtbCAlXSIgbmFtZT0iRmlsdGVyU2VydmljZXMiIHZhbHVlPSIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkZpbHRlciBmb3Igc2VydmljZXMiKSB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlsdGVyU2VydmljZSIpICVdCgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIk92ZXJ2aWV3IikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgTGF5b3V0R3JpZCBDb2x1bW5zV2l0aFNwYWNpbmciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2l6ZTFvZjIiPgogICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iVGFibGVsaWtlIiBpZD0iVGVtcGxhdGVzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJIZWFkZXIiPlslIFRyYW5zbGF0ZSgiVGVtcGxhdGVzIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJGaWx0ZXJNZXNzYWdlIEhpZGRlbiI+WyUgVHJhbnNsYXRlKCJObyBtYXRjaGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvbGk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vVGVtcGxhdGVzRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGk+WyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXTwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJOb1RlbXBsYXRlc0ZvdW5kTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTGlzdDFuIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1bJSBEYXRhLlN1YmFjdGlvbiB8IHVyaSAlXTtJRD1bJSBEYXRhLklEIHwgdXJpICVdIiBjbGFzcz0iQXNCbG9jayI+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvYT48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlzdDFuIikgJV0KICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTaXplMW9mMiI+CiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJUYWJsZWxpa2UiIGlkPSJTZXJ2aWNlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iSGVhZGVyIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2VzIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJGaWx0ZXJNZXNzYWdlIEhpZGRlbiI+WyUgVHJhbnNsYXRlKCJObyBtYXRjaGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvbGk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vU2VydmljZXNGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vU2VydmljZXNGb3VuZE1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxpc3RuMSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249WyUgRGF0YS5TdWJhY3Rpb24gfCB1cmkgJV07SUQ9WyUgRGF0YS5JRCB8IHVyaSAlXSIgY2xhc3M9IkFzQmxvY2siPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkxpc3RuMSIpICVdCiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1Jlc3VsdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNoYW5nZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5CcmVhZGNydW1iVGl0bGUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIERhdGEuQWN0aW9uSG9tZSB8IHVyaSAlXTtTdWJhY3Rpb249Q2hhbmdlO1slIERhdGEuU2VydmljZSB8IHVyaSAlXUlEPVslIERhdGEuSUQgfCB1cmkgJV0iPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCAiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9Im1hdHJpeCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkNoYW5nZVslIERhdGEuVHlwZSB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJRCIgdmFsdWU9IlslIERhdGEuSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ29udGludWVBZnRlclNhdmUiIGlkPSJDb250aW51ZUFmdGVyU2F2ZSIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIFZhcmlhYmxlV2lkdGgiIGlkPSJJdGVtc1RhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoRGF0YS5WaXNpYmxlTmVUeXBlKSB8IGh0bWwgJV08L3RoPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDaGFuZ2VIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iWyUgRGF0YS5NYXJrIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IlNlbGVjdEFsbEl0ZW1zU2VsZWN0ZWQiIG5hbWU9Ikl0ZW1zU2VsZWN0ZWQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSBhY3RpdmUgc3RhdGUgZm9yIGFsbCIpIHwgaHRtbCAlXSIgdmFsdWU9IiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBY3RpdmUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2hhbmdlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EYXRhRm91bmRNc2dMaXN0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iWyUgRGF0YS5Db2xTcGFuIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gZGF0YSBmb3VuZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnTGlzdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNoYW5nZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pblslIERhdGEuTmVUeXBlIHwgdXJpICVdO1N1YmFjdGlvbj1DaGFuZ2U7WyUgRGF0YS5TZXJ2aWNlIHwgdXJpICVdSUQ9WyUgRGF0YS5JRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iWyUgRGF0YS5NYXJrIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iSXRlbXNTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9nZ2xlIGFjdGl2ZSBzdGF0ZSBmb3IgJXMiLCBEYXRhLk5hbWUpIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuSUQgfCBodG1sICVdIiBbJSBEYXRhLlNlbGVjdGVkICVdLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbXNBbGwiIHZhbHVlPSJbJSBEYXRhLklEIHwgaHRtbCAlXSIvPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNoYW5nZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkZpbHRlck1lc3NhZ2UgSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+WyUgVHJhbnNsYXRlKCJObyBtYXRjaGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSIgaWQ9IlN1Ym1pdEFuZENvbnRpbnVlIiB0eXBlPSJidXR0b24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFByaW1hcnkiIGlkPSJTdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIGFuZCBmaW5pc2giKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV0iPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDaGFuZ2UiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3IikgJV0K</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/CustomerTicketMessage.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9DdXN0b21lclRpY2tldE1lc3NhZ2UudHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQo8ZGl2IGlkPSJvb29Db250ZW50IiBjbGFzcz0iQVJJQVJvbGVNYWluIFRpY2tldENvbXBvc2UiPgogICAgPGRpdiBpZD0ib29vSGVhZGVyIj4KICAgICAgICA8aDE+WyUgVHJhbnNsYXRlKCJJc3N1ZSBhIG5ldyBUaWNrZXQiKSB8IGh0bWwgJV08L2gxPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJvb29NYWluQm94IiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9ImNvbXBvc2UiIGlkPSJOZXdDdXN0b21lclRpY2tldCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZU5ldyIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kIiBpZD0iRXhwYW5kIiB2YWx1ZT0iIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZyb21DaGF0SUQiIHZhbHVlPSJbJSBEYXRhLkZyb21DaGF0SUQgfCBodG1sICVdIiAvPgogICAgICAgICAgICA8ZmllbGRzZXQ+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBc3Rlcmlza0V4cGxhbmF0aW9uIikgJV0KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJBc3Rlcmlza0V4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkFsbCBmaWVsZHMgbWFya2VkIHdpdGggYW4gYXN0ZXJpc2sgKCopIGFyZSBtYW5kYXRvcnkuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXN0ZXJpc2tFeHBsYW5hdGlvbiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfVGl0bGVDYXRlZ29yeSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdWyUgRGF0YS5IaWRkZW5DbGFzcyB8IGh0bWwgJV0iIFslIERhdGEuSGlkZGVuU3R5bGUgfCBodG1sICVdPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuVG9vbHRpcCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJUb29sdGlwIG9vb1Rvb2x0aXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Im9vb2ZvIG9vb2ZvLWhlbHAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIERhdGEuVG9vbHRpcCB8IGh0bWwgfCBodG1sX2xpbmVfYnJlYWsgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX1RpdGxlQ2F0ZWdvcnkiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0VHlwZSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUeXBlSUQiIGNsYXNzPSJNYW5kYXRvcnkiPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXSA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUeXBlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UgTm9KYXZhU2NyaXB0TWVzc2FnZVslIERhdGEuVHlwZUlESW52YWxpZCB8IGh0bWwgJV0iID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0VHlwZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJRdWV1ZSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuVG9TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGVzdCIgY2xhc3M9Ik1hbmRhdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVG8iKSB8IGh0bWwgJV0gPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlc3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlc3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UgTm9KYXZhU2NyaXB0TWVzc2FnZVslIERhdGEuUXVldWVJbnZhbGlkIHwgaHRtbCAlXSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJRdWV1ZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuU2VydmljZU1hbmRhdG9yeSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSUQiIGNsYXNzPSJNYW5kYXRvcnkiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXSA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSUQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuU2VydmljZU1hbmRhdG9yeSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U2VydmljZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTTEEiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93Ij4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNMQVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlNMQU1hbmRhdG9yeSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTTEFJRCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBsZXZlbCBhZ3JlZW1lbnQiKSB8IGh0bWwgJV0iIGNsYXNzPSJNYW5kYXRvcnkiPlslIFRyYW5zbGF0ZSgiU0xBIikgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IDwvbGFiZWw+CgogICAgICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU0xBSUQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlcnZpY2UgbGV2ZWwgYWdyZWVtZW50IikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIlNMQSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuU0xBTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNMQUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU0xBSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U0xBIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9UaXRsZUR5bmFtaWNGaWVsZHMiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVslIERhdGEuSGlkZGVuQ2xhc3MgfCBodG1sICVdIiBbJSBEYXRhLkhpZGRlblN0eWxlIHwgaHRtbCAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlRvb2x0aXAgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVG9vbHRpcCBvb29Ub29sdGlwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1oZWxwIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoRGF0YS5Ub29sdGlwKSB8IGh0bWwgfCBodG1sX2xpbmVfYnJlYWsgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX1RpdGxlRHluYW1pY0ZpZWxkcyIpICVdCgpbJSBEYXRhLkR5bmFtaWNGaWVsZEhUTUwgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9UaXRsZU1lc3NhZ2UiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVslIERhdGEuSGlkZGVuQ2xhc3MgfCBodG1sICVdIiBbJSBEYXRhLkhpZGRlblN0eWxlIHwgaHRtbCAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlRvb2x0aXAgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVG9vbHRpcCBvb29Ub29sdGlwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1oZWxwIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoRGF0YS5Ub29sdGlwKSB8IGh0bWwgfCBodG1sX2xpbmVfYnJlYWsgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX1RpdGxlTWVzc2FnZSIpICVdCgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFslIERhdGEuU3ViamVjdEhpZGRlbkNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV0iIHR5cGU9InRleHQiIGlkPSJTdWJqZWN0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuU3ViamVjdFZhbGlkYXRlIHwgaHRtbCAlXSBbJSBEYXRhLlN1YmplY3RJbnZhbGlkIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdWJqZWN0IiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIE5vSmF2YVNjcmlwdE1lc3NhZ2VbJSBEYXRhLlN1YmplY3RJbnZhbGlkIHwgaHRtbCAlXSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93Ij4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YW5kYXJkVGVtcGxhdGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhbmRhcmRUZW1wbGF0ZUlEIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJOZXcgdGlja2V0IHRlbXBsYXRlIikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIlRleHQgVGVtcGxhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJTZXR0aW5nIGEgdGVtcGxhdGUgd2lsbCBvdmVyd3JpdGUgYW55IHRleHQgb3IgYXR0YWNobWVudC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTdGFuZGFyZFRlbXBsYXRlIikgJV0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRIb2xkZXIgUmljaFRleHRGaWVsZCBbJSBEYXRhLkJvZHlIaWRkZW5DbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQiIGNsYXNzPSJSaWNoVGV4dCBbJSBEYXRhLkJvZHlWYWxpZGF0ZSB8IGh0bWwgJV0gWyUgRGF0YS5Cb2R5SW52YWxpZCB8IGh0bWwgJV0iIG5hbWU9IkJvZHkiIHJvd3M9IjE1IiBjb2xzPSJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSIpICVdIj5bJSBEYXRhLkJvZHkgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSaWNoVGV4dCIgY2xhc3M9Ik1hbmRhdG9yeSI+WyUgVHJhbnNsYXRlKCJUZXh0IikgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UgTm9KYXZhU2NyaXB0TWVzc2FnZVslIERhdGEuQm9keUludmFsaWQgfCBodG1sICVdIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgWyUgRGF0YS5BdHRhY2htZW50c0hpZGRlbkNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ib29vQXR0YWNobWVudHMiIGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkRuRFVwbG9hZEJveCI+ClslIElOQ0xVREUgIkZvcm1FbGVtZW50cy9DdXN0b21lckF0dGFjaG1lbnRMaXN0LnR0IiAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkNoYXRBcnRpY2xlUHJldmlldyIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNoYXQgcHJvdG9jb2wiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNoYXRQcm90b2NvbCI+ClslIElOQ0xVREUgIkFydGljbGVDb250ZW50L0NoYXQudHQiICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgnVGhlIGNoYXQgd2lsbCBiZSBhcHBlbmRlZCBhcyBhIHNlcGFyYXRlIGFydGljbGUuJykgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDaGF0QXJ0aWNsZVByZXZpZXciKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJpb3JpdHkiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93Ij4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlByaW9yaXR5U3RyZyAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlByaW9yaXR5SUQiPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJpb3JpdHkiKSAlXQoKICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgPGRpdiBpZD0iQm90dG9tQWN0aW9uUm93IiBjbGFzcz0iQWN0aW9uUm93Ij4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9InN1Ym1pdFJpY2hUZXh0IiBjbGFzcz0ib29vTCIgYWNjZXNza2V5PSJnIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0gKGcpIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9mb3JtPgogICAgPC9kaXY+CjwvZGl2Pgo=</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/CustomerTicketZoom.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9DdXN0b21lclRpY2tldFpvb20udHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKPGRpdiBpZD0nb29vQ29udGVudCcgY2xhc3M9IlRpY2tldFpvb20gQVJJQVJvbGVNYWluIj4KICAgIDxkaXYgaWQ9J29vb0hlYWRlcidbJSBJRiBEYXRhLlRpY2tldEluZm9EaXNwbGF5VHlwZSA9PSAnUGVybWFuZW50JyAlXSBjbGFzcz0ib29vVGlja2V0SW5mb1Blcm1hbmVudCJbJSBFTkQgJV0+CiAgICAgICAgPGRpdiBjbGFzcz0nb29vV2l0aFN1Yic+CiAgICAgICAgICAgIDxoMiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPHAgY2xhc3M9Im9vbzEyZyIgdGl0bGU9IlslIENvbmZpZygnVGlja2V0OjpIb29rJykgJV1bJSBDb25maWcoJ1RpY2tldDo6SG9va0RpdmlkZXInKSAlXVslIERhdGEuVGlja2V0TnVtYmVyIHwgaHRtbCAlXSI+WyUgRGF0YS5Ib29rICVdWyUgQ29uZmlnKCdUaWNrZXQ6Okhvb2tEaXZpZGVyJykgJV1bJSBEYXRhLlRpY2tldE51bWJlciB8IGh0bWwgJV08L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0nb29vQXZhdGFyJz4KICAgICAgICAgICAgWyUgSUYgRGF0YS5BdmF0YXIgJV0KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJbJSBEYXRhLkF2YXRhciAlXSIgLz4KICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkluaXRpYWxzIj5bJSBEYXRhLlVzZXJJbml0aWFscyB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgIDwvZGl2PgogICAgICAgIDxwIGNsYXNzPSdvb28xMic+WyUgRGF0YS5Vc2VyRmlyc3RuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLlVzZXJMYXN0bmFtZSB8IGh0bWwgJV08L3A+ClslIElGIERhdGEuVGlja2V0SW5mb0Rpc3BsYXlUeXBlID09ICdIZWFkZXInICVdCiAgICAgICAgPGRpdiBjbGFzcz0nb29vSW5mb0Jsb2NrJz4KICAgICAgICAgICAgPHAgY2xhc3M9J29vb0luZm8gb29vMTInPjxpIGNsYXNzPSJvb29mbyBvb29mby1pbmZvIj48L2k+IDxzcGFuPlslIFRyYW5zbGF0ZSgnSW5mb3JtYXRpb24nKSB8IGh0bWwgJV08L3NwYW4+PC9wPgogICAgICAgICAgICBbJSBJTkNMVURFICJDdXN0b21lclRpY2tldFpvb20vVGlja2V0SW5mby50dCIgJV0KICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgPGRpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVwbHlCdXR0b24iKSAlXQogICAgICAgIDxidXR0b24gaWQ9IlJlcGx5QnV0dG9uIiBjbGFzcz0iRG9udFByaW50IG9vb00iPjxzcGFuPlslIFRyYW5zbGF0ZSgiUmVwbHkiKSB8IGh0bWwgJV0gPC9zcGFuPjxpIGNsYXNzPSJvb29mbyBvb29mby1hcnJvd19yMiI+PC9pPjwvYnV0dG9uPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVwbHlCdXR0b24iKSAlXQogICAgICAgIDwvZGl2PgogICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1tb3JlX3YiPjwvaT4KICAgICAgICA8ZGl2IGlkPSdvb29DYXRlZ29yaWVzJz4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2F0ZWdvcmllcyIpICVdCiAgICAgICAgICAgIFslIElGIERhdGEuQ29uZmlnLkxpbmsgJV0KICAgICAgICAgICAgICAgIFslIElGIERhdGEuQ29uZmlnLlRyYW5zbGF0ZSAlXQogICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJvb29DYXRlZ29yeSBvb28xMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6WyUgRGF0YS5Db2xvciB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuQ29uZmlnLkxpbmsgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBJRiBEYXRhLkNvbmZpZy5QcmVmaXggJV1bJSBEYXRhLkNvbmZpZy5QcmVmaXggfCBodG1sICVdWyUgRU5EICVdWyUgRGF0YS5UZXh0IHwgSW50ZXJwb2xhdGUgfCBUcmFuc2xhdGUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJvb29DYXRlZ29yeSBvb28xMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6WyUgRGF0YS5Db2xvciB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuQ29uZmlnLkxpbmsgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBJRiBEYXRhLkNvbmZpZy5QcmVmaXggJV1bJSBEYXRhLkNvbmZpZy5QcmVmaXggfCBodG1sICVdWyUgRU5EICVdWyUgRGF0YS5UZXh0IHwgSW50ZXJwb2xhdGUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIElGIERhdGEuQ29uZmlnLlRyYW5zbGF0ZSAlXQogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJvb29DYXRlZ29yeSBvb28xMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6WyUgRGF0YS5Db2xvciB8IGh0bWwgJV0iPlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IFRyYW5zbGF0ZSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Im9vb0NhdGVnb3J5IG9vbzEwIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpbJSBEYXRhLkNvbG9yIHwgaHRtbCAlXSI+WyUgSUYgRGF0YS5Db25maWcuUHJlZml4ICVdWyUgRGF0YS5Db25maWcuUHJlZml4IHwgaHRtbCAlXVslIEVORCAlXVslIERhdGEuVGV4dCB8IEludGVycG9sYXRlIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICBbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkNhdGVnb3JpZXMiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSdvb29NYWluQm94JyBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgPGRpdiBpZD0iUHJvY2Vzc0FjdGl2aXRpZXMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOZXh0QWN0aXZpdGllcyIpICVdCiAgICAgICAgICAgIDxkaXYgaWQ9Ik5leHRBY3Rpdml0aWVzIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aXZpdHlEaWFsb2dEaXJlY3RTdWJtaXQiKSAlXQogICAgICAgICAgICAgICAgPGZvcm0gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXSIgYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpIHwgaHRtbCAlXSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJDdXN0b21lclRpY2tldFpvb20iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZUFjdGl2aXR5RGlhbG9nIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByb2Nlc3NFbnRpdHlJRCIgdmFsdWU9IlslIERhdGEuUHJvY2Vzc0VudGl0eUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGl2aXR5RGlhbG9nRW50aXR5SUQiIHZhbHVlPSJbJSBEYXRhLkFjdGl2aXR5RGlhbG9nRW50aXR5SUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iQnV0dG9uX1slIERhdGEuQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCB8IHVyaSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXSIgY2xhc3M9Im9vb00gQWN0aXZpdHlTdWJtaXRCdXR0b24iIHR5cGU9InN1Ym1pdCI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Zvcm0+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpdml0eURpYWxvZ0RpcmVjdFN1Ym1pdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGl2aXR5RGlhbG9nIikgJV0KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IkJ1dHRvbl9bJSBEYXRhLkFjdGl2aXR5RGlhbG9nRW50aXR5SUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0iIGNsYXNzPSJvb29NIEFjdGl2aXR5U3RhcnRCdXR0b24iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYnV0dG9uPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aXZpdHlEaWFsb2ciKSAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5leHRBY3Rpdml0aWVzIikgJV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8dWwgaWQ9J29vb0FydGljbGVMaXN0J1slIElGIERhdGEuVGlja2V0SW5mb0Rpc3BsYXlUeXBlID09ICdQZXJtYW5lbnQnICVdIGNsYXNzPSJvb29UaWNrZXRJbmZvUGVybWFuZW50IlslIEVORCAlXT4KICAgICAgICA8L3VsPgogICAgICAgIDx1bCBpZD0nb29vQXJ0aWNsZUxpc3RFeHBhbmRlZCdbJSBJRiBEYXRhLlRpY2tldEluZm9EaXNwbGF5VHlwZSA9PSAnUGVybWFuZW50JyAlXSBjbGFzcz0ib29vVGlja2V0SW5mb1Blcm1hbmVudCJbJSBFTkQgJV0+ClslIFJlbmRlckJsb2NrU3RhcnQoIlByb2Nlc3NBY3Rpdml0eSIpICVdCiAgICAgICAgICAgIDxsaSBpZD0iUHJvY2Vzc19bJSBEYXRhLkFjdGl2aXR5RGlhbG9nRW50aXR5SUQgfCB1cmkgJV0iIGNsYXNzPSJBY3Rpdml0eSI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkFjdGl2aXR5SFRNTCAlXQogICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvY2Vzc0FjdGl2aXR5IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRm9sbG93VXAiKSAlXQo8bGkgaWQ9IkZvbGxvd1VwIiBjbGFzcz0iWyUgRGF0YS5Gb2xsb3dVcFZpc2libGUgfCBodG1sICVdIEFjdGl2aXR5Ij4KICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSNGb2xsb3dVcCIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIiBpZD0iUmVwbHlDdXN0b21lclRpY2tldCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkN1c3RvbWVyVGlja2V0Wm9vbSIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZSIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiAvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFydGljbGVJRCIgdmFsdWU9IlslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXSIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRnJvbUNoYXRJRCIgdmFsdWU9IlslIERhdGEuRnJvbUNoYXRJRCB8IGh0bWwgJV0iIC8+CgogICAgICAgIDxkaXYgY2xhc3M9Ik1lc3NlbmdlciI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBc3Rlcmlza0V4cGxhbmF0aW9uIikgJV0KICAgICAgICAgICAgPHAgY2xhc3M9IkFzdGVyaXNrRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiQWxsIGZpZWxkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayAoKikgYXJlIG1hbmRhdG9yeS4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJBc3Rlcmlza0V4cGxhbmF0aW9uIikgJV0KCiAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iRG9udFByaW50Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX1RpdGxlTWVzc2FnZSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdWyUgRGF0YS5IaWRkZW5DbGFzcyB8IGh0bWwgJV0iIFslIERhdGEuSGlkZGVuU3R5bGUgfCBodG1sICVdPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuVG9vbHRpcCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJUb29sdGlwIG9vb1Rvb2x0aXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Im9vb2ZvIG9vb2ZvLWhlbHAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZShEYXRhLlRvb2x0aXApIHwgaHRtbCB8IGh0bWxfbGluZV9icmVhayAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfVGl0bGVNZXNzYWdlIikgJV0KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iRG9udFByaW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiBpZD0iU3ViamVjdCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuU3ViamVjdCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3ViamVjdCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGFuZGFyZFRlbXBsYXRlIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFuZGFyZFRlbXBsYXRlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YW5kYXJkVGVtcGxhdGVJRCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiTmV3IHRpY2tldCB0ZW1wbGF0ZSIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJUZXh0IFRlbXBsYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiU2V0dGluZyBhIHRlbXBsYXRlIHdpbGwgb3ZlcndyaXRlIGFueSB0ZXh0IG9yIGF0dGFjaG1lbnQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhbmRhcmRUZW1wbGF0ZSIpICVdCiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJpY2hUZXh0SG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVwbHkiKSB8IGh0bWwgJV0iIGlkPSJSaWNoVGV4dCIgY2xhc3M9IlJpY2hUZXh0IERvbnRQcmludCBWYWxpZGF0ZV9SZXF1aXJlZFJpY2hUZXh0IFslIERhdGEuUmljaFRleHRJbnZhbGlkIHwgaHRtbCAlXSIgbmFtZT0iQm9keSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgfCBodG1sICVdIj5bJSBEYXRhLkJvZHkgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmljaFRleHQiIGNsYXNzPSJNYW5kYXRvcnkiPlslIFRyYW5zbGF0ZSgiVGV4dCIpIHwgaHRtbCAlXSA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UgTm9KYXZhU2NyaXB0TWVzc2FnZVslIERhdGEuUmljaFRleHRJbnZhbGlkIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im9vb0F0dGFjaG1lbnRzIiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJEbkRVcGxvYWRCb3giPgpbJSBJTkNMVURFICJGb3JtRWxlbWVudHMvQ3VzdG9tZXJBdHRhY2htZW50TGlzdC50dCIgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfVGl0bGVDYXRlZ29yeSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdWyUgRGF0YS5IaWRkZW5DbGFzcyB8IGh0bWwgJV0iIFslIERhdGEuSGlkZGVuU3R5bGUgfCBodG1sICVdPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuVG9vbHRpcCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJUb29sdGlwIG9vb1Rvb2x0aXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Im9vb2ZvIG9vb2ZvLWhlbHAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZShEYXRhLlRvb2x0aXApIHwgaHRtbCB8IGh0bWxfbGluZV9icmVhayAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfVGl0bGVDYXRlZ29yeSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGb2xsb3dVcFN0YXRlIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OZXh0U3RhdGVzU3RyZyAlXSA8bGFiZWwgZm9yPSJTdGF0ZUlEIj5bJSBUcmFuc2xhdGUoIk5leHQgc3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRm9sbG93VXBTdGF0ZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZvbGxvd1VwUHJpb3JpdHkiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93Ij4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlByaW9yaXR5U3RyZyAlXSA8bGFiZWwgZm9yPSJQcmlvcml0eUlEIj5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZvbGxvd1VwUHJpb3JpdHkiKSAlXQoKWyUgRGF0YS5EeW5hbWljRmllbGRIVE1MICVdCgogICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJDbG9zZUJ1dHRvbiBvb29YUyI+WyUgVHJhbnNsYXRlKCJEaXNjYXJkIikgfCBodG1sICVdPC9idXR0b24+PGJ1dHRvbiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSIgY2xhc3M9Im9vb1hTIj5bJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZm9ybT4KPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkZvbGxvd1VwIikgJV0KWyUgSUYgRGF0YS5Ob0FydGljbGVzICVdCiAgICAgICAgICAgIDxsaSBjbGFzcz0nRW1wdHlNZXNzYWdlJz4KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGhpcyBpdGVtIGhhcyBubyBhcnRpY2xlcyB5ZXQuIikgfCBodG1sICVdCiAgICAgICAgICAgIDwvbGk+ClslIEVMU0UgJV0KICAgICAgICAgICAgWyUgRGF0YS5BcnRpY2xlcyAlXQpbJSBFTkQgJV0KICAgICAgICA8L3VsPgpbJSBJRiBEYXRhLlRpY2tldEluZm9EaXNwbGF5VHlwZSA9PSAnUGVybWFuZW50JyAlXQogICAgICAgICAgICBbJSBJTkNMVURFICJDdXN0b21lclRpY2tldFpvb20vVGlja2V0SW5mby50dCIgJV0KWyUgRU5EICVdCiAgICA8L2Rpdj4KPC9kaXY+Cg==</File>
        <File Location="Custom/Kernel/System/Service.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL1N5c3RlbS9TZXJ2aWNlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgKHF3KDphbGwpKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUcmFuc2xhdGlvbnMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UgLSBzZXJ2aWNlIGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgc2VydmljZSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnU2VydmljZSc7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSA2MCAqIDYwICogMjQgKiAyMDsKCiAgICAjIGxvYWQgZ2VuZXJhdG9yIHByZWZlcmVuY2VzIG1vZHVsZQogICAgbXkgJEdlbmVyYXRvck1vZHVsZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2VydmljZTo6UHJlZmVyZW5jZXNNb2R1bGUnKQogICAgICAgIHx8ICdLZXJuZWw6OlN5c3RlbTo6U2VydmljZTo6UHJlZmVyZW5jZXNEQic7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJEdlbmVyYXRvck1vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0gPSAkR2VuZXJhdG9yTW9kdWxlLT5uZXcoKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBTZXJ2aWNlTGlzdCgpCgpyZXR1cm4gYSBoYXNoIGxpc3Qgb2Ygc2VydmljZXMKCiAgICBteSAlU2VydmljZUxpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3QoCiAgICAgICAgVmFsaWQgID0+IDAsICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB2YWxpZCBwYXJhbQogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAxOwogICAgfQoKICAgICMgcmVhZCBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ1NlcnZpY2VMaXN0OjpWYWxpZDo6JyAuICRQYXJhbXtWYWxpZH07CgogICAgaWYgKCAkUGFyYW17VmFsaWR9ICYmIGRlZmluZWQgJFBhcmFte0tlZXBDaGlsZHJlbn0gJiYgJFBhcmFte0tlZXBDaGlsZHJlbn0gZXEgJzEnICkgewogICAgICAgICRDYWNoZUtleSAuPSAnOjpLZWVwQ2hpbGRyZW46OicgLiAkUGFyYW17S2VlcENoaWxkcmVufTsKICAgIH0KCiAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAleyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnSEFTSCc7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lLCB2YWxpZF9pZCBGUk9NIHNlcnZpY2UnLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTZXJ2aWNlTGlzdDsKICAgIG15ICVTZXJ2aWNlVmFsaWRMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFNlcnZpY2VMaXN0eyAkUm93WzBdIH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJFNlcnZpY2VWYWxpZExpc3R7ICRSb3dbMF0gfSA9ICRSb3dbMl07CiAgICB9CgogICAgaWYgKCAhJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlU2VydmljZUxpc3QsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJVNlcnZpY2VMaXN0IGlmICEkUGFyYW17VmFsaWR9OwogICAgfQoKICAgICMgZ2V0IHZhbGlkIGlkcwogICAgbXkgQFZhbGlkSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CgogICAgIyBkdXBsaWNhdGUgc2VydmljZSBsaXN0CiAgICBteSAlU2VydmljZUxpc3RUbXAgPSAlU2VydmljZUxpc3Q7CgogICAgIyBhZGQgc3VmZml4IGZvciBjb3JyZWN0IHNvcnRpbmcKICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICVTZXJ2aWNlTGlzdFRtcCApIHsKICAgICAgICAkU2VydmljZUxpc3RUbXB7JFNlcnZpY2VJRH0gLj0gJzo6JzsKICAgIH0KCiAgICBteSAlU2VydmljZUludmFsaWRMaXN0OwogICAgU0VSVklDRUlEOgogICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IHsgJFNlcnZpY2VMaXN0VG1weyRhfSBjbXAgJFNlcnZpY2VMaXN0VG1weyRifSB9IGtleXMgJVNlcnZpY2VMaXN0VG1wICkKICAgIHsKCiAgICAgICAgbXkgJFZhbGlkID0gc2NhbGFyIGdyZXAgeyAkXyBlcSAkU2VydmljZVZhbGlkTGlzdHskU2VydmljZUlEfSB9IEBWYWxpZElEczsKCiAgICAgICAgbmV4dCBTRVJWSUNFSUQgaWYgJFZhbGlkOwoKICAgICAgICAkU2VydmljZUludmFsaWRMaXN0eyAkU2VydmljZUxpc3R7JFNlcnZpY2VJRH0gfSA9IDE7CiAgICAgICAgZGVsZXRlICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfTsKICAgIH0KCiAgICAjIGRlbGV0ZSBpbnZhbGlkIHNlcnZpY2VzIGFuZCBjaGlsZHJlbgogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17S2VlcENoaWxkcmVufSB8fCAhJFBhcmFte0tlZXBDaGlsZHJlbn0gKSB7CiAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IGtleXMgJVNlcnZpY2VMaXN0ICkgewoKICAgICAgICAgICAgSU5WQUxJRE5BTUU6CiAgICAgICAgICAgIGZvciBteSAkSW52YWxpZE5hbWUgKCBzb3J0IGtleXMgJVNlcnZpY2VJbnZhbGlkTGlzdCApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfSA9fiBteyBcQSBcUSRJbnZhbGlkTmFtZVxFIDo6IH14bXMgKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfTsKICAgICAgICAgICAgICAgICAgICBsYXN0IElOVkFMSUROQU1FOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVTZXJ2aWNlTGlzdCwKICAgICk7CgogICAgcmV0dXJuICVTZXJ2aWNlTGlzdDsKfQoKPWhlYWQyIFNlcnZpY2VMaXN0R2V0KCkKCnJldHVybiBhIGxpc3Qgb2Ygc2VydmljZXMgd2l0aCB0aGUgY29tcGxldGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciBlYWNoIHNlcnZpY2UKCiAgICBteSAkU2VydmljZUxpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3RHZXQoCiAgICAgICAgVmFsaWQgID0+IDAsICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICByZXR1cm5zCgogICAgJFNlcnZpY2VMaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgU2VydmljZUlEICA9PiAxLAogICAgICAgICAgICBQYXJlbnRJRCAgID0+IDAsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ015U2VydmljZScsCiAgICAgICAgICAgIE5hbWVTaG9ydCAgPT4gJ015U2VydmljZScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICA9PiAnU29tZSBDb21tZW50JwogICAgICAgICAgICBDcmVhdGVUaW1lID0+ICcyMDExLTAyLTA4IDE1OjA4OjAwJywKICAgICAgICAgICAgQ2hhbmdlVGltZSA9PiAnMjAxMS0wNi0xMSAxNzoyMjowMCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBTZXJ2aWNlSUQgID0+IDIsCiAgICAgICAgICAgIFBhcmVudElEICAgPT4gMSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTXlTZXJ2aWNlOjpNeVN1YlNlcnZpY2UnLAogICAgICAgICAgICBOYW1lU2hvcnQgID0+ICdNeVN1YlNlcnZpY2UnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJ1NvbWUgQ29tbWVudCcKICAgICAgICAgICAgQ3JlYXRlVGltZSA9PiAnMjAxMS0wMi0wOCAxNTowODowMCcsCiAgICAgICAgICAgIENoYW5nZVRpbWUgPT4gJzIwMTEtMDYtMTEgMTc6MjI6MDAnLAogICAgICAgICAgICBDcmVhdGVCeSAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgPT4gMSwKICAgICAgICB9LAogICAgICAgICMgLi4uCiAgICBdOwoKPWN1dAoKc3ViIFNlcnZpY2VMaXN0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHZhbGlkIHBhcmFtCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkfSA9IDE7CiAgICB9CgogICAgIyBjaGVjayBjYWNoZWQgcmVzdWx0cwogICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTZXJ2aWNlTGlzdEdldDo6VmFsaWQ6OicgLiAkUGFyYW17VmFsaWR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmIGRlZmluZWQgJENhY2hlOwoKICAgICMgY3JlYXRlIFNRTCBxdWVyeQogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAnCiAgICAgICAgLiAnRlJPTSBzZXJ2aWNlJzsKCiAgICBpZiAoICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFNRTCAuPSAnIFdIRVJFIHZhbGlkX2lkIElOICgnIC4gam9pbiAnLCAnLAogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKSAuICcpJzsKICAgIH0KCiAgICAkU1FMIC49ICcgT1JERVIgQlkgbmFtZSc7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAkU1FMLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBTZXJ2aWNlTGlzdDsKICAgIG15ICVTZXJ2aWNlTmFtZTJJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVTZXJ2aWNlRGF0YTsKICAgICAgICAkU2VydmljZURhdGF7U2VydmljZUlEfSAgPSAkUm93WzBdOwogICAgICAgICRTZXJ2aWNlRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJFNlcnZpY2VEYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1syXTsKICAgICAgICAkU2VydmljZURhdGF7Q29tbWVudH0gICAgPSAkUm93WzNdIHx8ICcnOwogICAgICAgICRTZXJ2aWNlRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNF07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s1XTsKICAgICAgICAkU2VydmljZURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzZdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbN107CgogICAgICAgICMgYWRkIHNlcnZpY2UgZGF0YSB0byBzZXJ2aWNlIGxpc3QKICAgICAgICBwdXNoIEBTZXJ2aWNlTGlzdCwgXCVTZXJ2aWNlRGF0YTsKCiAgICAgICAgIyBidWlsZCBzZXJ2aWNlIGlkIGxvb2t1cCBoYXNoCiAgICAgICAgJFNlcnZpY2VOYW1lMklEeyAkU2VydmljZURhdGF7TmFtZX0gfSA9ICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9OwogICAgfQoKICAgIGZvciBteSAkU2VydmljZURhdGEgKEBTZXJ2aWNlTGlzdCkgewoKICAgICAgICAjIGNyZWF0ZSBzaG9ydCBuYW1lIGFuZCBwYXJlbnRpZAogICAgICAgICRTZXJ2aWNlRGF0YS0+e05hbWVTaG9ydH0gPSAkU2VydmljZURhdGEtPntOYW1lfTsKICAgICAgICBpZiAoICRTZXJ2aWNlRGF0YS0+e05hbWV9ID1+IG17IFxBICguKikgOjogKC4rPykgXHogfXhtcyApIHsKICAgICAgICAgICAgbXkgJFBhcmVudE5hbWUgPSAkMTsKICAgICAgICAgICAgJFNlcnZpY2VEYXRhLT57TmFtZVNob3J0fSA9ICQyOwogICAgICAgICAgICAkU2VydmljZURhdGEtPntQYXJlbnRJRH0gID0gJFNlcnZpY2VOYW1lMklEeyRQYXJlbnROYW1lfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlcnZpY2UgcHJlZmVyZW5jZXMKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+U2VydmljZVByZWZlcmVuY2VzR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VEYXRhLT57U2VydmljZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIG1lcmdlIGhhc2gKICAgICAgICBpZiAoJVByZWZlcmVuY2VzKSB7CiAgICAgICAgICAgICV7JFNlcnZpY2VEYXRhfSA9ICggJXskU2VydmljZURhdGF9LCAlUHJlZmVyZW5jZXMgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKEBTZXJ2aWNlTGlzdCkgewoKICAgICAgICAjIHNldCBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXEBTZXJ2aWNlTGlzdCwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBcQFNlcnZpY2VMaXN0Owp9Cgo9aGVhZDIgU2VydmljZUdldCgpCgpyZXR1cm4gYSBzZXJ2aWNlIGFzIGhhc2gKClJldHVybgogICAgJFNlcnZpY2VEYXRhe1NlcnZpY2VJRH0KICAgICRTZXJ2aWNlRGF0YXtQYXJlbnRJRH0KICAgICRTZXJ2aWNlRGF0YXtOYW1lfQogICAgJFNlcnZpY2VEYXRhe05hbWVTaG9ydH0KICAgICRTZXJ2aWNlRGF0YXtWYWxpZElEfQogICAgJFNlcnZpY2VEYXRhe0NvbW1lbnR9CiAgICAkU2VydmljZURhdGF7Q3JlYXRlVGltZX0KICAgICRTZXJ2aWNlRGF0YXtDcmVhdGVCeX0KICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VUaW1lfQogICAgJFNlcnZpY2VEYXRhe0NoYW5nZUJ5fQoKICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlR2V0KAogICAgICAgIFNlcnZpY2VJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlR2V0KAogICAgICAgIE5hbWUgICAgPT4gJ1NlcnZpY2U6OlN1YlNlcnZpY2UnLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgVXNlcklEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBlaXRoZXIgU2VydmljZUlEIG9yIE5hbWUgbXVzdCBiZSBwYXNzZWQKICAgIGlmICggISRQYXJhbXtTZXJ2aWNlSUR9ICYmICEkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNlcnZpY2VJRCBvciBOYW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB0aGF0IG5vdCBib3RoIFNlcnZpY2VJRCBhbmQgTmFtZSBhcmUgZ2l2ZW4KICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gJiYgJFBhcmFte05hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBlaXRoZXIgU2VydmljZUlEIE9SIE5hbWUgLSBub3QgYm90aCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9va3VwIHRoZSBTZXJ2aWNlSUQKICAgIGlmICggJFBhcmFte05hbWV9ICkgewogICAgICAgICRQYXJhbXtTZXJ2aWNlSUR9ID0gJFNlbGYtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte05hbWV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBjYWNoZWQgcmVzdWx0cwogICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTZXJ2aWNlR2V0OjonIC4gJFBhcmFte1NlcnZpY2VJRH07CiAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAleyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnSEFTSCc7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCBzZXJ2aWNlIGZyb20gZGIKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgJ1NFTEVDVCBpZCwgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5ICcKICAgICAgICAgICAgLiAnRlJPTSBzZXJ2aWNlIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1NlcnZpY2VJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTZXJ2aWNlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9ICA9ICRSb3dbMF07CiAgICAgICAgJFNlcnZpY2VEYXRhe05hbWV9ICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkU2VydmljZURhdGF7VmFsaWRJRH0gICAgPSAkUm93WzJdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDb21tZW50fSAgICA9ICRSb3dbM10gfHwgJyc7CiAgICAgICAgJFNlcnZpY2VEYXRhe0NyZWF0ZVRpbWV9ID0gJFJvd1s0XTsKICAgICAgICAkU2VydmljZURhdGF7Q3JlYXRlQnl9ICAgPSAkUm93WzVdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VUaW1lfSA9ICRSb3dbNl07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NoYW5nZUJ5fSAgID0gJFJvd1s3XTsKICAgIH0KCiAgICAjIGNoZWNrIHNlcnZpY2UKICAgIGlmICggISRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBTZXJ2aWNlSUQgKCRQYXJhbXtTZXJ2aWNlSUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHNob3J0IG5hbWUgYW5kIHBhcmVudGlkCiAgICAkU2VydmljZURhdGF7TmFtZVNob3J0fSA9ICRTZXJ2aWNlRGF0YXtOYW1lfTsKICAgIGlmICggJFNlcnZpY2VEYXRhe05hbWV9ID1+IG17IFxBICguKikgOjogKC4rPykgXHogfXhtcyApIHsKICAgICAgICAkU2VydmljZURhdGF7TmFtZVNob3J0fSA9ICQyOwoKICAgICAgICAjIGxvb2t1cCBwYXJlbnQKICAgICAgICBteSAkU2VydmljZUlEID0gJFNlbGYtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgIE5hbWUgPT4gJDEsCiAgICAgICAgKTsKICAgICAgICAkU2VydmljZURhdGF7UGFyZW50SUR9ID0gJFNlcnZpY2VJRDsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+U2VydmljZVByZWZlcmVuY2VzR2V0KAogICAgICAgIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICk7CgogICAgIyBtZXJnZSBoYXNoCiAgICBpZiAoJVByZWZlcmVuY2VzKSB7CiAgICAgICAgJVNlcnZpY2VEYXRhID0gKCAlU2VydmljZURhdGEsICVQcmVmZXJlbmNlcyApOwogICAgfQoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVTZXJ2aWNlRGF0YSwKICAgICk7CgogICAgcmV0dXJuICVTZXJ2aWNlRGF0YTsKfQoKPWhlYWQyIFNlcnZpY2VMb29rdXAoKQoKcmV0dXJuIGEgc2VydmljZSBuYW1lIGFuZCBpZAoKICAgIG15ICRTZXJ2aWNlTmFtZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTG9va3VwKAogICAgICAgIFNlcnZpY2VJRCA9PiAxMjMsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFNlcnZpY2VJRCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTG9va3VwKAogICAgICAgIE5hbWUgPT4gJ1NlcnZpY2U6OlN1YlNlcnZpY2UnLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtTZXJ2aWNlSUR9ICYmICEkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNlcnZpY2VJRCBvciBOYW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgIG15ICRDYWNoZUtleSA9ICdDYWNoZTo6U2VydmljZUxvb2t1cDo6SUQ6OicgLiAkUGFyYW17U2VydmljZUlEfTsKICAgICAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJENhY2hlIGlmIGRlZmluZWQgJENhY2hlOwoKICAgICAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBsb29rdXAKICAgICAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgbmFtZSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1NlcnZpY2VJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAkUmVzdWx0ID0gJyc7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRSZXN1bHQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiAkUmVzdWx0LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkUmVzdWx0OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnQ2FjaGU6OlNlcnZpY2VMb29rdXA6Ok5hbWU6OicgLiAkUGFyYW17TmFtZX07CiAgICAgICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiBkZWZpbmVkICRDYWNoZTsKCiAgICAgICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICAgICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgICAgICMgbG9va3VwCiAgICAgICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gc2VydmljZSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRSZXN1bHQgPSAnJzsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFJlc3VsdCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+ICRSZXN1bHQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRSZXN1bHQ7CiAgICB9Cn0KCj1oZWFkMiBTZXJ2aWNlQWRkKCkKCmFkZCBhIHNlcnZpY2UKCiAgICBteSAkU2VydmljZUlEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICAgICAgTmFtZSAgICAgPT4gJ1NlcnZpY2UgTmFtZScsCiAgICAgICAgUGFyZW50SUQgPT4gMSwgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgQ29tbWVudCAgPT4gJ0NvbW1lbnQnLCAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGNvbW1lbnQKICAgICRQYXJhbXtDb21tZW50fSB8fD0gJyc7CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgc2VydmljZSBuYW1lCiAgICBpZiAoICRQYXJhbXtOYW1lfSA9fiBteyA6OiB9eG1zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgYWRkIHNlcnZpY2UhIEludmFsaWQgU2VydmljZSBuYW1lICckUGFyYW17TmFtZX0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgZnVsbCBuYW1lCiAgICAkUGFyYW17RnVsbE5hbWV9ID0gJFBhcmFte05hbWV9OwoKICAgICMgZ2V0IHBhcmVudCBuYW1lCiAgICBpZiAoICRQYXJhbXtQYXJlbnRJRH0gKSB7CiAgICAgICAgbXkgJFBhcmVudE5hbWUgPSAkU2VsZi0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRQYXJhbXtQYXJlbnRJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJFBhcmVudE5hbWUpIHsKICAgICAgICAgICAgJFBhcmFte0Z1bGxOYW1lfSA9ICRQYXJlbnROYW1lIC4gJzo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGZpbmQgZXhpc3Rpbmcgc2VydmljZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17RnVsbE5hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJEV4aXN0czsKICAgIHdoaWxlICggJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEV4aXN0cyA9IDE7CiAgICB9CgogICAgIyBhZGQgc2VydmljZSB0byBkYXRhYmFzZQogICAgaWYgKCRFeGlzdHMpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkEgc2VydmljZSB3aXRoIHRoZSBuYW1lIGFuZCBwYXJlbnQgJyRQYXJhbXtGdWxsTmFtZX0nIGFscmVhZHkgZXhpc3RzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gc2VydmljZSAnCiAgICAgICAgICAgIC4gJyhuYW1lLCB2YWxpZF9pZCwgY29tbWVudHMsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpICcKICAgICAgICAgICAgLiAnVkFMVUVTICg/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtGdWxsTmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBnZXQgc2VydmljZSBpZAogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17RnVsbE5hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CiAgICBteSAkU2VydmljZUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFNlcnZpY2VJRCA9ICRSb3dbMF07CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgIG15ICVTZXJ2aWNlcyA9ICRTZWxmLT5TZXJ2aWNlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2VuZXJhdGUgY2hhaW5lZCB0cmFuc2xhdGlvbnMgYXV0b21hdGljYWxseQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRyYW5zbGF0aW9ucycpLT5UcmFuc2xhdGVQYXJlbnRDaGlsZEVsZW1lbnRzKAogICAgICAgIFN0cmluZ3MgPT4gWyB2YWx1ZXMgJVNlcnZpY2VzIF0sCiAgICApOwoKICAgIHJldHVybiAkU2VydmljZUlEOwp9Cgo9aGVhZDIgU2VydmljZVVwZGF0ZSgpCgp1cGRhdGUgYW4gZXhpc3Rpbmcgc2VydmljZQoKICAgIG15ICRUcnVlID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VVcGRhdGUoCiAgICAgICAgU2VydmljZUlEID0+IDEyMywKICAgICAgICBQYXJlbnRJRCAgPT4gMSwgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIE5hbWUgICAgICA9PiAnU2VydmljZSBOYW1lJywKICAgICAgICBWYWxpZElEICAgPT4gMSwKICAgICAgICBDb21tZW50ICAgPT4gJ0NvbW1lbnQnLCAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTZXJ2aWNlSUQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCBjb21tZW50CiAgICAkUGFyYW17Q29tbWVudH0gfHw9ICcnOwoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyktPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIHNlcnZpY2UgbmFtZQogICAgaWYgKCAkUGFyYW17TmFtZX0gPX4gbXsgOjogfXhtcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHVwZGF0ZSBzZXJ2aWNlISBJbnZhbGlkIFNlcnZpY2UgbmFtZSAnJFBhcmFte05hbWV9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IG9sZCBuYW1lIG9mIHNlcnZpY2UKICAgIG15ICRPbGRTZXJ2aWNlTmFtZSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKAogICAgICAgIFNlcnZpY2VJRCA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICk7CgogICAgaWYgKCAhJE9sZFNlcnZpY2VOYW1lICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIHNlcnZpY2UhIFNlcnZpY2UgJyRQYXJhbXtTZXJ2aWNlSUR9JyBkb2VzIG5vdCBleGlzdC4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIGZ1bGwgbmFtZQogICAgJFBhcmFte0Z1bGxOYW1lfSA9ICRQYXJhbXtOYW1lfTsKCiAgICAjIGdldCBwYXJlbnQgbmFtZQogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICkgewoKICAgICAgICAjIGxvb2t1cCBzZXJ2aWNlCiAgICAgICAgbXkgJFBhcmVudE5hbWUgPSAkU2VsZi0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRQYXJhbXtQYXJlbnRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRQYXJlbnROYW1lKSB7CiAgICAgICAgICAgICRQYXJhbXtGdWxsTmFtZX0gPSAkUGFyZW50TmFtZSAuICc6OicgLiAkUGFyYW17TmFtZX07CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrLCBpZiBzZWxlY3RlZCBwYXJlbnQgd2FzIGEgY2hpbGQgb2YgdGhpcyBzZXJ2aWNlCiAgICAgICAgaWYgKCAkUGFyYW17RnVsbE5hbWV9ID1+IG17IFxBICggXFEkT2xkU2VydmljZU5hbWVcRSApIDo6IH14bXMgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDYW5cJ3QgdXBkYXRlIHNlcnZpY2UhIEludmFsaWQgcGFyZW50IHdhcyBzZWxlY3RlZC4nCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGZpbmQgZXhpc3RzIHNlcnZpY2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gc2VydmljZSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0Z1bGxOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwogICAgbXkgJEV4aXN0czsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gbmUgJFJvd1swXSApIHsKICAgICAgICAgICAgJEV4aXN0cyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgdXBkYXRlIHNlcnZpY2UKICAgIGlmICgkRXhpc3RzKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBIHNlcnZpY2Ugd2l0aCB0aGUgbmFtZSBhbmQgcGFyZW50ICckUGFyYW17RnVsbE5hbWV9JyBhbHJlYWR5IGV4aXN0cy4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwoKICAgIH0KCiAgICAjIHVwZGF0ZSBzZXJ2aWNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgc2VydmljZSBTRVQgbmFtZSA9ID8sIHZhbGlkX2lkID0gPywgY29tbWVudHMgPSA/LCAnCiAgICAgICAgICAgIC4gJyBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17RnVsbE5hbWV9LCBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sICAgXCRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgIF0sCiAgICApOwoKICAgIG15ICRMaWtlU2VydmljZSA9ICREQk9iamVjdC0+UXVvdGUoICRPbGRTZXJ2aWNlTmFtZSwgJ0xpa2UnICkgLiAnOjolJzsKCiAgICAjIGZpbmQgYWxsIGNoaWxkcwogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gIlNFTEVDVCBpZCwgbmFtZSBGUk9NIHNlcnZpY2UgV0hFUkUgbmFtZSBMSUtFID8iLAogICAgICAgIEJpbmQgPT4gWyBcJExpa2VTZXJ2aWNlIF0sCiAgICApOwoKICAgIG15IEBDaGlsZHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAlQ2hpbGQ7CiAgICAgICAgJENoaWxke1NlcnZpY2VJRH0gPSAkUm93WzBdOwogICAgICAgICRDaGlsZHtOYW1lfSAgICAgID0gJFJvd1sxXTsKICAgICAgICBwdXNoIEBDaGlsZHMsIFwlQ2hpbGQ7CiAgICB9CgogICAgIyB1cGRhdGUgY2hpbGRzCiAgICBmb3IgbXkgJENoaWxkIChAQ2hpbGRzKSB7CiAgICAgICAgJENoaWxkLT57TmFtZX0gPX4gc3sgXEEgKCBcUSRPbGRTZXJ2aWNlTmFtZVxFICkgOjogfXskUGFyYW17RnVsbE5hbWV9Ojp9eG1zOwogICAgICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ1VQREFURSBzZXJ2aWNlIFNFVCBuYW1lID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDaGlsZC0+e05hbWV9LCBcJENoaWxkLT57U2VydmljZUlEfSBdLAogICAgICAgICk7CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgIG15ICVTZXJ2aWNlcyA9ICRTZWxmLT5TZXJ2aWNlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2VuZXJhdGUgY2hhaW5lZCB0cmFuc2xhdGlvbnMgYXV0b21hdGljYWxseQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRyYW5zbGF0aW9ucycpLT5UcmFuc2xhdGVQYXJlbnRDaGlsZEVsZW1lbnRzKAogICAgICAgIFN0cmluZ3MgPT4gWyB2YWx1ZXMgJVNlcnZpY2VzIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgU2VydmljZVNlYXJjaCgpCgpyZXR1cm4gc2VydmljZSBpZHMgYXMgYW4gYXJyYXkKCiAgICBteSBAU2VydmljZUxpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVNlYXJjaCgKICAgICAgICBOYW1lICAgPT4gJ1NlcnZpY2UgTmFtZScsICMgKG9wdGlvbmFsKQogICAgICAgIExpbWl0ICA9PiAxMjIsICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMTAwMAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IGxpbWl0CiAgICAkUGFyYW17TGltaXR9IHx8PSAxMDAwOwoKICAgICMgY3JlYXRlIHNxbCBxdWVyeQogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIHZhbGlkX2lkIElOICggJHtcKGpvaW4gJywgJywgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCkpfSApIjsKICAgIG15IEBCaW5kOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgaWYgKCAkUGFyYW17TmFtZX0gKSB7CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17TmFtZX0gPSAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17TmFtZX0sICdMaWtlJyApOwoKICAgICAgICAjIHJlcGxhY2UgKiB3aXRoICUgYW5kIGNsZWFuIHRoZSBzdHJpbmcKICAgICAgICAkUGFyYW17TmFtZX0gPX4gc3sgXCorIH17JX14bXNnOwogICAgICAgICRQYXJhbXtOYW1lfSA9fiBzeyAlKyB9eyV9eG1zZzsKICAgICAgICBteSAkTGlrZVN0cmluZyA9ICclJyAuICRQYXJhbXtOYW1lfSAuICclJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJExpa2VTdHJpbmc7CgogICAgICAgICRTUUwgLj0gIiBBTkQgbmFtZSBMSUtFID8iOwogICAgfQoKICAgICRTUUwgLj0gJyBPUkRFUiBCWSBuYW1lJzsKCiAgICAjIHNlYXJjaCBzZXJ2aWNlIGluIGRiCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSBAU2VydmljZUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBTZXJ2aWNlTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gQFNlcnZpY2VMaXN0Owp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoKQoKcmV0dXJucyBhIGxpc3Qgb2YgY3VzdG9tZXJ1c2VyL3NlcnZpY2UgbWVtYmVycwoKICAgIFNlcnZpY2VJRDogc2VydmljZSBpZAogICAgQ3VzdG9tZXJVc2VyTG9naW46IGN1c3RvbWVyIHVzZXIgbG9naW4KICAgIERlZmF1bHRTZXJ2aWNlczogYWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSBkZWZhdWx0IHNlcnZpY2VzCgogICAgUmVzdWx0OiBIQVNIIC0+IHJldHVybnMgYSBoYXNoIG9mIGtleSA9PiBzZXJ2aWNlIGlkLCB2YWx1ZSA9PiBzZXJ2aWNlIG5hbWUKICAgICAgICAgICAgTmFtZSAtPiByZXR1cm5zIGFuIGFycmF5IG9mIHVzZXIgbmFtZXMKICAgICAgICAgICAgSUQgICAtPiByZXR1cm5zIGFuIGFycmF5IG9mIHVzZXIgaWRzCgogICAgRXhhbXBsZSAoZ2V0IHNlcnZpY2VzIG9mIGN1c3RvbWVyIHVzZXIpOgoKICAgICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnVGVzdCcsCiAgICAgICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCiAgICApOwoKICAgIEV4YW1wbGUgKGdldCBjdXN0b21lciB1c2VyIG9mIHNlcnZpY2UpOgoKICAgICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgPT4gJElELAogICAgICAgIFJlc3VsdCAgICA9PiAnSEFTSCcsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtSZXN1bHR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBSZXN1bHQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IChvbmx5IDEgb3IgMCBpcyBhbGxvd2VkIHRvIGNvcnJlY3RseSBzZXQgdGhlIGNhY2hlIGtleSkKICAgIGlmICggIWRlZmluZWQgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gfHwgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gKSB7CiAgICAgICAgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gPSAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gPSAwOwogICAgfQoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6U2VydmljZTo6RGVmYXVsdDo6VW5rbm93bkN1c3RvbWVyJyk7CiAgICBpZiAoCiAgICAgICAgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyCiAgICAgICAgJiYgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30KICAgICAgICAmJiAhJFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAmJiAhJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ID0gJzxERUZBVUxUPic7CiAgICB9CgogICAgIyBjaGVjayBtb3JlIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NlcnZpY2VJRH0gJiYgISRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNlcnZpY2VJRCBvciBDdXN0b21lclVzZXJMb2dpbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIGNhY2hlIGtleQogICAgbXkgJENhY2hlS2V5ID0gJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0OjonIC4gJFBhcmFte1Jlc3VsdH0gLiAnOjonCiAgICAgICAgLiAnRGVmYXVsdFNlcnZpY2VzOjonIC4gJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gLiAnOjonOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAkQ2FjaGVLZXkgLj0gJ1NlcnZpY2VJRDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICkgewogICAgICAgICRDYWNoZUtleSAuPSAnQ3VzdG9tZXJVc2VyTG9naW46OicgLiAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59OwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICV7JENhY2hlfSBpZiByZWYgJENhY2hlIGVxICdIQVNIJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBAeyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnQVJSQVknOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdW90ZQogICAgZm9yICggc29ydCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJERCT2JqZWN0LT5RdW90ZSggJFBhcmFteyRffSApOwogICAgfQogICAgZm9yIChxdyhTZXJ2aWNlSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXskX30sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgc3FsCiAgICBteSAlRGF0YTsKICAgIG15IEBEYXRhOwogICAgbXkgJFNRTCA9ICdTRUxFQ1Qgc2N1LnNlcnZpY2VfaWQsIHNjdS5jdXN0b21lcl91c2VyX2xvZ2luLCBzLm5hbWUgJwogICAgICAgIC4gJyBGUk9NICcKICAgICAgICAuICcgc2VydmljZV9jdXN0b21lcl91c2VyIHNjdSwgc2VydmljZSBzJwogICAgICAgIC4gJyBXSEVSRSAnCiAgICAgICAgLiAiIHMudmFsaWRfaWQgSU4gKCAke1woam9pbiAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKSl9ICkgQU5EICIKICAgICAgICAuICcgcy5pZCA9IHNjdS5zZXJ2aWNlX2lkIEFORCAnOwoKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAiIHNjdS5zZXJ2aWNlX2lkID0gJFBhcmFte1NlcnZpY2VJRH0iOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICkgewogICAgICAgICRTUUwgLj0gIiBzY3UuY3VzdG9tZXJfdXNlcl9sb2dpbiA9ICckUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59JyI7CiAgICB9CgogICAgJERCT2JqZWN0LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAkVmFsdWUgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAkRGF0YXsgJFJvd1sxXSB9ID0gJFJvd1swXTsKICAgICAgICAgICAgJFZhbHVlID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkUm93WzJdOwogICAgICAgIH0KICAgIH0KICAgIGlmICgKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59CiAgICAgICAgJiYgJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSBuZSAnPERFRkFVTFQ+JwogICAgICAgICYmICRQYXJhbXtEZWZhdWx0U2VydmljZXN9CiAgICAgICAgJiYgIWtleXMoJURhdGEpCiAgICAgICAgKQogICAgewogICAgICAgICVEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgIyByZXR1cm4gcmVzdWx0CiAgICBpZiAoICRQYXJhbXtSZXN1bHR9IGVxICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICAgICApOwogICAgICAgIHJldHVybiAlRGF0YTsKICAgIH0KICAgIGlmICggJFBhcmFte1Jlc3VsdH0gZXEgJ05hbWUnICkgewogICAgICAgIEBEYXRhID0gdmFsdWVzICVEYXRhOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQERhdGEgPSBrZXlzICVEYXRhOwogICAgfQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxARGF0YSwKICAgICk7CiAgICByZXR1cm4gQERhdGE7Cn0KCj1oZWFkMiBDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKCkKCnRvIGFkZCBhIG1lbWJlciB0byBhIHNlcnZpY2UKCmlmICdBY3RpdmUnIGlzIDAsIHRoZSBjdXN0b21lciBpcyByZW1vdmVkIGZyb20gdGhlIHNlcnZpY2UKCiAgICAkU2VydmljZU9iamVjdC0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnVGVzdDEnLAogICAgICAgIFNlcnZpY2VJRCAgICAgICAgID0+IDYsCiAgICAgICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ3VzdG9tZXJVc2VyTG9naW4gU2VydmljZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRlbGV0ZSBleGlzdGluZyByZWxhdGlvbgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHNlcnZpY2VfY3VzdG9tZXJfdXNlciBXSEVSRSBjdXN0b21lcl91c2VyX2xvZ2luID0gPyBBTkQgc2VydmljZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSwgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIHJlbGF0aW9uIGlzIG5vdCBhY3RpdmUKICAgIGlmICggISRQYXJhbXtBY3RpdmV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGluc2VydCBuZXcgcmVsYXRpb24KICAgIG15ICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHNlcnZpY2VfY3VzdG9tZXJfdXNlciAnCiAgICAgICAgICAgIC4gJyhjdXN0b21lcl91c2VyX2xvZ2luLCBzZXJ2aWNlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5KSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPywgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0sIFwkUGFyYW17U2VydmljZUlEfSwgXCRQYXJhbXtVc2VySUR9IF0KICAgICk7CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKPWhlYWQyIFNlcnZpY2VQcmVmZXJlbmNlc1NldCgpCgpzZXQgc2VydmljZSBwcmVmZXJlbmNlcwoKICAgICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgU2VydmljZUlEID0+IDEyMywKICAgICAgICBLZXkgICAgICAgPT4gJ1VzZXJDb21tZW50JywKICAgICAgICBWYWx1ZSAgICAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVXNlcklEICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZVByZWZlcmVuY2VzU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNlcnZpY2VQcmVmZXJlbmNlc1NldCglUGFyYW0pOwoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgU2VydmljZVByZWZlcmVuY2VzR2V0KCkKCmdldCBzZXJ2aWNlIHByZWZlcmVuY2VzCgogICAgbXkgJVByZWZlcmVuY2VzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VQcmVmZXJlbmNlc0dldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VQcmVmZXJlbmNlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+U2VydmljZVByZWZlcmVuY2VzR2V0KCVQYXJhbSk7Cn0KCj1oZWFkMiBTZXJ2aWNlUGFyZW50c0dldCgpCgpyZXR1cm4gYW4gb3JkZXJlZCBsaXN0IGFsbCBwYXJlbnQgc2VydmljZSBJRHMgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlIGZyb20gdGhlIHJvb3QgcGFyZW50IHRvIHRoZQpjdXJyZW50IHNlcnZpY2UgcGFyZW50CgogICAgbXkgJFNlcnZpY2VQYXJlbnRzTGlzdCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlUGFyZW50c0dldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm5zCgogICAgJFNlcnZpY2VQYXJlbnRzTGlzdCA9IFsgMSwgMiwgLi4uXTsKCj1jdXQKCnN1YiBTZXJ2aWNlUGFyZW50c0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlcklEIFNlcnZpY2VJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkICROZWVkZWQhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlYWQgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdTZXJ2aWNlUGFyZW50c0dldDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmIHJlZiAkQ2FjaGU7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2Ygc2VydmljZXMKICAgIG15ICRTZXJ2aWNlTGlzdCA9ICRTZWxmLT5TZXJ2aWNlTGlzdEdldCgKICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgYSBzZXJ2aWNlIGxvb2t1cCB0YWJsZQogICAgbXkgJVNlcnZpY2VMb29rdXA7CiAgICBTRVJWSUNFOgogICAgZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKICAgICAgICBuZXh0IFNFUlZJQ0UgaWYgISRTZXJ2aWNlRGF0YTsKICAgICAgICBuZXh0IFNFUlZJQ0UgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRTZXJ2aWNlRGF0YSk7CiAgICAgICAgbmV4dCBTRVJWSUNFIGlmICEkU2VydmljZURhdGEtPntTZXJ2aWNlSUR9OwoKICAgICAgICAkU2VydmljZUxvb2t1cHsgJFNlcnZpY2VEYXRhLT57U2VydmljZUlEfSB9ID0gJFNlcnZpY2VEYXRhOwogICAgfQoKICAgICMgZXhpdCBpZiBTZXJ2aWNlSUQgaXMgaW52YWxpZAogICAgcmV0dXJuIGlmICEkU2VydmljZUxvb2t1cHsgJFBhcmFte1NlcnZpY2VJRH0gfTsKCiAgICAjIHRvIHN0b3JlIHRoZSByZXR1cm4gc3RydWN0dXJlCiAgICBteSBAU2VydmljZVBhcmVudHM7CgogICAgIyBnZXQgdGhlIFNlcnZpY2VQYXJlbnRJRCBmcm9tIHRoZSByZXF1ZXN0ZWQgc2VydmljZQogICAgbXkgJFNlcnZpY2VQYXJlbnRJRCA9ICRTZXJ2aWNlTG9va3VweyAkUGFyYW17U2VydmljZUlEfSB9LT57UGFyZW50SUR9OwoKICAgICMgZ2V0IGFsbCBwYXJ0ZW50cyBmb3IgdGhlIHJlcXVlc3RlZCBzZXJ2aWNlCiAgICB3aGlsZSAoJFNlcnZpY2VQYXJlbnRJRCkgewoKICAgICAgICAjIGFkZCBzZXJ2aWNlIHBhcmVudCBJRCB0byB0aGUgcmV0dXJuIHN0cnVjdHVyZQogICAgICAgIHB1c2ggQFNlcnZpY2VQYXJlbnRzLCAkU2VydmljZVBhcmVudElEOwoKICAgICAgICAjIHNldCBuZXh0IFNlcnZpY2VQYXJlbnRJRCAodGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBwYXJlbnQpCiAgICAgICAgJFNlcnZpY2VQYXJlbnRJRCA9ICRTZXJ2aWNlTG9va3VweyRTZXJ2aWNlUGFyZW50SUR9LT57UGFyZW50SUR9IHx8IDA7CgogICAgfQoKICAgICMgcmV2ZXJzZSB0aGUgcmV0dXJuIGFycmF5IHRvIGdldCB0aGUgbGlzdCBvcmRlcmVkIGZyb20gb2xkIHRvIHlvdW5nIChpbiBwYXJlbnQgY29udGV4dCkKICAgIG15IEBEYXRhID0gcmV2ZXJzZSBAU2VydmljZVBhcmVudHM7CgogICAgIyBzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcQERhdGEsCiAgICApOwoKICAgIHJldHVybiBcQERhdGE7Cn0KCj1oZWFkMiBHZXRBbGxDdXN0b21TZXJ2aWNlcygpCgpnZXQgYWxsIGN1c3RvbSBzZXJ2aWNlcyBvZiBvbmUgdXNlcgoKICAgIG15IEBTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5HZXRBbGxDdXN0b21TZXJ2aWNlcyggVXNlcklEID0+IDEyMyApOwoKPWN1dAoKc3ViIEdldEFsbEN1c3RvbVNlcnZpY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSAnR2V0QWxsQ3VzdG9tU2VydmljZXM6OicgLiAkUGFyYW17VXNlcklEfTsKICAgIG15ICRDYWNoZSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIHJldHVybiBAeyRDYWNoZX0gaWYgJENhY2hlOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBzZWFyY2ggYWxsIGN1c3RvbSBzZXJ2aWNlcwogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIHNlcnZpY2VfaWQKICAgICAgICAgICAgRlJPTSBwZXJzb25hbF9zZXJ2aWNlcwogICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VXNlcklEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBTZXJ2aWNlSURzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAU2VydmljZUlEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIHNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxAU2VydmljZUlEcywKICAgICk7CgogICAgcmV0dXJuIEBTZXJ2aWNlSURzOwp9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCgo9aGVhZDIgU2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KCkKCmdldCBzdGFuZGFyZCB0ZW1wbGF0ZXMgYXNzb2NpYXRlZCB0byBhIHNlcnZpY2UKCiAgICBteSAlVGVtcGxhdGVzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzCiAgICApOwoKICAgIFJldHVybnM6CiAgICAgICAgJVRlbXBsYXRlcyA9ICgKICAgICAgICAgICAgMSA9PiAnU29tZSBOYW1lJywKICAgICAgICAgICAgMiA9PiAnU29tZSBOYW1lJywKICAgICAgICApOwoKCiAgICBteSAlVGVtcGxhdGVzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgICAgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICApOwoKICAgIFJldHVybnM6CiAgICAgICAgJVJlc3BvbnNlcyA9ICgKICAgICAgICAgICAgQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ1NvbWUgTmFtZScsCiAgICAgICAgICAgICAgICAyID0+ICdTb21lIE5hbWUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBbnN3ZXIgPT4gewogICAgICAgICAgICAgICAgMyA9PiAnU29tZSBOYW1lJywKICAgICAgICAgICAgICAgIDQgPT4gJ1NvbWUgTmFtZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICMgLi4uCiAgICAgICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NlcnZpY2VJRH0gJiYgISRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnR290IG5vIFN0YW5kYXJkVGVtcGxhdGVJRCBvciBTZXJ2aWNlSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CiAgICBteSAkREJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBteSAkVGVtcGxhdGVUeXBlcyA9ICRQYXJhbXtUZW1wbGF0ZVR5cGVzfSB8fCAnMCc7CgogICAgbXkgJENhY2hlS2V5OwoKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhpcyByZXN1bHQgaXMgcHJlc2VudCAoaW4gY2FjaGUpCiAgICAgICAgJENhY2hlS2V5ID0gIlN0YW5kYXJkVGVtcGxhdGVzOjokUGFyYW17U2VydmljZUlEfTo6JFRlbXBsYXRlVHlwZXMiOwogICAgICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAleyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnSEFTSCc7CgogICAgICAgICMgZ2V0IHN0ZC4gdGVtcGxhdGVzCiAgICAgICAgbXkgJFNRTCA9ICJTRUxFQ1Qgc3QuaWQsIHN0Lm5hbWUsIHN0LnRlbXBsYXRlX3R5cGUgIgogICAgICAgICAgICAuICIgRlJPTSBzdGFuZGFyZF90ZW1wbGF0ZSBzdCwgc2VydmljZV9zdGFuZGFyZF90ZW1wbGF0ZSBxc3QgV0hFUkUgIgogICAgICAgICAgICAuICIgcXN0LnNlcnZpY2VfaWQgSU4gKCIKICAgICAgICAgICAgLiAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17U2VydmljZUlEfSwgJ0ludGVnZXInICkKICAgICAgICAgICAgLiAiKSBBTkQgIgogICAgICAgICAgICAuICIgcXN0LnN0YW5kYXJkX3RlbXBsYXRlX2lkID0gc3QuaWQgQU5EICIKICAgICAgICAgICAgLiAiIHN0LnZhbGlkX2lkIElOICggJHtcKGpvaW4gJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpKX0gKSIKICAgICAgICAgICAgLiAiIE9SREVSIEJZIHN0Lm5hbWUiOwoKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVUeXBlc30gKSB7CiAgICAgICAgICAgICAgICAkU3RhbmRhcmRUZW1wbGF0ZXN7ICRSb3dbMl0gfS0+eyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFN0YW5kYXJkVGVtcGxhdGVzeyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIHN0ZCB0ZW1wbGF0ZXMgKGluIGNhY2hlKQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVTdGFuZGFyZFRlbXBsYXRlcywKCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJVN0YW5kYXJkVGVtcGxhdGVzOwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgcmVzdWx0IGlzIHByZXNlbnQgKGluIGNhY2hlKQogICAgICAgICRDYWNoZUtleSA9ICJTZXJ2aWNlczo6JFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0iOwogICAgICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAleyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnSEFTSCc7CgogICAgICAgICMgZ2V0IHNlcnZpY2VzCiAgICAgICAgbXkgJFNRTCA9ICJTRUxFQ1QgcS5pZCwgcS5uYW1lICIKICAgICAgICAgICAgLiAiIEZST00gc2VydmljZSBxLCBzZXJ2aWNlX3N0YW5kYXJkX3RlbXBsYXRlIHFzdCBXSEVSRSAiCiAgICAgICAgICAgIC4gIiBxc3Quc3RhbmRhcmRfdGVtcGxhdGVfaWQgSU4gKCIKICAgICAgICAgICAgLiAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwgJ0ludGVnZXInICkKICAgICAgICAgICAgLiAiKSBBTkQgIgogICAgICAgICAgICAuICIgcXN0LnNlcnZpY2VfaWQgPSBxLmlkIEFORCAiCiAgICAgICAgICAgIC4gIiBxLnZhbGlkX2lkIElOICggJHtcKGpvaW4gJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpKX0gKSIKICAgICAgICAgICAgLiAiIE9SREVSIEJZIHEubmFtZSI7CgogICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAlU2VydmljZXM7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRTZXJ2aWNlc3sgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgICAgICB9CgogICAgICAgICMgc3RvcmUgc2VydmljZXMgKGluIGNhY2hlKQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVTZXJ2aWNlcywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJVNlcnZpY2VzOwogICAgfQp9Cgo9aGVhZDIgU2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJBZGQoKQoKdG8gYXNzb2NpYXRlIGEgbmV3IHRlbXBsYXRlIHRvIGEgc2VydmljZQoKICAgIG15ICRTdWNjZXNzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyQWRkKAogICAgICAgIFNlcnZpY2VJRCAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBBY3RpdmUgICAgICAgICAgICAgPT4gMSwgICAgICAgICMgdG8gc2V0L2NvbmZpcm0gKDEpIG9yIHJlbW92ZSAoMCkgdGhlIHJlbGF0aW9uCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU2VydmljZUlEIFN0YW5kYXJkVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkZWxldGUgZXhpc3RpbmcgcmVsYXRpb24KICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIHNlcnZpY2Vfc3RhbmRhcmRfdGVtcGxhdGUKICAgICAgICAgICAgV0hFUkUgc2VydmljZV9pZCA9ID8KICAgICAgICAgICAgQU5EIHN0YW5kYXJkX3RlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17U2VydmljZUlEfSwgXCRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIHJlbGF0aW9uIGlzIG5vdCBhY3RpdmUKICAgIGlmICggISRQYXJhbXtBY3RpdmV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgaW5zZXJ0IG5ldyByZWxhdGlvbgogICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIElOU0VSVCBJTlRPIHNlcnZpY2Vfc3RhbmRhcmRfdGVtcGxhdGUgKHNlcnZpY2VfaWQsIHN0YW5kYXJkX3RlbXBsYXRlX2lkLCBjcmVhdGVfdGltZSwKICAgICAgICAgICAgICAgIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkKICAgICAgICAgICAgVkFMVUVTICg/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9IF0sCiAgICApOwoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKICAgIHJldHVybiAkU3VjY2VzczsKfQoKIyBFTyBDdXN0b21lclRlbXBsYXRlCgoxOwo=</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.Admin.ServiceTemplates.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwpDb3JlLkFnZW50LkFkbWluID0gQ29yZS5BZ2VudC5BZG1pbiB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuQWdlbnQuQWRtaW4uU2VydmljZVRlbXBsYXRlcwogKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbgogKiBAYXV0aG9yCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbiBmb3IgU2VydmljZVRlbXBsYXRlcyBzZWxlY3Rpb24uCiAqLwogQ29yZS5BZ2VudC5BZG1pbi5TZXJ2aWNlVGVtcGxhdGVzID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qCiAgICAqIEBuYW1lIEluaXQKICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uU2VydmljZVRlbXBsYXRlcwogICAgKiBAZnVuY3Rpb24KICAgICogQGRlc2NyaXB0aW9uCiAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBmaWx0ZXIgYW5kICJTZWxlY3RBbGwiIGFjdGlvbnMuCiAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgLy8gaW5pdGlhbGl6ZSAiU2VsZWN0QWxsIiBjaGVja2JveCBhbmQgYmluZCBjbGljayBldmVudCBvbiAiU2VsZWN0QWxsIiBmb3IgZWFjaCByZWxhdGlvbiBpdGVtCiAgICAgICAgQ29yZS5Gb3JtLkluaXRTZWxlY3RBbGxDaGVja2JveGVzKCQoJ3RhYmxlIHRkIGlucHV0W3R5cGU9ImNoZWNrYm94Il1bbmFtZT1JdGVtc1NlbGVjdGVkXScpLCAkKCcjU2VsZWN0QWxsSXRlbXNTZWxlY3RlZCcpKTsKCiAgICAgICAgJCgnaW5wdXRbdHlwZT0iY2hlY2tib3giXVtuYW1lPUl0ZW1zU2VsZWN0ZWRdJykuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3JlLkZvcm0uU2VsZWN0QWxsQ2hlY2tib3hlcygkKHRoaXMpLCAkKCcjU2VsZWN0QWxsSXRlbXNTZWxlY3RlZCcpKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0YWJsZSBmaWx0ZXJzCiAgICAgICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgiI0ZpbHRlciIpLCAkKCIjSXRlbXNUYWJsZSIpKTsKICAgICAgICBDb3JlLlVJLlRhYmxlLkluaXRUYWJsZUZpbHRlcigkKCIjRmlsdGVyVGVtcGxhdGVzIiksICQoIiNUZW1wbGF0ZXMiKSk7CiAgICAgICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgiI0ZpbHRlclNlcnZpY2VzIiksICQoIiNTZXJ2aWNlcyIpKTsKICAgIH07CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkFkbWluLlNlcnZpY2VUZW1wbGF0ZXMgfHwge30pKTsK</File>
        <File Location="var/httpd/htdocs/js/Core.Customer.TicketAction.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQ3VzdG9tZXIgPSBDb3JlLkN1c3RvbWVyIHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5DdXN0b21lci5UaWNrZXRBY3Rpb24KICogQG1lbWJlcm9mIENvcmUuQ3VzdG9tZXIKICogQGF1dGhvcgogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIGFsbCB0aWNrZXQgYWN0aW9uIHBvcHVwcy4KICovCkNvcmUuQ3VzdG9tZXIuVGlja2V0QWN0aW9uID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQ3VzdG9tZXIuVGlja2V0QWN0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgY3VzdG9tZXIgdGVtcGxhdGUgcmVsYXRlZCBldmVudHMuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gY2hhbmdlIHN0YW5kYXJkIHRlbXBsYXRlCiAgICAgICAgJCgnI1N0YW5kYXJkVGVtcGxhdGVJRCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5Db25maXJtVGVtcGxhdGVPdmVyd3JpdGUoJ1JpY2hUZXh0JywgJCh0aGlzKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnZm9ybVtuYW1lPSJjb21wb3NlIicpLmZpcnN0KCksICdBSkFYVXBkYXRlJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICBpZiAoICQoJyNTdGFuZGFyZFRlbXBsYXRlSUQnKS5jaGlsZHJlbigpLmxlbmd0aCA9PSAyICkgewogICAgICAgICAgICAkKCIjU3RhbmRhcmRUZW1wbGF0ZUlEIikudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIENvbmZpcm1UZW1wbGF0ZU92ZXJ3cml0ZQogICAgICogQG1lbWJlcm9mIENvcmUuQ3VzdG9tZXIuVGlja2V0QWN0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBGaWVsZE5hbWUgLSBUaGUgSUQgb2YgdGhlIGNvbnRlbnQgZmllbGQgKHRleHRhcmVhIG9yIFJURSkuIElEIHdpdGhvdXQgc2VsZWN0b3IgKCMpLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRUZW1wbGF0ZVNlbGVjdCAtIFNlbGVjdG9yIG9mIHRoZSBkcm9wZG93biBlbGVtZW50IGZvciB0aGUgdGVtcGxhdGUgc2VsZWN0aW9uLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIGlmIG92ZXJ3cml0aW5nIGlzIGNvbmZpcm1lZC4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBBZnRlciBhIHRlbXBsYXRlIHdhcyBzZWxlY3RlZCwgdGhpcyBmdW5jdGlvbiBsZXRzIHRoZSB1c2VyIGNvbmZpcm0gdGhhdCBhbGwgYWxyZWFkeSBleGlzdGluZyBjb250ZW50CiAgICAgKiAgICAgIGluIHRoZSB0ZXh0YXJlYSBvciBSVEUgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSB0ZW1wbGF0ZSBjb250ZW50LgogICAgICovCiAgICBUYXJnZXROUy5Db25maXJtVGVtcGxhdGVPdmVyd3JpdGUgPSBmdW5jdGlvbiAoRmllbGROYW1lLCAkVGVtcGxhdGVTZWxlY3QsIENhbGxiYWNrKSB7CiAgICAgICAgdmFyIENvbnRlbnQgPSAnJywKICAgICAgICAgICAgTGFzdFZhbHVlID0gJFRlbXBsYXRlU2VsZWN0LmRhdGEoJ0xhc3RWYWx1ZScpIHx8ICcnOwogICAgICAgIC8vIEZhbGxiYWNrIGZvciBub24tcmljaHRleHQgY29udGVudAogICAgICAgIENvbnRlbnQgPSAkKCcjJyArIEZpZWxkTmFtZSkudmFsKCk7CgogICAgICAgIC8vIGdldCBSVEUgY29udGVudAogICAgICAgIGlmICh0eXBlb2YgQ0tFZGl0b3JJbnN0YW5jZXMgIT09ICd1bmRlZmluZWQnICYmIENLRWRpdG9ySW5zdGFuY2VzW0ZpZWxkTmFtZV0pIHsKICAgICAgICAgICAgQ29udGVudCA9IENLRWRpdG9ySW5zdGFuY2VzW0ZpZWxkTmFtZV0uZ2V0RGF0YSgpOwogICAgICAgIH0KCiAgICAgICAgLy8gaWYgY29udGVudCBhbHJlYWR5IGV4aXN0cyBsZXQgdXNlciBjb25maXJtIHRvIHJlYWxseSBvdmVyd3JpdGUgdGhhdCBjb250ZW50IHdpdGggYSB0ZW1wbGF0ZQogICAgICAgIGlmICgKICAgICAgICAgICAgQ29udGVudC5sZW5ndGggJiYKICAgICAgICAgICAgIXdpbmRvdy5jb25maXJtKENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTZXR0aW5nIGEgdGVtcGxhdGUgd2lsbCBvdmVyd3JpdGUgYW55IHRleHQgb3IgYXR0YWNobWVudC4nKSArICcgJyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY29udGludWU/JykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB1c2VyIGNhbmNlbHMgY29uZmlybWF0aW9uLCByZXNldCB0ZW1wbGF0ZSBzZWxlY3Rpb24KICAgICAgICAgICAgICAgICRUZW1wbGF0ZVNlbGVjdC52YWwoTGFzdFZhbHVlKS50cmlnZ2VyKCdyZWRyYXcnKTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCQuaXNGdW5jdGlvbihDYWxsYmFjaykpIHsKICAgICAgICAgICAgQ2FsbGJhY2soKTsKICAgICAgICAgICAgJFRlbXBsYXRlU2VsZWN0LmRhdGEoJ0xhc3RWYWx1ZScsICRUZW1wbGF0ZVNlbGVjdC52YWwoKSk7CiAgICAgICAgfQogICAgfQoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5DdXN0b21lci5UaWNrZXRBY3Rpb24gfHwge30pKTsK</File>
        <File Location="var/httpd/htdocs/skins/Customer/default/css/Core.FieldExplanationRow.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi5GaWVsZEV4cGxhbmF0aW9uIHsKICAgIHBhZGRpbmctbGVmdDogMjRweDsKICAgIHBhZGRpbmctdG9wOiA0cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBtYXJnaW4tYm90dG9tOiAtMjJweDsKfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogICAgLkZpZWxkRXhwbGFuYXRpb24gewogICAgICAgIG1hcmdpbi1sZWZ0OiAxNyU7CiAgICB9Cn0K</File>
        <File Location="doc/en/CustomerTemplates.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableCreate Type="post" Name="service_standard_template">
            <Column Name="service_id" Required="true" Type="INTEGER"></Column>
            <Column Name="standard_template_id" Required="true" Type="INTEGER"></Column>
            <Column Name="create_time" Required="true" Type="DATE"></Column>
            <Column Name="create_by" Required="true" Type="INTEGER"></Column>
            <Column Name="change_time" Required="true" Type="DATE"></Column>
            <Column Name="change_by" Required="true" Type="INTEGER"></Column>
            <Unique>
                                <UniqueColumn Name="service_id"></UniqueColumn>
                <UniqueColumn Name="standard_template_id"></UniqueColumn>
</Unique>
            <Index Name="service_standard_template_service_id">
                <IndexColumn Name="service_id">
                </IndexColumn>
            </Index>
            <Index Name="service_standard_template_standard_template_id">
                <IndexColumn Name="standard_template_id">
                </IndexColumn>
            </Index>
            <ForeignKey ForeignTable="service">
                <Reference Foreign="id" Local="service_id">
                </Reference>
            </ForeignKey>
            <ForeignKey ForeignTable="standard_template">
                <Reference Foreign="id" Local="standard_template_id">
                </Reference>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Foreign="id" Local="create_by">
                </Reference>
                <Reference Foreign="id" Local="change_by">
                </Reference>
            </ForeignKey>
        </TableCreate>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableDrop Type="pre" Name="service_standard_template">
        </TableDrop>
    </DatabaseUninstall>
</otrs_package>