<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>CustomerTemplates</Name>
    <Version>11.0.4</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-10-29 10:13:18" Version="11.0.4">Updated package with core improvements to ACLs.</ChangeLog>
    <ChangeLog Date="2026-04-27 14:03:17" 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>39a630d47b488c23a373bfd5e275cfcb9b0e1a4b</BuildCommitID>
    <BuildDate>2026-10-29 10:13:22</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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA5Njc1MzM4MDdmZjQ2NjRlZjFkMmJmODExNzlmY2E4OWNmYjUxYjUzIC0gS2VybmVsL01vZHVsZXMvQ3VzdG9tZXJUaWNrZXRNZXNzYWdlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldE1lc3NhZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+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+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEdldFBhcmFte0Rlc3R9ICkgewogICAgICAgICAgICBteSAoICRRdWV1ZUlEUGFyYW0sICRRdWV1ZVBhcmFtICkgPSBzcGxpdCggL1x8XHwvLCAkR2V0UGFyYW17RGVzdH0gKTsKICAgICAgICAgICAgbXkgJFF1ZXVlSURMb29rdXAgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUXVldWVQYXJhbSApOwogICAgICAgICAgICBpZiAoICRRdWV1ZUlETG9va3VwICYmICRRdWV1ZUlETG9va3VwIGVxICRRdWV1ZUlEUGFyYW0gKSB7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbicpOwogICAgICAgICAgICAgICAgaWYgKCAleyAkQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbiAvLyB7fSB9ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEZXN0fSA9ICRRdWV1ZUlEUGFyYW0gLiAnfHwnIC4gJEN1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb24tPnskUXVldWVQYXJhbX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVJRExvb2t1cDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwcmUtZmlsbGluZyBjYWNoZSBmb3IgcmVmZXJlbmNlIGZpZWxkIC0gbmVjZXNzYXJ5IGZvciBBQ0wgY2FsY3VsYXRpb24gb2YgbGVucyBmaWVsZHMKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKCiAgICAgICAgICAgIG15ICRJc1JlZmVyZW5jZUZpZWxkID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc1JlZmVyZW5jZUZpZWxkJywKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRJc1JlZmVyZW5jZUZpZWxkOwoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyktPlNldEZvcm1EYXRhKAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgID0+ICdQb3NzaWJsZVZhbHVlc19EeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICMgaWYgdGVtcGxhdGVzIHNob3VsZCBiZSBhdXRvc2VsZWN0ZWQsIGF1dG9tYXRpY2FsbHkgaGlkZSB0aGVtCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVGVtcGxhdGU6OkF1dG9zZWxlY3QnKSApIHsKICAgICAgICAgICAgJEF1dG9zZWxlY3QtPntTdGFuZGFyZFRlbXBsYXRlSUR9ID0gMjsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAjIGdhdGhlciBmaWVsZHMgd2hpY2ggYXJlIHN1cHBvc2VkIHRvIGJlIGhpZGRlbiB3aGVuIGF1dG9zZWxlY3RlZAogICAgICAgIG15ICRIaWRlQXV0b3NlbGVjdGVkSlNPTjsKICAgICAgICBpZiAoJEF1dG9zZWxlY3QpIHsKICAgICAgICAgICAgbXkgQEhpZGVBdXRvc2VsZWN0ZWQgPSBncmVwIHsgIXJlZiggJEF1dG9zZWxlY3QtPnskX30gKSAmJiAkQXV0b3NlbGVjdC0+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+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgaW52aXNpYmxlIGZpZWxkcwogICAgICAgICAgICBpZiAoICRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA5Njc1MzM4MDdmZjQ2NjRlZjFkMmJmODExNzlmY2E4OWNmYjUxYjUzIC0gS2VybmVsL01vZHVsZXMvQ3VzdG9tZXJUaWNrZXRab29tLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFpvb207Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCnVzZSBEaWdlc3Q6Ok1ENSBxdyhtZDVfaGV4KTsKdXNlIExpc3Q6OlV0aWwgIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+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+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXR0ZWQgYXR0YWNobWVudHMKICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAjIGRlbGV0ZSBoaWRkZW4gZmllbGRzIGNhY2hlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAnSGlkZGVuRmllbGRzJywKICAgICAgICAgICAgS2V5ICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdCB0byB6b29tIHZpZXcKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47VGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH0iLAogICAgICAgICk7CiAgICB9CgogICAgJFRpY2tldHtUbXBDb3VudGVyfSAgICAgID0gMDsKICAgICRUaWNrZXR7VGlja2V0VGltZVVuaXRzfSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRlZFRpbWVHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICApOwoKICAgICMgc2V0IHByaW9yaXR5IGZyb20gdGlja2V0IGFzIGZhbGxiYWNrCiAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gfHw9ICRUaWNrZXR7UHJpb3JpdHlJRH07CgogICAgIyBzZXQgaW5pdGlhbCBzdGF0ZQogICAgaWYgKCAkQ29uZmlnLT57U3RhdGV9ICYmICRDb25maWctPntTdGF0ZVByZXNldH0gKSB7CiAgICAgICAgbXkgJU5leHRTdGF0ZXMgPSByZXZlcnNlICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkTmV4dFN0YXRlc3sgJENvbmZpZy0+e1N0YXRlUHJlc2V0fSB9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17TmV4dFN0YXRlSUR9ID0gJE5leHRTdGF0ZXN7ICRDb25maWctPntTdGF0ZVByZXNldH0gfTsKICAgICAgICB9CiAgICB9CiAgICAkR2V0UGFyYW17TmV4dFN0YXRlSUR9IHx8PSAkR2V0UGFyYW17U3RhdGVJRH0gfHwgJFRpY2tldHtTdGF0ZUlEfTsKCiAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntVc2VySUR9OwoKICAgICMgR2V0IHZhbHVlcyBmb3IgVGlja2V0IGZpZWxkcyBhbmQgdXNlIGRlZmF1bHQgdmFsdWUgZm9yIEFydGljbGUgZmllbGRzLCBpZiBnaXZlbiAodGhpcwogICAgIyBzY3JlZW4gZ2VuZXJhdGVzIGEgbmV3IGFydGljbGUsIHRoZW4gYXJ0aWNsZSBmaWVsZHMgd2lsbCBiZSBhbHdheXMgZGVmYXVsdCB2YWx1ZSBvcgogICAgIyBlbXB0eSBhdCB0aGUgYmVnaW5uaW5nKS4KICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyApIHsKCiAgICAgICAgICAgICMgVmFsdWUgaXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZSBmcm9tIFRpY2tldC4KICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdBcnRpY2xlJyApIHsKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9IHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBwcmUtZmlsbGluZyBjYWNoZSBmb3IgcmVmZXJlbmNlIGZpZWxkIC0gbmVjZXNzYXJ5IGZvciBBQ0wgY2FsY3VsYXRpb24gb2YgbGVucyBmaWVsZHMKICAgICAgICBteSAkSXNSZWZlcmVuY2VGaWVsZCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc1JlZmVyZW5jZUZpZWxkJywKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRJc1JlZmVyZW5jZUZpZWxkOwoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+U2V0Rm9ybURhdGEoCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICBGb3JtSUQgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBLZXkgICAgICAgICAgPT4gJ1Bvc3NpYmxlVmFsdWVzX0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkZpZWxkUmVzdHJpY3Rpb25zJyk7CiAgICBteSAkQXV0b3NlbGVjdCAgICAgICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgIyBpZiB0ZW1wbGF0ZXMgc2hvdWxkIGJlIGF1dG9zZWxlY3RlZCwgYXV0b21hdGljYWxseSBoaWRlIHRoZW0KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclRlbXBsYXRlOjpBdXRvc2VsZWN0JykgKSB7CiAgICAgICAgJEF1dG9zZWxlY3QtPntTdGFuZGFyZFRlbXBsYXRlSUR9ID0gMjsKICAgIH0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgogICAgIyBnYXRoZXIgZmllbGRzIHdoaWNoIGFyZSBzdXBwb3NlZCB0byBiZSBoaWRkZW4gd2hlbiBhdXRvc2VsZWN0ZWQKICAgIG15ICRIaWRlQXV0b3NlbGVjdGVkSlNPTjsKICAgIGlmICgkQXV0b3NlbGVjdCkgewogICAgICAgIG15IEBIaWRlQXV0b3NlbGVjdGVkID0gZ3JlcCB7ICFyZWYoICRBdXRvc2VsZWN0LT57JF99ICkgJiYgJEF1dG9zZWxlY3QtPnskX30gPT0gMiB9IGtleXMgJXskQXV0b3NlbGVjdH07CiAgICAgICAgaWYgKCAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIHB1c2ggQEhpZGVBdXRvc2VsZWN0ZWQsCiAgICAgICAgICAgICAgICBtYXAgeyAiRHluYW1pY0ZpZWxkXyIgLiAkXyB9CiAgICAgICAgICAgICAgICAoIGdyZXAgeyAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH17JF99ID09IDIgfSBrZXlzICV7ICRBdXRvc2VsZWN0LT57RHluYW1pY0ZpZWxkfSB9ICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoQEhpZGVBdXRvc2VsZWN0ZWQpIHsKICAgICAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgICAgICAgICAkSGlkZUF1dG9zZWxlY3RlZEpTT04gPSAkSlNPTk9iamVjdC0+RW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcQEhpZGVBdXRvc2VsZWN0ZWQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdHJhY2sgY2hhbmdpbmcgc3RhbmRhcmQgZmllbGRzCiAgICBteSAkQUNMUHJlc2VsZWN0aW9uOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QUNMUHJlc2VsZWN0aW9uJykgKSB7CgogICAgICAgICMgZ2V0IGNhY2hlZCBwcmVzZWxlY3Rpb24gcnVsZXMKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldEFDTCcsCiAgICAgICAgICAgIEtleSAgPT4gJ1ByZXNlbGVjdGlvbicsCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5TZXRBQ0xQcmVzZWxlY3Rpb25DYWNoZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlQ29udmVyZ2VuY2UgPSAoCiAgICAgICAgU3RkRmllbGRzID0+IDAsCiAgICAgICAgRmllbGRzICAgID0+IDAsCiAgICApOwogICAgbXkgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAoKTsKICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKCk7CiAgICBteSAlQ2hhbmdlZFN0ZEZpZWxkczsKCiAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICBteSAlU3RkRmllbGRWYWx1ZXM7CiAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAoCiAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICBGaWVsZHMgICAgID0+IHt9LAogICAgKTsKCiAgICBteSAkSW5pdGlhbFJ1biA9IDE7CgogICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7RmllbGRzfSApIHsKCiAgICAgICAgIyBkZXRlcm1pbmUgc3RhbmRhcmQgZmllbGQgaW5wdXQKICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ICkgewoKICAgICAgICAgICAgbXkgJU5ld0NoYW5nZWRFbGVtZW50czsKCiAgICAgICAgICAgICMgd2hpY2ggc3RhbmRhcmQgZmllbGRzIHRvIGNoZWNrIC0gRmllbGRJRCA9PiBHZXRQYXJhbVZhbHVlIChuZWNlc3NhcnkgZm9yIERlc3QpCiAgICAgICAgICAgIG15ICVDaGVjayA9ICgKICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICA9PiAnUHJpb3JpdHlJRCcsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEFDTFByZXNlbGVjdGlvbiAmJiAhJEluaXRpYWxSdW4gKSB7CiAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGRJRCAoIHNvcnQga2V5cyAlQ2hlY2sgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEZpZWxkSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEZpZWxkSUQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uLT57UnVsZXN9e1RpY2tldH17JEVsZW1lbnR9eyRGaWVsZElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRWxlbWVudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRWxlbWVudCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB1bmFmZmVjdGVkIGZpZWxkcwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkQ2hlY2t7JEZpZWxkSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZvciBlYWNoIHN0YW5kYXJkIGZpZWxkIHdoaWNoIGhhcyB0byBiZSBjaGVja2VkLCBydW4gdGhlIGRlZmluZWQgbWV0aG9kCiAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRTZWxmLT57RmllbGRNZXRob2RzfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBNRVRIT0QgaWYgISRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfTsKCiAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3sgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IH0gPSAkRmllbGQtPntNZXRob2R9LT4oCiAgICAgICAgICAgICAgICAgICAgJFNlbGYsCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzcGVjaWFsIHN0dWZmIGZvciBRdWV1ZUlEL0Rlc3Q6IERlc3QgaXMgIlF1ZXVlSUR8fFF1ZXVlTmFtZSIgPT4gIlF1ZXVlTmFtZSI7CiAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICBUT3M6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICV7ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3tEZXN0fXsiJFF1ZXVlSUR8fCRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXsgJFF1ZXVlSUQgfSJ9ID0gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyRRdWV1ZUlEfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCBzZWxlY3Rpb24gb2YgUXVldWVJRCAoRGVzdCB3aWxsIGJlIGRvbmUgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXIgZmllbGRzKQogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1F1ZXVlSUR9ICYmICEkU3RkRmllbGRWYWx1ZXN7RGVzdH17ICRHZXRQYXJhbXtEZXN0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+e0Rlc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgd2hldGhlciBjdXJyZW50IHNlbGVjdGVkIHZhbHVlIGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgZmllbGQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0KICAgICAgICAgICAgICAgICAgICAmJiAhJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9eyAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAjIGlmIG5vdCBlbXB0eSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfSwKICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICElTmV3Q2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9ICVOZXdDaGFuZ2VkRWxlbWVudHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKAogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQsCiAgICAgICAgICAgICAgICAlTmV3Q2hhbmdlZEVsZW1lbnRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkTG9vcFByb3RlY3Rpb24tLSA8IDEgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSYW4gaW50byB1bnJlc29sdmFibGUgbG9vcCEiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFRPRE86IGlzIHJldHVybmluZyBhbiBlbXB0eSBsaXN0IHJlYXNvbmFibGU/CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICVDaGFuZ2VkRWxlbWVudHMgICAgICAgID0gJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQ7CiAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVDdXJGaWVsZFN0YXRlczsKICAgICAgICBpZiAoICVDaGFuZ2VkRWxlbWVudHMgfHwgJEluaXRpYWxSdW4gKSB7CgogICAgICAgICAgICAjIGdldCB2YWx1ZXMgYW5kIHZpc2liaWxpdHkgb2YgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgIFRpY2tldE9iamVjdCAgICAgICAgICAgICAgPT4gJFRpY2tldE9iamVjdCwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0+ICRCYWNrZW5kT2JqZWN0LAogICAgICAgICAgICAgICAgQ2hhbmdlZEVsZW1lbnRzICAgICAgICAgICA9PiBcJUNoYW5nZWRFbGVtZW50cywgICAgICAgICAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEF1dG9zZWxlY3QgICAgICAgICAgICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gICAgICAgICAgID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgICAgICAgICAgID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbWJpbmUgRmllbGRTdGF0ZXMKICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9ID0gewogICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9IH0sCiAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IHsKICAgICAgICAgICAgICAgICV7ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9IH0sCiAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICBpZiAoICVDdXJGaWVsZFN0YXRlcyAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gKSApIHsKICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAwOwogICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICB9CgogICAgICAgICRJbml0aWFsUnVuID0gMDsKICAgIH0KCiAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGQgdmFsaWRhdGlvbiByZXN1bHQgaWYgZXJyb25lb3VzCiAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMgPSBtYXAgewogICAgICAgICdEeW5hbWljRmllbGRfJyAuICRfID0+IGRlZmluZWQgJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JF99CiAgICAgICAgICAgID8gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JF99e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICA6IHVuZGVmCiAgICB9ICgga2V5cyAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfS0+JSogKTsKCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiBqb2luICcnLAogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKSwKICAgICAgICAkU2VsZi0+X01hc2soCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVCb3ggPT4gXEBBcnRpY2xlQm94LAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICBUaWNrZXRTdGF0ZSAgID0+ICRUaWNrZXR7U3RhdGV9LAogICAgICAgICAgICBUaWNrZXRTdGF0ZUlEID0+ICRUaWNrZXR7U3RhdGVJRH0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgVGlja2V0U3RhdGVJRCAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwgICAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBjaGVjayB3aGV0aGVyIHRoaXMgcmlnaHQKICAgICAgICAgICAgQWNsQWN0aW9uICAgICAgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgIEhpZGVBdXRvc2VsZWN0ZWQgID0+ICRIaWRlQXV0b3NlbGVjdGVkSlNPTiwKICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgPT4gJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9LAogICAgICAgICAgICBBY3Rpdml0eUVycm9ySFRNTCA9PiBcJUFjdGl2aXR5RXJyb3JIVE1MLAogICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzICA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBSZXBseSAgICAgICAgICAgICA9PiAkQWNsQWN0aW9uTG9va3Vwe0N1c3RvbWVyVGlja2V0Wm9vbVJlcGx5fSwKICAgICAgICApLAogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTmF2aWdhdGlvbkJhciwKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcjsKfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5leHRTdGF0ZXM7CiAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJU5leHRTdGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKCiAgICAgICAgICAgICMgJVBhcmFtIGNvdWxkIGNvbnRhaW4gVGlja2V0IFR5cGUgYXMgb25seSBUeXBlLCBpdCBzaG91bGQgbm90IGJlIHNlbnQKICAgICAgICAgICAgVHlwZSA9PiB1bmRlZiwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVQcmlvcml0aWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgbXkgJUFjbEFjdGlvbkxvb2t1cDsKICAgIGlmICggJFBhcmFte0FjbEFjdGlvbn0gKSB7CiAgICAgICAgJUFjbEFjdGlvbkxvb2t1cCA9IHJldmVyc2UgJXsgJFBhcmFte0FjbEFjdGlvbn0gfTsKICAgIH0KCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgc2hvdyBiYWNrIGxpbmsKICAgIGlmICggJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBhcnRpY2xlIHN0dWZmCiAgICBteSAkU2VsZWN0ZWRBcnRpY2xlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApIHx8ICcnOwogICAgbXkgQEFydGljbGVCb3ggICAgICAgID0gQHsgJFBhcmFte0FydGljbGVCb3h9IH07CgogICAgIyBwcmVwYXJlIGVycm9ycyEKICAgIGlmICggJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgZm9yIG15ICRLZXlFcnJvciAoIHNvcnQga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JEtleUVycm9yfSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskS2V5RXJyb3J9ICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRBcnRpY2xlSUQgICAgICAgICAgID0gJyc7CiAgICBteSAkTGFzdEN1c3RvbWVyQXJ0aWNsZSA9ICcnOwogICAgaWYgKEBBcnRpY2xlQm94KSB7CgogICAgICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgICAgIG15ICRDb3VudGVyQXJyYXkgPSAwOwogICAgICAgIG15ICRMYXN0Q3VzdG9tZXJBcnRpY2xlSUQ7CiAgICAgICAgJExhc3RDdXN0b21lckFydGljbGUgPSAkI0FydGljbGVCb3g7CgogICAgICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICAgICAgbXkgJUFydGljbGUgPSAleyRBcnRpY2xlVG1wfTsKCiAgICAgICAgICAgICMgaWYgaXQgaXMgYSBjdXN0b21lciBhcnRpY2xlCiAgICAgICAgICAgIGlmICggJEFydGljbGV7U2VuZGVyVHlwZX0gZXEgJ2N1c3RvbWVyJyApIHsKICAgICAgICAgICAgICAgICRMYXN0Q3VzdG9tZXJBcnRpY2xlSUQgPSAkQXJ0aWNsZXtBcnRpY2xlSUR9OwogICAgICAgICAgICAgICAgJExhc3RDdXN0b21lckFydGljbGUgICA9ICRDb3VudGVyQXJyYXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENvdW50ZXJBcnJheSsrOwogICAgICAgICAgICBpZiAoICgkU2VsZWN0ZWRBcnRpY2xlSUQpICYmICggJFNlbGVjdGVkQXJ0aWNsZUlEIGVxICRBcnRpY2xle0FydGljbGVJRH0gKSApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkQXJ0aWNsZXtBcnRpY2xlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHRyeSB0byB1c2UgdGhlIGxhdGVzdCBub24gaW50ZXJuYWwgYWdlbnQgYXJ0aWNsZQogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICRBcnRpY2xlSUQgICAgICAgICA9ICRBcnRpY2xlQm94Wy0xXS0+e0FydGljbGVJRH07CiAgICAgICAgICAgICRTZWxlY3RlZEFydGljbGVJRCA9ICRBcnRpY2xlSUQ7CiAgICAgICAgfQoKICAgICAgICAjIHRyeSB0byB1c2UgdGhlIGxhdGVzdCBjdXN0b21lciBhcnRpY2xlCiAgICAgICAgaWYgKCAhJEFydGljbGVJRCAmJiAkTGFzdEN1c3RvbWVyQXJ0aWNsZUlEICkgewogICAgICAgICAgICAkQXJ0aWNsZUlEICAgICAgICAgPSAkTGFzdEN1c3RvbWVyQXJ0aWNsZUlEOwogICAgICAgICAgICAkU2VsZWN0ZWRBcnRpY2xlSUQgPSAkQXJ0aWNsZUlEOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHNldCBkaXNwbGF5IG9wdGlvbnMKICAgICRQYXJhbXtIb29rfSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJykgfHwgJ1RpY2tldCMnOwoKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgdGlja2V0IGFjY291bnRlZCB0aW1lCiAgICBpZiAoICRDb25maWctPntab29tVGltZURpc3BsYXl9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBwcmlvcml0eSBmbGFnCiAgICBpZiAoICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5RmxhZycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgcmVuZGVyIHRpY2tldCBpbmZvIGhlYWQgZGVwZW5kaW5nIG9uIHN5c2NvbmZpZyBzZXR0aW5nCiAgICBpZiAoICRDb25maWctPntUaWNrZXRJbmZvRGlzcGxheVR5cGV9IGVxICdIZWFkZXInICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJJbmZvJywKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHR5cGUKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkQ29uZmlnLT57QXR0cmlidXRlc1ZpZXd9LT57VHlwZX0gKSB7CgogICAgICAgIG15ICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKS0+VHlwZUdldCgKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFZhbGlkID0+ICRUeXBle1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBzZXJ2aWNlCiAgICBpZiAoCiAgICAgICAgJFBhcmFte1NlcnZpY2V9CiAgICAgICAgJiYKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgJiYgJENvbmZpZy0+e0F0dHJpYnV0ZXNWaWV3fS0+e1NlcnZpY2V9CiAgICAgICAgKQogICAgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17U0xBfQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntTTEF9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgc3RhdGUKICAgIGlmICggJENvbmZpZy0+e0F0dHJpYnV0ZXNWaWV3fS0+e1N0YXRlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBwcmlvcml0eQogICAgaWYgKCAkQ29uZmlnLT57QXR0cmlidXRlc1ZpZXd9LT57UHJpb3JpdHl9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHF1ZXVlCiAgICBpZiAoICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntRdWV1ZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEFnZW50VXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyB0aWNrZXQgb3duZXIKICAgIGlmICggJENvbmZpZy0+e0F0dHJpYnV0ZXNWaWV3fS0+e093bmVyfSApIHsKICAgICAgICBteSAkT3duZXJOYW1lID0gJEFnZW50VXNlck9iamVjdC0+VXNlck5hbWUoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17T3duZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgICAgICBEYXRhID0+IHsgT3duZXJOYW1lID0+ICRPd25lck5hbWUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHJlc3BvbnNpYmxlCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJgogICAgICAgICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntSZXNwb25zaWJsZX0KICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlTmFtZSA9ICRBZ2VudFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZU5hbWUgPT4gJFJlc3BvbnNpYmxlTmFtZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBjaGVjayBpZiB0aWNrZXQgaXMgbm9ybWFsIG9yIHByb2Nlc3MgdGlja2V0CiAgICBteSAkSXNQcm9jZXNzVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q2hlY2tGb3JQcm9jZXNzVHlwZSgKICAgICAgICAnVGlja2V0SUQnID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgKTsKCiAgICAjIHNob3cgcHJvY2VzcyB3aWRnZXQgIGFuZCBhY3Rpdml0eSBkaWFsb2dzIG9uIHByb2Nlc3MgdGlja2V0cwogICAgaWYgKCRJc1Byb2Nlc3NUaWNrZXQpIHsKCiAgICAgICAgIyBnZXQgdGhlIERGIHdoZXJlIHRoZSBQcm9jZXNzRW50aXR5SUQgaXMgc3RvcmVkCiAgICAgICAgbXkgJFByb2Nlc3NFbnRpdHlJREZpZWxkID0gJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCJQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudFByb2Nlc3NJRCIpOwoKICAgICAgICAjIGdldCB0aGUgREYgd2hlcmUgdGhlIEFjdGl2aXR5RW50aXR5SUQgaXMgc3RvcmVkCiAgICAgICAgbXkgJEFjdGl2aXR5RW50aXR5SURGaWVsZCA9ICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRBY3Rpdml0eUlEIik7CgogICAgICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cyBmb3IgcHJvY2VzcyBtYW5hZ2VtZW50CiAgICAgICAgbXkgJEFjdGl2aXR5T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eScpOwogICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2cnKTsKICAgICAgICBteSAkUHJvY2Vzc09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmODUyZGViZTJlZTlmZWViOGJkM2MwN2IwMjJjNGFhNmNhOWRkZmYyIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9DdXN0b21lclRpY2tldFpvb20udHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKPGRpdiBpZD0nb29vQ29udGVudCcgY2xhc3M9IlRpY2tldFpvb20gQVJJQVJvbGVNYWluIj4KICAgIDxkaXYgaWQ9J29vb0hlYWRlcidbJSBJRiBEYXRhLlRpY2tldEluZm9EaXNwbGF5VHlwZSA9PSAnUGVybWFuZW50JyAlXSBjbGFzcz0ib29vVGlja2V0SW5mb1Blcm1hbmVudCJbJSBFTkQgJV0+CiAgICAgICAgPGRpdiBjbGFzcz0nb29vV2l0aFN1Yic+CiAgICAgICAgICAgIDxoMiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPHAgY2xhc3M9Im9vbzEyZyIgdGl0bGU9IlslIENvbmZpZygnVGlja2V0OjpIb29rJykgJV1bJSBDb25maWcoJ1RpY2tldDo6SG9va0RpdmlkZXInKSAlXVslIERhdGEuVGlja2V0TnVtYmVyIHwgaHRtbCAlXSI+WyUgRGF0YS5Ib29rICVdWyUgQ29uZmlnKCdUaWNrZXQ6Okhvb2tEaXZpZGVyJykgJV1bJSBEYXRhLlRpY2tldE51bWJlciB8IGh0bWwgJV08L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0nb29vQXZhdGFyJz4KICAgICAgICAgICAgWyUgSUYgRGF0YS5BdmF0YXIgJV0KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJbJSBEYXRhLkF2YXRhciAlXSIgLz4KICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkluaXRpYWxzIj5bJSBEYXRhLlVzZXJJbml0aWFscyB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgIDwvZGl2PgogICAgICAgIDxwIGNsYXNzPSdvb28xMic+WyUgRGF0YS5Vc2VyRmlyc3RuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLlVzZXJMYXN0bmFtZSB8IGh0bWwgJV08L3A+ClslIElGIERhdGEuVGlja2V0SW5mb0Rpc3BsYXlUeXBlID09ICdIZWFkZXInICVdCiAgICAgICAgPGRpdiBjbGFzcz0nb29vSW5mb0Jsb2NrJz4KICAgICAgICAgICAgPHAgY2xhc3M9J29vb0luZm8gb29vMTInPjxpIGNsYXNzPSJvb29mbyBvb29mby1pbmZvIj48L2k+IDxzcGFuPlslIFRyYW5zbGF0ZSgnSW5mb3JtYXRpb24nKSB8IGh0bWwgJV08L3NwYW4+PC9wPgogICAgICAgICAgICBbJSBJTkNMVURFICJDdXN0b21lclRpY2tldFpvb20vVGlja2V0SW5mby50dCIgJV0KICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgPGRpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVwbHlCdXR0b24iKSAlXQogICAgICAgIDxidXR0b24gaWQ9IlJlcGx5QnV0dG9uIiBjbGFzcz0iRG9udFByaW50IG9vb00iPjxzcGFuPlslIFRyYW5zbGF0ZSgiUmVwbHkiKSB8IGh0bWwgJV0gPC9zcGFuPjxpIGNsYXNzPSJvb29mbyBvb29mby1hcnJvd19yMiI+PC9pPjwvYnV0dG9uPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVwbHlCdXR0b24iKSAlXQogICAgICAgIDwvZGl2PgogICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1tb3JlX3YiPjwvaT4KICAgICAgICA8ZGl2IGlkPSdvb29DYXRlZ29yaWVzJz4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2F0ZWdvcmllcyIpICVdCiAgICAgICAgICAgIFslIElGIERhdGEuQ29uZmlnLkxpbmsgJV0KICAgICAgICAgICAgICAgIFslIElGIERhdGEuQ29uZmlnLlRyYW5zbGF0ZSAlXQogICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJvb29DYXRlZ29yeSBvb28xMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6WyUgRGF0YS5Db2xvciB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuQ29uZmlnLkxpbmsgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBJRiBEYXRhLkNvbmZpZy5QcmVmaXggJV1bJSBEYXRhLkNvbmZpZy5QcmVmaXggfCBodG1sICVdWyUgRU5EICVdWyUgRGF0YS5UZXh0IHwgSW50ZXJwb2xhdGUgfCBUcmFuc2xhdGUgfCBodG1sICVdIiB0YXJnZXQ9Il9ibGFuayI+WyUgSUYgRGF0YS5Db25maWcuUHJlZml4ICVdWyUgRGF0YS5Db25maWcuUHJlZml4IHwgaHRtbCAlXVslIEVORCAlXVslIERhdGEuVGV4dCB8IEludGVycG9sYXRlIHwgVHJhbnNsYXRlIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0ib29vQ2F0ZWdvcnkgb29vMTAiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOlslIERhdGEuQ29sb3IgfCBodG1sICVdIiBocmVmPSJbJSBEYXRhLkNvbmZpZy5MaW5rIHwgSW50ZXJwb2xhdGUgfCBodG1sICVdIiB0aXRsZT0iWyUgSUYgRGF0YS5Db25maWcuUHJlZml4ICVdWyUgRGF0YS5Db25maWcuUHJlZml4IHwgaHRtbCAlXVslIEVORCAlXVslIERhdGEuVGV4dCB8IEludGVycG9sYXRlIHwgaHRtbCAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Db25maWcuVHJhbnNsYXRlICVdCiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Im9vb0NhdGVnb3J5IG9vbzEwIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpbJSBEYXRhLkNvbG9yIHwgaHRtbCAlXSIgdGl0bGU9IlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IFRyYW5zbGF0ZSB8IGh0bWwgJV0iPlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IFRyYW5zbGF0ZSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Im9vb0NhdGVnb3J5IG9vbzEwIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpbJSBEYXRhLkNvbG9yIHwgaHRtbCAlXSIgdGl0bGU9IlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV0iPlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJDYXRlZ29yaWVzIikgJV0KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0nb29vTWFpbkJveCcgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgIDxkaXYgaWQ9IlByb2Nlc3NBY3Rpdml0aWVzIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTmV4dEFjdGl2aXRpZXMiKSAlXQogICAgICAgICAgICA8ZGl2IGlkPSJOZXh0QWN0aXZpdGllcyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGl2aXR5RGlhbG9nRGlyZWN0U3VibWl0IikgJV0KICAgICAgICAgICAgICAgIDxmb3JtIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0iIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSB8IGh0bWwgJV0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQ3VzdG9tZXJUaWNrZXRab29tIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVBY3Rpdml0eURpYWxvZyIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQcm9jZXNzRW50aXR5SUQiIHZhbHVlPSJbJSBEYXRhLlByb2Nlc3NFbnRpdHlJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpdml0eURpYWxvZ0VudGl0eUlEIiB2YWx1ZT0iWyUgRGF0YS5BY3Rpdml0eURpYWxvZ0VudGl0eUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IkJ1dHRvbl9bJSBEYXRhLkFjdGl2aXR5RGlhbG9nRW50aXR5SUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0iIGNsYXNzPSJvb29NIEFjdGl2aXR5U3VibWl0QnV0dG9uIiB0eXBlPSJzdWJtaXQiPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9mb3JtPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aXZpdHlEaWFsb2dEaXJlY3RTdWJtaXQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpdml0eURpYWxvZyIpICVdCiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJCdXR0b25fWyUgRGF0YS5BY3Rpdml0eURpYWxvZ0VudGl0eUlEIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIiBjbGFzcz0ib29vTSBBY3Rpdml0eVN0YXJ0QnV0dG9uIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGl2aXR5RGlhbG9nIikgJV0KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJOZXh0QWN0aXZpdGllcyIpICVdCiAgICAgICAgPC9kaXY+CiAgICAgICAgPHVsIGlkPSdvb29BcnRpY2xlTGlzdCdbJSBJRiBEYXRhLlRpY2tldEluZm9EaXNwbGF5VHlwZSA9PSAnUGVybWFuZW50JyAlXSBjbGFzcz0ib29vVGlja2V0SW5mb1Blcm1hbmVudCJbJSBFTkQgJV0+CiAgICAgICAgPC91bD4KICAgICAgICA8dWwgaWQ9J29vb0FydGljbGVMaXN0RXhwYW5kZWQnWyUgSUYgRGF0YS5UaWNrZXRJbmZvRGlzcGxheVR5cGUgPT0gJ1Blcm1hbmVudCcgJV0gY2xhc3M9Im9vb1RpY2tldEluZm9QZXJtYW5lbnQiWyUgRU5EICVdPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcm9jZXNzQWN0aXZpdHkiKSAlXQogICAgICAgICAgICA8bGkgaWQ9IlByb2Nlc3NfWyUgRGF0YS5BY3Rpdml0eURpYWxvZ0VudGl0eUlEIHwgdXJpICVdIiBjbGFzcz0iQWN0aXZpdHkiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5BY3Rpdml0eUhUTUwgJV0KICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2Nlc3NBY3Rpdml0eSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZvbGxvd1VwIikgJV0KPGxpIGlkPSJGb2xsb3dVcCIgY2xhc3M9IlslIERhdGEuRm9sbG93VXBWaXNpYmxlIHwgaHRtbCAlXSBBY3Rpdml0eSI+CiAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0jRm9sbG93VXAiIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSIgaWQ9IlJlcGx5Q3VzdG9tZXJUaWNrZXQiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJDdXN0b21lclRpY2tldFpvb20iIC8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmUiIC8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBcnRpY2xlSUQiIHZhbHVlPSJbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIiAvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZyb21DaGF0SUQiIHZhbHVlPSJbJSBEYXRhLkZyb21DaGF0SUQgfCBodG1sICVdIiAvPgoKICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzZW5nZXIiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXN0ZXJpc2tFeHBsYW5hdGlvbiIpICVdCiAgICAgICAgICAgIDxwIGNsYXNzPSJBc3Rlcmlza0V4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkFsbCBmaWVsZHMgbWFya2VkIHdpdGggYW4gYXN0ZXJpc2sgKCopIGFyZSBtYW5kYXRvcnkuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXN0ZXJpc2tFeHBsYW5hdGlvbiIpICVdCgogICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IkRvbnRQcmludCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9UaXRsZU1lc3NhZ2UiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVslIERhdGEuSGlkZGVuQ2xhc3MgfCBodG1sICVdIiBbJSBEYXRhLkhpZGRlblN0eWxlIHwgaHRtbCAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlRvb2x0aXAgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVG9vbHRpcCBvb29Ub29sdGlwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1oZWxwIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoRGF0YS5Ub29sdGlwKSB8IGh0bWwgfCBodG1sX2xpbmVfYnJlYWsgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX1RpdGxlTWVzc2FnZSIpICVdCgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9IkRvbnRQcmludCIgdHlwZT0idGV4dCIgbmFtZT0iU3ViamVjdCIgaWQ9IlN1YmplY3QiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN1YmplY3QiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhbmRhcmRUZW1wbGF0ZSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhbmRhcmRUZW1wbGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGFuZGFyZFRlbXBsYXRlSUQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk5ldyB0aWNrZXQgdGVtcGxhdGUiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiVGV4dCBUZW1wbGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIlNldHRpbmcgYSB0ZW1wbGF0ZSB3aWxsIG92ZXJ3cml0ZSBhbnkgdGV4dCBvciBhdHRhY2htZW50LiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQojIEVPIEN1c3RvbWVyVGVtcGxhdGUKCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSaWNoVGV4dEhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlcGx5IikgfCBodG1sICVdIiBpZD0iUmljaFRleHQiIGNsYXNzPSJSaWNoVGV4dCBEb250UHJpbnQgVmFsaWRhdGVfUmVxdWlyZWRSaWNoVGV4dCBbJSBEYXRhLlJpY2hUZXh0SW52YWxpZCB8IGh0bWwgJV0iIG5hbWU9IkJvZHkiIHJvd3M9IjE1IiBjb2xzPSJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSIpIHwgaHRtbCAlXSI+WyUgRGF0YS5Cb2R5IHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJpY2hUZXh0IiBjbGFzcz0iTWFuZGF0b3J5Ij5bJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV0gPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIE5vSmF2YVNjcmlwdE1lc3NhZ2VbJSBEYXRhLlJpY2hUZXh0SW52YWxpZCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJvb29BdHRhY2htZW50cyIgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRG5EVXBsb2FkQm94Ij4KWyUgSU5DTFVERSAiRm9ybUVsZW1lbnRzL0N1c3RvbWVyQXR0YWNobWVudExpc3QudHQiICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX1RpdGxlQ2F0ZWdvcnkiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVslIERhdGEuSGlkZGVuQ2xhc3MgfCBodG1sICVdIiBbJSBEYXRhLkhpZGRlblN0eWxlIHwgaHRtbCAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlRvb2x0aXAgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVG9vbHRpcCBvb29Ub29sdGlwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1oZWxwIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoRGF0YS5Ub29sdGlwKSB8IGh0bWwgfCBodG1sX2xpbmVfYnJlYWsgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX1RpdGxlQ2F0ZWdvcnkiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRm9sbG93VXBTdGF0ZSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTmV4dFN0YXRlc1N0cmcgJV0gPGxhYmVsIGZvcj0iU3RhdGVJRCI+WyUgVHJhbnNsYXRlKCJOZXh0IHN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZvbGxvd1VwU3RhdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGb2xsb3dVcFByaW9yaXR5IikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Qcmlvcml0eVN0cmcgJV0gPGxhYmVsIGZvcj0iUHJpb3JpdHlJRCI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGb2xsb3dVcFByaW9yaXR5IikgJV0KClslIERhdGEuRHluYW1pY0ZpZWxkSFRNTCAlXQoKICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWN0aW9uUm93Ij4KICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iQ2xvc2VCdXR0b24gb29vWFMiPlslIFRyYW5zbGF0ZSgiRGlzY2FyZCIpIHwgaHRtbCAlXTwvYnV0dG9uPjxidXR0b24gdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iIGNsYXNzPSJvb29YUyI+WyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV08L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Zvcm0+CjwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJGb2xsb3dVcCIpICVdClslIElGIERhdGEuTm9BcnRpY2xlcyAlXQogICAgICAgICAgICA8bGkgY2xhc3M9J0VtcHR5TWVzc2FnZSc+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRoaXMgaXRlbSBoYXMgbm8gYXJ0aWNsZXMgeWV0LiIpIHwgaHRtbCAlXQogICAgICAgICAgICA8L2xpPgpbJSBFTFNFICVdCiAgICAgICAgICAgIFslIERhdGEuQXJ0aWNsZXMgJV0KWyUgRU5EICVdCiAgICAgICAgPC91bD4KWyUgSUYgRGF0YS5UaWNrZXRJbmZvRGlzcGxheVR5cGUgPT0gJ1Blcm1hbmVudCcgJV0KICAgICAgICAgICAgWyUgSU5DTFVERSAiQ3VzdG9tZXJUaWNrZXRab29tL1RpY2tldEluZm8udHQiICVdClslIEVORCAlXQogICAgPC9kaXY+CjwvZGl2Pgo=</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>