<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>DiscreteSystemAddresses</Name>
    <Version>11.1.1</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-06-22 08:28:41" Version="11.1.1">Update to OTOBO 11.1.</ChangeLog>
    <Description Lang="en">This extension facilitates communication between system addresses within OTOBO (e.g. in cc), by linking tickets in different queues to each other and using address pools to ensure a new article is added to all relevant tickets within the system (e.g. one in the IT Queue and one in HR).</Description>
    <Description Lang="de">Diese Erweiterung erleichtert die Kommunikation zwischen Systemadressen innerhalb von OTOBO (z. B. in cc), indem sie Tickets in verschiedenen Queues miteinander verknüpft und Adress-Bereiche verwendet, um sicherzustellen, dass ein neuer Artikel zu allen relevanten Tickets innerhalb des Systems hinzugefügt wird (z. B. eines in der IT-Queue und eine in der Personalabteilung).</Description>
    <Framework>11.1.x</Framework>
    <IntroInstall Lang="en" Title="Install Information" Type="pre">
        &lt;br/&gt;
        &lt;strong&gt;WELCOME&lt;/strong&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        You are about to install the OTOBO package DiscreteSystemAddresses.&lt;br/&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        ((enjoy))&lt;br/&gt;
        &lt;br/&gt;
    </IntroInstall>
    <IntroInstall Lang="de" Title="Installation Information" Type="pre">
        &lt;br/&gt;
        &lt;strong&gt;WILLKOMMEN&lt;/strong&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        Sie sind im Begriff das OTOBO-Paket DiscreteSystemAddresses zu installieren.&lt;br/&gt;
        &lt;br/&gt;
        &lt;br/&gt;
        ((enjoy))&lt;br/&gt;
        &lt;br/&gt;
    </IntroInstall>
    <BuildCommitID>df4c6be5bf5acafa598e6d05ebd488f3d7b80849</BuildCommitID>
    <BuildDate>2026-06-22 08:28:44</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Kernel/Autoload/TicketSubjectCleanInterdivisional.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IFJvdGhlciBPU1MgR21iSCwgaHR0cHM6Ly9vdG9iby5pby8KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7ICAgICMjIG5vIGNyaXRpYyAoTW9kdWxlczo6UmVxdWlyZUV4cGxpY2l0UGFja2FnZSkKCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDsgICAgIyMgbm8gY3JpdGljIChNb2R1bGVzOjpSZXF1aXJlRmlsZW5hbWVNYXRjaGVzUGFja2FnZSkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCik7CgojIGRpc2FibGUgcmVkZWZpbmUgd2FybmluZ3MgaW4gdGhpcyBzY29wZQp7CiAgICBubyB3YXJuaW5ncyAncmVkZWZpbmUnOyAgICAjIyBubyBjcml0aWMgcXcoVGVzdGluZ0FuZERlYnVnZ2luZzo6UHJvaGliaXROb1dhcm5pbmdzKQoKICAgICMgYmFja3VwIG9yaWdpbmFsIHJvdXRpbmVzCiAgICBteSAkVGlja2V0U3ViamVjdENsZWFuID0gXCZLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpUaWNrZXRTdWJqZWN0Q2xlYW47CgogICAgIyBSZW1vdmUgaW50ZXJkaXZpc2lvbmFsIHRpY2tldCBudW1iZXJzCiAgICAqS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6VGlja2V0U3ViamVjdENsZWFuID0gc3ViIHsKICAgICAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICAgICAjIHN0YW5kYXJkIGNsZWFuZWQgc3ViamVjdAogICAgICAgIG15ICRTdWJqZWN0ID0gJnskVGlja2V0U3ViamVjdENsZWFufShAXyk7CgogICAgICAgIHJldHVybiBpZiAhZGVmaW5lZCAkU3ViamVjdDsKCiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgICMgZ2V0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJFRpY2tldEhvb2sgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKTsKICAgICAgICBteSAkVGlja2V0SG9va0RpdmlkZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9va0RpdmlkZXInKTsKCiAgICAgICAgcmV0dXJuICRTdWJqZWN0IGlmICRTdWJqZWN0ICF+IC8kVGlja2V0SG9vay87CiAgICAgICAgcmV0dXJuICRTdWJqZWN0IGlmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTdWJqZWN0Q2xlYW5BbGxOdW1iZXJzJyk7CgogICAgICAgIG15ICRUaWNrZXRJRCA9ICRTZWxmLT5UaWNrZXRJRExvb2t1cCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRQYXJhbXtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBsaW5rZWQgdGlja2V0cwogICAgICAgIG15ICVMaW5rZWRUaWNrZXRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0tleUxpc3RXaXRoRGF0YSgKICAgICAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICAgICAgS2V5MSAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIE9iamVjdDIgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFN0YXRlICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVHlwZSAgICA9PiAnSW50ZXJkaXZpc2lvbmFsJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU3ViamVjdCBpZiAhJUxpbmtlZFRpY2tldHM7CgogICAgICAgIGZvciBteSAkVGlja2V0ICggdmFsdWVzICVMaW5rZWRUaWNrZXRzICkgewoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIHBvc3NpYmxlIHRpY2tldCBob29rIGZvcm1hdHMgd2l0aCBbXQogICAgICAgICAgICAkU3ViamVjdCA9fiBzL1xbXHMqXFEkVGlja2V0SG9vazogJFRpY2tldC0+e1RpY2tldE51bWJlcn1cRVxzKlxdXHMqLy9nOwogICAgICAgICAgICAkU3ViamVjdCA9fiBzL1xbXHMqXFEkVGlja2V0SG9vazokVGlja2V0LT57VGlja2V0TnVtYmVyfVxFXHMqXF1ccyovL2c7CiAgICAgICAgICAgICRTdWJqZWN0ID1+IHMvXFtccypcUSRUaWNrZXRIb29rJFRpY2tldEhvb2tEaXZpZGVyJFRpY2tldC0+e1RpY2tldE51bWJlcn1cRVxzKlxdXHMqLy9nOwoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIHBvc3NpYmxlIHRpY2tldCBob29rIGZvcm1hdHMgd2l0aG91dCBbXQogICAgICAgICAgICAkU3ViamVjdCA9fiBzL1xRJFRpY2tldEhvb2s6ICRUaWNrZXQtPntUaWNrZXROdW1iZXJ9XEVccyovL2c7CiAgICAgICAgICAgICRTdWJqZWN0ID1+IHMvXFEkVGlja2V0SG9vazokVGlja2V0LT57VGlja2V0TnVtYmVyfVxFXHMqLy9nOwogICAgICAgICAgICAkU3ViamVjdCA9fiBzL1xRJFRpY2tldEhvb2skVGlja2V0SG9va0RpdmlkZXIkVGlja2V0LT57VGlja2V0TnVtYmVyfVxFXHMqLy9nOwogICAgICAgIH0KCiAgICAgICAgIyB0cmltIHdoaXRlIHNwYWNlIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kCiAgICAgICAgJFN1YmplY3QgPX4gcy8oXlxzK3xccyskKS8vOwoKICAgICAgICByZXR1cm4gJFN1YmplY3Q7CiAgICB9Owp9CgoxOwo=</File>
        <File Location="Kernel/Config/Files/XML/AddressPool.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90b2JvX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sOjpFbWFpbEhlYWRlcnMiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW1haWwgaGVhZGVycyB1c2VkIGZvciBhZGRyZXNzLXBvb2wgYXNzaWdubWVudC4gU2Vjb25kYXJ5IGhlYWRlcnMgYXJlIG5vdCBldmFsdWF0ZWQgaWYgcG9vbHMgY291bGQgYmUgYXNzaWduZWQgdmlhIHRoZSBwcmltYXJ5IGhlYWRlcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3RlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmltYXJ5Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPlJlc2VudC1UbzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RW52ZWxvcGUtVG88L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPlRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5DYzwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZWNvbmRhcnkiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+RGVsaXZlcmVkLVRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5YLU9yaWdpbmFsLVRvPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMDEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDAyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wwMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMDQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDA1IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wwNiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMDciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDA4IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wwOSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMTAiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDExIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wxMiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMTMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDE0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wxNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMTYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDE3IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wxOCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMTkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDIwIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wyMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMjIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sIyMjUG9vbDIzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlZmF1bHRRdWV1ZSIgVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUXVldWUiIFZhbHVlUmVnZXg9IiI+UG9zdG1hc3RlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRW1haWxzIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCMjI1Bvb2wyNCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGwgZW1haWwgYWRkcmVzc2VzIHdoaWNoIG1ha2UgdXAgb25lIHBvb2wuIFF1ZXVlcyBhcmUgYXNzaWduZWQgaW1wbGljaXRlbHkuIEEgZGVmYXVsdCBxdWV1ZSBjYW4gYmUgcHJvdmlkZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpFbWFpbDo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2w8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0UXVldWUiIFZhbHVlVHlwZT0iRW50aXR5IiBWYWx1ZUVudGl0eVR5cGU9IlF1ZXVlIiBWYWx1ZVJlZ2V4PSIiPlBvc3RtYXN0ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkVtYWlscyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wjIyNQb29sMjUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsIGVtYWlsIGFkZHJlc3NlcyB3aGljaCBtYWtlIHVwIG9uZSBwb29sLiBRdWV1ZXMgYXJlIGFzc2lnbmVkIGltcGxpY2l0ZWx5LiBBIGRlZmF1bHQgcXVldWUgY2FuIGJlIHByb3ZpZGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFF1ZXVlIiBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJRdWV1ZSIgVmFsdWVSZWdleD0iIj5Qb3N0bWFzdGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFbWFpbHMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlR5cGUjIyNJbnRlcmRpdmlzaW9uYWwiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGxpbmsgdHlwZSAnSW50ZXJkaXZpc2lvbmFsJy4gSWYgdGhlIHNvdXJjZSBuYW1lIGFuZCB0aGUgdGFyZ2V0IG5hbWUgY29udGFpbiB0aGUgc2FtZSB2YWx1ZSwgdGhlIHJlc3VsdGluZyBsaW5rIGlzIGEgbm9uLWRpcmVjdGlvbmFsIG9uZS4gSWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBkaXJlY3Rpb25hbCBsaW5rLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6TGlua09iamVjdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTb3VyY2VOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkludGVyZGl2aXNpb25hbDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0TmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5JbnRlcmRpdmlzaW9uYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjMjIwMCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaW5rcyAyIHRpY2tldHMgd2l0aCBhICJJbnRlcmRpdmlzaW9uYWwiIHR5cGUgbGluay48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJPYmplY3QyIj5UaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPkludGVyZGl2aXNpb25hbDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJQb3N0TWFzdGVyOjpQcmVGaWx0ZXJNb2R1bGUjIyMwMDAtU2tpcFZpYU1lc3NhZ2VJRCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2R1bGUgdG8gY2hlY2sgaWYgYW4gYXJ0aWNsZSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgaWQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHN5c3RlbS4gKEUuZy4gaWYgdGhlIG1haWwgd2FzIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQgdGhyb3VnaCBhIGRpZmZlcmVudCBlbWFpbCBpbmJveC4pIE11bHRpcGxlIHBhcnNpbmcgY2FuIGJlIGFsbG93ZWQuIFBvb2xzIHdoaWNoIGFscmVhZHkgY29udGFpbiBhbiBhcnRpY2xlIHdpdGggdGhlIHJlc3BlY3RpdmUgbWVzc2FnZSBpZCB3aWxsIHN0aWxsIGJlIGlnbm9yZWQuIE9wdGlvbnMgYXJlICJBbHdheXMiLCAiQm91bmNlZEVtYWlsIiAobXVsdGlwbGUgcGFyc2luZyB3aWxsIG9ubHkgYmUgZG9uZSBmb3IgRW1haWxzIHdpdGggIlJlc2VudC1UbyItaGVhZGVyLCBlLmcuIFBvb2xBIGJvdW5jZWQgYSBtYWlsIHRvIFBvb2xCKSBhbmQgIk1haWxBY2NvdW50UXVldWUiIChpZiBkaXNwYXRjaGluZyB2aWEgcXVldWUgaXMgZW5hYmxlZCBmb3IgYSBtYWlsIGFjY291bnQsIGFuIGVtYWlsIGNhbiBiZSBtb3ZlZCB0byB0aGUgcmVzcGVjdGl2ZSBpbmJveCwgdG8gYmUgZXZhbHVhdGVkIGFnYWluKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVtYWlsOjpQb3N0TWFzdGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U2tpcFZpYU1lc3NhZ2VJRDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWxsb3dNdWx0aVBhcnNlIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBbHdheXMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWFpbEFjY291bnRRdWV1ZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCb3VuY2VkRW1haWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkF1dG9sb2FkUGVybFBhY2thZ2VzIyMjMTAwMC1UaWNrZXRTdWJqZWN0Q2xlYW5JbnRlcmRpdmlzaW9uYWxUaWNrZXROdW1iZXJzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlbW92ZSB0aWNrZXQgbnVtYmVycyBvZiBhbGwgaW50ZXJkaXZpc2lvbmFsbHkgbGlua2VkIHRpY2tldHMgd2hlbiBzdWJqZWN0IGlzIGNsZWFuZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpBdXRvbG9hZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIj5LZXJuZWw6OkF1dG9sb2FkOjpUaWNrZXRTdWJqZWN0Q2xlYW5JbnRlcmRpdmlzaW9uYWw8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KPC9vdG9ib19jb25maWc+Cg==</File>
        <File Location="Kernel/Language/de_DiscreteSystemAddresses.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0Rpc2NyZXRlU3lzdGVtQWRkcmVzc2VzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbCBlbWFpbCBhZGRyZXNzZXMgd2hpY2ggbWFrZSB1cCBvbmUgcG9vbC4gUXVldWVzIGFyZSBhc3NpZ25lZCBpbXBsaWNpdGVseS4gQSBkZWZhdWx0IHF1ZXVlIGNhbiBiZSBwcm92aWRlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbWFpbCBoZWFkZXJzIHVzZWQgZm9yIGFkZHJlc3MtcG9vbCBhc3NpZ25tZW50LiBTZWNvbmRhcnkgaGVhZGVycyBhcmUgbm90IGV2YWx1YXRlZCBpZiBwb29scyBjb3VsZCBiZSBhc3NpZ25lZCB2aWEgdGhlIHByaW1hcnkgaGVhZGVycy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnRlcmRpdmlzaW9uYWwnfSA9ICdCZXJlaWNoc8O8YmVyZ3JlaWZlbmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgMiB0aWNrZXRzIHdpdGggYSAiSW50ZXJkaXZpc2lvbmFsIiB0eXBlIGxpbmsuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBjaGVjayBpZiBhbiBhcnRpY2xlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSBpZCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3lzdGVtLiAoRS5nLiBpZiB0aGUgbWFpbCB3YXMgcmVjZWl2ZWQgYW5kIHByb2Nlc3NlZCB0aHJvdWdoIGEgZGlmZmVyZW50IGVtYWlsIGluYm94LikgTXVsdGlwbGUgcGFyc2luZyBjYW4gYmUgYWxsb3dlZC4gUG9vbHMgd2hpY2ggYWxyZWFkeSBjb250YWluIGFuIGFydGljbGUgd2l0aCB0aGUgcmVzcGVjdGl2ZSBtZXNzYWdlIGlkIHdpbGwgc3RpbGwgYmUgaWdub3JlZC4gT3B0aW9ucyBhcmUgIkFsd2F5cyIsICJCb3VuY2VkRW1haWwiIChtdWx0aXBsZSBwYXJzaW5nIHdpbGwgb25seSBiZSBkb25lIGZvciBFbWFpbHMgd2l0aCAiUmVzZW50LVRvIi1oZWFkZXIsIGUuZy4gUG9vbEEgYm91bmNlZCBhIG1haWwgdG8gUG9vbEIpIGFuZCAiTWFpbEFjY291bnRRdWV1ZSIgKGlmIGRpc3BhdGNoaW5nIHZpYSBxdWV1ZSBpcyBlbmFibGVkIGZvciBhIG1haWwgYWNjb3VudCwgYW4gZW1haWwgY2FuIGJlIG1vdmVkIHRvIHRoZSByZXNwZWN0aXZlIGluYm94LCB0byBiZSBldmFsdWF0ZWQgYWdhaW4pLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbW92ZSB0aWNrZXQgbnVtYmVycyBvZiBhbGwgaW50ZXJkaXZpc2lvbmFsbHkgbGlua2VkIHRpY2tldHMgd2hlbiBzdWJqZWN0IGlzIGNsZWFuZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGhpcyBzZXR0aW5nIGRlZmluZXMgdGhlIGxpbmsgdHlwZSBcJ0ludGVyZGl2aXNpb25hbFwnLiBJZiB0aGUgc291cmNlIG5hbWUgYW5kIHRoZSB0YXJnZXQgbmFtZSBjb250YWluIHRoZSBzYW1lIHZhbHVlLCB0aGUgcmVzdWx0aW5nIGxpbmsgaXMgYSBub24tZGlyZWN0aW9uYWwgb25lLiBJZiB0aGUgdmFsdWVzIGFyZSBkaWZmZXJlbnQsIHRoZSByZXN1bHRpbmcgbGluayBpcyBhIGRpcmVjdGlvbmFsIGxpbmsuJ30gPQogICAgICAgICcnOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICk7Cgp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/PostMaster.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBkN2RhYTczZWUzZjQzZjE2NTdjZDY4M2I2YTE3NDBiY2MyMmQ3OGQ4IC0gS2VybmVsL1N5c3RlbS9Qb3N0TWFzdGVyLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgojIGNvcmUgbW9kdWxlcwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyICAgICAgICAgICAoKTsKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3Nlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkRlc3RRdWV1ZSAoKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpOZXdUaWNrZXQgKCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6Rm9sbG93VXAgICgpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OlJlamVjdCAgICAoKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrICAgICAgICAgcXcoSXNIYXNoUmVmV2l0aERhdGEpOwoKb3VyICVPYmplY3RNYW5hZ2VyRmxhZ3MgPSAoCiAgICBOb25TaW5nbGV0b24gPT4gMSwKKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyIC0gcG9zdG1hc3RlciBsaWIKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIHBvc3RtYXN0ZXIgZnVuY3Rpb25zLiBFLiBnLiB0byBwcm9jZXNzIGVtYWlscy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkRvbid0IHVzZSB0aGUgY29uc3RydWN0b3IgZGlyZWN0bHksIHVzZSB0aGUgT2JqZWN0TWFuYWdlciBpbnN0ZWFkOgoKICAgIG15ICRQb3N0TWFzdGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIEVtYWlsICAgICAgICA9PiBcQEFycmF5T2ZFbWFpbENvbnRlbnQsCiAgICAgICAgICAgIFRydXN0ZWQgICAgICA9PiAxLCAjIDF8MCBpZ25vcmUgWC1PVE9CTyBoZWFkZXIgaWYgZmFsc2UKICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgICRTZWxmLT57RW1haWx9ICAgICAgICAgICAgICAgICAgPSAkUGFyYW17RW1haWx9ICAgICAgICAgICAgICAgICAgfHwgZGllICJHb3Qgbm8gRW1haWwhIjsKICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0gPSAkUGFyYW17Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0gfHwgZGllICJHb3Qgbm8gQ29tbXVuaWNhdGlvbkxvZ09iamVjdCEiOwoKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICRTZWxmLT57T3JpZ2luQ29tbXVuaWNhdGlvbkxvZ09iamVjdH0gPSAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9OwojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57UGFyc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgIEVtYWlsID0+ICRQYXJhbXtFbWFpbH0sCiAgICApOwogICAgJFNlbGYtPntEZXN0UXVldWVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkRlc3RRdWV1ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntOZXdUaWNrZXRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6Ok5ld1RpY2tldC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntGb2xsb3dVcE9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZvbGxvd1VwLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1JlamVjdE9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6UmVqZWN0LT5uZXcoICV7JFNlbGZ9ICk7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwojICAgICRTZWxmLT57RGVzdFF1ZXVlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpEZXN0UXVldWUtPm5ldyggJXskU2VsZn0gKTsKIyAgICAkU2VsZi0+e05ld1RpY2tldE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6TmV3VGlja2V0LT5uZXcoICV7JFNlbGZ9ICk7CiMgICAgJFNlbGYtPntGb2xsb3dVcE9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZvbGxvd1VwLT5uZXcoICV7JFNlbGZ9ICk7CiMgICAgJFNlbGYtPntSZWplY3RPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OlJlamVjdC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPl9DcmVhdGVNYWlsT2JqZWN0cygKICAgICAgICBEYXRhID0+ICRTZWxmLAogICAgKTsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgICMgY2hlY2sgbmVlZGVkIGNvbmZpZyBvcHRpb25zCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIGZvciBteSAkT3B0aW9uIChxdyhQb3N0bWFzdGVyVXNlcklEIFBvc3RtYXN0ZXJYLUhlYWRlcikpIHsKICAgICAgICAkU2VsZi0+eyRPcHRpb259ID0gJENvbmZpZ09iamVjdC0+R2V0KCRPcHRpb24pCiAgICAgICAgICAgIHx8IGRpZSAiRm91bmQgbm8gJyRPcHRpb24nIG9wdGlvbiBpbiBjb25maWd1cmF0aW9uISI7CiAgICB9CgogICAgIyBzaG91bGQgSSB1c2UgWC1PVE9CTyBoZWFkZXJzPwogICAgJFNlbGYtPntUcnVzdGVkfSA9ICRQYXJhbXtUcnVzdGVkfSAvLyAxOwoKICAgIGlmICggJFNlbGYtPntUcnVzdGVkfSApIHsKCiAgICAgICAgIyBnZXQgZHluYW1pYyBmaWVsZCBvYmplY3RzCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICAgICAgIyBhZGQgRHluYW1pYyBGaWVsZCBoZWFkZXJzCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZHMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0KAogICAgICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgICAgIFJlc3VsdFR5cGUgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGEgbG9va3VwIHRhYmxlCiAgICAgICAgbXkgJUhlYWRlckxvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAeyAkU2VsZi0+eydQb3N0bWFzdGVyWC1IZWFkZXInfSB9OwoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHZhbHVlcyAlJER5bmFtaWNGaWVsZHMgKSB7CiAgICAgICAgICAgIGZvciBteSAkSGVhZGVyICgKICAgICAgICAgICAgICAgICdYLU9UT0JPLUR5bmFtaWNGaWVsZC0nIC4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICdYLU9UT0JPLUZvbGxvd1VwLUR5bmFtaWNGaWVsZC0nIC4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgb25seSBhZGQgdGhlIGhlYWRlciBpZiBpcyBub3QgYWxyZWRheSBpbiB0aGUgY29uZmlnCiAgICAgICAgICAgICAgICBpZiAoICEkSGVhZGVyTG9va3VweyRIZWFkZXJ9ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJFNlbGYtPnsnUG9zdG1hc3RlclgtSGVhZGVyJ30gfSwgJEhlYWRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKdG8gZXhlY3V0ZSB0aGUgcnVuIHByb2Nlc3MKCiAgICBteSAoJFJldENvZGUsICRUaWNrZXRJRCkgPSAkUG9zdE1hc3Rlck9iamVjdC0+UnVuKAogICAgICAgIFF1ZXVlICAgPT4gJ0p1bmsnLCAgIyBvcHRpb25hbCwgc3BlY2lmeSB0YXJnZXQgcXVldWUgZm9yIG5ldyB0aWNrZXRzCiAgICAgICAgUXVldWVJRCA9PiAxLCAgICAgICAjIG9wdGlvbmFsLCBzcGVjaWZ5IHRhcmdldCBxdWV1ZSBmb3IgbmV3IHRpY2tldHMKICAgICk7CgpBbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkIGluIGNhc2Ugb2YgYW4gZXJyb3IuCgpUaGUgZmlyc3QgcmV0dXJuZWQgdmFsdWUgaW5kaWNhdGVzIHdoYXQgaGFzIGJlZW4gZG9uZS4KCiAgICAwID0gZXJyb3IgKGFsc28gdW5kZWZpbmVkKQogICAgMSA9IG5ldyB0aWNrZXQgY3JlYXRlZAogICAgMiA9IGZvbGxvdyB1cCAvIG9wZW4vcmVvcGVuCiAgICAzID0gZm9sbG93IHVwIC8gY2xvc2UgLT4gbmV3IHRpY2tldAogICAgNCA9IGZvbGxvdyB1cCAvIGNsb3NlIC0+IHJlamVjdAogICAgNSA9IGlnbm9yZWQgKGJlY2F1c2Ugb2YgWC1PVE9CTy1JZ25vcmUgaGVhZGVyKQoKV2hlbiB0aGVyZSBpcyBhIG5ldyBvciBmb2xsb3d1cCB0aWNrZXQgdGhlbiB0aGlzIHRpY2tldCBpZCBpcyByZXR1cm5lZCBhcyB0aGUgc2Vjb25kIHZhbHVlLgoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBSZXR1cm47CgogICAgIyBDb25maWdPYmplY3Qgc2VjdGlvbiAvIGdldCBwYXJhbXMKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKIyAgIG15ICRHZXRQYXJhbSA9ICRTZWxmLT5HZXRFbWFpbFBhcmFtcygpOwojCiMgICAgIyBjaGVjayBpZiBmb2xsb3cgdXAKIyAgICBteSAoICRUbiwgJFRpY2tldElEICkgPSAkU2VsZi0+Q2hlY2tGb2xsb3dVcCggR2V0UGFyYW0gPT4gJEdldFBhcmFtICk7CgogICAgbXkgJEdldFBhcmFtID0gJFBhcmFte0VtYWlsUGFyYW1zfSB8fCAkU2VsZi0+R2V0RW1haWxQYXJhbXMoKTsKCiAgICBteSAoICRUbiwgJFRpY2tldElEICk7CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKCiAgICAjIGdldCBjb25maWcgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgbXkgJExpbmtPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpOwoKICAgIG15IEBUaWNrZXRJRHNUb0xpbms7CiAgICBpZiAoICEkUGFyYW17QWRkcmVzc1Bvb2x9ICkgewogICAgICAgICggJFRuLCAkVGlja2V0SUQgKSA9ICRTZWxmLT5DaGVja0ZvbGxvd1VwKCBHZXRQYXJhbSA9PiAkR2V0UGFyYW0gKTsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgICAgICAjIFJ1biB0aGUgUHJlRmlsdGVyTW9kdWxlcy4KICAgICAgICAjIFRoZXNlIGZpbHRlciBtb2R1bGVzIG1heSBtb2RpZnkgdGhlIGVtYWlsIHBhcmFtZXRlcnMgaW4gJUdldFBhcmFtLCBpbmNsdWRpbmcKICAgICAgICAjIHRoZSBib2R5IGFuZCB0aGUgYXR0YWNobWVudHMuCiAgICAgICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdQb3N0TWFzdGVyOjpQcmVGaWx0ZXJNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnUG9zdE1hc3Rlcjo6UHJlRmlsdGVyTW9kdWxlJykgfTsKCiAgICAgICAgICAgICMgZ2V0IG1haW4gb2JqZWN0cwogICAgICAgICAgICBteSAkTWFpbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CgogICAgICAgICAgICBKT0I6CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgICAgICMgTm90ZSB0aGF0IHBhc3NpbmcgUGFyc2VyT2JqZWN0IHRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZmlsdGVyIG9iamVjdAogICAgICAgICAgICAgICAgIyBhbGxvd3MgdGhlIGZpbHRlciB0byBtb2RpZnkgdGhlIG1lc3NhZ2UgaXRzZWxmLiBUaGlzIGlzIHVzZWQgaW4gU01JTUUgZGVjcnlwdGlvbi4KICAgICAgICAgICAgICAgIG15ICRGaWx0ZXJPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJEZpbHRlck9iamVjdCApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAibmV3KCkgb2YgUHJlRmlsdGVyTW9kdWxlICRKb2JzeyRKb2J9LT57TW9kdWxlfSBub3Qgc3VjY2Vzc2Z1bGx5ISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEpPQjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIG1vZGlmeSBwYXJhbXMKICAgICAgICAgICAgICAgIG15ICRSdW4gPSAkRmlsdGVyT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gID0+ICRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBKb2JDb25maWcgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgPT4gJFBhcmFte1F1ZXVlSUR9LAojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFJ1biApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiRXhlY3V0ZSBSdW4oKSBvZiBQcmVGaWx0ZXJNb2R1bGUgJEpvYnN7JEpvYn0tPntNb2R1bGV9IG5vdCBzdWNjZXNzZnVsbHkhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3VsZCBJIGlnbm9yZSB0aGUgaW5jb21pbmcgbWFpbD8KICAgICAgICBpZiAoICRHZXRQYXJhbS0+eydYLU9UT0JPLUlnbm9yZSd9ICYmICRHZXRQYXJhbS0+eydYLU9UT0JPLUlnbm9yZSd9ID1+IC8oeWVzfHRydWUpL2kgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnSW5mbycsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3RlcicsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+CiAgICAgICAgICAgICAgICAgICAgIklnbm9yZWQgRW1haWwgKEZyb206ICRHZXRQYXJhbS0+eydGcm9tJ30sIE1lc3NhZ2UtSUQ6ICRHZXRQYXJhbS0+eydNZXNzYWdlLUlEJ30pICIKICAgICAgICAgICAgICAgICAgICAuICJiZWNhdXNlIHRoZSBYLU9UT0JPLUlnbm9yZSBpcyBzZXQgKFgtT1RPQk8tSWdub3JlOiAkR2V0UGFyYW0tPnsnWC1PVE9CTy1JZ25vcmUnfSkuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAoNSk7CiAgICAgICAgfQoKICAgICAgICAjCiAgICAgICAgIyB0aWNrZXQgc2VjdGlvbgogICAgICAgICMKCiAgICAgICAgIyBjaGVjayBpZiBmb2xsb3cgdXAgKGFnYWluLCB3aXRoIG5ldyBHZXRQYXJhbSkKICAgICAgICAoICRUbiwgJFRpY2tldElEICkgPSAkU2VsZi0+Q2hlY2tGb2xsb3dVcCggR2V0UGFyYW0gPT4gJEdldFBhcmFtICk7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgICAgICAjIGJ1aWxkIG1haWwgYWRkcmVzcyBsaXN0CiAgICAgICAgbXkgQEFkZHJlc3NlZFBvb2xzID0gJFNlbGYtPntBZGRyZXNzUG9vbE9iamVjdH0tPkZpbHRlclBvb2xzKAogICAgICAgICAgICBQYXJhbXMgPT4gJEdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggQEFkZHJlc3NlZFBvb2xzICkgewogICAgICAgICAgICAjIGdldCB0aGUgUG9vbCBmb3IgUXVldWVJRCBmcm9tIE1haWxBY2NvdW50LCBpbiBjYXNlIG9mIGRpc3BhdGNoaW5nIHZpYSBRdWV1ZQogICAgICAgICAgICBteSAkTWFpbEFjY291bnRQb29sOwogICAgICAgICAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17UXVldWV9ICkgewogICAgICAgICAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgICAgICAgICAgICAgJFBhcmFte1F1ZXVlSUR9ICAgICAgfHw9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgUXVldWUgICA9PiAkUGFyYW17UXVldWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICVNYWlsQWNjb3VudEFkZHJlc3MgPSAkUXVldWVPYmplY3QtPkdldFN5c3RlbUFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE1haWxBY2NvdW50UG9vbCAgICAgICA9ICRTZWxmLT57QWRkcmVzc1Bvb2xPYmplY3R9LT5Qb29sTG9va3VwKAogICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgPT4gJE1haWxBY2NvdW50QWRkcmVzc3tFbWFpbH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBQb29sLCBpZiBub3QgYWRkcmVzc2VkCiAgICAgICAgICAgICAgICBpZiAoICRNYWlsQWNjb3VudFBvb2wgJiYgKCAhZ3JlcCB7ICRfIGVxICRNYWlsQWNjb3VudFBvb2wgfSBAQWRkcmVzc2VkUG9vbHMgKSApIHsKICAgICAgICAgICAgICAgICAgICB1bnNoaWZ0IEBBZGRyZXNzZWRQb29scywgJE1haWxBY2NvdW50UG9vbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiB3ZSBhcmUgcmVwcm9jZXNzaW5nIGFuIGVtYWlsIGZpbHRlciBvdXQgcG9vbHMgd2hpY2ggYWxyZWFkeSBoYXZlIGFuIGFydGljbGUgd2l0aCB0aGlzIG1lc3NhZ2UgaWQKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW0tPntJZ25vcmVBZGRyZXNzUG9vbHN9ICkgewogICAgICAgICAgICAgICAgQEFkZHJlc3NlZFBvb2xzID0gZ3JlcCB7ICEkR2V0UGFyYW0tPntJZ25vcmVBZGRyZXNzUG9vbHN9eyRffSB9IEBBZGRyZXNzZWRQb29sczsKCiAgICAgICAgICAgICAgICBpZiAoICFAQWRkcmVzc2VkUG9vbHMgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnSW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIklnbm9yZWQgRW1haWwgKEZyb206ICRHZXRQYXJhbS0+eydGcm9tJ30sIE1lc3NhZ2UtSUQ6ICRHZXRQYXJhbS0+eydNZXNzYWdlLUlEJ30pICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gImJlY2F1c2UgYWxsIGFkZHJlc3NlZCBwb29scyBhbHJlYWR5IGhvbGQgYW4gYXJ0aWNsZSBmb3IgaXQuIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZvciBmb2xsb3ctdXBzCiAgICAgICAgICAgIGlmICggJFRpY2tldElEICkgewogICAgICAgICAgICAgICAgbXkgJFBvb2wgPSAkU2VsZi0+e0FkZHJlc3NQb29sT2JqZWN0fS0+UG9vbExvb2t1cCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJFBvb2wgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJFBvb2wgfSBAQWRkcmVzc2VkUG9vbHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBZGRyZXNzUG9vbH0gPSAkUG9vbDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgaWYgYSBmb2xsb3cgdXAgaW4gYSBub3QgYWRkcmVzc2VkIHBvb2wgZXhpc3RzLCBsb29rIGZvciBsaW5rZWQgdGlja2V0cyBhbHNvIGluIHRoZSBwYXJlbnQgcnVuCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtGb2xsb3dVcFRpY2tldElEfSA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBpZiBwb29scyBhcmUgYWRkcmVzc2VkLCBub24gcG9vbCB0aWNrZXRzIGFyZSBpZ25vcmVkCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkVG4gICAgICAgPSB1bmRlZjsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQgPSB1bmRlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte0FkZHJlc3NQb29sfSAvLz0gc2hpZnQgQEFkZHJlc3NlZFBvb2xzOwoKICAgICAgICAgICAgQUREUkVTUzoKICAgICAgICAgICAgZm9yIG15ICRQb29sICggQEFkZHJlc3NlZFBvb2xzICkgewogICAgICAgICAgICAgICAgbmV4dCBBRERSRVNTIGlmICRQb29sIGVxICRQYXJhbXtBZGRyZXNzUG9vbH07CgogICAgICAgICAgICAgICAgbXkgJUVtYWlsUGFyYW1zICA9ICV7JEdldFBhcmFtfTsKICAgICAgICAgICAgICAgIG15ICRSZWN1VGlja2V0SUQgPSAkU2VsZi0+UmVjdXJzaXZlUG9zdE1hc3RlclJ1bigKICAgICAgICAgICAgICAgICAgICBFbWFpbFBhcmFtcyAgICAgID0+IFwlRW1haWxQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgQWRkcmVzc1Bvb2wgICAgICA9PiAkUG9vbCwKICAgICAgICAgICAgICAgICAgICBGb2xsb3dVcFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICAgID0+CiAgICAgICAgICAgICAgICAgICAgICAgICggJE1haWxBY2NvdW50UG9vbCAmJiAkTWFpbEFjY291bnRQb29sIGVxICRQb29sICkgPyAkUGFyYW17UXVldWVJRH0gOiB1bmRlZiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcHVzaCBAVGlja2V0SURzVG9MaW5rLCAkUmVjdVRpY2tldElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRha2UgcXVldWUgYnkgbWFpbCBhY2NvdW50IG9ubHkgaW50byBjb25zaWRlcmF0aW9uIGZvciBpdHMgcmVzcGVjdGl2ZSBwb29sCiAgICAgICAgICAgIGlmICggISRNYWlsQWNjb3VudFBvb2wgfHwgJE1haWxBY2NvdW50UG9vbCBuZSAkUGFyYW17QWRkcmVzc1Bvb2x9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtRdWV1ZX07CiAgICAgICAgICAgICAgICBkZWxldGUgJFBhcmFte1F1ZXVlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBjb21tdW5pY2F0aW9uIGxvZyB0byBvcmlnaW4KICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSA9ICRTZWxmLT57T3JpZ2luQ29tbXVuaWNhdGlvbkxvZ09iamVjdH07CiAgICAgICAgICAgICRTZWxmLT5fQ3JlYXRlTWFpbE9iamVjdHMoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRTZWxmLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRQYXJhbXtGb2xsb3dVcFRpY2tldElEfSApIHsKICAgICAgICAoICRUbiwgJFRpY2tldElEICkgPSAkU2VsZi0+e0FkZHJlc3NQb29sT2JqZWN0fS0+RmluZExpbmtlZFRpY2tldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFBhcmFte0ZvbGxvd1VwVGlja2V0SUR9LAogICAgICAgICAgICBBZGRyZXNzUG9vbCA9PiAkUGFyYW17QWRkcmVzc1Bvb2x9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1Bvc3RtYXN0ZXJVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17QWRkcmVzc1Bvb2x9ICkgewogICAgICAgICRHZXRQYXJhbS0+e0FkZHJlc3NQb29sfSA9ICRQYXJhbXtBZGRyZXNzUG9vbH07CgogICAgICAgIFhRVUVVRUhFQURFUjoKICAgICAgICBmb3IgbXkgJFhRdWV1ZUhlYWRlciAocXcoWC1PVE9CTy1RdWV1ZSBYLU9UT0JPLUZvbGxvd1VwLVF1ZXVlKSkgewoKICAgICAgICAgICAgbmV4dCBYUVVFVUVIRUFERVIgaWYgISRHZXRQYXJhbS0+eyRYUXVldWVIZWFkZXJ9OwoKICAgICAgICAgICAgbXkgJFF1ZXVlRXhpc3QgPSAkU2VsZi0+e0FkZHJlc3NQb29sT2JqZWN0fS0+UXVldWVDaGVjaygKICAgICAgICAgICAgICAgIFF1ZXVlICAgICAgID0+ICRHZXRQYXJhbS0+eyRYUXVldWVIZWFkZXJ9LAogICAgICAgICAgICAgICAgQWRkcmVzc1Bvb2wgPT4gJEdldFBhcmFtLT57QWRkcmVzc1Bvb2x9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFF1ZXVlRXhpc3QgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUoICRHZXRQYXJhbS0+eyRYUXVldWVIZWFkZXJ9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCgogICAgIyBydW4gYWxsIFByZUNyZWF0ZUZpbHRlck1vZHVsZXMKICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnUG9zdE1hc3Rlcjo6UHJlQ3JlYXRlRmlsdGVyTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnUG9zdE1hc3Rlcjo6UHJlQ3JlYXRlRmlsdGVyTW9kdWxlJykgfTsKCiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICBKT0I6CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICByZXR1cm4gdW5sZXNzICRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgIG15ICRGaWx0ZXJPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJEZpbHRlck9iamVjdCApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIm5ldygpIG9mIFByZUNyZWF0ZUZpbHRlck1vZHVsZSAkSm9ic3skSm9ifS0+e01vZHVsZX0gbm90IHN1Y2Nlc3NmdWxseSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQgSk9COwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG1vZGlmeSBwYXJhbXMKICAgICAgICAgICAgbXkgJFJ1biA9ICRGaWx0ZXJPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgIEdldFBhcmFtICA9PiAkR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBKb2JDb25maWcgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57UG9zdG1hc3RlclVzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRSdW4gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJFeGVjdXRlIFJ1bigpIG9mIFByZUNyZWF0ZUZpbHRlck1vZHVsZSAkSm9ic3skSm9ifS0+e01vZHVsZX0gbm90IHN1Y2Nlc3NmdWxseSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGl0J3MgYSBmb2xsb3cgdXAgLi4uCiAgICBpZiAoICRUbiAmJiAkVGlja2V0SUQgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcXVldWUgb2JqZWN0CiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgICAgICMgY2hlY2sgaWYgaXQgaXMgcG9zc2libGUgdG8gZG8gdGhlIGZvbGxvdyB1cAogICAgICAgICMgZ2V0IGZvbGxvdyB1cCBvcHRpb24gKHBvc3NpYmxlIG9yIG5vdCkKICAgICAgICBteSAkRm9sbG93VXBQb3NzaWJsZSA9ICRRdWV1ZU9iamVjdC0+R2V0Rm9sbG93VXBPcHRpb24oCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBsb2NrIG9wdGlvbiAoc2hvdWxkIGJlIHRoZSB0aWNrZXQgbG9ja2VkIC0gaWYgY2xvc2VkIC0gYWZ0ZXIgdGhlIGZvbGxvdyB1cCkKICAgICAgICBteSAkTG9jayA9ICRRdWV1ZU9iamVjdC0+R2V0Rm9sbG93VXBMb2NrT3B0aW9uKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3RhdGUgZGV0YWlscwogICAgICAgIG15ICVTdGF0ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldCgKICAgICAgICAgICAgSUQgPT4gJFRpY2tldHtTdGF0ZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gdHJlYXQgYSBib3VuY2UgZS1tYWlsIGFsd2F5cyBhcyBhIG5vcm1hbCBmb2xsb3ctdXAgKHRvIHJlb3BlbiB0aGUgdGlja2V0IGlmIG5lZWRlZCkuCiAgICAgICAgbXkgJEJvdW5jZUVtYWlsQXNGb2xsb3dVcCA9IDA7CiAgICAgICAgaWYgKCAkR2V0UGFyYW0tPnsnWC1PVE9CTy1Cb3VuY2UnfSApIHsKICAgICAgICAgICAgJEJvdW5jZUVtYWlsQXNGb2xsb3dVcCA9ICRDb25maWdPYmplY3QtPkdldCgnUG9zdG1hc3RlckJvdW5jZUVtYWlsQXNGb2xsb3dVcCcpOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgdGlja2V0CiAgICAgICAgaWYgKCAhJEJvdW5jZUVtYWlsQXNGb2xsb3dVcCAmJiAkRm9sbG93VXBQb3NzaWJsZSA9fiAvbmV3IHRpY2tldC9pICYmICRTdGF0ZXtUeXBlTmFtZX0gPX4gL14ocmVtb3ZlZHxjbG9zZSkvaSApCiAgICAgICAgewoKICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdJbmZvJywKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIkZvbGxvdyB1cCBmb3IgWyRUbl0gYnV0IGZvbGxvdyB1cCBub3QgcG9zc2libGUgKCRUaWNrZXR7U3RhdGV9KS4gQ3JlYXRlIG5ldyB0aWNrZXQuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2VuZCBtYWlsICYmIGNyZWF0ZSBuZXcgYXJ0aWNsZQogICAgICAgICAgICAjIGdldCBxdWV1ZSBpZiBvZiBGcm9tOiBhbmQgVG86CiAgICAgICAgICAgIGlmICggISRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRTZWxmLT57RGVzdFF1ZXVlT2JqZWN0fS0+R2V0UXVldWVJRCgKICAgICAgICAgICAgICAgICAgICBQYXJhbXMgPT4gJEdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiB0cnVzdGVkIHJldHVybnMgYSBuZXcgcXVldWUgaWQKICAgICAgICAgICAgbXkgJFRRdWV1ZUlEID0gJFNlbGYtPntEZXN0UXVldWVPYmplY3R9LT5HZXRUcnVzdGVkUXVldWVJRCgKICAgICAgICAgICAgICAgIFBhcmFtcyA9PiAkR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkVFF1ZXVlSUQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRUUXVldWVJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDbGVhbiBvdXQgdGhlIG9sZCBUaWNrZXROdW1iZXIgZnJvbSB0aGUgc3ViamVjdCAoc2VlIGJ1ZyM5MTA4KS4KICAgICAgICAgICAgIyBUaGlzIGF2b2lkcyBmYWxzZSB0aWNrZXQgbnVtYmVyIGRldGVjdGlvbiBvbiBjdXN0b21lciByZXBsaWVzLgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbS0+e1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFtLT57U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUbiwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFtLT57U3ViamVjdH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkVGlja2V0SUQgPSAkU2VsZi0+e05ld1RpY2tldE9iamVjdH0tPlJ1bigKICAgICAgICAgICAgICAgIElubWFpbFVzZXJJRCAgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgICA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgICAgID0+ICJCZWNhdXNlIHRoZSBvbGQgdGlja2V0IFskVG5dIGlzICckU3RhdGV7TmFtZX0nIiwKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gJ2F1dG8gcmVwbHkvbmV3IHRpY2tldCcsCiAgICAgICAgICAgICAgICBMaW5rVG9UaWNrZXRJRCAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJFRpY2tldElEOwoKICAgICAgICAgICAgQFJldHVybiA9ICggMywgJFRpY2tldElEICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlamVjdCBmb2xsb3cgdXAKICAgICAgICBlbHNpZiAoICEkQm91bmNlRW1haWxBc0ZvbGxvd1VwICYmICRGb2xsb3dVcFBvc3NpYmxlID1+IC9yZWplY3QvaSAmJiAkU3RhdGV7VHlwZU5hbWV9ID1+IC9eKHJlbW92ZWR8Y2xvc2UpL2kgKSB7CgogICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0luZm8nLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiRm9sbG93IHVwIGZvciBbJFRuXSBidXQgZm9sbG93IHVwIG5vdCBwb3NzaWJsZS4gRm9sbG93IHVwIHJlamVjdGVkLiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNlbmQgcmVqZWN0IG1haWwgYW5kIGFkZCBhcnRpY2xlIHRvIHRpY2tldAogICAgICAgICAgICBteSAkUnVuID0gJFNlbGYtPntSZWplY3RPYmplY3R9LT5SdW4oCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIElubWFpbFVzZXJJRCAgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICAgICAgICAgTG9jayAgICAgICAgICAgICA9PiAkTG9jaywKICAgICAgICAgICAgICAgIFRuICAgICAgICAgICAgICAgPT4gJFRuLAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICA9PiAnRm9sbG93IHVwIHJlamVjdGVkLicsCiAgICAgICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICdhdXRvIHJlamVjdCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gdW5sZXNzICRSdW47CgogICAgICAgICAgICBAUmV0dXJuID0gKCA0LCAkVGlja2V0SUQgKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIG5vcm1hbCBmb2xsb3cgdXAKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIG15ICRSdW4gPSAkU2VsZi0+e0ZvbGxvd1VwT2JqZWN0fS0+UnVuKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBJbm1haWxVc2VySUQgICAgID0+ICRTZWxmLT57UG9zdG1hc3RlclVzZXJJRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgID0+ICRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIExvY2sgICAgICAgICAgICAgPT4gJExvY2ssCiAgICAgICAgICAgICAgICBUbiAgICAgICAgICAgICAgID0+ICRUbiwKICAgICAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gJ2F1dG8gZm9sbG93IHVwJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJFJ1bjsKCiAgICAgICAgICAgIEBSZXR1cm4gPSAoIDIsICRUaWNrZXRJRCApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgdGlja2V0CiAgICBlbHNlIHsKCiAgICAgICAgaWYgKCAkUGFyYW17UXVldWV9ICYmICEkUGFyYW17UXVldWVJRH0gKSB7CgogICAgICAgICAgICAjIHF1ZXVlIGxvb2t1cCBpZiBxdWV1ZSBuYW1lIGlzIGdpdmVuCiAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFF1ZXVlID0+ICRQYXJhbXtRdWV1ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBxdWV1ZSBmcm9tIEZyb206IG9yIFRvOgogICAgICAgIGlmICggISRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgJFBhcmFte1F1ZXVlSUR9ID0gJFNlbGYtPntEZXN0UXVldWVPYmplY3R9LT5HZXRRdWV1ZUlEKCBQYXJhbXMgPT4gJEdldFBhcmFtICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHRydXN0ZWQgcmV0dXJucyBhIG5ldyBxdWV1ZSBpZAogICAgICAgIG15ICRUUXVldWVJRCA9ICRTZWxmLT57RGVzdFF1ZXVlT2JqZWN0fS0+R2V0VHJ1c3RlZFF1ZXVlSUQoCiAgICAgICAgICAgIFBhcmFtcyA9PiAkR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJFRRdWV1ZUlEKSB7CiAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRUUXVldWVJRDsKICAgICAgICB9CiAgICAgICAgJFRpY2tldElEID0gJFNlbGYtPntOZXdUaWNrZXRPYmplY3R9LT5SdW4oCiAgICAgICAgICAgIElubWFpbFVzZXJJRCAgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICA9PiAkR2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgICAgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICdhdXRvIHJlcGx5JywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gdW5sZXNzICRUaWNrZXRJRDsKCiAgICAgICAgQFJldHVybiA9ICggMSwgJFRpY2tldElEICk7CiAgICB9CgogICAgIyBydW4gYWxsIFBvc3RGaWx0ZXJNb2R1bGVzIChtb2RpZnkgZW1haWwgcGFyYW1zKQogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdQb3N0TWFzdGVyOjpQb3N0RmlsdGVyTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnUG9zdE1hc3Rlcjo6UG9zdEZpbHRlck1vZHVsZScpIH07CgogICAgICAgICMgZ2V0IG1haW4gb2JqZWN0cwogICAgICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAgICAgSk9COgogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgcmV0dXJuIHVubGVzcyAkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICBteSAkRmlsdGVyT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRGaWx0ZXJPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJuZXcoKSBvZiBQb3N0RmlsdGVyTW9kdWxlICRKb2JzeyRKb2J9LT57TW9kdWxlfSBub3Qgc3VjY2Vzc2Z1bGx5ISIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgSk9COwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG1vZGlmeSBwYXJhbXMKICAgICAgICAgICAgbXkgJFJ1biA9ICRGaWx0ZXJPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgPT4gJEdldFBhcmFtLAogICAgICAgICAgICAgICAgSm9iQ29uZmlnID0+ICRKb2JzeyRKb2J9LAogICAgICAgICAgICAgICAgUmV0dXJuICAgID0+ICRSZXR1cm5bMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntQb3N0bWFzdGVyVXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSdW4gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJFeGVjdXRlIFJ1bigpIG9mIFBvc3RGaWx0ZXJNb2R1bGUgJEpvYnN7JEpvYn0tPntNb2R1bGV9IG5vdCBzdWNjZXNzZnVsbHkhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgIyBjcmVhdGUgbGluayBvZiB0eXBlICdJbnRlcmRpdmlzaW9uYWwnIHRvIHRpY2tldHMKICAgIGlmICggJFBhcmFte0FkZHJlc3NQb29sfQogICAgICAgICYmICggQFRpY2tldElEc1RvTGluayB8fCAkUGFyYW17Rm9sbG93VXBUaWNrZXRJRH0gfHwgJEdldFBhcmFtLT57SWdub3JlQWRkcmVzc1Bvb2xzfSApICkgewoKICAgICAgICAjIGFkZCBhbGwgdGlja2V0IGlkcyB0byB0aGUgcmV0dXJuIC0gbWFpbmx5IHVzZWQgZm9yIHVuaXQgdGVzdHMKICAgICAgICBwdXNoIEBSZXR1cm4sIEBUaWNrZXRJRHNUb0xpbms7CgogICAgICAgICMgYWRkIHRoZSB0aWNrZXQgSUQgb2YgdGhlIGZpcnN0IHRpY2tldAogICAgICAgIHB1c2ggQFRpY2tldElEc1RvTGluaywgJFJldHVyblsxXTsKCiAgICAgICAgIyBhZGQgdGhlIG9yaWdpbmFsIGZvbGxvdyB1cCBJRCwgaWYgaXQgd2FzIGluIGEgcG9vbCBub3QgYWRkcmVzc2VkCiAgICAgICAgaWYgKCAkUGFyYW17Rm9sbG93VXBUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgIHB1c2ggQFRpY2tldElEc1RvTGluaywgJFBhcmFte0ZvbGxvd1VwVGlja2V0SUR9OwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGlzIGlzIGFuIGVtYWlsIHBhcnNlZCBhbiBhZGRpdGlvbmFsIHRpbWUsIGxpbmsgYWxsIHByZXZpb3VzbHkgY3JlYXRlZCB0aWNrZXRzCiAgICAgICAgaWYgKCAkR2V0UGFyYW0tPntJZ25vcmVBZGRyZXNzUG9vbHN9ICkgewogICAgICAgICAgICBwdXNoIEBUaWNrZXRJRHNUb0xpbmssICggdmFsdWVzICRHZXRQYXJhbS0+e0lnbm9yZUFkZHJlc3NQb29sc30tPiUqICk7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhbGwgdGlja2V0cyBhbHJlYWR5IGxpbmtlZAogICAgICAgIG15ICVMaW5rZWRUaWNrZXRzID0gJExpbmtPYmplY3QtPkxpbmtLZXlMaXN0KAogICAgICAgICAgICBPYmplY3QxID0+ICdUaWNrZXQnLAogICAgICAgICAgICBLZXkxICAgID0+ICRQYXJhbXtGb2xsb3dVcFRpY2tldElEfSB8fCAkVGlja2V0SUQsCiAgICAgICAgICAgIE9iamVjdDIgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFN0YXRlICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgVHlwZSAgICA9PiAnSW50ZXJkaXZpc2lvbmFsJywKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1Bvc3RtYXN0ZXJVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFRpY2tldElEc1RvTGluaywga2V5cyAlTGlua2VkVGlja2V0czsKCiAgICAgICAgJFNlbGYtPntBZGRyZXNzUG9vbE9iamVjdH0tPkludGVyZGl2aXNpb25hbFRpY2tldExpbmtBZGQoCiAgICAgICAgICAgIFRpY2tldElEcyA9PiBcQFRpY2tldElEc1RvTGluaywKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57UG9zdG1hc3RlclVzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgIHJldHVybiBAUmV0dXJuOwp9Cgo9aGVhZDIgQ2hlY2tGb2xsb3dVcCgpCgp0byBkZXRlY3QgdGhlIHRpY2tldCBudW1iZXIgaW4gcHJvY2Vzc2luZyBlbWFpbAoKICAgIG15ICgkVGlja2V0TnVtYmVyLCAkVGlja2V0SUQpID0gJFBvc3RNYXN0ZXJPYmplY3QtPkNoZWNrRm9sbG93VXAoCiAgICAgICAgU3ViamVjdCA9PiAnUmU6IFtUaWNrZXQ6IzEyMzQ1Nl0gU29tZSBTdWJqZWN0JywKICAgICk7Cgo9Y3V0CgpzdWIgQ2hlY2tGb2xsb3dVcCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgTG9hZCBDaGVja0ZvbGxvd1VwIE1vZHVsZXMKICAgIG15ICRKb2JzID0gJENvbmZpZ09iamVjdC0+R2V0KCdQb3N0TWFzdGVyOjpDaGVja0ZvbGxvd1VwTW9kdWxlJyk7CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkSm9icykgKSB7CiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwogICAgICAgIEpPQjoKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlJEpvYnMgKSB7CiAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkSm9icy0+eyRKb2J9OwoKICAgICAgICAgICAgcmV0dXJuIGlmICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnMtPnskSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgIG15ICRDaGVja09iamVjdCA9ICRKb2JzLT57JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRDaGVja09iamVjdCApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIm5ldygpIG9mIENoZWNrRm9sbG93VXAgJEpvYnMtPnskSm9ifS0+e01vZHVsZX0gbm90IHN1Y2Nlc3NmdWxseSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQgSk9COwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRUaWNrZXRJRCA9ICRDaGVja09iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57UG9zdG1hc3RlclVzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkVGlja2V0SUQpIHsKICAgICAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICglVGlja2V0KSB7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXInLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgZm9sbG93IHVwIHRpY2tldCB3aXRoIFRpY2tldE51bWJlciAnJFRpY2tldHtUaWNrZXROdW1iZXJ9JyBhbmQgVGlja2V0SUQgJyRUaWNrZXRJRCcuIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCAkVGlja2V0e1RpY2tldE51bWJlcn0sICRUaWNrZXRJRCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIEdldEVtYWlsUGFyYW1zKCkKCnRvIGdldCBhbGwgY29uZmlndXJlZCBQb3N0bWFzdGVyWC1IZWFkZXIgZW1haWwgaGVhZGVycwoKICAgIG15ICVIZWFkZXIgPSAkUG9zdE1hc3Rlck9iamVjdC0+R2V0RW1haWxQYXJhbXMoKTsKCj1jdXQKCnN1YiBHZXRFbWFpbFBhcmFtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVHZXRQYXJhbTsKCiAgICAjIHBhcnNlIHNlY3Rpb24KICAgIEhFQURFUjoKICAgIGZvciBteSAkUGFyYW0gKCBAeyAkU2VsZi0+eydQb3N0bWFzdGVyWC1IZWFkZXInfSB9ICkgewoKICAgICAgICAjIGRvIG5vdCBzY2FuIHgtb3RvYm8gaGVhZGVycyBpZiBtYWlsYm94IGlzIG5vdCBtYXJrZWQgYXMgdHJ1c3RlZAogICAgICAgIG5leHQgSEVBREVSIGlmICggISRTZWxmLT57VHJ1c3RlZH0gJiYgJFBhcmFtID1+IC9eeC1vdG9iby9pICk7CgogICAgICAgICRHZXRQYXJhbXskUGFyYW19ID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRQYXJhbSggV0hBVCA9PiAkUGFyYW0gKTsKCiAgICAgICAgbmV4dCBIRUFERVIgaWYgISRHZXRQYXJhbXskUGFyYW19OwoKICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdEZWJ1ZycsCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiJFBhcmFtOiAiIC4gJEdldFBhcmFteyRQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBjb21wYXQuIGhlYWRlcnMKICAgIGlmICggJEdldFBhcmFteydNZXNzYWdlLUlkJ30gKSB7CiAgICAgICAgJEdldFBhcmFteydNZXNzYWdlLUlEJ30gPSAkR2V0UGFyYW17J01lc3NhZ2UtSWQnfTsKICAgIH0KICAgIGlmICggJEdldFBhcmFteydSZXBseS1Ubyd9ICkgewogICAgICAgICRHZXRQYXJhbXsnUmVwbHlUbyd9ID0gJEdldFBhcmFteydSZXBseS1Ubyd9OwogICAgfQogICAgaWYgKAogICAgICAgICRHZXRQYXJhbXsnTWFpbGluZy1MaXN0J30KICAgICAgICB8fCAkR2V0UGFyYW17J1ByZWNlZGVuY2UnfQogICAgICAgIHx8ICRHZXRQYXJhbXsnWC1Mb29wJ30KICAgICAgICB8fCAkR2V0UGFyYW17J1gtTm8tTG9vcCd9CiAgICAgICAgfHwgJEdldFBhcmFteydYLU9UT0JPLUxvb3AnfQogICAgICAgIHx8ICgKICAgICAgICAgICAgJEdldFBhcmFteydBdXRvLVN1Ym1pdHRlZCd9CiAgICAgICAgICAgICYmIHN1YnN0ciggJEdldFBhcmFteydBdXRvLVN1Ym1pdHRlZCd9LCAwLCA1ICkgZXEgJ2F1dG8tJwogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteydYLU9UT0JPLUxvb3AnfSA9ICd5ZXMnOwogICAgfQogICAgaWYgKCAhJEdldFBhcmFteydYLVNlbmRlcid9ICkgewoKICAgICAgICAjIGdldCBzZW5kZXIgZW1haWwKICAgICAgICBteSAkRW1haWxBZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycpOwogICAgICAgIG15IEBFbWFpbEFkZHJlc3NlcyAgICAgPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKAogICAgICAgICAgICBMaW5lID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkRW1haWwgKEBFbWFpbEFkZHJlc3NlcykgewogICAgICAgICAgICAkR2V0UGFyYW17J1gtU2VuZGVyJ30gPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICAjIHNldCBzZW5kZXIgdHlwZSBpZiBub3QgZ2l2ZW4KICAgIGZvciBteSAkS2V5IChxdyhYLU9UT0JPLVNlbmRlclR5cGUgWC1PVE9CTy1Gb2xsb3dVcC1TZW5kZXJUeXBlKSkgewoKICAgICAgICBpZiAoICEkR2V0UGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICdjdXN0b21lcic7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIFgtT1RPQk8tU2VuZGVyVHlwZSBleGlzdHMsIGlmIG5vdCwgc2V0IGN1c3RvbWVyCiAgICAgICAgaWYgKCAhJEFydGljbGVPYmplY3QtPkFydGljbGVTZW5kZXJUeXBlTG9va3VwKCBTZW5kZXJUeXBlID0+ICRHZXRQYXJhbXskS2V5fSApICkgewogICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIkNhbid0IGZpbmQgc2VuZGVyIHR5cGUgJyRHZXRQYXJhbXskS2V5fScgaW4gZGIsIHRha2UgJ2N1c3RvbWVyJyIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICdjdXN0b21lcic7CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IGFydGljbGUgY3VzdG9tZXIgdmlzaWJpbGl0eSBpZiBub3QgZ2l2ZW4uCiAgICBmb3IgbXkgJEtleSAocXcoWC1PVE9CTy1Jc1Zpc2libGVGb3JDdXN0b21lciBYLU9UT0JPLUZvbGxvd1VwLUlzVmlzaWJsZUZvckN1c3RvbWVyKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBib2R5LgogICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRNZXNzYWdlQm9keSgpOwoKICAgICMgR2V0IGNvbnRlbnQgdHlwZSwgZGlzcG9zaXRpb24gYW5kIGNoYXJzZXQuCiAgICAkR2V0UGFyYW17J0NvbnRlbnQtVHlwZSd9ICAgICAgICA9ICRTZWxmLT57UGFyc2VyT2JqZWN0fS0+R2V0UmV0dXJuQ29udGVudFR5cGUoKTsKICAgICRHZXRQYXJhbXsnQ29udGVudC1EaXNwb3NpdGlvbid9ID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRDb250ZW50RGlzcG9zaXRpb24oKTsKICAgICRHZXRQYXJhbXtDaGFyc2V0fSAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRSZXR1cm5DaGFyc2V0KCk7CgogICAgIyBHZXQgYXR0YWNobWVudHMuCiAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1BhcnNlck9iamVjdH0tPkdldEF0dGFjaG1lbnRzKCk7CiAgICAkR2V0UGFyYW17QXR0YWNobWVudH0gPSBcQEF0dGFjaG1lbnRzOwoKICAgIHJldHVybiBcJUdldFBhcmFtOwp9CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKPWhlYWQyIFJlY3Vyc2l2ZVBvc3RNYXN0ZXJSdW4oKQoKUmVjdXJzaXZlIHBvc3RtYXN0ZXIgcnVuIGZvciBhZGRyZXNzIHBvb2wKCiAgICBteSAkVGlja2V0SUQgPSAkUG9zdE1hc3Rlck9iamVjdC0+UmVjdXJzaXZlUG9zdE1hc3RlclJ1bigKICAgICAgICBFbWFpbFBhcmFtcyAgICAgID0+IFwlRW1haWxQYXJhbXMsICAjIChvcHRpb25hbCkKICAgICAgICBBZGRyZXNzUG9vbCAgICAgID0+ICdQb29sMScsICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBGb2xsb3dVcFRpY2tldElEID0+IDQsICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICk7CgpSZXR1cm46CgogICAgVGlja2V0SUQgPSA1Cgo9Y3V0CgpzdWIgUmVjdXJzaXZlUG9zdE1hc3RlclJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaWNrZXRJRDsKCiAgICAjIGdldCBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY3JlYXRlIG5ldyBjb21tdW5pY2F0aW9uIGxvZyBmb3IgZXZlcnkgYXJ0aWNsZQogICAgbXkgJENvbW11bmljYXRpb25Mb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6Q29tbXVuaWNhdGlvbkxvZycsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgVHJhbnNwb3J0ICAgPT4gJ0VtYWlsJywKICAgICAgICAgICAgRGlyZWN0aW9uICAgPT4gJ0luY29taW5nJywKICAgICAgICAgICAgQWNjb3VudFR5cGUgPT4gJ1NURElOJywKICAgICAgICB9LAogICAgKTsKICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdGFydCggT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScgKTsKCiAgICAjIGNyZWF0ZSBjb25uZWN0aW9uIGRldGFpbHMgbGluawogICAgbXkgJE9yaWdpbkNvbm5lY3Rpb25JRCAgICA9ICRTZWxmLT57T3JpZ2luQ29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPntDdXJyZW50fS0+e0Nvbm5lY3Rpb259OwogICAgbXkgJE9yaWdpbkNvbW11bmljYXRpb25JRCA9ICRTZWxmLT57T3JpZ2luQ29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPntDb21tdW5pY2F0aW9uSUR9OwogICAgaWYgKCAkT3JpZ2luQ29ubmVjdGlvbklEICYmICRPcmlnaW5Db21tdW5pY2F0aW9uSUQgKSB7CgogICAgICAgIG15ICREZXRhaWxzTGluayA9ICRDb25maWdPYmplY3QtPntIdHRwVHlwZX0gLiAiOi8vIiAuICRDb25maWdPYmplY3QtPntGUUROfSAuCiAgICAgICAgICAgICIvb3RvYm8vaW5kZXgucGw/QWN0aW9uPUFkbWluQ29tbXVuaWNhdGlvbkxvZztTdWJhY3Rpb249Wm9vbTtDb21tdW5pY2F0aW9uSUQ9JE9yaWdpbkNvbW11bmljYXRpb25JRDtPYmplY3RMb2dJRD0kT3JpZ2luQ29ubmVjdGlvbklEIjsKCiAgICAgICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZygKICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sOjpPcmlnaW5hbE1haWwnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJGb3IgbW9yZSBkZXRhaWxzIHNlZTogJERldGFpbHNMaW5rIiwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IG5ldyBjb21tdW5pY2F0aW9uIGxvZwogICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSA9ICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0OwoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzIGFnYWluCiAgICAkU2VsZi0+X0NyZWF0ZU1haWxPYmplY3RzKAogICAgICAgIERhdGEgPT4gJFNlbGYsCiAgICApOwoKICAgICMgc2V0IHN0YXR1cyBtZXNzYWdlCiAgICBteSAkTWVzc2FnZVN0YXR1cyA9ICdTdWNjZXNzZnVsJzsKCiAgICAjIHJ1biBwb3N0IG1hc3RlcgogICAgbXkgQFN1Y2Nlc3MgPSBldmFsIHsKICAgICAgICAkU2VsZi0+UnVuKAogICAgICAgICAgICBFbWFpbFBhcmFtcyAgICAgID0+ICRQYXJhbXtFbWFpbFBhcmFtc30sCiAgICAgICAgICAgIEFkZHJlc3NQb29sICAgICAgPT4gJFBhcmFte0FkZHJlc3NQb29sfSwKICAgICAgICAgICAgRm9sbG93VXBUaWNrZXRJRCA9PiAkUGFyYW17Rm9sbG93VXBUaWNrZXRJRH0sCiAgICAgICAgKTsKICAgIH07CiAgICBpZiAoICEkU3VjY2Vzc1swXSApIHsKICAgICAgICAkTWVzc2FnZVN0YXR1cyA9ICdGYWlsZWQnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFRpY2tldElEID0gJFN1Y2Nlc3NbMV07CiAgICB9CgogICAgIyBzdG9wIG9iamVjdCAvIGNvbW11bmljYXRpb24gbG9nCiAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+T2JqZWN0TG9nU3RvcCgKICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICBTdGF0dXMgICAgICAgID0+ICRNZXNzYWdlU3RhdHVzLAogICAgKTsKICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5Db21tdW5pY2F0aW9uU3RvcCggU3RhdHVzID0+ICdTdWNjZXNzZnVsJyApOwoKICAgIHJldHVybiAkVGlja2V0SUQ7Cn0KCj1oZWFkMiBfQ3JlYXRlTWFpbE9iamVjdHMoKQoKQ3JlYXRlIG5ldyBtYWlsIG9iamVjdHMgKERlc3RRdWV1ZSwgTmV3VGlja2V0LCBGb2xsb3dVcCwgUmVqZWN0LCBBZGRyZXNzUG9vbCkKCiAgICAkUG9zdE1hc3Rlck9iamVjdC0+X0NyZWF0ZU1haWxPYmplY3RzKAogICAgICAgIERhdGEgPT4gJFNlbGYsCiAgICApOwoKPWN1dAoKc3ViIF9DcmVhdGVNYWlsT2JqZWN0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RGF0YX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIERhdGEhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBtYWlsIG9iamVjdHMKICAgICRTZWxmLT57RGVzdFF1ZXVlT2JqZWN0fSAgID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkRlc3RRdWV1ZS0+bmV3KCAkUGFyYW17RGF0YX0tPiUqICk7CiAgICAkU2VsZi0+e05ld1RpY2tldE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpOZXdUaWNrZXQtPm5ldyggJFBhcmFte0RhdGF9LT4lKiApOwogICAgJFNlbGYtPntGb2xsb3dVcE9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6Rm9sbG93VXAtPm5ldyggJFBhcmFte0RhdGF9LT4lKiApOwogICAgJFNlbGYtPntSZWplY3RPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6UmVqZWN0LT5uZXcoICRQYXJhbXtEYXRhfS0+JSogKTsKICAgICRTZWxmLT57QWRkcmVzc1Bvb2xPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sLT5uZXcoICRQYXJhbXtEYXRhfS0+JSogKTsKCiAgICByZXR1cm4gMTsKfQoKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKMTsK</File>
        <File Location="Custom/Kernel/System/SystemAddress.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAyY2QyY2VjNjhmMTNlN2M3MmFlZWZiMDY5ZWEwNmQzOWU0ZTI0ZjE5IC0gS2VybmVsL1N5c3RlbS9TeXN0ZW1BZGRyZXNzLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3M7Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGUKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sJywKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzIC0gYWxsIHN5c3RlbSBhZGRyZXNzIGZ1bmN0aW9ucwoKPWhlYWQxIERFU0NSSVBUSU9OCgpHbG9iYWwgbW9kdWxlIHRvIGFkZC9lZGl0L3VwZGF0ZSBzeXN0ZW0gYWRkcmVzc2VzLiBUaGVyZSBpcyBhIHN5c3RlbSBhZGRyZXNzIGZvciBlYWNoIHF1ZXVlLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIG15ICRTeXN0ZW1BZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCRUeXBlKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7fSwgJFR5cGU7CgogICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ1N5c3RlbUFkZHJlc3MnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gNjAgKiA2MCAqIDI0ICogMjA7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgU3lzdGVtQWRkcmVzc0FkZCgpCgphZGQgc3lzdGVtIGFkZHJlc3Mgd2l0aCBhdHRyaWJ1dGVzCgogICAgbXkgJElEID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NBZGQoCiAgICAgICAgTmFtZSAgICAgPT4gJ2luZm9AZXhhbXBsZS5jb20nLAogICAgICAgIFJlYWxuYW1lID0+ICdIb3RsaW5lJywKICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgIFF1ZXVlSUQgID0+IDEyMywKICAgICAgICBDb21tZW50ICA9PiAnc29tZSBjb21tZW50JywKICAgICAgICBVc2VySUQgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFN5c3RlbUFkZHJlc3NBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KE5hbWUgVmFsaWRJRCBSZWFsbmFtZSBRdWV1ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIE9ubHkgdGhlIHBsYWluIGFkZHJlc3MgaXMgcmVsZXZhbnQKICAgIG15ICRFbWFpbEFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJyk7CiAgICBteSAkQWRkcmVzcyAgICAgICAgICAgID0gJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0QWRkcmVzcyggRW1haWwgPT4gJFBhcmFte05hbWV9ICk7CiAgICBpZiAoICEkQWRkcmVzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIickUGFyYW17TmFtZX0nIGlzIG5vdCBhbiBlbWFpbCBhZGRyZXNzIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBhIHN5c3RlbSBhZGRyZXNzIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoICRTZWxmLT5OYW1lRXhpc3RzQ2hlY2soIE5hbWUgPT4gJEFkZHJlc3MgKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkEgc3lzdGVtIGFkZHJlc3Mgd2l0aCB0aGUgbmFtZSAnJEFkZHJlc3MnIGFscmVhZHkgZXhpc3RzLiIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBpbnNlcnQgbmV3IHN5c3RlbSBhZGRyZXNzCiAgICByZXR1cm4gdW5sZXNzICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBzeXN0ZW1fYWRkcmVzcyAodmFsdWUwLCB2YWx1ZTEsIHZhbGlkX2lkLCBjb21tZW50cywgcXVldWVfaWQsICcKICAgICAgICAgICAgLiAnIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpJwogICAgICAgICAgICAuICcgVkFMVUVTICg/LCA/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRBZGRyZXNzLCAgICAgICAgXCRQYXJhbXtSZWFsbmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17UXVldWVJRH0sIFwkUGFyYW17VXNlcklEfSwgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBnZXQgc3lzdGVtIGFkZHJlc3MgaWQKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gc3lzdGVtX2FkZHJlc3MgV0hFUkUgdmFsdWUwID0gPyBBTkQgdmFsdWUxID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJEFkZHJlc3MsIFwkUGFyYW17UmVhbG5hbWV9LCBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJElEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJElEID0gJFJvd1swXTsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICk7CgogICAgcmV0dXJuICRJRDsKfQoKPWhlYWQyIFN5c3RlbUFkZHJlc3NHZXQoKQoKZ2V0IHN5c3RlbSBhZGRyZXNzIHdpdGggYXR0cmlidXRlcwoKICAgIG15ICVTeXN0ZW1BZGRyZXNzID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgSUQgPT4gMSwKICAgICk7CgpyZXR1cm5zOgoKICAgICVTeXN0ZW1BZGRyZXNzID0gKAogICAgICAgIElEICAgICAgICAgPT4gMSwKICAgICAgICBOYW1lICAgICAgID0+ICdpbmZvQGV4YW1wbGUuY29tJwogICAgICAgIFJlYWxuYW1lICAgPT4gJ0hvdGxpbmUnLAogICAgICAgIFF1ZXVlSUQgICAgPT4gMTIzLAogICAgICAgIENvbW1lbnQgICAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIENyZWF0ZVRpbWUgPT4gJzIwMTAtMTEtMjkgMTE6MDQ6MDQnLAogICAgICAgIENoYW5nZVRpbWUgPT4gJzIwMTAtMTItMDcgMTI6MzM6NTYnLAogICAgKQoKPWN1dAoKc3ViIFN5c3RlbUFkZHJlc3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0lEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgSUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQ2FjaGVLZXkgPSAnU3lzdGVtQWRkcmVzc0dldDo6JyAuICRQYXJhbXtJRH07CgogICAgbXkgJENhY2hlZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIHJldHVybiAleyRDYWNoZWR9IGlmIHJlZiAkQ2FjaGVkIGVxICdIQVNIJzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IHN5c3RlbSBhZGRyZXNzCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCB2YWx1ZTAsIHZhbHVlMSwgY29tbWVudHMsIHZhbGlkX2lkLCBxdWV1ZV9pZCwgY2hhbmdlX3RpbWUsIGNyZWF0ZV90aW1lICcKICAgICAgICAgICAgLiAnIEZST00gc3lzdGVtX2FkZHJlc3MgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17SUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRGF0YTsKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAlRGF0YSA9ICgKICAgICAgICAgICAgSUQgICAgICAgICA9PiAkUGFyYW17SUR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICREYXRhWzBdLAogICAgICAgICAgICBSZWFsbmFtZSAgID0+ICREYXRhWzFdLAogICAgICAgICAgICBDb21tZW50ICAgID0+ICREYXRhWzJdLAogICAgICAgICAgICBWYWxpZElEICAgID0+ICREYXRhWzNdLAogICAgICAgICAgICBRdWV1ZUlEICAgID0+ICREYXRhWzRdLAogICAgICAgICAgICBDaGFuZ2VUaW1lID0+ICREYXRhWzVdLAogICAgICAgICAgICBDcmVhdGVUaW1lID0+ICREYXRhWzZdLAogICAgICAgICk7CiAgICB9CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICk7CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aGVhZDIgU3lzdGVtQWRkcmVzc1VwZGF0ZSgpCgp1cGRhdGUgc3lzdGVtIGFkZHJlc3Mgd2l0aCBhdHRyaWJ1dGVzCgogICAgJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NVcGRhdGUoCiAgICAgICAgSUQgICAgICAgPT4gMSwKICAgICAgICBOYW1lICAgICA9PiAnaW5mb0BleGFtcGxlLmNvbScsICAgIyBhY3R1YWxseSB0aGUgZW1haWwKICAgICAgICBSZWFsbmFtZSA9PiAnSG90bGluZScsCiAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICBRdWV1ZUlEICA9PiAxMjMsCiAgICAgICAgQ29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBTeXN0ZW1BZGRyZXNzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBDaGVjayBuZWVkZWQgc3R1ZmYuCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSUQgTmFtZSBWYWxpZElEIFJlYWxuYW1lIFF1ZXVlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgT25seSB0aGUgcGxhaW4gYWRkcmVzcyBpcyByZWxldmFudAogICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKICAgIG15ICRBZGRyZXNzICAgICAgICAgICAgPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBFbWFpbCA9PiAkUGFyYW17TmFtZX0gKTsKICAgIGlmICggISRBZGRyZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiJyRQYXJhbXtOYW1lfScgaXMgbm90IGFuIGVtYWlsIGFkZHJlc3MiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIENoZWNrIHdoZXRoZXIgYW5vdGhlciBzeXN0ZW0gYWRkcmVzcyB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cy4KICAgIGlmICgKICAgICAgICAkU2VsZi0+TmFtZUV4aXN0c0NoZWNrKAogICAgICAgICAgICBJRCAgID0+ICRQYXJhbXtJRH0sCiAgICAgICAgICAgIE5hbWUgPT4gJEFkZHJlc3MsCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkEgc3lzdGVtIGFkZHJlc3Mgd2l0aCB0aGUgbmFtZSAnJEFkZHJlc3MnIGFscmVhZHkgZXhpc3RzLiIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQ2hlY2sgd2hldGhlciB0aGUgc3lzdGVtIGFkZHJlc3MgaXMgdXNlZCBpbiBhbnkgcXVldWUgb3IgYXV0byByZXNwb25zZQogICAgaWYgKCAkU2VsZi0+U3lzdGVtQWRkcmVzc0lzVXNlZCggU3lzdGVtQWRkcmVzc0lEID0+ICRQYXJhbXtJRH0gKSAmJiAkUGFyYW17VmFsaWRJRH0gPiAxICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgIlRoaXMgc3lzdGVtIGFkZHJlc3MgJyRBZGRyZXNzJyBjYW5ub3QgYmUgc2V0IHRvIGludmFsaWQsIGJlY2F1c2UgaXQgaXMgdXNlZCBpbiBvbmUgb3IgbW9yZSBxdWV1ZShzKSBvciBhdXRvIHJlc3BvbnNlKHMpLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBVcGRhdGUgc3lzdGVtIGFkZHJlc3MuCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBzeXN0ZW1fYWRkcmVzcyBTRVQgdmFsdWUwID0gPywgdmFsdWUxID0gPywgY29tbWVudHMgPSA/LCB2YWxpZF9pZCA9ID8sICcKICAgICAgICAgICAgLiAnIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8sIHF1ZXVlX2lkID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJEFkZHJlc3MsICAgICAgIFwkUGFyYW17UmVhbG5hbWV9LCBcJFBhcmFte0NvbW1lbnR9LCBcJFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17UXVldWVJRH0sICBcJFBhcmFte0lEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBTeXN0ZW1BZGRyZXNzTGlzdCgpCgpnZXQgYSBsaXN0IG9mIHN5c3RlbSBhZGRyZXNzZXMKCiAgICBteSAlTGlzdCA9ICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzTGlzdCgKICAgICAgICBWYWxpZCA9PiAwLCAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gMQogICAgKTsKCnJldHVybnM6CgogICAgJUxpc3QgPSAoCiAgICAgICAgJzEnID0+ICdzYWxlc0BleGFtcGxlLmNvbScsCiAgICAgICAgJzInID0+ICdwdXJjaGFzaW5nQGV4YW1wbGUuY29tJywKICAgICAgICAnMycgPT4gJ3NlcnZpY2VAZXhhbXBsZS5jb20nLAogICAgKTsKCj1jdXQKCnN1YiBTeXN0ZW1BZGRyZXNzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWxpZCA9IDE7CiAgICBpZiAoICEkUGFyYW17VmFsaWR9ICYmIGRlZmluZWQgJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkVmFsaWQgPSAwOwogICAgfQoKICAgIG15ICRDYWNoZUtleSA9ICdTeXN0ZW1BZGRyZXNzTGlzdDo6JyAuICRWYWxpZDsKCiAgICBteSAkQ2FjaGVkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgcmV0dXJuICV7JENhY2hlZH0gaWYgcmVmICRDYWNoZWQgZXEgJ0hBU0gnOwoKICAgIG15ICRWYWxpZFNRTCA9ICcnOwogICAgaWYgKCRWYWxpZCkgewogICAgICAgIG15ICRWYWxpZElEcyA9IGpvaW4gJywnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKICAgICAgICAkVmFsaWRTUUwgPSAiIFdIRVJFIHZhbGlkX2lkIElOICgkVmFsaWRJRHMpIjsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IHN5c3RlbSBhZGRyZXNzCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIgogICAgICAgICAgICBTRUxFQ1QgaWQsIHZhbHVlMAogICAgICAgICAgICBGUk9NIHN5c3RlbV9hZGRyZXNzCiAgICAgICAgICAgICRWYWxpZFNRTCIsCiAgICApOwoKICAgIG15ICVMaXN0OwoKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTGlzdHsgJERhdGFbMF0gfSA9ICREYXRhWzFdOwogICAgfQoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcJUxpc3QsCiAgICApOwoKICAgIHJldHVybiAlTGlzdDsKfQoKPWhlYWQyIFN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygpCgpDaGVja3MgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaXMgYSBsb2NhbCAoc3lzdGVtKSBhZGRyZXNzLiBSZXR1cm5zIHRydWUKZm9yIGxvY2FsIGFkZHJlc3Nlcy4KCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiMgICAgaWYgKCAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKCBBZGRyZXNzID0+ICdpbmZvQGV4YW1wbGUuY29tJyApICkgewogICAgbXkgJElzTG9jYWwgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgIEFkZHJlc3MgID0+ICdpbmZvQGV4YW1wbGUuY29tJywKICAgICAgICBRdWV1ZUlEICA9PiA0LCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBUaWNrZXRJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICk7CgogICAgaWYgKCAkSXNMb2NhbCApIHsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICMgaXMgbG9jYWwKICAgIH0KICAgIGVsc2UgewogICAgICAgICMgaXMgbm90IGxvY2FsCiAgICB9CgpBbHRlcm5hdGl2ZWx5IGFuIGluc3RhbmNlIG9mIEVtYWlsOjpBZGRyZXNzOjpYUyBtYXkgYmUgcGFzc2VkLiBJbiB0aGF0IGNhc2Ugb25seSB0aGUgYmFyZSBhZGRyZXNzIGlzIGNoZWNrZWQuCgogICAgbXkgJEFkZHJlc3NPYmplY3QgPSBFbWFpbDo6QWRkcmVzczo6WFMtPm5ldygKICAgICAgICAnQXVndXN0IEF1c3Byb2JpZXJlcicsCiAgICAgICAgJ2d1c3RsQHRlc3Rhbnl0aGluZy5vcmcnCiAgICApOwoKICAgIG15ICRJc0xvY2FsID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICBBZGRyZXNzT2JqZWN0ID0+ICRBZGRyZXNzT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBTeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0FkZHJlc3N9ICYmICFkZWZpbmVkICRQYXJhbXtBZGRyZXNzT2JqZWN0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIEFkZHJlc3Mgb3IgQWRkcmVzc09iamVjdCEnCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCAkUGFyYW17QWRkcmVzc30gJiYgZGVmaW5lZCAkUGFyYW17QWRkcmVzc09iamVjdH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIG9ubHkgb25lIG9mIEFkZHJlc3Mgb3IgQWRkcmVzc09iamVjdCEnCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgVHJhZGl0aW9uYWxseSB0aGlzIGNoZWNrIGlzIG9ubHkgbG9va2luZyBhIHRoZSBiYXJlIGFkZHJlc3MuCiAgICBteSAkQWRkcmVzcyA9ICRQYXJhbXtBZGRyZXNzfSAvLyAkUGFyYW17QWRkcmVzc09iamVjdH0tPmFkZHJlc3M7CgogICAgIyBOb3RlIHRoYXQgYSBkZWZpbmVkIGFkZHJlc3Mgb2JqZWN0IGNhbiBzdGlsbCBnaXZlIGFuIGVtcHR5IGFkZHJlc3MuCiAgICAjIEluIHRoaXMgY2FzZSB3ZSBkb24ndCBjbGFpbSB0aGF0IGl0IGlzIGEgbG9jYWwgYWRkcmVzcy4KICAgIHJldHVybiB1bmxlc3MgJEFkZHJlc3M7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgIyBnZXQgb2JqZWN0cwogICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQWRkcmVzc1Bvb2xPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wnKTsKCiAgICAjIGdldCBhZGRyZXNzIHBvb2wKICAgIG15ICRBZGRyZXNzUG9vbCA9ICRBZGRyZXNzUG9vbE9iamVjdC0+UG9vbExvb2t1cCgKICAgICAgICBBZGRyZXNzID0+ICRBZGRyZXNzLAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGFkZHJlc3MgZXhpc3QgaW4gc2FtZSBhZGRyZXNzIHBvb2wgb2YgdGlja2V0CiAgICBpZiAoCiAgICAgICAgJEFkZHJlc3NQb29sCiAgICAgICAgJiYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApCiAgICAgICAgKQogICAgewoKICAgICAgICBteSAkUXVldWVJRCA9ICRQYXJhbXtRdWV1ZUlEfTsKICAgICAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJFRpY2tldE9iamVjdC0+VGlja2V0UXVldWVJRCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRRdWV1ZSA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFF1ZXVlRXhpc3QgPSAkQWRkcmVzc1Bvb2xPYmplY3QtPlF1ZXVlQ2hlY2soCiAgICAgICAgICAgIFF1ZXVlICAgICAgID0+ICRRdWV1ZSwKICAgICAgICAgICAgQWRkcmVzc1Bvb2wgPT4gJEFkZHJlc3NQb29sLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkUXVldWVFeGlzdDsKICAgIH0KIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgICMgUmV0dXJuIHRoZSBmb3VuZCBxdWV1ZSBpZCwgZGVzcGl0ZSB0aGUgbWV0aG9kIG5hbWUgd2hpY2ggaGludHMgYXQgYSBib29sZWFuIHJlc3VsdAogICAgcmV0dXJuICRTZWxmLT5TeXN0ZW1BZGRyZXNzUXVldWVJRCgKICAgICAgICBBZGRyZXNzID0+ICRBZGRyZXNzLAogICAgKTsKfQoKPWhlYWQyIFN5c3RlbUFkZHJlc3NRdWV1ZUlEKCkKCmZpbmQgZGlzcGF0Y2hpbmcgcXVldWUgaWQgb2YgZW1haWwgYWRkcmVzcwoKICAgIG15ICRRdWV1ZUlEID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NRdWV1ZUlEKCBBZGRyZXNzID0+ICdpbmZvQGV4YW1wbGUuY29tJyApOwoKPWN1dAoKc3ViIFN5c3RlbUFkZHJlc3NRdWV1ZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBZGRyZXNzKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVtb3ZlIHNwYWNlcwogICAgJFBhcmFte0FkZHJlc3N9ID1+IHMvXHMrLy9nOwoKICAgIG15ICRDYWNoZUtleSA9ICdTeXN0ZW1BZGRyZXNzUXVldWVJRDo6JyAuICRQYXJhbXtBZGRyZXNzfTsKICAgIG15ICRDYWNoZWQgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwoKICAgIHJldHVybiAkeyRDYWNoZWR9IGlmIHJlZiAkQ2FjaGVkIGVxICdTQ0FMQVInOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgaWYgKCAkREJPYmplY3QtPkdldERhdGFiYXNlRnVuY3Rpb24oJ0Nhc2VTZW5zaXRpdmUnKSApIHsKCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIHF1ZXVlX2lkIEZST00gc3lzdGVtX2FkZHJlc3MgV0hFUkUgIgogICAgICAgICAgICAgICAgLiAidmFsaWRfaWQgSU4gKCAke1woam9pbiAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKSl9ICkgIgogICAgICAgICAgICAgICAgLiAiQU5EIExPV0VSKHZhbHVlMCkgPSBMT1dFUig/KSIsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtBZGRyZXNzfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgcXVldWVfaWQgRlJPTSBzeXN0ZW1fYWRkcmVzcyBXSEVSRSAiCiAgICAgICAgICAgICAgICAuICJ2YWxpZF9pZCBJTiAoICR7XChqb2luICcsICcsICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZElEc0dldCgpKX0gKSAiCiAgICAgICAgICAgICAgICAuICJBTkQgdmFsdWUwID0gPyIsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtBZGRyZXNzfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkUXVldWVJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRRdWV1ZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCRRdWV1ZUlELAogICAgKTsKCiAgICByZXR1cm4gJFF1ZXVlSUQ7Cn0KCj1oZWFkMiBTeXN0ZW1BZGRyZXNzUXVldWVMaXN0KCkKCmdldCBhIGxpc3Qgb2YgdGhlIHF1ZXVlcyBhbmQgdGhlaXIgc3lzdGVtIGFkZHJlc3NlcyBJRHMKCiAgICBteSAlTGlzdCA9ICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzUXVldWVMaXN0KAogICAgICAgIFZhbGlkID0+IDAsICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byAxCiAgICApOwoKcmV0dXJuczoKCiAgICAlTGlzdCA9ICgKICAgICAgICAnNScgPT4gMywKICAgICAgICAnNycgPT4gMSwKICAgICAgICAnOScgPT4gMiwKICAgICk7Cgo9Y3V0CgpzdWIgU3lzdGVtQWRkcmVzc1F1ZXVlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgIG15ICRWYWxpZCA9ICRQYXJhbXtWYWxpZH0gLy8gMTsKCiAgICAjIGNyZWF0ZSB0aGUgdmFsaWQgbGlzdAogICAgbXkgJFZhbGlkSURzID0gam9pbiAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKTsKCiAgICAjIGJ1aWxkIFNRTAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgcXVldWVfaWQsIGlkIEZST00gc3lzdGVtX2FkZHJlc3MnOwoKICAgICMgYWRkIFdIRVJFIHN0YXRlbWVudCBpbiBjYXNlIFZhbGlkIHBhcmFtIGlzIHNldCB0byAnMScsIGZvciB2YWxpZCBzeXN0ZW0gYWRkcmVzcwogICAgaWYgKCRWYWxpZCkgewogICAgICAgICRTUUwgLj0gJyBXSEVSRSB2YWxpZF9pZCBJTiAoJyAuICRWYWxpZElEcyAuICcpJzsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IGRhdGEgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICRTUUwsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVN5c3RlbUFkZHJlc3NRdWV1ZUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU3lzdGVtQWRkcmVzc1F1ZXVlTGlzdHsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gJVN5c3RlbUFkZHJlc3NRdWV1ZUxpc3Q7Cgp9Cgo9aGVhZDIgTmFtZUV4aXN0c0NoZWNrKCkKCnJldHVybiAxIGlmIGFub3RoZXIgc3lzdGVtIGFkZHJlc3Mgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMKCiAgICAkRXhpc3QgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+TmFtZUV4aXN0c0NoZWNrKAogICAgICAgIE5hbWUgPT4gJ1NvbWUgQWRkcmVzcycsCiAgICAgICAgSUQgPT4gMSwgIyBvcHRpb25hbAogICAgKTsKCj1jdXQKCnN1YiBOYW1lRXhpc3RzQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGlkIEZST00gc3lzdGVtX2FkZHJlc3MgV0hFUkUgdmFsdWUwID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkRmxhZzsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGlmICggISRQYXJhbXtJRH0gfHwgJFBhcmFte0lEfSBuZSAkUm93WzBdICkgewogICAgICAgICAgICAkRmxhZyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkRmxhZykgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAwOwp9Cgo9aGVhZDIgU3lzdGVtQWRkcmVzc0lzVXNlZCgpCgpSZXR1cm4gMSBpZiBzeXN0ZW0gYWRkcmVzcyBpcyB1c2VkIGluIGFueSBxdWV1ZSBvciBhdXRvIHJlc3BvbnNlLgoKICAgICRTeXRlbUFkZHJlc3NJc1VzZWQgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc0lzVXNlZCgKICAgICAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgU3lzdGVtQWRkcmVzc0lzVXNlZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgQ2hlY2sgbmVlZGVkIHBhcmFtLgogICAgaWYgKCAhJFBhcmFte1N5c3RlbUFkZHJlc3NJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFN5c3RlbUFkZHJlc3NJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBHZXQgZGF0YWJhc2Ugb2JqZWN0LgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgRElTVElOQ1Qgc2EuaWQgRlJPTSBzeXN0ZW1fYWRkcmVzcyBzYQogICAgICAgICAgICBMRUZUIEpPSU4gcXVldWUgcSBPTiBxLnN5c3RlbV9hZGRyZXNzX2lkID0gc2EuaWQKICAgICAgICAgICAgTEVGVCBKT0lOIGF1dG9fcmVzcG9uc2UgYXIgT04gYXIuc3lzdGVtX2FkZHJlc3NfaWQgPSBzYS5pZAogICAgICAgICAgICBXSEVSRSBxLnN5c3RlbV9hZGRyZXNzX2lkID0gPyBPUiBhci5zeXN0ZW1fYWRkcmVzc19pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtTeXN0ZW1BZGRyZXNzSUR9LCBcJFBhcmFte1N5c3RlbUFkZHJlc3NJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIEZldGNoIHRoZSByZXN1bHQuCiAgICBteSAkU3lzdGVtQWRkcmVzc0lzVXNlZDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTeXN0ZW1BZGRyZXNzSXNVc2VkID0gJFJvd1swXSA/IDEgOiAwOwogICAgfQoKICAgIHJldHVybiAkU3lzdGVtQWRkcmVzc0lzVXNlZDsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/PostMaster/DestQueue.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBkN2RhYTczZWUzZjQzZjE2NTdjZDY4M2I2YTE3NDBiY2MyMmQ3OGQ4IC0gS2VybmVsL1N5c3RlbS9Qb3N0TWFzdGVyL0Rlc3RRdWV1ZS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpEZXN0UXVldWU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sJywKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7fSwgJFR5cGU7CgogICAgIyBHZXQgY29tbXVuaWNhdGlvbiBsb2cgb2JqZWN0LgogICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSA9ICRQYXJhbXtDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSB8fCBkaWUgIkdvdCBubyBDb21tdW5pY2F0aW9uTG9nT2JqZWN0ISI7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgR2V0UXVldWVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGVtYWlsIGhlYWRlcnMKICAgIG15ICVHZXRQYXJhbSA9ICV7ICRQYXJhbXtQYXJhbXN9IH07CgogICAgIyBjaGVjayBwb3NzaWJsZSB0bywgY2MgYW5kIHJlc2VudC10byBlbWFpbGFkZHJlc3NlcwogICAgbXkgJFJlY2lwaWVudCA9ICcnOwogICAgUkVDSVBJRU5UOgogICAgZm9yIG15ICRLZXkgKHF3KFJlc2VudC1UbyBFbnZlbG9wZS1UbyBUbyBDYyBEZWxpdmVyZWQtVG8gWC1PcmlnaW5hbC1UbykpIHsKCiAgICAgICAgbmV4dCBSRUNJUElFTlQgaWYgISRHZXRQYXJhbXskS2V5fTsKCiAgICAgICAgaWYgKCRSZWNpcGllbnQpIHsKICAgICAgICAgICAgJFJlY2lwaWVudCAuPSAnLCAnOwogICAgICAgIH0KCiAgICAgICAgJFJlY2lwaWVudCAuPSAkR2V0UGFyYW17JEtleX07CiAgICB9CgogICAgIyBnZXQgc3lzdGVtIGFkZHJlc3Mgb2JqZWN0CiAgICBteSAkU3lzdGVtQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyk7CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgbXkgJEFkZHJlc3NQb29sT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sJyk7CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKCiAgICAjIGNoZWNrIGFkZHJlc3NlcwogICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKICAgIG15IEBFbWFpbEFkZHJlc3NlcyAgICAgPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRSZWNpcGllbnQgKTsKICAgIEVNQUlMOgogICAgZm9yIG15ICRFbWFpbCAoQEVtYWlsQWRkcmVzc2VzKSB7CgogICAgICAgIG5leHQgRU1BSUwgdW5sZXNzICRFbWFpbDsKCiAgICAgICAgbXkgJEFkZHJlc3MgPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApOwoKICAgICAgICBuZXh0IEVNQUlMIHVubGVzcyAkQWRkcmVzczsKCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgIyBjaGVjayBpZiBlbWFpbCBleGlzdCBpbiBhZGRyZXNzIHBvb2wKICAgICAgICBpZiAoICRHZXRQYXJhbXtBZGRyZXNzUG9vbH0gKSB7CgogICAgICAgICAgICBuZXh0IEVNQUlMIGlmCiAgICAgICAgICAgICAgICAoICRBZGRyZXNzUG9vbE9iamVjdC0+UG9vbExvb2t1cCggQWRkcmVzcyA9PiAkQWRkcmVzcyApIC8vICcnICkgbmUgJEdldFBhcmFte0FkZHJlc3NQb29sfTsKICAgICAgICB9CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKCiAgICAgICAgIyBsb29rdXAgcXVldWUgaWQgaWYgcmVjaXBpZW5kIGFkZHJlc3MKICAgICAgICBteSAkUXVldWVJRCA9ICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzUXVldWVJRCgKICAgICAgICAgICAgQWRkcmVzcyA9PiAkQWRkcmVzcywKICAgICAgICApOwoKICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdEZWJ1ZycsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+IHJlZigkU2VsZiksCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJNYXRjaCBlbWFpbDogJEVtYWlsIHRvIFF1ZXVlSUQgJFF1ZXVlSUQgKE1lc3NhZ2VJRDokR2V0UGFyYW17J01lc3NhZ2UtSUQnfSkhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkUXVldWVJRDsKICAgICAgICB9CgogICAgICAgICMgQWRkcmVzcy9FbWFpbCBub3QgbWF0Y2hlZCB3aXRoIGFueSB0aGF0IGlzIGNvbmZpZ3VyZWQgaW4gdGhlIHN5c3RlbQogICAgICAgICMgICBvciBhbnkgZXJyb3Igb2NjdXJyZWQgd2hpbGUgY2hlY2tpbmcgaXQuCgogICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiByZWYoJFNlbGYpLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJObyBtYXRjaCBmb3IgZW1haWw6ICRFbWFpbCAoTWVzc2FnZUlEOiRHZXRQYXJhbXsnTWVzc2FnZS1JRCd9KSEiLAogICAgICAgICk7CiAgICB9CgogICAgIyBJZiB3ZSBnZXQgaGVyZSBtZWFucyB0aGF0IG5vbmUgb2YgdGhlIGFkZHJlc3NlcyBpbiB0aGUgbWVzc2FnZSBpcyBkZWZpbmVkIGFzIGEgc3lzdGVtIGFkZHJlc3MKICAgICMgICBvciBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjaGVja2luZyBpdC4KCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiMgICAgbXkgJFF1ZXVlICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1Bvc3RtYXN0ZXJEZWZhdWx0UXVldWUnKTsKICAgIG15ICRRdWV1ZTsKCiAgICBpZiAoICRHZXRQYXJhbXtBZGRyZXNzUG9vbH0gKSB7CiAgICAgICAgJFF1ZXVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCcpLT57ICRHZXRQYXJhbXtBZGRyZXNzUG9vbH0gfXsnRGVmYXVsdFF1ZXVlJ307CiAgICB9CgogICAgJFF1ZXVlIC8vPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1Bvc3RtYXN0ZXJEZWZhdWx0UXVldWUnKTsKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwoKICAgIG15ICRRdWV1ZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKAogICAgICAgIFF1ZXVlID0+ICRRdWV1ZSwKICAgICk7CgogICAgaWYgKCRRdWV1ZUlEKSB7CiAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRGVidWcnLAogICAgICAgICAgICBLZXkgICAgICAgICAgID0+IHJlZigkU2VsZiksCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIk1lc3NhZ2VJRDokR2V0UGFyYW17J01lc3NhZ2UtSUQnfSB0byAnUG9zdG1hc3RlckRlZmF1bHRRdWV1ZScgKCBRdWV1ZUlEOiR7UXVldWVJRH0gKS4iLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkUXVldWVJRDsKICAgIH0KCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgIEtleSAgICAgICAgICAgPT4gcmVmKCRTZWxmKSwKICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJDb3VsZG4ndCBnZXQgUXVldWVJRCBmb3IgJ1Bvc3RtYXN0ZXJEZWZhdWx0UXVldWUnICgke1F1ZXVlfSkgISIsCiAgICApOwoKICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICBQcmlvcml0eSAgICAgID0+ICdEZWJ1ZycsCiAgICAgICAgS2V5ICAgICAgICAgICA9PiByZWYoJFNlbGYpLAogICAgICAgIFZhbHVlICAgICAgICAgPT4gIk1lc3NhZ2VJRDokR2V0UGFyYW17J01lc3NhZ2UtSUQnfSB0byBRdWV1ZUlEOjEhIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBHZXRUcnVzdGVkUXVldWVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGVtYWlsIGhlYWRlcnMKICAgIG15ICVHZXRQYXJhbSA9ICV7ICRQYXJhbXtQYXJhbXN9IH07CgogICAgcmV0dXJuIGlmICEkR2V0UGFyYW17J1gtT1RPQk8tUXVldWUnfTsKCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRGVidWcnLAogICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpEZXN0UXVldWUnLAogICAgICAgIFZhbHVlICAgICAgICAgPT4gIkV4aXN0aW5nIFgtT1RPQk8tUXVldWUgaGVhZGVyOiAkR2V0UGFyYW17J1gtT1RPQk8tUXVldWUnfSAoTWVzc2FnZUlEOiRHZXRQYXJhbXsnTWVzc2FnZS1JRCd9KSEiLAogICAgKTsKCiAgICAjIGdldCBkZXN0IHF1ZXVlCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKAogICAgICAgIFF1ZXVlID0+ICRHZXRQYXJhbXsnWC1PVE9CTy1RdWV1ZSd9LAogICAgKTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/Ticket/Article/Backend/Email.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBhZGE4NWRhZmQ1OTdhZDk4NjU4OGZkMzU2NTIzY2VkZGE0ZDM5ZDI3IC0gS2VybmVsL1N5c3RlbS9UaWNrZXQvQXJ0aWNsZS9CYWNrZW5kL0VtYWlsLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZTo6QmFja2VuZDo6RW1haWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgcGFyZW50ICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlOjpCYWNrZW5kOjpNSU1FQmFzZSc7CgojIGNvcmUgbW9kdWxlcwoKIyBDUEFOIG1vZHVsZXMKdXNlIEVtYWlsOjpBZGRyZXNzOjpYUyAoKTsKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW1haWwnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6TG9vcFByb3RlY3Rpb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWlsUXVldWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGU6OkJhY2tlbmQ6OkVtYWlsIC0gYmFja2VuZCBjbGFzcyBmb3IgZW1haWwgYmFzZWQgYXJ0aWNsZXMKCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBlbWFpbCBiYXNlZCBhcnRpY2xlcyBpbiB0aGUgZGF0YWJhc2UuCgpJbmhlcml0cyBmcm9tIEw8S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZTo6QmFja2VuZDo6TUlNRUJhc2U+LCBwbGVhc2UgaGF2ZSBhIGxvb2sgdGhlcmUgZm9yIGl0cyBiYXNlIEFQSSwKYW5kIGJlbG93IGZvciB0aGUgYWRkaXRpb25hbCBmdW5jdGlvbnMgdGhpcyBiYWNrZW5kIHByb3ZpZGVzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1jdXQKCnN1YiBDaGFubmVsTmFtZUdldCB7CiAgICByZXR1cm4gJ0VtYWlsJzsKfQoKPWhlYWQyIEFydGljbGVHZXRCeU1lc3NhZ2VJRCgpCgpSZXR1cm4gYXJ0aWNsZSBkYXRhIGJ5IHN1cHBsaWVkIG1lc3NhZ2UgSUQuCgogICAgbXkgJUFydGljbGUgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVHZXRCeU1lc3NhZ2VJRCgKICAgICAgICBNZXNzYWdlSUQgICAgID0+ICc8MTMyMzEyMzEuMTIzMTIzMS4zMjEzMTIzMUBleGFtcGxlLmNvbT4nLCAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUbyBpbmNsdWRlIHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlcyBmb3IgdGhpcyBhcnRpY2xlIG9uIHRoZSByZXR1cm4gc3RydWN0dXJlLgogICAgICAgIFJlYWxOYW1lcyAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVG8gaW5jbHVkZSB0aGUgRnJvbS9Uby9DYy9CY2MgZmllbGRzIHdpdGggcmVhbCBuYW1lcy4KICAgICk7Cgo9Y3V0CgpzdWIgQXJ0aWNsZUdldEJ5TWVzc2FnZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2VJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1lc3NhZ2VJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRNRDUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5NRDVzdW0oIFN0cmluZyA9PiAkUGFyYW17TWVzc2FnZUlEfSApOwoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgR2V0IHRpY2tldCBhbmQgYXJ0aWNsZSBJRCBmcm9tIG1ldGEgYXJ0aWNsZSB0YWJsZS4KCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiMgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKIyAgICAgICBTUUwgPT4gJwojICAgICAgICAgICBTRUxFQ1Qgc2EuaWQsIHNhLnRpY2tldF9pZCBGUk9NIGFydGljbGUgc2EKIyAgICAgICAgICAgTEVGVCBKT0lOIGFydGljbGVfZGF0YV9taW1lIHNhZG0gT04gc2EuaWQgPSBzYWRtLmFydGljbGVfaWQKIyAgICAgICAgICAgV0hFUkUgc2FkbS5hX21lc3NhZ2VfaWRfbWQ1ID0gPwojICAgICAgICcsCiMgICAgICAgQmluZCAgPT4gWyBcJE1ENSBdLAojICAgICAgIExpbWl0ID0+IDEwLAojICAgKTsKIwojICAgIG15ICRDb3VudCA9IDA7CiMgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiMgICAgICAgICRQYXJhbXtBcnRpY2xlSUR9ID0gJFJvd1swXTsKIyAgICAgICAgJFBhcmFte1RpY2tldElEfSAgPSAkUm93WzFdOwojICAgICAgICAkQ291bnQrKzsKIyAgICB9CiMKIyAgICAjIE5vIHJlZmVyZW5jZSBmb3VuZC4KIyAgICByZXR1cm4gaWYgJENvdW50ID09IDA7CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1Qgc2EuaWQsIHNhLnRpY2tldF9pZCBGUk9NIGFydGljbGUgc2EKICAgICAgICAgICAgTEVGVCBKT0lOIGFydGljbGVfZGF0YV9taW1lIHNhZG0gT04gc2EuaWQgPSBzYWRtLmFydGljbGVfaWQKICAgICAgICAgICAgV0hFUkUgc2FkbS5hX21lc3NhZ2VfaWRfbWQ1ID0gPwogICAgICAgICAgICBPUkRFUiBCWSBzYS5pZCBERVNDCiAgICAgICAgJywKICAgICAgICBCaW5kICA9PiBbIFwkTUQ1IF0sCiAgICApOwoKICAgIG15IEBUaWNrZXRJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkUGFyYW17QXJ0aWNsZUlEfSAvLz0gJFJvd1swXTsKICAgICAgICAkUGFyYW17VGlja2V0SUR9ICAvLz0gJFJvd1sxXTsKICAgICAgICBwdXNoIEBUaWNrZXRJRHMsICRSb3dbMV07CiAgICB9CgogICAgIyBObyByZWZlcmVuY2UgZm91bmQuCiAgICByZXR1cm4gaWYgIUBUaWNrZXRJRHM7CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgIHJldHVybiBpZiAhJFBhcmFte1RpY2tldElEfSB8fCAhJFBhcmFte0FydGljbGVJRH07CgojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwojICAgIyBNb3JlIHRoYW4gb25lIHJlZmVyZW5jZSBmb3VuZCEgVGhhdCBzaG91bGQgbm90IGhhcHBlbiwgc2luY2UgJ2EgbWVzc2FnZV9pZCcgc2hvdWxkIGJlIHVuaXF1ZSEKIyAgIGlmICggJENvdW50ID4gMSApIHsKIyAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKIyAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiMgICAgICAgICAgIE1lc3NhZ2UgID0+CiMgICAgICAgICAgICAgICAiVGhlIE1lc3NhZ2VJRCAnJFBhcmFte01lc3NhZ2VJRH0nIGlzIGluIHlvdXIgZGF0YWJhc2UgbW9yZSB0aGFuIG9uZSB0aW1lISBUaGF0IHNob3VsZCBub3QgaGFwcGVuLCBzaW5jZSAnYSBtZXNzYWdlX2lkJyBzaG91bGQgYmUgdW5pcXVlISIsCiMgICAgICAgKTsKIyAgICAgICByZXR1cm47CiMgICB9CiMKIyAgICByZXR1cm4gJFNlbGYtPkFydGljbGVHZXQoCiMgICAgICAgICVQYXJhbSwKIyAgICApOwogICAgbXkgJUFydGljbGUgPSAkU2VsZi0+QXJ0aWNsZUdldCgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIGlmICggc2NhbGFyIEBUaWNrZXRJRHMgPiAxICkgewogICAgICAgICRBcnRpY2xle0FtYmlndW91c1RpY2tldElEc30gPSBcQFRpY2tldElEczsKICAgIH0KCiAgICByZXR1cm4gJUFydGljbGU7CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKfQoKPWhlYWQyIEFydGljbGVTZW5kKCkKClNlbmQgYXJ0aWNsZSB2aWEgZW1haWwgYW5kIGNyZWF0ZSBhcnRpY2xlIHdpdGggYXR0YWNobWVudHMuCgogICAgbXkgJEFydGljbGVJRCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZVNlbmQoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgYWdlbnR8c3lzdGVtfGN1c3RvbWVyCiAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBJcyBhcnRpY2xlIHZpc2libGUgZm9yIGN1c3RvbWVyPwogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKCiAgICAgICAgRnJvbSAgICAgICAgPT4gJ1NvbWUgQWdlbnQgPGVtYWlsQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkCiAgICAgICAgVG8gICAgICAgICAgPT4gJ1NvbWUgQ3VzdG9tZXIgQSA8Y3VzdG9tZXItYUBleGFtcGxlLmNvbT4nLCAgICAgICAgICAgICAjIHJlcXVpcmVkIGlmIGJvdGggQ2MgYW5kIEJjYyBhcmUgbm90IHByZXNlbnQKICAgICAgICBDYyAgICAgICAgICA9PiAnU29tZSBDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICMgcmVxdWlyZWQgaWYgYm90aCBUbyBhbmQgQmNjIGFyZSBub3QgcHJlc2VudAogICAgICAgIEJjYyAgICAgICAgID0+ICdTb21lIEN1c3RvbWVyIEMgPGN1c3RvbWVyLWNAZXhhbXBsZS5jb20+JywgICAgICAgICAgICAgIyByZXF1aXJlZCBpZiBib3RoIFRvIGFuZCBDYyBhcmUgbm90IHByZXNlbnQKICAgICAgICBSZXBseVRvICAgICA9PiAnU29tZSBDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICMgbm90IHJlcXVpcmVkLCBpcyBwb3NzaWJsZSB0byB1c2UgJ1JlcGx5LVRvJyBpbnN0ZWFkCiAgICAgICAgU3ViamVjdCAgICAgPT4gJ3NvbWUgc2hvcnQgZGVzY3JpcHRpb24nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkCiAgICAgICAgQm9keSAgICAgICAgPT4gJ3RoZSBtZXNzYWdlIHRleHQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkCiAgICAgICAgSW5SZXBseVRvICAgPT4gJzxhc2Rhc2Rhc2QuMTJAZXhhbXBsZS5jb20+JywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdCByZXF1aXJlZCBidXQgdXNlZnVsCiAgICAgICAgUmVmZXJlbmNlcyAgPT4gJzxhc2Rhc2Rhc2QuMUBleGFtcGxlLmNvbT4gPGFzZGFzZGFzZC4xMkBleGFtcGxlLmNvbT4nLCAjIG5vdCByZXF1aXJlZCBidXQgdXNlZnVsCiAgICAgICAgQ2hhcnNldCAgICAgPT4gJ2lzby04ODU5LTE1JwogICAgICAgIE1pbWVUeXBlICAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICBMb29wICAgICAgICA9PiAwLCAjIDF8MCB1c2VkIGZvciBidWxrIGVtYWlscwogICAgICAgIEF0dGFjaG1lbnQgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdsYWxhLnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRDb250ZW50LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJENvbnRlbnRUeXBlLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ2xhbGExLnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBFbWFpbFNlY3VyaXR5ID0+IHsKICAgICAgICAgICAgQmFja2VuZCAgICAgPT4gJ1BHUCcsICAgICAgICAgICAgICAgICAgICAgICAjIFBHUCBvciBTTUlNRQogICAgICAgICAgICBNZXRob2QgICAgICA9PiAnRGV0YWNoZWQnLCAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwgRGV0YWNoZWQgb3IgSW5saW5lIChkZWZhdWx0cyB0byBEZXRhY2hlZCkKICAgICAgICAgICAgU2lnbktleSAgICAgPT4gJzgxODc3RjVFJywgICAgICAgICAgICAgICAgICAjIE9wdGlvbmFsCiAgICAgICAgICAgIEVuY3J5cHRLZXlzID0+IFsgJzgxODc3RjVFJywgJzNiNjMwYzgwJyBdLCAgIyBPcHRpb25hbAogICAgICAgIH0KICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAnT3duZXJVcGRhdGUnLCAgIyBNb3ZlfEFkZE5vdGV8UHJpb3JpdHlVcGRhdGV8V2ViUmVxdWVzdEN1c3RvbWVyfC4uLgogICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICdTb21lIGZyZWUgdGV4dCEnLAogICAgICAgIE5vQWdlbnROb3RpZnkgID0+IDAsICAgICAgICAgICAgIyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBzZW5kIGFnZW50IG5vdGlmaWNhdGlvbnMKICAgICk7CgoKICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKCAgICAgICAgICAgICAgICAoQmFja3dhcmRzIGNvbXBhdGliaWxpdHkpCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFNlbmRlclR5cGVJRCAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgYWdlbnR8c3lzdGVtfGN1c3RvbWVyCiAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBJcyBhcnRpY2xlIHZpc2libGUgZm9yIGN1c3RvbWVyPwogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKCiAgICAgICAgRnJvbSAgICAgICAgPT4gJ1NvbWUgQWdlbnQgPGVtYWlsQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkCiAgICAgICAgVG8gICAgICAgICAgPT4gJ1NvbWUgQ3VzdG9tZXIgQSA8Y3VzdG9tZXItYUBleGFtcGxlLmNvbT4nLCAgICAgICAgICAgICAjIHJlcXVpcmVkIGlmIGJvdGggQ2MgYW5kIEJjYyBhcmUgbm90IHByZXNlbnQKICAgICAgICBDYyAgICAgICAgICA9PiAnU29tZSBDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICMgcmVxdWlyZWQgaWYgYm90aCBUbyBhbmQgQmNjIGFyZSBub3QgcHJlc2VudAogICAgICAgIEJjYyAgICAgICAgID0+ICdTb21lIEN1c3RvbWVyIEMgPGN1c3RvbWVyLWNAZXhhbXBsZS5jb20+JywgICAgICAgICAgICAgIyByZXF1aXJlZCBpZiBib3RoIFRvIGFuZCBDYyBhcmUgbm90IHByZXNlbnQKICAgICAgICBSZXBseVRvICAgICA9PiAnU29tZSBDdXN0b21lciBCIDxjdXN0b21lci1iQGV4YW1wbGUuY29tPicsICAgICAgICAgICAgICMgbm90IHJlcXVpcmVkLCBpcyBwb3NzaWJsZSB0byB1c2UgJ1JlcGx5LVRvJyBpbnN0ZWFkCiAgICAgICAgU3ViamVjdCAgICAgPT4gJ3NvbWUgc2hvcnQgZGVzY3JpcHRpb24nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkCiAgICAgICAgQm9keSAgICAgICAgPT4gJ3RoZSBtZXNzYWdlIHRleHQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcXVpcmVkCiAgICAgICAgSW5SZXBseVRvICAgPT4gJzxhc2Rhc2Rhc2QuMTJAZXhhbXBsZS5jb20+JywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdCByZXF1aXJlZCBidXQgdXNlZnVsCiAgICAgICAgUmVmZXJlbmNlcyAgPT4gJzxhc2Rhc2Rhc2QuMUBleGFtcGxlLmNvbT4gPGFzZGFzZGFzZC4xMkBleGFtcGxlLmNvbT4nLCAjIG5vdCByZXF1aXJlZCBidXQgdXNlZnVsCiAgICAgICAgQ2hhcnNldCAgICAgPT4gJ2lzby04ODU5LTE1JwogICAgICAgIE1pbWVUeXBlICAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICBMb29wICAgICAgICA9PiAwLCAjIDF8MCB1c2VkIGZvciBidWxrIGVtYWlscwogICAgICAgIEF0dGFjaG1lbnQgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCwKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRDb250ZW50VHlwZSwKICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICdsYWxhLnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRDb250ZW50LAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJENvbnRlbnRUeXBlLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJ2xhbGExLnR4dCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgXSwKICAgICAgICBTaWduID0+IHsKICAgICAgICAgICAgVHlwZSAgICA9PiAnUEdQJywKICAgICAgICAgICAgU3ViVHlwZSA9PiAnSW5saW5lfERldGFjaGVkJywKICAgICAgICAgICAgS2V5ICAgICA9PiAnODE4NzdGNUUnLAogICAgICAgICAgICBUeXBlICAgID0+ICdTTUlNRScsCiAgICAgICAgICAgIEtleSAgICAgPT4gJzNiNjMwYzgwJywKICAgICAgICB9LAogICAgICAgIENyeXB0ID0+IHsKICAgICAgICAgICAgVHlwZSAgICA9PiAnUEdQJywKICAgICAgICAgICAgU3ViVHlwZSA9PiAnSW5saW5lfERldGFjaGVkJywKICAgICAgICAgICAgS2V5ICAgICA9PiAnODE4NzdGNUUnLAogICAgICAgICAgICBUeXBlICAgID0+ICdTTUlNRScsCiAgICAgICAgICAgIEtleSAgICAgPT4gJzNiNjMwYzgwJywKICAgICAgICB9LAogICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICdPd25lclVwZGF0ZScsICAjIE1vdmV8QWRkTm90ZXxQcmlvcml0eVVwZGF0ZXxXZWJSZXF1ZXN0Q3VzdG9tZXJ8Li4uCiAgICAgICAgSGlzdG9yeUNvbW1lbnQgPT4gJ1NvbWUgZnJlZSB0ZXh0IScsCiAgICAgICAgTm9BZ2VudE5vdGlmeSAgPT4gMCwgICAgICAgICAgICAjIGlmIHlvdSBkb24ndCB3YW50IHRvIHNlbmQgYWdlbnQgbm90aWZpY2F0aW9ucwogICAgKTsKCkV2ZW50czoKICAgIEFydGljbGVTZW5kCgo9Y3V0CgpzdWIgQXJ0aWNsZVNlbmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVG9PcmlnICAgICAgPSAkUGFyYW17VG99ICAgICAgICAgIHx8ICcnOwogICAgbXkgJExvb3AgICAgICAgID0gJFBhcmFte0xvb3B9ICAgICAgICB8fCAwOwogICAgbXkgJEhpc3RvcnlUeXBlID0gJFBhcmFte0hpc3RvcnlUeXBlfSB8fCAnU2VuZEFuc3dlcic7CgogICAgbXkgJEFydGljbGVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CgogICAgIyBMb29rdXAgaWYgbm8gSUQgaXMgcGFzc2VkLgogICAgaWYgKCAkUGFyYW17U2VuZGVyVHlwZX0gJiYgISRQYXJhbXtTZW5kZXJUeXBlSUR9ICkgewogICAgICAgICRQYXJhbXtTZW5kZXJUeXBlSUR9ID0gJEFydGljbGVPYmplY3QtPkFydGljbGVTZW5kZXJUeXBlTG9va3VwKCBTZW5kZXJUeXBlID0+ICRQYXJhbXtTZW5kZXJUeXBlfSApOwogICAgfQoKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXRJRCBVc2VySUQgU2VuZGVyVHlwZUlEIEZyb20gQm9keSBDaGFyc2V0IE1pbWVUeXBlKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIWRlZmluZWQgJFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgSXNWaXNpYmxlRm9yQ3VzdG9tZXIhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIE1hcCBSZXBseVRvIGludG8gUmVwbHktVG8gaWYgcHJlc2VudC4KICAgIGlmICggJFBhcmFte1JlcGx5VG99ICkgewogICAgICAgICRQYXJhbXsnUmVwbHktVG8nfSA9ICRQYXJhbXtSZXBseVRvfTsKICAgIH0KCiAgICAjIENsZWFuIHVwIGJvZHkgc3RyaW5nLgogICAgJFBhcmFte0JvZHl9ID1+IHMvKFxyXG58XG5ccikvXG4vZzsKICAgICRQYXJhbXtCb2R5fSA9fiBzL1xyL1xuL2c7CgogICAgIyBpbml0aWFsaXplIHBhcmFtZXRlciBmb3IgYXR0YWNobWVudHMsIHNvIHRoYXQgdGhlIGNvbnRlbnQgcHVzaGVkIGludG8gdGhhdCByZWYgZnJvbQogICAgIyBFbWJlZGRlZEltYWdlc0V4dHJhY3Qgd2lsbCBzdGF5IGF2YWlsYWJsZQogICAgaWYgKCAhJFBhcmFte0F0dGFjaG1lbnR9ICkgewogICAgICAgICRQYXJhbXtBdHRhY2htZW50fSA9IFtdOwogICAgfQoKICAgICMgY2hlY2sgZm9yIGJhc2U2NCBpbWFnZXMgaW4gYm9keSBhbmQgcHJvY2VzcyB0aGVtCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkVtYmVkZGVkSW1hZ2VzRXh0cmFjdCgKICAgICAgICBEb2N1bWVudFJlZiAgICA9PiBcJFBhcmFte0JvZHl9LAogICAgICAgIEF0dGFjaG1lbnRzUmVmID0+ICRQYXJhbXtBdHRhY2htZW50fSwKICAgICk7CgogICAgIyBjcmVhdGUgYXJ0aWNsZQogICAgbXkgJFRpbWUgICAgICA9ICREYXRlVGltZU9iamVjdC0+VG9FcG9jaCgpOwogICAgbXkgJFJhbmRvbSAgICA9IHJhbmQgOTk5OTk5OwogICAgbXkgJEZRRE4gICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRlFETicpOwogICAgbXkgJE1lc3NhZ2VJRCA9ICI8JFRpbWUuJFJhbmRvbVxAJEZRRE4+IjsKICAgIG15ICRBcnRpY2xlSUQgPSAkU2VsZi0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAlUGFyYW0sCiAgICAgICAgTWVzc2FnZUlEID0+ICRNZXNzYWdlSUQsCiAgICApOwogICAgcmV0dXJuIGlmICEkQXJ0aWNsZUlEOwoKICAgICMgU2VuZCB0aGUgbWFpbAogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcpLT5TZW5kKAogICAgICAgICVQYXJhbSwKICAgICAgICBBcnRpY2xlSUQgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAnTWVzc2FnZS1JRCcgPT4gJE1lc3NhZ2VJRCwKICAgICk7CgogICAgIyByZXR1cm4gaWYgbWFpbCB3YXNuJ3Qgc2VudAogICAgaWYgKCAhJFJlc3VsdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3NzaWJsZSB0byBzZW5kIG1lc3NhZ2UgdG86ICRQYXJhbXsnVG8nfSAuIiwKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHdyaXRlIGFydGljbGUgdG8gZmlsZSBzeXN0ZW0KICAgIG15ICRQbGFpbiA9ICRTZWxmLT5BcnRpY2xlV3JpdGVQbGFpbigKICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICBFbWFpbCAgICAgPT4gc3ByaW50ZiggIiVzXG4lcyIsICRSZXN1bHQtPntEYXRhfS0+e0hlYWRlcn0sICRSZXN1bHQtPntEYXRhfS0+e0JvZHl9ICksCiAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgIHJldHVybiBpZiAhJFBsYWluOwoKICAgICMgbG9nCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4gc3ByaW50ZigKICAgICAgICAgICAgcXtRdWV1ZWQgZW1haWwgdG8gJyVzJyBmcm9tICclcycuIEhpc3RvcnlUeXBlID0+ICVzLCBTdWJqZWN0ID0+ICVzO30sCiAgICAgICAgICAgICRQYXJhbXtUb30sCiAgICAgICAgICAgICRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgJEhpc3RvcnlUeXBlLAogICAgICAgICAgICAkUGFyYW17U3ViamVjdH0sCiAgICAgICAgKSwKICAgICk7CgogICAgIyBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZVNlbmQnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEFydGljbGVJRDsKfQoKPWhlYWQyIEFydGljbGVCb3VuY2UoKQoKQm91bmNlIGFuIGFydGljbGUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVCb3VuY2UoCiAgICAgICAgRnJvbSAgICAgID0+ICdzb21lQGV4YW1wbGUuY29tJywKICAgICAgICBUbyAgICAgICAgPT4gJ3dlYm1hc3RlckBleGFtcGxlLmNvbScsCiAgICAgICAgVGlja2V0SUQgID0+IDEyMywKICAgICAgICBBcnRpY2xlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxMjMsCiAgICApOwoKRXZlbnRzOgogICAgQXJ0aWNsZUJvdW5jZQoKPWN1dAoKc3ViIEFydGljbGVCb3VuY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEl0ZW0gKHF3KFRpY2tldElEIEFydGljbGVJRCBGcm9tIFRvIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEl0ZW19ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkSXRlbSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICMgY3JlYXRlIG1lc3NhZ2UgaWQKICAgIG15ICRUaW1lICAgICAgICAgPSAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKTsKICAgIG15ICRSYW5kb20gICAgICAgPSByYW5kIDk5OTk5OTsKICAgIG15ICRGUUROICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZRRE4nKTsKICAgIG15ICROZXdNZXNzYWdlSUQgPSAiPCRUaW1lLiRSYW5kb20uMFxAJEZRRE4+IjsKICAgIG15ICRFbWFpbCAgICAgICAgPSAkU2VsZi0+QXJ0aWNsZVBsYWluKCBBcnRpY2xlSUQgPT4gJFBhcmFte0FydGljbGVJRH0gKTsKCiAgICAjIGNoZWNrIGlmIHBsYWluIGVtYWlsIGV4aXN0cwogICAgaWYgKCAhJEVtYWlsICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBwbGFpbiBhcnRpY2xlIGZvciBBcnRpY2xlSUQgKCRQYXJhbXtBcnRpY2xlSUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcGlwZSBhbGwgaW50byBzZW5kbWFpbAogICAgbXkgJEJvdW5jZVNlbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWwnKS0+Qm91bmNlKAogICAgICAgICdNZXNzYWdlLUlEJyA9PiAkTmV3TWVzc2FnZUlELAogICAgICAgIEZyb20gICAgICAgICA9PiAkUGFyYW17RnJvbX0sCiAgICAgICAgVG8gICAgICAgICAgID0+ICRQYXJhbXtUb30sCiAgICAgICAgRW1haWwgICAgICAgID0+ICRFbWFpbCwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQm91bmNlU2VudC0+e1N1Y2Nlc3N9OwoKICAgICMgd3JpdGUgaGlzdG9yeQogICAgbXkgJEhpc3RvcnlUeXBlID0gJFBhcmFte0hpc3RvcnlUeXBlfSB8fCAnQm91bmNlJzsKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+SGlzdG9yeUFkZCgKICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBBcnRpY2xlSUQgICAgPT4gJFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgSGlzdG9yeVR5cGUgID0+ICRIaXN0b3J5VHlwZSwKICAgICAgICBOYW1lICAgICAgICAgPT4gIlwlXCUkUGFyYW17VG99IiwKICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FydGljbGVCb3VuY2UnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBTZW5kQXV0b1Jlc3BvbnNlKCkKClNlbmQgYW4gYXV0byByZXNwb25zZSB0byBhIGN1c3RvbWVyIHZpYSBlbWFpbC4KCiAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5TZW5kQXV0b1Jlc3BvbnNlKAogICAgICAgIFRpY2tldElEICAgICAgICAgPT4gMTIzLAogICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gJ2F1dG8gcmVwbHknLAogICAgICAgIE9yaWdIZWFkZXIgICAgICAgPT4gewogICAgICAgICAgICBGcm9tICAgID0+ICdzb21lQGV4YW1wbGUuY29tJywKICAgICAgICAgICAgU3ViamVjdCA9PiAnRm9yIHRoZSBtZXNzYWdlIScsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCkV2ZW50czoKICAgIEFydGljbGVBdXRvUmVzcG9uc2UKCj1jdXQKCnN1YiBTZW5kQXV0b1Jlc3BvbnNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkSXRlbSAocXcoVGlja2V0SUQgVXNlcklEIE9yaWdIZWFkZXIgQXV0b1Jlc3BvbnNlVHlwZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEl0ZW19ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkSXRlbSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIGlmIG5vIG5vdGlmaWNhdGlvbiBpcyBhY3RpdmUKICAgIHJldHVybiAxIGlmICRTZWxmLT57U2VuZE5vTm90aWZpY2F0aW9ufTsKCiAgICAjIGdldCBvcmlnIGVtYWlsIGhlYWRlcgogICAgbXkgJU9yaWdIZWFkZXIgPSAleyAkUGFyYW17T3JpZ0hlYWRlcn0gfTsKCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgZ2V0IHRpY2tldAogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLCAgICAgICAgICAgICAgICAgICMgbm90IG5lZWRlZCBoZXJlLCBUZW1wbGF0ZUdlbmVyYXRvciB3aWxsIGZldGNoIHRoZSB0aWNrZXQgb24gaXRzIG93bgogICAgKTsKCiAgICAjIGdldCBhdXRvIGRlZmF1bHQgcmVzcG9uc2VzCiAgICBteSAlQXV0b1Jlc3BvbnNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyktPkF1dG9SZXNwb25zZSgKICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSA9PiAkUGFyYW17QXV0b1Jlc3BvbnNlVHlwZX0sCiAgICAgICAgT3JpZ0hlYWRlciAgICAgICA9PiAkUGFyYW17T3JpZ0hlYWRlcn0sCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyByZXR1cm4gaWYgbm8gdmFsaWQgYXV0byByZXNwb25zZSBleGlzdHMKICAgIHJldHVybiB1bmxlc3MgJEF1dG9SZXNwb25zZXtUZXh0fTsKICAgIHJldHVybiB1bmxlc3MgJEF1dG9SZXNwb25zZXtTZW5kZXJSZWFsbmFtZX07ICAgICMgdGhlIHVucXVvdGVkIHBocmFzZSBvZiB0aGUgc3lzdGVtIGFkZHJlc3MKICAgIHJldHVybiB1bmxlc3MgJEF1dG9SZXNwb25zZXtTZW5kZXJBZGRyZXNzfTsKCiAgICAjIHNlbmQgaWYgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBzZW50IChub3QgZm9yIGNsb3NlZCB0aWNrZXRzKSE/CiAgICBteSAlU3RhdGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXQoIElEID0+ICRUaWNrZXR7U3RhdGVJRH0gKTsKICAgIGlmICgKICAgICAgICAkUGFyYW17QXV0b1Jlc3BvbnNlVHlwZX0gZXEgJ2F1dG8gcmVwbHknCiAgICAgICAgJiYgKCAkU3RhdGV7VHlwZU5hbWV9IGVxICdjbG9zZWQnIHx8ICRTdGF0ZXtUeXBlTmFtZX0gZXEgJ3JlbW92ZWQnICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgYWRkIGhpc3Rvcnkgcm93CiAgICAgICAgJFRpY2tldE9iamVjdC0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgPT4gJ01pc2MnLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAiU2VudCBubyBhdXRvIHJlc3BvbnNlIG9yIGFnZW50IG5vdGlmaWNhdGlvbiBiZWNhdXNlIHRpY2tldCBpcyAiCiAgICAgICAgICAgICAgICAuICJzdGF0ZS10eXBlICckU3RhdGV7VHlwZU5hbWV9JyEiLAogICAgICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4KICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2cgdGhhdCBubyBhdXRvIHJlc3BvbnNlIHdhcyBzZW50IQogICAgaWYgKCAkT3JpZ0hlYWRlcnsnWC1PVE9CTy1Mb29wJ30gJiYgJE9yaWdIZWFkZXJ7J1gtT1RPQk8tTG9vcCd9ICF+IC9eKGZhbHNlfG5vKSQvaSApIHsKCiAgICAgICAgIyBhZGQgaGlzdG9yeSByb3cKICAgICAgICAkVGlja2V0T2JqZWN0LT5IaXN0b3J5QWRkKAogICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAnTWlzYycsCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICJTZW50IG5vIGF1dG8tcmVzcG9uc2UgYmVjYXVzZSB0aGUgc2VuZGVyIGRvZXNuJ3Qgd2FudCAiCiAgICAgICAgICAgICAgICAuICJhbiBhdXRvLXJlc3BvbnNlIChlLiBnLiBsb29wIG9yIHByZWNlZGVuY2UgaGVhZGVyKSIsCiAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTZW50IG5vICckUGFyYW17QXV0b1Jlc3BvbnNlVHlwZX0nIGZvciBUaWNrZXQgWyIKICAgICAgICAgICAgICAgIC4gIiRUaWNrZXR7VGlja2V0TnVtYmVyfV0gKCRPcmlnSGVhZGVye0Zyb219KSBiZWNhdXNlIHRoZSAiCiAgICAgICAgICAgICAgICAuICJzZW5kZXIgZG9lc24ndCB3YW50IGFuIGF1dG8tcmVzcG9uc2UgKGUuIGcuIGxvb3Agb3IgcHJlY2VkZW5jZSBoZWFkZXIpIgogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHJlcGx5IHRvIGZvciBhdXRvIHJlc3BvbnNlIHJlY2lwaWVudAogICAgaWYgKCAkT3JpZ0hlYWRlcntSZXBseVRvfSApIHsKICAgICAgICAkT3JpZ0hlYWRlcntGcm9tfSA9ICRPcmlnSGVhZGVye1JlcGx5VG99OwogICAgfQoKICAgICMgZ2V0IGxvb3AgcHJvdGVjdGlvbiBvYmplY3QKICAgIG15ICRMb29wUHJvdGVjdGlvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpMb29wUHJvdGVjdGlvbicpOwoKICAgIG15ICRFbWFpbEFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJyk7CgogICAgbXkgQEF1dG9SZXBseUFkZHJlc3NlczsKICAgIG15IEBBZGRyZXNzT2JqZWN0cyA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJE9yaWdIZWFkZXJ7RnJvbX0gKTsKICAgIEFERFJFU1M6CiAgICBmb3IgbXkgJEFkZHJlc3NPYmplY3QgKEBBZGRyZXNzT2JqZWN0cykgewogICAgICAgIG15ICRFbWFpbCAgID0gJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0QWRkcmVzcyggQWRkcmVzc09iamVjdCA9PiAkQWRkcmVzc09iamVjdCApOwogICAgICAgIG15ICRBZGRyZXNzID0gJEVtYWlsQWRkcmVzc09iamVjdC0+Rm9ybWF0KCBBZGRyZXNzT2JqZWN0ID0+ICRBZGRyZXNzT2JqZWN0ICk7CiAgICAgICAgaWYgKCAhJEVtYWlsICkgewoKICAgICAgICAgICAgIyBhZGQgaXQgdG8gdGlja2V0IGhpc3RvcnkKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQ3JlYXRlVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdNaXNjJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAiU2VudCBubyBhdXRvIHJlc3BvbnNlIHRvICckQWRkcmVzcycgLSBubyB2YWxpZCBlbWFpbCBhZGRyZXNzLiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGxvZwogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNlbnQgbm8gYXV0byByZXNwb25zZSB0byAnJEFkZHJlc3MnIGJlY2F1c2Ugb2YgaW52YWxpZCBhZGRyZXNzLiIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFERFJFU1M7CgogICAgICAgIH0KICAgICAgICBpZiAoICEkTG9vcFByb3RlY3Rpb25PYmplY3QtPkNoZWNrKCBUbyA9PiAkRW1haWwgKSApIHsKCiAgICAgICAgICAgICMgYWRkIGhpc3Rvcnkgcm93CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPkhpc3RvcnlBZGQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTG9vcFByb3RlY3Rpb24nLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICJcJVwlJEVtYWlsIiwKICAgICAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbG9nCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VudCBubyAnJFBhcmFte0F1dG9SZXNwb25zZVR5cGV9JyBmb3IgVGlja2V0IFsiCiAgICAgICAgICAgICAgICAgICAgLiAiJFRpY2tldHtUaWNrZXROdW1iZXJ9XSAoJEVtYWlsKSBiZWNhdXNlIG9mIGxvb3AgcHJvdGVjdGlvbi4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFERFJFU1M7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBpbmNyZWFzZSBsb29wIGNvdW50CiAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJExvb3BQcm90ZWN0aW9uT2JqZWN0LT5TZW5kRW1haWwoIFRvID0+ICRFbWFpbCApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBzZW5kZXIgaXMgZS4gZy4gTUFJTEVSLURBRU1PTiBvciBQb3N0bWFzdGVyCiAgICAgICAgbXkgJE5vQXV0b1JlZ0V4cCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2VuZE5vQXV0b1Jlc3BvbnNlUmVnRXhwJyk7CiAgICAgICAgaWYgKCAkRW1haWwgPX4gLyROb0F1dG9SZWdFeHAvaSApIHsKCiAgICAgICAgICAgICMgYWRkIGl0IHRvIHRpY2tldCBoaXN0b3J5CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPkhpc3RvcnlBZGQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gIlNlbnQgbm8gYXV0byByZXNwb25zZSB0byAnJEVtYWlsJywgU2VuZE5vQXV0b1Jlc3BvbnNlUmVnRXhwIG1hdGNoZWQuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbG9nCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNlbnQgbm8gYXV0byByZXNwb25zZSB0byAnJEVtYWlsJyBiZWNhdXNlIGNvbmZpZyIKICAgICAgICAgICAgICAgICAgICAuICIgb3B0aW9uIFNlbmROb0F1dG9SZXNwb25zZVJlZ0V4cCAoLyROb0F1dG9SZWdFeHAvaSkgbWF0Y2hlZC4iLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IEFERFJFU1M7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBBdXRvUmVwbHlBZGRyZXNzZXMsICRBZGRyZXNzOwogICAgfQoKICAgIG15ICRBdXRvUmVwbHlBZGRyZXNzZXMgPSBqb2luKCAnLCAnLCBAQXV0b1JlcGx5QWRkcmVzc2VzICk7CiAgICBteSAkQ2M7CgogICAgIyBhbHNvIHNlbmQgQ0MgdG8gY3VzdG9tZXIgdXNlciBpZiBjdXN0b21lciB1c2VyIGlkIGlzIHVzZWQgYW5kIGFkZHJlc3NlcyBkbyBub3QgbWF0Y2gKICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CgogICAgICAgIG15ICVDdXN0b21lclVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ3VzdG9tZXJVc2Vye1VzZXJFbWFpbH0KICAgICAgICAgICAgJiYgJE9yaWdIZWFkZXJ7RnJvbX0gIX4gL1xRJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9XEUvaQogICAgICAgICAgICAmJiAkUGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRDYyA9ICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgaGlzdG9yeSB0eXBlCiAgICBteSAkSGlzdG9yeVR5cGU7CiAgICBpZiAoICRQYXJhbXtBdXRvUmVzcG9uc2VUeXBlfSA9fiAvXmF1dG8gZm9sbG93IHVwJC9pICkgewogICAgICAgICRIaXN0b3J5VHlwZSA9ICdTZW5kQXV0b0ZvbGxvd1VwJzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0F1dG9SZXNwb25zZVR5cGV9ID1+IC9eYXV0byByZXBseSQvaSApIHsKICAgICAgICAkSGlzdG9yeVR5cGUgPSAnU2VuZEF1dG9SZXBseSc7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBdXRvUmVzcG9uc2VUeXBlfSA9fiAvXmF1dG8gcmVwbHlcL25ldyB0aWNrZXQkL2kgKSB7CiAgICAgICAgJEhpc3RvcnlUeXBlID0gJ1NlbmRBdXRvUmVwbHknOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXV0b1Jlc3BvbnNlVHlwZX0gPX4gL15hdXRvIHJlamVjdCQvaSApIHsKICAgICAgICAkSGlzdG9yeVR5cGUgPSAnU2VuZEF1dG9SZWplY3QnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEhpc3RvcnlUeXBlID0gJ01pc2MnOwogICAgfQoKICAgIGlmICggIUBBdXRvUmVwbHlBZGRyZXNzZXMgJiYgISRDYyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gYXV0byByZXNwb25zZSBhZGRyZXNzZXMgZm9yIFRpY2tldCBbJFRpY2tldHtUaWNrZXROdW1iZXJ9XSIKICAgICAgICAgICAgICAgIC4gIiAoVGlja2V0SUQ9JFBhcmFte1RpY2tldElEfSkuIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgRm9ybWF0IHNlbmRlciByZWFsbmFtZSBhbmQgYWRkcmVzcyBjb21wbGlhbnQgdG8gUkZDIDUzMjIuIFRoaXMgaXMgcmVsZXZhbnQgd2hlbiB0aGUgcmVhbCBuYW1lIGNvbnRhaW4gY29tbWFzCiAgICAjIG9yIG90aGVyIHNwZWNpYWwgc3ltYm9scy4KICAgIG15ICRGcm9tID0gJEVtYWlsQWRkcmVzc09iamVjdC0+Rm9ybWF0KAogICAgICAgIFJlYWxOYW1lID0+ICRBdXRvUmVzcG9uc2V7U2VuZGVyUmVhbG5hbWV9LAogICAgICAgIEFkZHJlc3MgID0+ICRBdXRvUmVzcG9uc2V7U2VuZGVyQWRkcmVzc30sCiAgICApOwoKICAgICMgc2VuZCBlbWFpbAogICAgbXkgJEFydGljbGVJRCA9ICRTZWxmLT5BcnRpY2xlU2VuZCgKICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdzeXN0ZW0nLAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJEhpc3RvcnlUeXBlLAogICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICJcJVwlJEF1dG9SZXBseUFkZHJlc3NlcyIsCiAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJEF1dG9SZXBseUFkZHJlc3NlcywKICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkQ2MsCiAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJ3V0Zi04JywKICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICA9PiAkQXV0b1Jlc3BvbnNle0NvbnRlbnRUeXBlfSwKICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkQXV0b1Jlc3BvbnNle1N1YmplY3R9LAogICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRBdXRvUmVzcG9uc2V7VGV4dH0sCiAgICAgICAgSW5SZXBseVRvICAgICAgICAgICAgPT4gJE9yaWdIZWFkZXJ7J01lc3NhZ2UtSUQnfSwKICAgICAgICBMb29wICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGxvZwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2luZm8nLAogICAgICAgIE1lc3NhZ2UgID0+ICJTZW50IGF1dG8gcmVzcG9uc2UgKCRIaXN0b3J5VHlwZSkgZm9yIFRpY2tldCBbJFRpY2tldHtUaWNrZXROdW1iZXJ9XSIKICAgICAgICAgICAgLiAiIChUaWNrZXRJRD0kUGFyYW17VGlja2V0SUR9LCBBcnRpY2xlSUQ9JEFydGljbGVJRCkgdG8gJyRBdXRvUmVwbHlBZGRyZXNzZXMnLiIKICAgICk7CgogICAgIyBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZUF1dG9SZXNwb25zZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEFydGljbGVUcmFuc21pc3Npb25TdGF0dXMoKQoKR2V0IHRoZSB0cmFuc21pc3Npb24gc3RhdHVzIGZvciBvbmUgYXJ0aWNsZS4KCiAgICBteSAkVHJhbnNtaXNzaW9uU3RhdHVzID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlVHJhbnNtaXNzaW9uU3RhdHVzKAogICAgICAgIEFydGljbGVJRCA9PiAxMjMsICAgIyByZXF1aXJlZAogICAgKTsKClRoaXMgcmV0dXJucyBzb21ldGhpbmcgbGlrZToKCiAgICAkVHJhbnNtaXNzaW9uU3RhdHVzID0gewogICAgICAgIEFydGljbGVJRCAgPT4gMTIzLAogICAgICAgIE1lc3NhZ2VJRCAgPT4gNDU2LAogICAgICAgIE1lc3NhZ2UgICAgPT4gJ0Rlc2NyaXB0aXZlIG1lc3NhZ2Ugb2YgbGFzdCBjb21tdW5pY2F0aW9uJywgICMgb25seSBpbiBjYXNlIG9mIGZhaWxlZCBzdGF0dXMKICAgICAgICBDcmVhdGVUaW1lID0+ICcyMDE3LTAxLTAxIDEyOjM0OjU2JywKICAgICAgICBTdGF0dXMgICAgID0+IFtQcm9jZXNzaW5nfEZhaWxlZF0sCiAgICAgICAgQXR0ZW1wdHMgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmx5IGluIGNhc2Ugb2YgcHJvY2Vzc2luZyBzdGF0dXMKICAgICAgICBEdWVUaW1lICAgID0+ICcyMDE3LTAxLTAyIDEyOjM0OjU2JywgICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgaW4gY2FzZSBvZiBwcm9jZXNzaW5nIHN0YXR1cwogICAgfQoKPWN1dAoKc3ViIEFydGljbGVUcmFuc21pc3Npb25TdGF0dXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17QXJ0aWNsZUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQXJ0aWNsZUlEJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPkFydGljbGVHZXRUcmFuc21pc3Npb25FcnJvciggJVBhcmFtLCApOwogICAgcmV0dXJuICRSZXN1bHQgaWYgJFJlc3VsdCAmJiAleyRSZXN1bHR9OwoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIGFydGljbGVfaWQsIGNyZWF0ZV90aW1lLCBhdHRlbXB0cywgZHVlX3RpbWUgRlJPTSBtYWlsX3F1ZXVlIFdIRVJFIGFydGljbGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtBcnRpY2xlSUR9IF0sCiAgICApOwoKICAgIGlmICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIEFydGljbGVJRCAgPT4gJFJvd1swXSwKICAgICAgICAgICAgQ3JlYXRlVGltZSA9PiAkUm93WzFdLAogICAgICAgICAgICBBdHRlbXB0cyAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIER1ZVRpbWUgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgU3RhdHVzICAgICA9PiAnUHJvY2Vzc2luZycsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1oZWFkMiBBcnRpY2xlQ3JlYXRlVHJhbnNtaXNzaW9uRXJyb3IoKQoKQ3JlYXRlcyBhIFRyYW5zbWlzc2lvbiBFcnJvciBlbnRyeSBmb3Igb25lIGFydGljbGUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVDcmVhdGVUcmFuc21pc3Npb25FcnJvcigKICAgICAgICBBcnRpY2xlSUQgPT4gMTIzLCAgICAgICAgICAgICAgICAgICAjIFJlcXVpcmVkCiAgICAgICAgTWVzc2FnZUlEID0+IDQ1NiwgICAgICAgICAgICAgICAgICAgIyBPcHRpb25hbAogICAgICAgIE1lc3NhZ2UgICA9PiAnJywgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgQXJ0aWNsZUNyZWF0ZVRyYW5zbWlzc2lvbkVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkRmllbGQgKHF3e0FydGljbGVJRH0pIHsKICAgICAgICBpZiAoICEkUGFyYW17JEZpZWxkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJHtGaWVsZH0hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTUUwgPSAnSU5TRVJUIElOVE8gYXJ0aWNsZV9kYXRhX21pbWVfc2VuZF9lcnJvcignOwoKICAgIG15IEBGaWVsZHM7CiAgICBteSBAQmluZDsKCiAgICBteSAlTWFwREIgPSAoCiAgICAgICAgQXJ0aWNsZUlEID0+ICdhcnRpY2xlX2lkJywKICAgICAgICBNZXNzYWdlSUQgPT4gJ21lc3NhZ2VfaWQnLAogICAgICAgIE1lc3NhZ2UgICA9PiAnbG9nX21lc3NhZ2UnLAogICAgKTsKCiAgICBteSBAUGxhY2VIb2xkZXI7CgogICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlTWFwREIgKSB7CiAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17JEZpZWxkfSApICkgewogICAgICAgICAgICBwdXNoIEBGaWVsZHMsICAgICAgJE1hcERCeyRGaWVsZH07CiAgICAgICAgICAgIHB1c2ggQFBsYWNlSG9sZGVyLCAnPyc7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsICAgICAgICBcJFBhcmFteyRGaWVsZH07CiAgICAgICAgfQogICAgfQogICAgcHVzaCBARmllbGRzLCAnY3JlYXRlX3RpbWUnOwoKICAgICRTUUwgLj0gam9pbiggJywgJywgQEZpZWxkcyApCiAgICAgICAgLiAnKSB2YWx1ZXMoJzsKCiAgICAkU1FMIC49IGpvaW4gJywgJywgQFBsYWNlSG9sZGVyOwoKICAgICRTUUwgLj0gJywgY3VycmVudF90aW1lc3RhbXApJzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgbXkgJFRpY2tldElEICAgICAgPSAkQXJ0aWNsZU9iamVjdC0+VGlja2V0SURMb29rdXAoCiAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgKTsKCiAgICAjIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBcnRpY2xlVHJhbnNtaXNzaW9uRXJyb3JDcmVhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9IHx8IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQXJ0aWNsZUdldFRyYW5zbWlzc2lvbkVycm9yKCkKCkdldCB0aGUgVHJhbnNtaXNzaW9uIEVycm9yIGVudHJ5IGZvciBhIGdpdmVuIGFydGljbGUuCgogICAgbXkgJVRyYW5zbWlzc2lvbkVycm9yID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0VHJhbnNtaXNzaW9uRXJyb3IoCiAgICAgICAgQXJ0aWNsZUlEID0+IDEyMywgICAjIFJlcXVpcmVkCiAgICApOwoKICAgIFJldHVybnM6CiAgICB7CiAgICAgICAgQXJ0aWNsZUlEICA9PiAxMjMsCiAgICAgICAgTWVzc2FnZUlEICA9PiA0NTYsCiAgICAgICAgTWVzc2FnZSAgICA9PiAnRGVzY3JpcHRpdmUgbWVzc2FnZSBvZiBsYXN0IGNvbW11bmljYXRpb24nLAogICAgICAgIENyZWF0ZVRpbWUgPT4gJzIwMTctMDEtMDEgMDE6MDI6MDMnLAogICAgICAgIFN0YXR1cyAgICAgPT4gJ0ZhaWxlZCcsCiAgICB9CiAgICBvciB1bmRlZiBpbiBjYXNlIG9mIGZhaWx1cmUgdG8gcmV0cml2ZSBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZS4KCj1jdXQKCnN1YiBBcnRpY2xlR2V0VHJhbnNtaXNzaW9uRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0FydGljbGVJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEFydGljbGVJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBwcmVwYXJlL2ZpbHRlciBBcnRpY2xlSUQKICAgICRQYXJhbXtBcnRpY2xlSUR9ID0gcXVvdGVtZXRhKCAkUGFyYW17QXJ0aWNsZUlEfSApOwogICAgJFBhcmFte0FydGljbGVJRH0gPX4gcy9cMC8vZzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgY2FuJ3Qgb3BlbiBhcnRpY2xlLCB0cnkgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIGFydGljbGVfaWQsIG1lc3NhZ2VfaWQsIGxvZ19tZXNzYWdlLCBjcmVhdGVfdGltZSBGUk9NIGFydGljbGVfZGF0YV9taW1lX3NlbmRfZXJyb3IgV0hFUkUgYXJ0aWNsZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0FydGljbGVJRH0gXSwKICAgICk7CgogICAgbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpOwogICAgaWYgKEBSb3cpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnQXJ0aWNsZUlEJyAgPT4gJFJvd1swXSwKICAgICAgICAgICAgJ01lc3NhZ2VJRCcgID0+ICRSb3dbMV0sCiAgICAgICAgICAgICdNZXNzYWdlJyAgICA9PiAkUm93WzJdLAogICAgICAgICAgICAnQ3JlYXRlVGltZScgPT4gJFJvd1szXSwKICAgICAgICAgICAgJ1N0YXR1cycgICAgID0+ICdGYWlsZWQnLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgQXJ0aWNsZVVwZGF0ZVRyYW5zbWlzc2lvbkVycm9yKCkKClVwZGF0ZXMgdGhlIFRyYW5zbWlzc2lvbiBFcnJvci4KCiAgICBteSAkUmVzdWx0ID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlVXBkYXRlVHJhbnNtaXNzaW9uRXJyb3IoCiAgICAgICAgQXJ0aWNsZUlEID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJlcXVpcmVkCiAgICAgICAgTWVzc2FnZUlEID0+IDQ1NiwgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9wdGlvbmFsCiAgICAgICAgTWVzc2FnZSAgID0+ICdTaG9ydCBkZXNjcmlwdGl2ZSBtZXNzYWdlJywgICAjIE9wdGlvbmFsCiAgICApOwoKUmV0dXJucyAxIG9uIFN1Y2Nlc3MsIHVuZGVmIG9uIGZhaWx1cmUuCgo9Y3V0CgpzdWIgQXJ0aWNsZVVwZGF0ZVRyYW5zbWlzc2lvbkVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtBcnRpY2xlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBBcnRpY2xlSUQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBGaWVsZHNUb1VwZGF0ZTsKICAgIG15IEBCaW5kOwoKICAgIGlmICggSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte01lc3NhZ2VJRH0gKSApIHsKICAgICAgICBwdXNoIEBGaWVsZHNUb1VwZGF0ZSwgJ21lc3NhZ2VfaWQgPSA/JzsKICAgICAgICBwdXNoIEBCaW5kLCAgICAgICAgICAgXCRQYXJhbXtNZXNzYWdlSUR9OwogICAgfQoKICAgIGlmICggSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte01lc3NhZ2V9ICkgKSB7CiAgICAgICAgcHVzaCBARmllbGRzVG9VcGRhdGUsICdsb2dfbWVzc2FnZSA9ID8nOwogICAgICAgIHB1c2ggQEJpbmQsICAgICAgICAgICBcJFBhcmFte01lc3NhZ2V9OwogICAgfQoKICAgIHJldHVybiBpZiAhc2NhbGFyIEBCaW5kOwoKICAgIG15ICRTUUwgPSAnVVBEQVRFIGFydGljbGVfZGF0YV9taW1lX3NlbmRfZXJyb3IgU0VUICcKICAgICAgICAuIGpvaW4oICcsICcsIEBGaWVsZHNUb1VwZGF0ZSApCiAgICAgICAgLiAnIFdIRVJFIGFydGljbGVfaWQgPSA/JzsKCiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0FydGljbGVJRH07CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHVwZGF0ZQogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgIG15ICRUaWNrZXRJRCAgICAgID0gJEFydGljbGVPYmplY3QtPlRpY2tldElETG9va3VwKAogICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICk7CgogICAgIyBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXJ0aWNsZVRyYW5zbWlzc2lvbkVycm9yVXBkYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSB8fCAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Kernel/System/PostMaster/AddressPool.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyhJc0hhc2hSZWZXaXRoRGF0YSBJc0FycmF5UmVmV2l0aERhdGEpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIEdldCBjb21tdW5pY2F0aW9uIGxvZyBvYmplY3QuCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9ID0gJFBhcmFte0NvbW11bmljYXRpb25Mb2dPYmplY3R9IHx8ICcnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEZpbHRlclBvb2xzKCkKClJldHVybiBwb29scyBhZGRyZXNzZWQgaW4gdGhlIGFkZHJlc3MgbGlzdCBvZiBUbywgQ2MgLi4uCgogICAgbXkgQEFkZHJlc3NlZFBvb2xzID0gJEFkZHJlc3NQb29sT2JqZWN0LT5GaWx0ZXJQb29scygKICAgICAgICBQYXJhbXMgPT4gJEdldFBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBGaWx0ZXJQb29scyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1BhcmFtc30gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgUGFyYW1zIGFzIGhhc2ggcmVmISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRFbWFpbEFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJyk7CgogICAgIyBnZXQgaGVhZGVycwogICAgbXkgJUdldFBhcmFtICAgICAgICA9ICRQYXJhbXtQYXJhbXN9LT4lKjsKICAgIG15ICRFbWFpbEhlYWRlciAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1Bvc3RNYXN0ZXI6OkFkZHJlc3NQb29sOjpFbWFpbEhlYWRlcnMnKTsKICAgIG15IEBQcmltYXJ5SGVhZGVyICAgPSBAeyAkRW1haWxIZWFkZXItPntQcmltYXJ5fSAgIHx8IFtdIH07CiAgICBteSBAU2Vjb25kYXJ5SGVhZGVyID0gQHsgJEVtYWlsSGVhZGVyLT57U2Vjb25kYXJ5fSB8fCBbXSB9OwoKICAgICMgY2hlY2sgcG9zc2libGUgYWRkcmVzcyBoZWFkZXJzCiAgICBteSAlUG9vbHNTZWVuOwogICAgbXkgQFBvb2xzOwogICAgSEVBREVSOgogICAgZm9yIG15ICRIZWFkZXIgKEBQcmltYXJ5SGVhZGVyKSB7CgogICAgICAgIG5leHQgSEVBREVSIGlmICEkR2V0UGFyYW17JEhlYWRlcn07CgogICAgICAgIG15IEBFbWFpbHMgPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRHZXRQYXJhbXskSGVhZGVyfSApOwogICAgICAgIEVNQUlMOgogICAgICAgIGZvciBteSAkRW1haWwgKEBFbWFpbHMpIHsKCiAgICAgICAgICAgIG5leHQgRU1BSUwgaWYgISRFbWFpbDsKCiAgICAgICAgICAgIG15ICRBZGRyZXNzID0gJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0QWRkcmVzcyggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKTsKCiAgICAgICAgICAgIG5leHQgRU1BSUwgaWYgISRBZGRyZXNzOwoKICAgICAgICAgICAgbXkgJEFkZHJlc3NQb29sID0gJFNlbGYtPlBvb2xMb29rdXAoCiAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRBZGRyZXNzCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEVNQUlMIGlmICEkQWRkcmVzc1Bvb2w7CgogICAgICAgICAgICBuZXh0IEVNQUlMIGlmICRQb29sc1NlZW57JEFkZHJlc3NQb29sfSsrOwoKICAgICAgICAgICAgcHVzaCBAUG9vbHMsICRBZGRyZXNzUG9vbDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBQb29scyBpZiBAUG9vbHM7CgogICAgIyBpZiBubyBwb29scyBhcmUgYWRkcmVzc2VkIGluIHRoZSBhYm92ZSBzZXQgb2YgaGVhZGVycywgYWxzbyBsb29rIGZvciBzZWNvbmRhcnkgb25lcwogICAgSEVBREVSOgogICAgZm9yIG15ICRIZWFkZXIgKEBTZWNvbmRhcnlIZWFkZXIpIHsKCiAgICAgICAgbmV4dCBIRUFERVIgaWYgISRHZXRQYXJhbXskSGVhZGVyfTsKCiAgICAgICAgbXkgQEVtYWlscyA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEdldFBhcmFteyRIZWFkZXJ9ICk7CiAgICAgICAgRU1BSUw6CiAgICAgICAgZm9yIG15ICRFbWFpbCAoQEVtYWlscykgewoKICAgICAgICAgICAgbmV4dCBFTUFJTCBpZiAhJEVtYWlsOwoKICAgICAgICAgICAgbXkgJEFkZHJlc3MgPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApOwoKICAgICAgICAgICAgbmV4dCBFTUFJTCBpZiAhJEFkZHJlc3M7CgogICAgICAgICAgICBteSAkQWRkcmVzc1Bvb2wgPSAkU2VsZi0+UG9vbExvb2t1cCgKICAgICAgICAgICAgICAgIEFkZHJlc3MgPT4gJEFkZHJlc3MKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRU1BSUwgaWYgISRBZGRyZXNzUG9vbDsKCiAgICAgICAgICAgIG5leHQgRU1BSUwgaWYgJFBvb2xzU2VlbnskQWRkcmVzc1Bvb2x9Kys7CgogICAgICAgICAgICBwdXNoIEBQb29scywgJEFkZHJlc3NQb29sOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQFBvb2xzOwp9Cgo9aGVhZDIgQWRkcmVzc0xpc3QoKQoKPWZvciBzdG9wd29yZHMgYWRkcmVzc3Bvb2xzCkdldCBhbGwgYWRkcmVzc2VzIGRlZmluZWQgaW4gYWRkcmVzc3Bvb2xzCgogICAgbXkgJUFkZHJlc3NUb1Bvb2wgPSAkQWRkcmVzc1Bvb2xPYmplY3QtPkFkZHJlc3NMaXN0KCk7CgpSZXR1cm46CgogICAgJUFkZHJlc3NUb1Bvb2wgPSAoCiAgICAgICAgICAgICAgJ3Rlc3QxQGV4YW1wbGUuY29tJyA9PiAnUG9vbDEnLAogICAgICAgICAgICAgICd0ZXN0MkBleGFtcGxlLmNvbScgPT4gJ1Bvb2wyJywKICAgICAgICAgICAgICAndGVzdDNAZXhhbXBsZS5jb20nID0+ICdQb29sMycsCiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICkKCj1jdXQKCnN1YiBBZGRyZXNzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e0FkZHJlc3NUb1Bvb2x9LT4lKiBpZiAkU2VsZi0+e0FkZHJlc3NUb1Bvb2x9OwoKICAgICRTZWxmLT57QWRkcmVzc1RvUG9vbH0gPSB7fTsKICAgIG15ICRQb29sQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnUG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wnKTsKCiAgICBpZiAoICEkUG9vbENvbmZpZ3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBwb29scyBkZWZpbmVkIGluIFBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sLiIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICgpOwogICAgfQoKICAgIFBPT0w6CiAgICBmb3IgbXkgJFBvb2wgKCBrZXlzICRQb29sQ29uZmlncy0+JSogKSB7CiAgICAgICAgbmV4dCBQT09MIGlmICEkUG9vbENvbmZpZ3MtPnskUG9vbH17RW1haWxzfTsKCiAgICAgICAgZm9yIG15ICRBZGRyZXNzICggJFBvb2xDb25maWdzLT57JFBvb2x9e0VtYWlsc30tPkAqICkgewogICAgICAgICAgICAkU2VsZi0+e0FkZHJlc3NUb1Bvb2x9eyBsYygkQWRkcmVzcykgfSA9ICRQb29sOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPntBZGRyZXNzVG9Qb29sfS0+JSo7Cn0KCj1oZWFkMiBQb29sTG9va3VwKCkKCkdldCBhZGRyZXNzIHBvb2wgYnkgYWRkcmVzcyBvciB0aWNrZXQgaWQKCiAgICBteSAkUG9vbE5hbWUgPSAkQWRkcmVzc1Bvb2xPYmplY3QtPlBvb2xMb29rdXAoCiAgICAgICAgQWRkcmVzcyAgPT4gJ3Rlc3QxQGV4YW1wbGUuY29tJywKICAgICk7CgogICAgbXkgJFBvb2xOYW1lID0gJEFkZHJlc3NQb29sT2JqZWN0LT5Qb29sTG9va3VwKAogICAgICAgIFRpY2tldElEID0+IDQsCiAgICApOwoKUmV0dXJuOgoKICAgICRQb29sTmFtZSA9ICJQb29sMSIKCj1jdXQKCnN1YiBQb29sTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtBZGRyZXNzfSAmJiAhJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQWRkcmVzcyBvciBUaWNrZXRJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGFkZHJlc3MgcG9vbCBuYW1lIGxpc3QKICAgIG15ICVBZGRyZXNzVG9Qb29sID0gJFNlbGYtPkFkZHJlc3NMaXN0KCk7CgogICAgcmV0dXJuICRBZGRyZXNzVG9Qb29seyBsYyggJFBhcmFte0FkZHJlc3N9ICkgfSBpZiAkUGFyYW17QWRkcmVzc307CgogICAgIyBnZXQgb2JqZWN0cwogICAgbXkgJFF1ZXVlT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCB0aWNrZXQgcXVldWUgaWQKICAgIG15ICRRdWV1ZUlEID0gJFRpY2tldE9iamVjdC0+VGlja2V0UXVldWVJRCgKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgKTsKCiAgICAjIHNldCBhZGRyZXNzIHBvb2wgbmFtZQogICAgbXkgJVF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoCiAgICAgICAgSUQgPT4gJFF1ZXVlSUQsCiAgICApOwoKICAgIHJldHVybiBpZiAhJFF1ZXVlRGF0YXtFbWFpbH07CgogICAgcmV0dXJuICRBZGRyZXNzVG9Qb29seyBsYyggJFF1ZXVlRGF0YXtFbWFpbH0gKSB9Owp9Cgo9aGVhZDIgUXVldWVDaGVjaygpCgpDaGVjayBpZiBxdWV1ZSBleGlzdHMgaW4gYWRkcmVzcyBwb29sCgogICAgbXkgJFF1ZXVlRXhpc3QgPSAkQWRkcmVzc1Bvb2xPYmplY3QtPlF1ZXVlQ2hlY2soCiAgICAgICAgUXVldWUgICAgICAgPT4gJ0p1bmsnLAogICAgICAgIEFkZHJlc3NQb29sID0+ICdQb29sMScsCiAgICApOwoKUmV0dXJuOgoKICAgICRRdWV1ZUV4aXN0ID0gMQoKICAgIE9yCgogICAgJFF1ZXVlRXhpc3QgPSAwCgo9Y3V0CgpzdWIgUXVldWVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUXVldWUgQWRkcmVzc1Bvb2wpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcXVldWUKICAgIG15ICVRdWV1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUdldCgKICAgICAgICBOYW1lID0+ICRQYXJhbXtRdWV1ZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJVF1ZXVlOwoKICAgIG15ICRQb29sID0gJFNlbGYtPlBvb2xMb29rdXAoCiAgICAgICAgQWRkcmVzcyA9PiAkUXVldWV7RW1haWx9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRQb29sOwogICAgcmV0dXJuIGlmICRQb29sIG5lICRQYXJhbXtBZGRyZXNzUG9vbH07CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGaW5kTGlua2VkVGlja2V0KCkKCkZpbmQgbGlua2VkIHRpY2tldCB3aXRoICdJbnRlcmRpdmlzaW9uYWwnIHR5cGUgaW4gYWRkcmVzcyBwb29sCgogICAgbXkgKCAkTFRUaWNrZXROdW1iZXIsICRMVFRpY2tldElEICkgPSAkQWRkcmVzc1Bvb2xPYmplY3QtPkZpbmRMaW5rZWRUaWNrZXQoCiAgICAgICAgVGlja2V0SUQgICAgPT4gNCwKICAgICAgICBBZGRyZXNzUG9vbCA9PiAnUG9vbDEnLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKUmV0dXJuOgoKICAgICggJExUVGlja2V0TnVtYmVyLCAkTFRUaWNrZXRJRCApID0gKCIyMDIzMDEyMzM4MDAwMDc0IiwgNSkKCj1jdXQKCnN1YiBGaW5kTGlua2VkVGlja2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXRJRCBBZGRyZXNzUG9vbCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb2JqZWN0CiAgICBteSAkTGlua09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7CgogICAgIyBnZXQgbGlua2VkIHRpY2tldHMKICAgIG15ICVMaW5rZWRUaWNrZXRzID0gJExpbmtPYmplY3QtPkxpbmtLZXlMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICBLZXkxICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgT2JqZWN0MiA9PiAnVGlja2V0JywKICAgICAgICBTdGF0ZSAgID0+ICdWYWxpZCcsCiAgICAgICAgVHlwZSAgICA9PiAnSW50ZXJkaXZpc2lvbmFsJywKICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBmb3IgbXkgJExpbmtlZFRpY2tldCAoIGtleXMgJUxpbmtlZFRpY2tldHMgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBudW1iZXIgLyB0aWNrZXQgaWQKICAgICAgICBteSAkTFRUaWNrZXRJRCAgICAgPSAkTGlua2VkVGlja2V0c3skTGlua2VkVGlja2V0fXtUaWNrZXRJRH07CiAgICAgICAgbXkgJExUVGlja2V0TnVtYmVyID0gJExpbmtlZFRpY2tldHN7JExpbmtlZFRpY2tldH17VGlja2V0TnVtYmVyfTsKCiAgICAgICAgbXkgJExUUG9vbCA9ICRTZWxmLT5Qb29sTG9va3VwKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkTFRUaWNrZXRJRCwKICAgICAgICApOwoKICAgICAgICBpZiAoICRMVFBvb2wgJiYgJExUUG9vbCBlcSAkUGFyYW17QWRkcmVzc1Bvb2x9ICkgewogICAgICAgICAgICByZXR1cm4gKCAkTFRUaWNrZXROdW1iZXIsICRMVFRpY2tldElEICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIEludGVyZGl2aXNpb25hbFRpY2tldExpbmtBZGQoKQoKQWRkIGxpbmsgZm9yIGFkZHJlc3MgcG9vbCB0aWNrZXRzIHdpdGggbmV3ICdJbnRlcmRpdmlzaW9uYWwnIHR5cGUKCiAgICAkQWRkcmVzc1Bvb2xPYmplY3QtPkludGVyZGl2aXNpb25hbFRpY2tldExpbmtBZGQoCiAgICAgICAgVGlja2V0SURzID0+IFsxLCA1LCA4XSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSW50ZXJkaXZpc2lvbmFsVGlja2V0TGlua0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SURzIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXRJRHN9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFRpY2tldElEcyBhcyBhcnJheSByZWYhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSBAVGlja2V0SURzOwogICAgbXkgJVNlZW47CiAgICBJRDoKICAgIGZvciBteSAkSUQgKCAkUGFyYW17VGlja2V0SURzfS0+QCogKSB7CiAgICAgICAgbmV4dCBJRCBpZiAkU2VlbnskSUR9Kys7CgogICAgICAgIHB1c2ggQFRpY2tldElEcywgJElEOwogICAgfQoKICAgIGlmICggc2NhbGFyKEBUaWNrZXRJRHMpIDwgMiApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgYXQgbGVhc3QgMiB0aWNrZXQgaWRzISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb2JqZWN0CiAgICBteSAkTGlua09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7CgogICAgIyBsaW5rIHRpY2tldHMKICAgIGZvciBteSAkU291cmNlICggMCAuLiAkI1RpY2tldElEcyApIHsKCiAgICAgICAgZm9yIG15ICRUYXJnZXQgKCAkU291cmNlICsgMSAuLiAkI1RpY2tldElEcyApIHsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJExpbmtPYmplY3QtPkxpbmtBZGQoCiAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFRpY2tldElEc1skU291cmNlXSwKICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGlja2V0SURzWyRUYXJnZXRdLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdJbnRlcmRpdmlzaW9uYWwnLAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKMTsK</File>
        <File Location="Kernel/System/PostMaster/Filter/SkipViaMessageID.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlNraXBWaWFNZXNzYWdlSUQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBHZXQgY29tbXVuaWNhdGlvbiBsb2cgb2JqZWN0LgogICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSA9ICRQYXJhbXtDb21tdW5pY2F0aW9uTG9nT2JqZWN0fSB8fCBkaWUgIkdvdCBubyBDb21tdW5pY2F0aW9uTG9nT2JqZWN0ISI7CgogICAgIyBHZXQgQXJ0aWNsZSBiYWNrZW5kIG9iamVjdC4KICAgICRTZWxmLT57QXJ0aWNsZUJhY2tlbmRPYmplY3R9ID0KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnRW1haWwnICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPl9BZGRDb21tdW5pY2F0aW9uTG9nKCBNZXNzYWdlID0+ICdTZWFyY2hpbmcgZm9yIGhlYWRlciBNZXNzYWdlLUlELicgKTsKCiAgICBteSAkTWVzc2FnZUlEID0gJFBhcmFte0dldFBhcmFtfS0+eydNZXNzYWdlLUlEJ307CgogICAgcmV0dXJuIDEgaWYgISRNZXNzYWdlSUQ7CgogICAgJFNlbGYtPl9BZGRDb21tdW5pY2F0aW9uTG9nKAogICAgICAgIE1lc3NhZ2UgPT4gc3ByaW50ZigKICAgICAgICAgICAgJ1NlYXJjaGluZyBmb3IgYXJ0aWNsZSB3aXRoIG1lc3NhZ2UgaWQgIiVzIi4nLAogICAgICAgICAgICAkTWVzc2FnZUlELAogICAgICAgICksCiAgICApOwoKICAgIG15ICVBcnRpY2xlID0gJFNlbGYtPntBcnRpY2xlQmFja2VuZE9iamVjdH0tPkFydGljbGVHZXRCeU1lc3NhZ2VJRCgKICAgICAgICBNZXNzYWdlSUQgPT4gJE1lc3NhZ2VJRCwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgISVBcnRpY2xlOwoKICAgIG15ICRFbWFpbEFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJyk7CgogICAgaWYgKCAhJEFydGljbGV7QW1iaWd1b3VzVGlja2V0SURzfSApIHsKICAgICAgICBteSAoJFNlbmRlckVtYWlsKSA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEFydGljbGV7RnJvbX0gKTsKCiAgICAgICAgbXkgJElzTG9jYWwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgIEFkZHJlc3NPYmplY3QgPT4gJFNlbmRlckVtYWlsLAogICAgICAgICk7CgogICAgICAgICMgaWYgd2UgYXJlIHJlYWRpbmcgYSBtZXNzYWdlIHNlbnQgdmlhIG91ciBPVE9CTyBpdHNlbGYgZm9yIHRoZSBmaXJzdCB0aW1lCiAgICAgICAgaWYgKCRJc0xvY2FsKSB7CiAgICAgICAgICAgICRTZWxmLT5fQWRkQ29tbXVuaWNhdGlvbkxvZygKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAnRW1haWwgd2l0aCBtZXNzYWdlIGlkICIlcyIgd2FzIHNlbnQgYXMgbmV3IGFydGljbGUgZnJvbSBhIGxvY2FsIGFkZHJlc3MuJywKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZUlELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkUGFyYW17Sm9iQ29uZmlnfSB8fCAhJFBhcmFte0pvYkNvbmZpZ317QWxsb3dNdWx0aVBhcnNlfSApIHsKICAgICAgICAkU2VsZi0+X0FkZENvbW11bmljYXRpb25Mb2coCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICdBcnRpY2xlIHdpdGggbWVzc2FnZSBpZCAiJXMiIGFscmVhZHkgZXhpc3RzLCBzZXR0aW5nIFgtT1RPQk8tSWdub3JlLicsCiAgICAgICAgICAgICAgICAkTWVzc2FnZUlELAogICAgICAgICAgICApLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte0dldFBhcmFtfXsnWC1PVE9CTy1JZ25vcmUnfSA9ICd5ZXMnOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBteSAkTXVsdGlQYXJzZSA9ICRQYXJhbXtKb2JDb25maWd9e0FsbG93TXVsdGlQYXJzZX17QWx3YXlzfSA/IDEgOiAwOwoKICAgIGlmICggISRNdWx0aVBhcnNlICYmICRQYXJhbXtKb2JDb25maWd9e0FsbG93TXVsdGlQYXJzZX17TWFpbEFjY291bnRRdWV1ZX0gJiYgJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICRTZWxmLT5fQWRkQ29tbXVuaWNhdGlvbkxvZygKICAgICAgICAgICAgTWVzc2FnZSA9PiBzcHJpbnRmKAogICAgICAgICAgICAgICAgJ0FydGljbGUgd2l0aCBtZXNzYWdlIGlkICIlcyIgYWxyZWFkeSBleGlzdHMsIHBhcnNlIGFnYWluIGFzIGV4cGxpY2l0IFF1ZXVlSUQgaXMgcHJvdmlkZWQuJywKICAgICAgICAgICAgICAgICRNZXNzYWdlSUQsCiAgICAgICAgICAgICksCiAgICAgICAgKTsKCiAgICAgICAgJE11bHRpUGFyc2UgPSAxOwogICAgfQoKICAgIGlmICggISRNdWx0aVBhcnNlICYmICRQYXJhbXtKb2JDb25maWd9e0FsbG93TXVsdGlQYXJzZX17Qm91bmNlZEVtYWlsfSAmJiAkUGFyYW17R2V0UGFyYW19eydSZXNlbnQtVG8nfSApIHsKICAgICAgICAkU2VsZi0+X0FkZENvbW11bmljYXRpb25Mb2coCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICdBcnRpY2xlIHdpdGggbWVzc2FnZSBpZCAiJXMiIGFscmVhZHkgZXhpc3RzLCBwYXJzZSBhZ2FpbiBhcyBlbWFpbCB3YXMgYm91bmNlZC4nLAogICAgICAgICAgICAgICAgJE1lc3NhZ2VJRCwKICAgICAgICAgICAgKSwKICAgICAgICApOwoKICAgICAgICAkTXVsdGlQYXJzZSA9IDE7CiAgICB9CgogICAgaWYgKCAhJE11bHRpUGFyc2UgKSB7CiAgICAgICAgJFNlbGYtPl9BZGRDb21tdW5pY2F0aW9uTG9nKAogICAgICAgICAgICBNZXNzYWdlID0+IHNwcmludGYoCiAgICAgICAgICAgICAgICAnQXJ0aWNsZSB3aXRoIG1lc3NhZ2UgaWQgIiVzIiBhbHJlYWR5IGV4aXN0cywgc2V0dGluZyBYLU9UT0JPLUlnbm9yZS4nLAogICAgICAgICAgICAgICAgJE1lc3NhZ2VJRCwKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtHZXRQYXJhbX17J1gtT1RPQk8tSWdub3JlJ30gPSAneWVzJzsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgbXkgJEFkZHJlc3NQb29sT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkFkZHJlc3NQb29sJyk7CiAgICBUSUNLRVRJRDoKICAgIGZvciBteSAkVGlja2V0SUQgKCAkQXJ0aWNsZXtBbWJpZ3VvdXNUaWNrZXRJRHN9LT5AKiApIHsKICAgICAgICBteSAkUG9vbCA9ICRBZGRyZXNzUG9vbE9iamVjdC0+UG9vbExvb2t1cCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIG5leHQgVElDS0VUSUQgaWYgISRQb29sOwoKICAgICAgICAkUGFyYW17R2V0UGFyYW19e0lnbm9yZUFkZHJlc3NQb29sc317JFBvb2x9ID0gJFRpY2tldElEOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FkZENvbW11bmljYXRpb25Mb2cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgUHJpb3JpdHkgICAgICA9PiAkUGFyYW17UHJpb3JpdHl9IHx8ICdEZWJ1ZycsCiAgICAgICAgS2V5ICAgICAgICAgICA9PiByZWYoJFNlbGYpLAogICAgICAgIFZhbHVlICAgICAgICAgPT4gJFBhcmFte01lc3NhZ2V9LAogICAgKTsKCiAgICByZXR1cm47Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentTicketBounce.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA5YTRmYTA4Y2RkODE1Nzk4YjI5YjY4NDg1NDdlY2Y1OTAwZDFkNjRhIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRCb3VuY2UucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0Qm91bmNlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICAjIGdldCBhcnRpY2xlIElECiAgICAkU2VsZi0+e0FydGljbGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApIHx8ICcnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkRW1haWxBZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXJ0aWNsZUlEIFRpY2tldElEIFF1ZXVlSUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGlzIG5lZWRlZCEnLCAkTmVlZGVkICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJVRpY2tldCAgICAgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRDb25maWcgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICBteSAlUG9zc2libGVBY3Rpb25zID0gKCAxID0+ICRTZWxmLT57QWN0aW9ufSApOwoKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVBvc3NpYmxlQWN0aW9ucywKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJUFjbEFjdGlvbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIGlmICgkQUNMKSB7CgogICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7ICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxvY2sgc3RhdGUgJiYgd3JpdGUgKGxvY2spIHBlcm1pc3Npb25zCiAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CgogICAgICAgICAgICBteSAkTG9jayA9ICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRMb2NrKSB7CgogICAgICAgICAgICAgICAgIyBTZXQgbmV3IG93bmVyIGlmIHRpY2tldCBvd25lciBpcyBkaWZmZXJlbnQgdGhlbiBsb2dnZWQgdXNlci4KICAgICAgICAgICAgICAgIGlmICggJFRpY2tldHtPd25lcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgcHJldmlvdXMgb3duZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXN0b3JlIHRpY2tldCBvd25lciBvbiB1bmRvIGFjdGlvbi4KICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJldmlvdXNPd25lcn0gPSAkVGlja2V0e093bmVySUR9OwoKICAgICAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBTaG93IGxvY2sgc3RhdGUuCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRUaWNrZXRPYmplY3QtPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtOdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+V2FybmluZygKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSB0aWNrZXQgb3duZXIgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi4nKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNob3cgc2NyZWVuCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHBsYWluIGFydGljbGUgZXhpc3RzCiAgICAgICAgaWYgKCAhJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlUGxhaW4oIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0gKSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1BsYWluIGFydGljbGUgbm90IGZvdW5kIGZvciBhcnRpY2xlICVzIScsCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntBcnRpY2xlSUR9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBkYXRhCiAgICAgICAgbXkgJUFydGljbGUgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBpZiBhcnRpY2xlIGlzIGZyb20gdGhlIHNhbWUgVGlja2V0SUQgYXMgd2UgY2hlY2tlZCBwZXJtaXNzaW9ucyBmb3IuCiAgICAgICAgaWYgKCAkQXJ0aWNsZXtUaWNrZXRJRH0gbmUgJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdBcnRpY2xlIGRvZXMgbm90IGJlbG9uZyB0byB0aWNrZXQgJXMhJywKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldElEfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyZSB0byAoUmVwbHlUbyEpIC4uLgogICAgICAgIGlmICggJEFydGljbGV7UmVwbHlUb30gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1RvfSA9ICRBcnRpY2xle1JlcGx5VG99OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFydGljbGV7VG99ID0gJEFydGljbGV7RnJvbX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBnZW5lcmF0b3Igb2JqZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyA9PiB7ICV7JFNlbGZ9IH0KICAgICAgICApOwogICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwoKICAgICAgICAjIHByZXBhcmUgc2FsdXRhdGlvbgogICAgICAgICRQYXJhbXtTYWx1dGF0aW9ufSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2FsdXRhdGlvbigKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICBEYXRhICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgc2lnbmF0dXJlCiAgICAgICAgJFBhcmFte1NpZ25hdHVyZX0gPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNpZ25hdHVyZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICBEYXRhICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgYm91bmNlIHRleHQKICAgICAgICAkUGFyYW17Qm91bmNlVGV4dH0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJvdW5jZVRleHQnKSB8fCAnJzsKCiAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyBwcmVwYXJlIGJvdW5jZSB0YWdzCiAgICAgICAgICAgICRQYXJhbXtCb3VuY2VUZXh0fSA9fiBzLzxPVE9CT19USUNLRVQ+LyZsdDtPVE9CT19USUNLRVQmZ3Q7L2c7CiAgICAgICAgICAgICRQYXJhbXtCb3VuY2VUZXh0fSA9fiBzLzxPVE9CT19CT1VOQ0VfVE8+LyZsdDtPVE9CT19CT1VOQ0VfVE8mZ3Q7L2c7CgogICAgICAgICAgICAkUGFyYW17Qm91bmNlVGV4dH0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17Qm91bmNlVGV4dH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEluZm9ybWF0aW9uRm9ybWF0CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJFBhcmFte0luZm9ybWF0aW9uRm9ybWF0fSA9ICIkUGFyYW17U2FsdXRhdGlvbn08YnIvPgo8YnIvPgokUGFyYW17Qm91bmNlVGV4dH08YnIvPgo8YnIvPgokUGFyYW17U2lnbmF0dXJlfSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17SW5mb3JtYXRpb25Gb3JtYXR9ID0gIiRQYXJhbXtTYWx1dGF0aW9ufQoKJFBhcmFte0JvdW5jZVRleHR9CgokUGFyYW17U2lnbmF0dXJlfSI7CiAgICAgICAgfQoKICAgICAgICAjIHByZXBhcmUgc2VuZGVyIG9mIGJvdW5jZSBlbWFpbAogICAgICAgIG15ICVBZGRyZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFN5c3RlbUFkZHJlc3MoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICApOwogICAgICAgICRBcnRpY2xle0Zyb219ID0gJEFkZHJlc3N7Rm9ybWF0dGVkQWRkcmVzc307CgogICAgICAgICMgZ2V0IG5leHQgc3RhdGVzCiAgICAgICAgbXkgJU5leHRTdGF0ZXMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgICAgIGlmICggISRDb25maWctPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAkTmV4dFN0YXRlc3snJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtOZXh0U3RhdGVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJU5leHRTdGF0ZXMsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0JvdW5jZVN0YXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRDb25maWctPntTdGF0ZURlZmF1bHR9LAogICAgICAgICAgICBDbGFzcyAgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBleHBsYW5hdG9yeSBtZXNzYWdlIGFib3V0IGFzdGVyaXNrCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFzdGVyaXNrRXhwbGFuYXRpb24nKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBc3Rlcmlza0V4cGxhbmF0aW9uJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJpbnQgZm9ybSAuLi4KICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldEJvdW5jZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYm91bmNlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAocXcoQm91bmNlVG8gVG8gU3ViamVjdCBCb2R5IEluZm9ybVNlbmRlciBCb3VuY2VTdGF0ZUlEKSkgewogICAgICAgICAgICAkUGFyYW17JFBhcmFtZXRlcn0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICkKICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBNYWtlIHN1cmUgc2VuZGVyIGlzIGNvcnJlY3Qgb25lLgogICAgICAgICRQYXJhbXtGcm9tfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5TZW5kZXIoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUVycm9yOwoKICAgICAgICAjIGNoZWNrIGZvcndhcmQgZW1haWwgYWRkcmVzcwogICAgICAgIGlmICggISRQYXJhbXtCb3VuY2VUb30gKSB7CiAgICAgICAgICAgICRFcnJvcnsnQm91bmNlVG9JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQm91bmNlVG9DdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZycgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICAgICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJFBhcmFte0JvdW5jZVRvfSApICkgewoKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKIyAgICAgICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsLAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRJc0xvY2FsKSB7CiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdCb3VuY2VUb0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJyApOwogICAgICAgICAgICAgICAgJEVycm9yeydCb3VuY2VUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICBlbHNpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgbXkgJEJvdW5jZVRvRXJyb3JNc2cgPQogICAgICAgICAgICAgICAgICAgICdCb3VuY2VUbycKICAgICAgICAgICAgICAgICAgICAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAkQm91bmNlVG9FcnJvck1zZyApOwogICAgICAgICAgICAgICAgJEVycm9yeydCb3VuY2VUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJFBhcmFte0luZm9ybVNlbmRlcn0gKSB7CiAgICAgICAgICAgIGlmICggISRQYXJhbXtUb30gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1RvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdUb0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcyhlcykKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRQYXJhbXtUb30gKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkVG9FcnJvck1zZyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVG8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJFRvRXJyb3JNc2cgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkUGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1N1YmplY3RJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICNjaGVjayBmb3IgZXJyb3IKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGdldCBuZXh0IHN0YXRlcwogICAgICAgICAgICBteSAlTmV4dFN0YXRlcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICAgICAgaWYgKCAhJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkTmV4dFN0YXRlc3snJ30gPSAnLSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte05leHRTdGF0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVOZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0JvdW5jZVN0YXRlSUQnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte0JvdW5jZVN0YXRlSUR9LAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcHJlcGFyZSBib3VuY2UgdGFncyBpZiBib2R5IGlzIHJpY2ggdGV4dAogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgICAgICMgcHJlcGFyZSBib3VuY2UgdGFncwogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID1+IHMvJmx0O09UT0JPX1RJQ0tFVCZndDsvJmFtcDtsdDtPVE9CT19USUNLRVQmYW1wO2d0Oy9naTsKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9fiBzLyZsdDtPVE9CT19CT1VOQ0VfVE8mZ3Q7LyZhbXA7bHQ7T1RPQk9fQk9VTkNFX1RPJmFtcDtndDsvZ2k7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtJbmZvcm1hdGlvbkZvcm1hdH0gICA9ICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgJFBhcmFte0luZm9ybVNlbmRlckNoZWNrZWR9ID0gJFBhcmFte0luZm9ybVNlbmRlcn0gPyAnY2hlY2tlZCAnIDogJyc7CgogICAgICAgICAgICAjIGV4cGxhbmF0b3J5IG1lc3NhZ2UgYWJvdXQgYXN0ZXJpc2sKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFzdGVyaXNrRXhwbGFuYXRpb24nKSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FzdGVyaXNrRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldEJvdW5jZScsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0sCgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRCb3VuY2UgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVCb3VuY2UoCiAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVG8gICAgICAgICAgPT4gJFBhcmFte0JvdW5jZVRvfSwKICAgICAgICAgICAgRnJvbSAgICAgICAgPT4gJFBhcmFte0Zyb219LAogICAgICAgICAgICBIaXN0b3J5VHlwZSA9PiAnQm91bmNlJywKICAgICAgICApOwoKICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICBpZiAoICEkQm91bmNlICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ2FuXCd0IGJvdW5jZSBlbWFpbCEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBjdXN0b21lciBpbmZvPwogICAgICAgIGlmICggJFBhcmFte0luZm9ybVNlbmRlcn0gKSB7CgogICAgICAgICAgICAjIHNldCBtaW1lIHR5cGUKICAgICAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlcGxhY2UgcGxhY2Vob2xkZXJzCiAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9fiBzLygmbHQ7fDwpT1RPQk9fVElDS0VUKCZndDt8PikvJFRpY2tldHtUaWNrZXROdW1iZXJ9L2c7CiAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9fiBzLygmbHQ7fDwpT1RPQk9fQk9VTkNFX1RPKCZndDt8PikvJFBhcmFte0JvdW5jZVRvfS9nOwoKICAgICAgICAgICAgIyBzZW5kCiAgICAgICAgICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdCb3VuY2UnLAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gIkJvdW5jZWQgaW5mbyB0byAnJFBhcmFte1RvfScuIiwKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgICAgIEVtYWlsICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFbWFpbH0sCiAgICAgICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VG99LAogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZXJyb3IgcGFnZQogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3Qgc2VuZCBlbWFpbCEnKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHRoZXJlIGlzIGEgY2hvc2VuIGJvdW5jZSBzdGF0ZSBpZAogICAgICAgIGlmICggJFBhcmFte0JvdW5jZVN0YXRlSUR9ICkgewoKICAgICAgICAgICAgIyBzZXQgc3RhdGUKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRQYXJhbXtCb3VuY2VTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgID0+ICRQYXJhbXtCb3VuY2VTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3VsZCBpIHNldCBhbiB1bmxvY2s/CiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaQogICAgICAgICAgICAgICAgJiYgISRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UmVkaXJlY3RBZnRlckNsb3NlRGlzYWJsZWQnKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgICAgICAgICBVUkwgPT4gKCAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gfHwgJ0FjdGlvbj1BZ2VudERhc2hib2FyZCcgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JFNlbGYtPntBcnRpY2xlSUR9IiwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdXcm9uZyBTdWJhY3Rpb24hJyksCiAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgKTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AgentTicketCompose.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiMjllZmMyNTBkMTZkYzM0NWUwMGY1MTFjZjkwNDUwOWJjZDM1ZDdjIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRDb21wb3NlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldENvbXBvc2U7Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIG5hbWVzcGFjZTo6YXV0b2NsZWFuOwp1c2UgdXRmODsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBUcnkgdG8gbG9hZCBkcmFmdCBpZiByZXF1ZXN0ZWQuCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e0Zvcm1EcmFmdH0KICAgICAgICAmJiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTG9hZEZvcm1EcmFmdCcgKQogICAgICAgICYmICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRJRCcgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSA9ICRQYXJhbU9iamVjdC0+TG9hZEZvcm1EcmFmdCgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdElEJyApLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkTGlzdCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgbXkgJERlZmluaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpNYXNrJyktPkRlZmluaXRpb25HZXQoCiAgICAgICAgTWFzayA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICApIHx8IHt9OwoKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfSAgID0ge307CiAgICAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSA9ICREZWZpbml0aW9uLT57TWFza307CgogICAgIyBhbGlnbiBzeXNjb25maWcgYW5kIHRpY2tldCBtYXNrIGRhdGEgSQogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyAkRHluYW1pY0ZpZWxkTGlzdCAvLyBbXSB9ICkgewogICAgICAgIGlmICggZXhpc3RzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc317ICREeW5hbWljRmllbGQtPntOYW1lfSB9ICkgewogICAgICAgICAgICBteSAkUGFyYW1ldGVycyA9IGRlbGV0ZSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSAvLyB7fTsKCiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAkUGFyYW1ldGVycy0+JSogKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57JEF0dHJpYnV0ZX0gPSAkUGFyYW1ldGVycy0+eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoICRTZWxmLT57TWFza0RlZmluaXRpb259LT5AKiwgewogICAgICAgICAgICAgICAgREYgICAgICAgID0+ICREeW5hbWljRmllbGQtPntOYW1lfSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPT0gMiA/IDEgOiAwLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGQtPntNYW5kYXRvcnl9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgIyBhbGlnbiBzeXNjb25maWcgYW5kIHRpY2tldCBtYXNrIGRhdGEgSUkKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIGtleXMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfS0+JSogKSB7CiAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfSA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICApOwoKICAgICAgICBteSAkUGFyYW1ldGVycyA9ICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc317JER5bmFtaWNGaWVsZE5hbWV9IC8vIHt9OwoKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIGtleXMgJFBhcmFtZXRlcnMtPiUqICkgewogICAgICAgICAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH17JER5bmFtaWNGaWVsZE5hbWV9eyRBdHRyaWJ1dGV9ID0gJFBhcmFtZXRlcnMtPnskQXR0cmlidXRlfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyktPlByZXBhcmVGb3JtSUQoCiAgICAgICAgUGFyYW1PYmplY3QgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLAogICAgKTsKCiAgICAjIG1ldGhvZHMgd2hpY2ggYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHN0YW5kYXJkIGZpZWxkcwogICAgJFNlbGYtPntGaWVsZE1ldGhvZHN9ID0gWwogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldE5leHRTdGF0ZXMKICAgICAgICB9LAogICAgXTsKCiAgICAjIGRlcGVuZGFuY2llcyBvZiBzdGFuZGFyZCBmaWVsZHMgd2hpY2ggYXJlIG5vdCBkZWZpbmVkIHZpYSBBQ0xzCiAgICAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX0gPSB7CiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RmllbGRSZXN0cmljdGlvbnMnKTsKICAgIG15ICRBcnRpY2xlT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICBteSAkRW1haWxBZGRyZXNzT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFRpY2tldElEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRDb25maWctPntQZXJtaXNzaW9ufSApLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9ucyA9ICggMSA9PiAkU2VsZi0+e0FjdGlvbn0gKTsKCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICBpZiAoJEFDTCkgewoKICAgICAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICAgICAjIHNob3cgZXJyb3Igc2NyZWVuIGlmIEFDTCBwcm9oaWJpdHMgdGhpcyBhY3Rpb24KICAgICAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KICAgIH0KCiAgICAjIENoZWNrIGZvciBmYWlsZWQgZHJhZnQgbG9hZGluZyByZXF1ZXN0LgogICAgaWYgKAogICAgICAgICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdMb2FkRm9ybURyYWZ0JyApCiAgICAgICAgJiYgISRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0xvYWRpbmcgZHJhZnQgZmFpbGVkIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICAjIGdldCBsb2NrIHN0YXRlCiAgICBteSAkVGlja2V0QmFja1R5cGUgPSAnVGlja2V0QmFjayc7CiAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CgogICAgICAgICAgICBteSAkTG9jayA9ICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTZXQgbmV3IG93bmVyIGlmIHRpY2tldCBvd25lciBpcyBkaWZmZXJlbnQgdGhlbiBsb2dnZWQgdXNlci4KICAgICAgICAgICAgaWYgKCAkTG9jayAmJiAoICRUaWNrZXR7T3duZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICkgKSB7CgogICAgICAgICAgICAgICAgIyBSZW1lbWJlciBwcmV2aW91cyBvd25lciwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlc3RvcmUgdGlja2V0IG93bmVyIG9uIHVuZG8gYWN0aW9uLgogICAgICAgICAgICAgICAgJFRpY2tldHtQcmV2aW91c093bmVyfSA9ICRUaWNrZXR7T3duZXJJRH07CgogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFNob3cgbG9jayBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRUaWNrZXRCYWNrVHlwZSAuPSAnVW5kbyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkVGlja2V0T2JqZWN0LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1NvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgdGlja2V0IG93bmVyIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uJyksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdFbWFpbCcgKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciAoCiAgICAgICAgcXcoCiAgICAgICAgICAgIFRvIENjIEJjYyBTdWJqZWN0IEJvZHkgSW5SZXBseVRvIFJlZmVyZW5jZXMgUmVzcG9uc2VJRCBSZXBseUFydGljbGVJRCBTdGF0ZUlEIEFydGljbGVJRAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lclByZXNlbnQgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgVGltZVVuaXRzIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlIEZvcm1JRCBSZXBseUFsbAogICAgICAgICAgICBGb3JtRHJhZnRJRCBUaXRsZQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICB9CgogICAgIyBNYWtlIHN1cmUgc2VuZGVyIGlzIGNvcnJlY3Qgb25lLiBTZWUgYnVnIzE0ODcyICggaHR0cHM6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDg3MiApLgogICAgJEdldFBhcmFte0Zyb219ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyktPlNlbmRlcigKICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgaGFzaCBmb3IgY2hlY2sgZHVwbGljYXRlZCBlbnRyaWVzCiAgICBteSAlQWRkcmVzc2VzTGlzdDsKCiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJUbyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlclRvKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDE7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDdXN0b21lcnNOdW1iZXJUbyApIHsKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAkQ291bnQgPiAxXzAwMDsgICAgIyBiYWlsIG91dCB3aGVuIHRoZSBudW1iZXIgb2YgY3VzdG9tZXJzIGlzIGFibm9ybWFsbHkgaGlnaAoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudDsKCiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkU2VsZWN0ZWQgZXEgJENvdW50ID8gJ2NoZWNrZWQgJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKSAgIHx8ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJRdWV1ZSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclF1ZXVlXycgLiAkQ291bnQgKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RvfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3IgICAgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEN1c3RvbWVyRWxlbWVudCApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSAmJiAkQ3VzdG9tZXJFcnJvciBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3IgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZCA9ICdkaXNhYmxlZCc7CiAgICAgICAgICAgICAgICAkQ291bnRBdXggICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyUXVldWUgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZSA9ICRDb3VudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnQsCiAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlLAogICAgICAgICAgICB9OwogICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQ2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQ2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyQ2NDdXN0b21lcicgKSB8fCAwOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyQ2MpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyQ2MgPSAxOwoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAkQ3VzdG9tZXJzTnVtYmVyQ2MgKSB7CiAgICAgICAgICAgIGxhc3QgQ09VTlQgaWYgJENvdW50ID4gMV8wMDA7ICAgICMgYmFpbCBvdXQgd2hlbiB0aGUgbnVtYmVyIG9mIGN1c3RvbWVycyBpcyBhYm5vcm1hbGx5IGhpZ2gKCiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnRDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDY0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CgogICAgICAgICAgICBuZXh0IENPVU5UIHVubGVzcyAkQ3VzdG9tZXJFbGVtZW50Q2M7CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlDYyAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlQ2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lclF1ZXVlXycgLiAkQ291bnQgKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0NjfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDY30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnRDYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDY30gPSAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkQ3VzdG9tZXJFbGVtZW50Q2MgKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gJiYgJEN1c3RvbWVyRXJyb3JDYyBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkQ2MgPSAnJzsKICAgICAgICAgICAgbXkgJENvdW50QXV4Q2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJDYysrOwogICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yQ2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJ2Rpc2FibGVkJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eENjICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDdXN0b21lclF1ZXVlQ2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZUNjID0gJENvdW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyQ2MsIHsKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4Q2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnRDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5Q2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQ2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnQ2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkQ2MsCiAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlQ2MsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSBATXVsdGlwbGVDdXN0b21lckJjYzsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyQmNjQ3VzdG9tZXInICkgfHwgMDsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlckJjYykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAxOwoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAkQ3VzdG9tZXJzTnVtYmVyQmNjICkgewogICAgICAgICAgICBsYXN0IENPVU5UIGlmICRDb3VudCA+IDFfMDAwOyAgICAjIGJhaWwgb3V0IHdoZW4gdGhlIG51bWJlciBvZiBjdXN0b21lcnMgaXMgYWJub3JtYWxseSBoaWdoCgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50QmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CgogICAgICAgICAgICBuZXh0IENPVU5UIHVubGVzcyAkQ3VzdG9tZXJFbGVtZW50QmNjOwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5QmNjICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlQmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17QmNjfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50QmNjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0JjY30gPSAkQ3VzdG9tZXJFbGVtZW50QmNjOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkQ3VzdG9tZXJFbGVtZW50QmNjICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ICYmICRDdXN0b21lckVycm9yQmNjIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICcnOwogICAgICAgICAgICBteSAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQmNjID0gJ2Rpc2FibGVkJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eEJjYyAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZUJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclF1ZXVlQmNjID0gJENvdW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyQmNjLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eEJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudEJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvckJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkQmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZUJjYywKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgIG15ICVEeW5hbWljRmllbGRWYWx1ZXM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwogICAgfQoKICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICB7CiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkSXRlbSAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZEl0ZW07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBkZWZpbmVkICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZEl0ZW19OwoKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRJdGVtIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRJdGVtfTsKICAgICAgICB9CiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICB9CgogICAgIyB0cmFuc2Zvcm0gcGVuZGluZyB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkR2V0UGFyYW17WWVhcn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNb250aH0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtEYXl9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17SG91cn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNaW51dGV9CiAgICAgICAgKQogICAgewogICAgICAgICVHZXRQYXJhbSA9ICRMYXlvdXRPYmplY3QtPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHVwbG9hZCBjYWNoZSBvYmplY3QKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgIyBzZW5kIGVtYWlsCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VuZEVtYWlsJyB8fCAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgIGlmICggISRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB2YWxpZCBzdGF0ZSBpZAogICAgICAgIGlmICggISRHZXRQYXJhbXtTdGF0ZUlEfSApIHsKICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdldFBhcmFte1N0YXRlSUR9ID0gJFRpY2tldHtTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgIG15ICVTdGF0ZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXQoIElEID0+ICRHZXRQYXJhbXtTdGF0ZUlEfSApOwoKICAgICAgICBteSAlRXJyb3I7CgogICAgICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICAgICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAgICAgIyBjaGVjayBzb21lIHZhbHVlcwogICAgICAgIExJTkU6CiAgICAgICAgZm9yIG15ICRMaW5lIChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgICAgIG5leHQgTElORSB1bmxlc3MgJEdldFBhcmFteyRMaW5lfTsKCiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRHZXRQYXJhbXskTGluZX0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkTGluZSAuICdFcnJvclR5cGUnIH0gPSAkTGluZSAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRJc0xvY2FsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsLAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJElzTG9jYWwpIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRMaW5lIC4gJ0lzTG9jYWxBZGRyZXNzJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkRXJyb3J7VG9Jc0xvY2FsQWRkcmVzc30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEVycm9ye0NjSXNMb2NhbEFkZHJlc3N9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRFcnJvcntCY2NJc0xvY2FsQWRkcmVzc30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgYW5kIHZhbGlkYXRlIGRyYWZ0IGFjdGlvbi4KICAgICAgICBteSAkRm9ybURyYWZ0QWN0aW9uID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdEFjdGlvbicgKTsKICAgICAgICBpZiAoICRGb3JtRHJhZnRBY3Rpb24gJiYgISRDb25maWctPntGb3JtRHJhZnR9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnRm9ybURyYWZ0IGZ1bmN0aW9uYWxpdHkgZGlzYWJsZWQhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlRm9ybURyYWZ0UmVzcG9uc2U7CgogICAgICAgICMgQ2hlY2sgZHJhZnQgbmFtZS4KICAgICAgICBpZiAoCiAgICAgICAgICAgICRGb3JtRHJhZnRBY3Rpb24KICAgICAgICAgICAgJiYKICAgICAgICAgICAgKCAkRm9ybURyYWZ0QWN0aW9uIGVxICdBZGQnIHx8ICRGb3JtRHJhZnRBY3Rpb24gZXEgJ1VwZGF0ZScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkVGl0bGUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybURyYWZ0VGl0bGUnICk7CgogICAgICAgICAgICAjIEEgZHJhZnQgbmFtZSBpcyByZXF1aXJlZC4KICAgICAgICAgICAgaWYgKCAhJFRpdGxlICkgewoKICAgICAgICAgICAgICAgICVGb3JtRHJhZnRSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoIkRyYWZ0IG5hbWUgaXMgcmVxdWlyZWQhIiksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENob3NlbiBkcmFmdCBuYW1lIG11c3QgYmUgdW5pcXVlLgogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRGb3JtRHJhZnRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZvcm1EcmFmdCcpLT5Gb3JtRHJhZnRMaXN0R2V0KAogICAgICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBEUkFGVDoKICAgICAgICAgICAgICAgIGZvciBteSAkRm9ybURyYWZ0ICggQHskRm9ybURyYWZ0TGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgTm8gZXhpc3RpbmcgZHJhZnQgd2l0aCBzYW1lIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgbmV4dCBEUkFGVCBpZiAkVGl0bGUgbmUgJEZvcm1EcmFmdC0+e1RpdGxlfTsKCiAgICAgICAgICAgICAgICAgICAgIyBTYW1lIG5hbWUgZm9yIHVwZGF0ZSBvbiBleGlzdGluZyBkcmFmdC4KICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEZvcm1EcmFmdEFjdGlvbiBlcSAnVXBkYXRlJwogICAgICAgICAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9IGVxICRGb3JtRHJhZnQtPntGb3JtRHJhZnRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBEUkFGVDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgQW5vdGhlciBkcmFmdCB3aXRoIHRoZSBjaG9zZW4gbmFtZSBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgICAgICAgICAgICAlRm9ybURyYWZ0UmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoICJGb3JtRHJhZnQgbmFtZSAlcyBpcyBhbHJlYWR5IGluIHVzZSEiLCAkVGl0bGUgKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGxhc3QgRFJBRlQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgUGVyZm9ybSBkcmFmdCBhY3Rpb24gaW5zdGVhZCBvZiBzYXZpbmcgZm9ybSBkYXRhIGluIHRpY2tldC9hcnRpY2xlLgogICAgICAgIGlmICggJEZvcm1EcmFmdEFjdGlvbiAmJiAhJUZvcm1EcmFmdFJlc3BvbnNlICkgewoKICAgICAgICAgICAgIyBSZXNldCBGb3JtRHJhZnRJRCB0byBwcmV2ZW50IHVwZGF0aW5nIGV4aXN0aW5nIGRyYWZ0LgogICAgICAgICAgICBpZiAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0FkZCcgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSApIHsKCiAgICAgICAgICAgICAgICAjIG1lZGRsaW5nIHdpdGggdGhlIGlubmFyZHMgb2YgS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5TZXRBcnJheSgKICAgICAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ0Zvcm1EcmFmdElEJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgPT4gWycnXQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEZvcm1EcmFmdEFjdGlvbk9rOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkRm9ybURyYWZ0QWN0aW9uIGVxICdBZGQnCiAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgKCAkRm9ybURyYWZ0QWN0aW9uIGVxICdVcGRhdGUnICYmICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRm9ybURyYWZ0QWN0aW9uT2sgPSAkUGFyYW1PYmplY3QtPlNhdmVGb3JtRHJhZnQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0RlbGV0ZScgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSApIHsKICAgICAgICAgICAgICAgICRGb3JtRHJhZnRBY3Rpb25PayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0RGVsZXRlKAogICAgICAgICAgICAgICAgICAgIEZvcm1EcmFmdElEID0+ICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRGb3JtRHJhZnRBY3Rpb25PaykgewogICAgICAgICAgICAgICAgJEZvcm1EcmFmdFJlc3BvbnNle1N1Y2Nlc3N9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICVGb3JtRHJhZnRSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJ0NvdWxkIG5vdCBwZXJmb3JtIHJlcXVlc3RlZCBkcmFmdCBhY3Rpb24hJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgUmV0dXJuIEpTT04gd2hlbiB0aGVyZSBhbHJlYWR5IGlzIGEgcmVzcG9uc2UKICAgICAgICBpZiAoJUZvcm1EcmFmdFJlc3BvbnNlKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5KU09OUmVwbHkoCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlRm9ybURyYWZ0UmVzcG9uc2UKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGVuZGluZyBkYXRlCiAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICMgY29udmVydCBwZW5kaW5nIGRhdGUgdG8gYSBkYXRldGltZSBvYmplY3QKICAgICAgICAgICAgbXkgJFBlbmRpbmdEYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFNlY29uZCA9PiAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGN1cnJlbnQgc3lzdGVtIGVwb2NoCiAgICAgICAgICAgIG15ICRDdXJTeXN0ZW1EYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgKCAhJFBlbmRpbmdEYXRlVGltZU9iamVjdCB8fCAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0IDwgJEN1clN5c3RlbURhdGVUaW1lT2JqZWN0ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9ye0RhdGVJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgYXQgbGVhc3Qgb25lIHJlY2lwaWVudCBoYXMgYmVlbiBjaG9zZW4KICAgICAgICBpZiAoICEkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAkRXJyb3J7J1RvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgc29tZSB2YWx1ZXMKICAgICAgICBMSU5FOgogICAgICAgIGZvciBteSAkTGluZSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBuZXh0IExJTkUgaWYgISRHZXRQYXJhbXskTGluZX07CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRHZXRQYXJhbXskTGluZX0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkTGluZSAuICdJbnZhbGlkJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBzdWJqZWN0CiAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAkRXJyb3J7U3ViamVjdEludmFsaWR9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGJvZHkKICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICRFcnJvcntCb2R5SW52YWxpZH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGltZSB1bml0cwogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpCiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAmJiAkR2V0UGFyYW17VGltZVVuaXRzfSBlcSAnJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3J7VGltZVVuaXRzSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBwcmVwYXJlIHN1YmplY3QKICAgICAgICBteSAkVG4gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXROdW1iZXJMb29rdXAoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRuLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9IHx8ICcnLAogICAgICAgICk7CgogICAgICAgIG15ICVBcnRpY2xlUGFyYW07CgogICAgICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIHVzZSB0aWNrZXQgUXVldWVJRCBpbiBjb21wb3NlIG1vZHVsZXMKICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFRpY2tldHtRdWV1ZUlEfTsKCiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30gKTsKCiAgICAgICAgICAgICAgICBteSAkTXVsdGlwbGU7CgogICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgU3RvcmVOZXcgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkSm9ic3skSm9ifQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICAjIGFuZCBhZGQgdGhlbSBiYWNrIHRvIHRoZSBzZWxlY3Rpb24gc28gdGhhdCB0aGUgc3VibWl0CiAgICAgICAgICAgICAgICAjIHdpbGwgY29udGFpbiBvcHRpb25zIHRoYXQgd2VyZSBoaWRkZW4gZnJvbSB0aGUgYWdlbnQKICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAUmVtb3ZlZE9wdGlvbnMgPSAkT2JqZWN0LT5HZXRPcHRpb25zVG9SZW1vdmVBSkFYKCVHZXRQYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJE11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJlbW92ZWRPcHRpb24gKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJEdldFBhcmFteyRLZXl9IH0sICRSZW1vdmVkT3B0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gc2hpZnQgQFJlbW92ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdGlja2V0IHBhcmFtcwogICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSA9ICgKICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPkFydGljbGVPcHRpb24oICVHZXRQYXJhbSwgJUFydGljbGVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IGVycm9ycwogICAgICAgICAgICAgICAgJUVycm9yID0gKAogICAgICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2tpcCB2YWxpZGF0aW9uIG9mIGhpZGRlbiBmaWVsZHMKICAgICAgICBteSAlVmlzaWJpbGl0eTsKCiAgICAgICAgIyB0cmFuc2Zvcm0gZHluYW1pYyBmaWVsZCBkYXRhIGludG8gREZOYW1lID0+IERGTmFtZSBwYWlyCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEFjbCA9IG1hcCB7ICRfID0+ICRfIH0ga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqOwoKICAgICAgICAjIGNhbGwgdGlja2V0IEFDTHMgZm9yIER5bmFtaWNGaWVsZHMgdG8gY2hlY2sgZmllbGQgdmlzaWJpbGl0eQogICAgICAgIG15ICRBQ0xSZXN1bHQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0Zvcm0nLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZEFjbCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFDTFJlc3VsdCkgewogICAgICAgICAgICAlVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfID0+IDAgfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVBY2xEYXRhICkgewogICAgICAgICAgICAgICAgJFZpc2liaWxpdHl7ICdEeW5hbWljRmllbGRfJyAuICRGaWVsZCB9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVZpc2liaWxpdHkgPSBtYXAgeyAnRHluYW1pY0ZpZWxkXycgLiAkXyA9PiAxIH0ga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqOwogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkIHZhbGlkYXRpb24gcmVzdWx0cyBpZiBlcnJvbmVvdXMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKCiAgICAgICAgICAgICAgICAgICAgIyBUT0RPIGFsc28gcGFzcyBvYmplY3QgaGVyZT8KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJER5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgICMgZG8gbm90IHZhbGlkYXRlIG9uIGludmlzaWJsZSBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkVmlzaWJpbGl0eXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CgogICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCgogICAgICAgICAgICAgICAgICAgICMgTWFuZGF0b3J5IGlzIGFkZGVkIHRvIHRoZSBjb25maWdzIGJ5ICRTZWxmLT5uZXcKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e01hbmRhdG9yeX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQuCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2F2ZSBmb3JtIGlmIGEgZHJhZnQgd2FzIGxvYWRlZC4KICAgICAgICBpZiAoICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewogICAgICAgICAgICAlRXJyb3IgPSAoIExvYWRlZEZvcm1EcmFmdCA9PiAxICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVycm9ycwogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgV2hlbiBhIGRyYWZ0IGlzIGxvYWRlZCwgaW5mb3JtIGEgdXNlciB0aGF0IGFydGljbGUgc3ViamVjdCB3aWxsIGJlIGVtcHR5CiAgICAgICAgICAgICMgaWYgY29udGFpbnMgb25seSB0aGUgdGlja2V0IGhvb2sgKGlmIG5vdGhpbmcgaXMgbW9kaWZpZWQpLgogICAgICAgICAgICBpZiAoICRFcnJvcntMb2FkZWRGb3JtRHJhZnR9ICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdBcnRpY2xlIHN1YmplY3Qgd2lsbCBiZSBlbXB0eSBpZiB0aGUgc3ViamVjdCBjb250YWlucyBvbmx5IHRoZSB0aWNrZXQgaG9vayEnCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRHZXRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlfSA9ICRHZXRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTmV4dFN0YXRlcyA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFJlc3BvbnNlRm9ybWF0ICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkR2V0UGFyYW17Qm9keX0gKSwKICAgICAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJDYywKICAgICAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQmNjLAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0QmFja1R5cGUgICAgICA9PiAkVGlja2V0QmFja1R5cGUsCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgREZQb3NzaWJsZVZhbHVlcyA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICAgICAgREZFcnJvcnMgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHQsCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGQgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICA9PiBcJVZpc2liaWxpdHksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgcmVwbGFjZSA8T1RPQk9fVElDS0VUX1NUQVRFPiB3aXRoIG5leHQgdGlja2V0IHN0YXRlIG5hbWUKICAgICAgICBpZiAoICRTdGF0ZURhdGF7TmFtZX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLzxPVE9CT19USUNLRVRfU1RBVEU+LyRTdGF0ZURhdGF7TmFtZX0vZzsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvJmx0O09UT0JPX1RJQ0tFVF9TVEFURSZndDsvJFN0YXRlRGF0YXtOYW1lfS9nOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICAjIGdldCByZWNpcGllbnRzCiAgICAgICAgbXkgJFJlY2lwaWVudHMgPSAnJzsKICAgICAgICBMSU5FOgogICAgICAgIGZvciBteSAkTGluZSAocXcoVG8gQ2MgQmNjKSkgewoKICAgICAgICAgICAgbmV4dCBMSU5FIGlmICEkR2V0UGFyYW17JExpbmV9OwoKICAgICAgICAgICAgaWYgKCRSZWNpcGllbnRzKSB7CiAgICAgICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAnLCAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRSZWNpcGllbnRzIC49ICRHZXRQYXJhbXskTGluZX07CiAgICAgICAgfQoKICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAjIHJlbW92ZSB1bnVzZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICBteSBATmV3QXR0YWNobWVudERhdGE7CiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICAgICAgaWYgKCAkQ29udGVudElEICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICAgICAjIElGIHRoZSBpbWFnZSBpcyByZWZlcmVuY2VkIGluIHRoZSBib2R5IHNldCBpdCBhcyBpbmxpbmUuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gPX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gPSAnaW5saW5lJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgSWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5LgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgaW5saW5lIGltYWdlcyBhbmQgbm9ybWFsIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBwdXNoIEBOZXdBdHRhY2htZW50RGF0YSwgXCV7JEF0dGFjaG1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBBdHRhY2htZW50RGF0YSA9IEBOZXdBdHRhY2htZW50RGF0YTsKCiAgICAgICAgICAgICMgdmVyaWZ5IEhUTUwgZG9jdW1lbnQKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRDb25maWctPntJc1Zpc2libGVGb3JDdXN0b21lckRlZmF1bHR9OwogICAgICAgIGlmICggJEdldFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudH0gKSB7CiAgICAgICAgICAgICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRHZXRQYXJhbXtJc1Zpc2libGVGb3JDdXN0b21lcn0gPyAxIDogMDsKICAgICAgICB9CgogICAgICAgICMgR2V0IGF0dHJpYnV0ZXMgbGlrZSBzZW5kZXIgYWRkcmVzcy4KICAgICAgICAjIEl0IGlzIG5vdCBvYnZpb3VzIHdoZXRoZXIgJERhdGF7RnJvbX0gY2FuIGRpZmZlciBmcm9tICRHZXRQYXJhbXtGcm9tfS4KICAgICAgICBteSAlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5BdHRyaWJ1dGVzKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgRGF0YSAgICAgPT4ge30sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNlbmQgZW1haWwKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlU2VuZCgKICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gJElzVmlzaWJsZUZvckN1c3RvbWVyLAogICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJ1NlbmRBbnN3ZXInLAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAiXCVcJSRSZWNpcGllbnRzIiwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJERhdGF7RnJvbX0sCiAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUb30sCiAgICAgICAgICAgIENjICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtDY30sCiAgICAgICAgICAgIEJjYyAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCY2N9LAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICBJblJlcGx5VG8gICAgICAgICAgICA9PiAkR2V0UGFyYW17SW5SZXBseVRvfSwKICAgICAgICAgICAgUmVmZXJlbmNlcyAgICAgICAgICAgPT4gJEdldFBhcmFte1JlZmVyZW5jZXN9LAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgIEF0dGFjaG1lbnQgICAgICAgICAgID0+IFxAQXR0YWNobWVudERhdGEsCiAgICAgICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBlcnJvciBwYWdlCiAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJFZpc2liaWxpdHl7IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e1JlYWRvbmx5fTsKCiAgICAgICAgICAgICMgc2V0IHRoZSBvYmplY3QgSUQgKFRpY2tldElEIG9yIEFydGljbGVJRCkgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCBjb25maWdyYXRpb24KICAgICAgICAgICAgbXkgJE9iamVjdElEID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdBcnRpY2xlJwogICAgICAgICAgICAgICAgPyAkU2VsZi0+e0FydGljbGVJRH0gfHwgJEFydGljbGVJRAogICAgICAgICAgICAgICAgOiAkU2VsZi0+e1RpY2tldElEfTsKCiAgICAgICAgICAgICMgc2V0IHRoZSB2YWx1ZSB3aGljaCB3YXMgdGFrZW4gZnJvbSB3ZWIgcmVxdWVzdAogICAgICAgICAgICAjIFRPRE86IGZvciBSZWZlcmVuY2UgYW5kIExlbnMsIHRoZSBvcmRlciBpcyByZWxldmFudAogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRPYmplY3RJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFN0YXRlU2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICBTdGF0ZUlEICAgPT4gJEdldFBhcmFte1N0YXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdWxkIEkgc2V0IGFuIHVubG9jaz8KICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgWWVhciAgICAgPT4gJEdldFBhcmFte1llYXJ9LAogICAgICAgICAgICAgICAgTW9udGggICAgPT4gJEdldFBhcmFte01vbnRofSwKICAgICAgICAgICAgICAgIERheSAgICAgID0+ICRHZXRQYXJhbXtEYXl9LAogICAgICAgICAgICAgICAgSG91ciAgICAgPT4gJEdldFBhcmFte0hvdXJ9LAogICAgICAgICAgICAgICAgTWludXRlICAgPT4gJEdldFBhcmFte01pbnV0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGxvZyB1c2UgcmVzcG9uc2UgaWQgYW5kIHJlcGx5IGFydGljbGUgaWQgKHVzZWZ1bCBmb3IgcmVzcG9uc2UgZGlhZ25vc3RpY3MpCiAgICAgICAgJFRpY2tldE9iamVjdC0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICJSZXNwb25zZVRlbXBsYXRlICgkR2V0UGFyYW17UmVzcG9uc2VJRH0vJEdldFBhcmFte1JlcGx5QXJ0aWNsZUlEfS8kQXJ0aWNsZUlEKSIsCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQ3JlYXRlVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHJlbW92ZSBhbGwgZm9ybSBkYXRhCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyktPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAjIElmIGZvcm0gd2FzIGNhbGxlZCBiYXNlZCBvbiBhIGRyYWZ0LAogICAgICAgICMgICBkZWxldGUgZHJhZnQgc2luY2UgaXRzIGNvbnRlbnQgaGFzIG5vdyBiZWVuIHVzZWQuCiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9CiAgICAgICAgICAgICYmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdERlbGV0ZSgKICAgICAgICAgICAgICAgIEZvcm1EcmFmdElEID0+ICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NvdWxkIG5vdCBkZWxldGUgZHJhZnQhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGxvYWQgbmV3IFVSTCBpbiBwYXJlbnQgd2luZG93IGFuZCBjbG9zZSBwb3B1cAogICAgICAgIGlmICgKICAgICAgICAgICAgJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pCiAgICAgICAgICAgICYmICEkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlJlZGlyZWN0QWZ0ZXJDbG9zZURpc2FibGVkJykKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgICAgICBVUkwgPT4gKCAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gfHwgJ0FjdGlvbj1BZ2VudERhc2hib2FyZCcgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICBVUkwgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH07QXJ0aWNsZUlEPSRBcnRpY2xlSUQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgICMgdXNlIHRoZSBGaWVsZElEcywgd2hpY2ggYXJlIGZvdW5kIGluIEFnZW50VGlja2V0UGhvbmUvRW1haWwsIGFuZCBDdXN0b21lclRpY2tldE1lc3NhZ2UKICAgICAgICBteSAlVW5pZm9ybWl0eSA9ICgKICAgICAgICAgICAgTmV3U3RhdGVJRCA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICk7CgogICAgICAgIG15IEBFeHRlbmRlZERhdGE7CgogICAgICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIHVzZSB0aWNrZXQgUXVldWVJRCBpbiBjb21wb3NlIG1vZHVsZXMKICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFRpY2tldHtRdWV1ZUlEfTsKCiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgICAgIEpPQjoKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgbmV4dCBKT0IgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRNdWx0aXBsZTsKCiAgICAgICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRNdWx0aXBsZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAkT2JqZWN0LT5EYXRhKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgICAgICMgZ2V0IEFKQVggcGFyYW0gdmFsdWVzCiAgICAgICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0UGFyYW1BSkFYJykgKSB7CiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtID0gKCAlR2V0UGFyYW0sICRPYmplY3QtPkdldFBhcmFtQUpBWCglR2V0UGFyYW0pICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgb3B0aW9ucyB0aGF0IGhhdmUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZWxlY3Rpb24gdmlzaWJsZQogICAgICAgICAgICAgICAgIyB0byB0aGUgYWdlbnQuIFRoZXNlIG9wdGlvbnMgd2lsbCBiZSBhZGRlZCBhZ2FpbiBvbiBzdWJtaXQuCiAgICAgICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCcpICkgewogICAgICAgICAgICAgICAgICAgIG15IEBPcHRpb25zVG9SZW1vdmUgPSAkT2JqZWN0LT5HZXRPcHRpb25zVG9SZW1vdmVBSkFYKCVHZXRQYXJhbSk7CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkT3B0aW9uVG9SZW1vdmUgKEBPcHRpb25zVG9SZW1vdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICREYXRheyRPcHRpb25Ub1JlbW92ZX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgICAgICAgICBpZiAoJEtleSkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEV4dGVuZGVkRGF0YSwgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gJE11bHRpcGxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTUwLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15ICRFbGVtZW50Q2hhbmdlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcgKSB8fCAnJzsKICAgICAgICBpZiAoICRFbGVtZW50Q2hhbmdlZCBlcSAnU3RhdGVJRCcgKSB7CiAgICAgICAgICAgICRFbGVtZW50Q2hhbmdlZCA9ICdOZXh0U3RhdGVJRCc7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsaXN0IHR5cGUKICAgICAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRBdXRvc2VsZWN0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkF1dG9zZWxlY3QnKSB8fCB1bmRlZjsKICAgICAgICBteSAkQUNMUHJlc2VsZWN0aW9uOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkFDTFByZXNlbGVjdGlvbicpICkgewoKICAgICAgICAgICAgIyBnZXQgY2FjaGVkIHByZXNlbGVjdGlvbiBydWxlcwogICAgICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGlja2V0QUNMJywKICAgICAgICAgICAgICAgIEtleSAgPT4gJ1ByZXNlbGVjdGlvbicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24gKSB7CiAgICAgICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5TZXRBQ0xQcmVzZWxlY3Rpb25DYWNoZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlQ29udmVyZ2VuY2UgPSAoCiAgICAgICAgICAgIFN0ZEZpZWxkcyA9PiAwLAogICAgICAgICAgICBGaWVsZHMgICAgPT4gMCwKICAgICAgICApOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHMgICAgICAgID0gJEVsZW1lbnRDaGFuZ2VkID8gKCAkRWxlbWVudENoYW5nZWQgPT4gMSApIDogKCk7CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAlQ2hhbmdlZEVsZW1lbnRzOwoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICAgICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICgKICAgICAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICAgICAgICAgU2V0cyAgICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtGaWVsZHN9ICkgewoKICAgICAgICAgICAgIyBkZXRlcm1pbmUgc3RhbmRhcmQgZmllbGQgaW5wdXQKICAgICAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSApIHsKCiAgICAgICAgICAgICAgICBteSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwoKICAgICAgICAgICAgICAgICMgd2hpY2ggc3RhbmRhcmQgZmllbGRzIHRvIGNoZWNrIC0gRmllbGRJRCA9PiBHZXRQYXJhbVZhbHVlIChuZWNjZXNzYXJ5IGZvciBEZXN0KQogICAgICAgICAgICAgICAgbXkgJUNoZWNrID0gKAogICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0xQcmVzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggISVOZXdDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9ICVOZXdDaGFuZ2VkRWxlbWVudHM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoCiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgJU5ld0NoYW5nZWRFbGVtZW50cywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkTG9vcFByb3RlY3Rpb24tLSA8IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSYW4gaW50byB1bnJlc29sdmFibGUgbG9vcCEiLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgICAgICAgID0gJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQ7CiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKCk7CgogICAgICAgICAgICAjIGNoZWNrIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICVDdXJGaWVsZFN0YXRlczsKICAgICAgICAgICAgaWYgKCVDaGFuZ2VkRWxlbWVudHMpIHsKCiAgICAgICAgICAgICAgICAjIGdldCB2YWx1ZXMgYW5kIHZpc2liaWxpdHkgb2YgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgICAgICVDdXJGaWVsZFN0YXRlcyA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+R2V0RmllbGRTdGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0T2JqZWN0ICAgICAgICAgICAgICA9PiAkVGlja2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gJFNlbGYtPntEeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPT4gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZEVsZW1lbnRzICAgICAgICAgICA9PiBcJUNoYW5nZWRFbGVtZW50cywgICAgICAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkU2VsZWN0ZWQgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgTmV4dFN0YXRlSUQgPT4gJEdldFBhcmFte1N0YXRlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEF1dG9zZWxlY3QgICAgICA9PiAkQXV0b3NlbGVjdCwKICAgICAgICAgICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gPT4gJEFDTFByZXNlbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgPT4gXCRMb29wUHJvdGVjdGlvbiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjb21iaW5lIEZpZWxkU3RhdGVzCiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tGaWVsZHN9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tTZXRzfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7U2V0c30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7U2V0c30gfSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIyBzdG9yZSBuZXcgdmFsdWVzCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIGR5bmFtaWMgZmllbGRzIGNoYW5nZWQsIGNoZWNrIHN0YW5kYXJkIGZpZWxkcyBhZ2FpbgogICAgICAgICAgICBpZiAoICVDdXJGaWVsZFN0YXRlcyAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gKSApIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMDsKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSBtYXAgeyAkXyA9PiAxIH0ga2V5cyAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle0ZpZWxkc30gPSAxOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCB0aGUgQUpBWCByZXR1cm4gZm9yIHRoZSBkeW5hbWljIGZpZWxkcwogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkQUpBWFJldHVybigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlncyA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgRHluRmllbGRTdGF0ZXMgICAgICA9PiBcJUR5bkZpZWxkU3RhdGVzLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgQUpBWCByZXR1cm4gZm9yIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICAgICBteSBAU3RkRmllbGRBSkFYOwogICAgICAgIG15ICVBdHRyaWJ1dGVzID0gKAogICAgICAgICAgICBOZXh0U3RhdGVJRCA9PiB7CiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAlRGl2ZXJzaXR5ID0gcmV2ZXJzZSAlVW5pZm9ybWl0eTsKICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVTdGRGaWVsZFZhbHVlcyApIHsKICAgICAgICAgICAgcHVzaCBAU3RkRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICREaXZlcnNpdHl7JEZpZWxkfSB8fCAkRmllbGQsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3skRmllbGR9LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17JEZpZWxkfSwKICAgICAgICAgICAgICAgICV7ICRBdHRyaWJ1dGVzeyRGaWVsZH0gfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICAgICAgQFN0ZEZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgICMgY2FuJ3QgdXNlIEpTT05SZXBseSBoZXJlLCBhcyB3ZSBhbHJlYWR5IGhhdmUgSlNPTgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN0ZCBhdHRhY2htZW50IG9iamVjdAogICAgICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKCiAgICAgICAgIyBoYW5kbGUgcmVzcG9uc2UgdGVtcGxhdGUgYXR0YWNobWVudHMgYW5kIHN0YXRlCiAgICAgICAgaWYgKCAkR2V0UGFyYW17UmVzcG9uc2VJRH0gKSB7CgogICAgICAgICAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIGVtYWlsCiAgICAgICAgICAgIG15ICVBbGxTdGRBdHRhY2htZW50cyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1Jlc3BvbnNlSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgKCBzb3J0IGtleXMgJUFsbFN0ZEF0dGFjaG1lbnRzICkgewogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudEdldCggSUQgPT4gJF8gKTsKICAgICAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcmVzcG9uc2UgcHJlc2VsZWN0ZWQgc3RhdGUKICAgICAgICAgICAgbXkgJVJlc3BvbnNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKS0+U3RhbmRhcmRUZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtSZXNwb25zZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdldFBhcmFte1N0YXRlSUR9IHx8PSAkUmVzcG9uc2V7UHJlU2VsZWN0ZWRUaWNrZXRTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBsYXN0IGN1c3RvbWVyIGFydGljbGUgb3Igc2VsZWN0ZWQgYXJ0aWNsZQogICAgICAgIG15IEBBcnRpY2xlTGlzdDsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXJ0aWNsZUlEfSApIHsKCiAgICAgICAgICAgIEBBcnRpY2xlTGlzdCA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICBAQXJ0aWNsZUxpc3QgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgICAgICBPbmx5TGFzdCAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJURhdGE7CgogICAgICAgIEFSVElDTEVNRVRBREFUQToKICAgICAgICBmb3IgbXkgJEFydGljbGVNZXRhRGF0YSAoQEFydGljbGVMaXN0KSB7CgogICAgICAgICAgICBuZXh0IEFSVElDTEVNRVRBREFUQSBpZiAhJEFydGljbGVNZXRhRGF0YTsKICAgICAgICAgICAgbmV4dCBBUlRJQ0xFTUVUQURBVEEgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBcnRpY2xlTWV0YURhdGEpOwoKICAgICAgICAgICAgbXkgJEN1cnJlbnRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSggJXskQXJ0aWNsZU1ldGFEYXRhfSApOwoKICAgICAgICAgICAgJURhdGEgPSAkQ3VycmVudEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlTWV0YURhdGEtPntBcnRpY2xlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJERhdGF7Q29tbXVuaWNhdGlvbkNoYW5uZWxOYW1lfSA9ICRDdXJyZW50QXJ0aWNsZUJhY2tlbmRPYmplY3QtPkNoYW5uZWxOYW1lR2V0KCk7CgogICAgICAgICAgICBsYXN0IEFSVElDTEVNRVRBREFUQTsKICAgICAgICB9CgogICAgICAgICMgTWVyZ2UgdGlja2V0IGRhdGEgd2l0aCBhcnRpY2xlIGRhdGEsIHNlZSBidWcjMTM5OTUgKGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM5OTUpLgogICAgICAgICVEYXRhID0gKCAlVGlja2V0LCAlRGF0YSApOwoKICAgICAgICAjIElmIGFydGljbGUgaXMgbm90IGEgTUlNRUJhc2UgYXJ0aWNsZSwgZ2V0IGN1c3RvbWVyIHJlY2lwaWVudHMgZnJvbSB0aGUgYmFja2VuZC4KICAgICAgICBpZiAoICEkRGF0YXtUb30gJiYgISREYXRhe0Zyb219ICkgewogICAgICAgICAgICBteSBAQ3VzdG9tZXJVc2VySURzID0gJExheW91dE9iamVjdC0+QXJ0aWNsZUN1c3RvbWVyUmVjaXBpZW50c0dldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkRGF0YXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgICAgICAgICBteSBAQ3VzdG9tZXJSZWNpcGllbnRzOwoKICAgICAgICAgICAgQ1VTVE9NRVJfVVNFUl9JRDoKICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJJRCAoQEN1c3RvbWVyVXNlcklEcykgewogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IENVU1RPTUVSX1VTRVJfSUQgaWYgISVDdXN0b21lcjsKCiAgICAgICAgICAgICAgICBwdXNoIEBDdXN0b21lclJlY2lwaWVudHMsICJcIiRDdXN0b21lcntVc2VyRmlyc3RuYW1lfSAkQ3VzdG9tZXJ7VXNlckxhc3RuYW1lfVwiIDwkQ3VzdG9tZXJ7VXNlckVtYWlsfT4iOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRGF0YXtUb30gPSBqb2luKCAnLCcsIEBDdXN0b21lclJlY2lwaWVudHMgKSAvLyAnJzsKCiAgICAgICAgICAgICMgSW5jbHVkZSBzZW5kZXIgbmFtZSBpbiAnRnJvbScgZmllbGQgZm9yIGNvcnJlY3QgcXVvdGluZy4KICAgICAgICAgICAgbXkgJUFydGljbGVGaWVsZHMgPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlRmllbGRzKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICREYXRhe0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICREYXRhe0Zyb219ID0gJEFydGljbGVGaWVsZHN7U2VuZGVyfS0+e1ZhbHVlfSAvLyAnJzsKICAgICAgICB9CgogICAgICAgICMgc2V0IE9yaWdGcm9tIGZvciBjb3JyZWN0IGVtYWlsIHF1b3RpbmcgKHh4eHggd3JvdGUpCiAgICAgICAgJERhdGF7T3JpZ0Zyb219ID0gJERhdGF7RnJvbX07CgogICAgICAgICMgY2hlY2sgYXJ0aWNsZSB0eXBlIGFuZCByZXBsYWNlIFRvIHdpdGggRnJvbSAoaW4gY2FzZSkKICAgICAgICBpZiAoICREYXRhe1NlbmRlclR5cGV9ICF+IC9jdXN0b21lci8gKSB7CgogICAgICAgICAgICAjIHJlcGxhY2UgRnJvbS9UbywgVG8vRnJvbSBiZWNhdXNlIHNlbmRlciBpcyBhZ2VudAogICAgICAgICAgICBteSAkVG8gPSAkRGF0YXtUb307CiAgICAgICAgICAgICREYXRhe1RvfSAgID0gJERhdGF7RnJvbX07CiAgICAgICAgICAgICREYXRhe0Zyb219ID0gJFRvOwoKICAgICAgICAgICAgJERhdGF7UmVwbHlUb30gPSAnJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgT3JpZ0Zyb21OYW1lICh0byBvbmx5IHVzZSB0aGUgcmVhbG5hbWUpCiAgICAgICAgJERhdGF7T3JpZ0Zyb21OYW1lfSA9ICREYXRhe09yaWdGcm9tfTsKICAgICAgICAkRGF0YXtPcmlnRnJvbU5hbWV9ID1+IHMvPC4qPnxcKC4qXCl8XCJ8O3wsLy9nOwogICAgICAgICREYXRhe09yaWdGcm9tTmFtZX0gPX4gcy8oICQpfCggICQpLy9nOwoKICAgICAgICAjIEZhbGxiYWNrIHRvIE9yaWdGcm9tIGlmIHJlYWxuYW1lIHBhcnQgaXMgZW1wdHkuCiAgICAgICAgaWYgKCAhJERhdGF7T3JpZ0Zyb21OYW1lfSApIHsKICAgICAgICAgICAgJERhdGF7T3JpZ0Zyb21OYW1lfSA9ICREYXRhe09yaWdGcm9tfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIGRhdGEKICAgICAgICBteSAlQ3VzdG9tZXI7CiAgICAgICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJUN1c3RvbWVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXJ0aWNsZSB0byBxdW90ZQogICAgICAgICREYXRhe0JvZHl9ID0gJExheW91dE9iamVjdC0+QXJ0aWNsZVF1b3RlKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgPT4gJERhdGF7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBVcGxvYWRDYWNoZU9iamVjdCA9PiAkVXBsb2FkQ2FjaGVPYmplY3QsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVNhZmV0eUNoZWNrUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5TYWZldHkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkRGF0YXtCb2R5fSwKCiAgICAgICAgICAgICMgU3RyaXAgb3V0IGV4dGVybmFsIGNvbnRlbnQgaWYgQmxvY2tMb2FkaW5nUmVtb3RlQ29udGVudCBpcyBlbmFibGVkLgogICAgICAgICAgICBOb0V4dFNyY0xvYWQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCbG9ja0xvYWRpbmdSZW1vdGVDb250ZW50JyksCgogICAgICAgICAgICAjIERpc2FsbG93IHBvdGVudGlhbGx5IHVuc2FmZSBjb250ZW50LgogICAgICAgICAgICBOb0FwcGxldCAgICAgPT4gMSwKICAgICAgICAgICAgTm9PYmplY3QgICAgID0+IDEsCiAgICAgICAgICAgIE5vRW1iZWQgICAgICA9PiAxLAogICAgICAgICAgICBOb1NWRyAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm9KYXZhU2NyaXB0ID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkRGF0YXtCb2R5fSA9ICRTYWZldHlDaGVja1Jlc3VsdHtTdHJpbmd9OwoKICAgICAgICAjIHJlc3RyaWN0IG51bWJlciBvZiBib2R5IGxpbmVzIGlmIGNvbmZpZ3VyZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgICREYXRhe0JvZHl9CiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UmVzcG9uc2VRdW90ZU1heExpbmVzJykKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJE1heExpbmVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpSZXNwb25zZVF1b3RlTWF4TGluZXMnKTsKCiAgICAgICAgICAgICMgc3BsaXQgYm9keSAtIG9uZSBlbGVtZW50IHBlciBsaW5lCiAgICAgICAgICAgIG15IEBCb2R5ID0gc3BsaXQgL1xuLywgJERhdGF7Qm9keX07CgogICAgICAgICAgICAjIG9ubHkgbW9kaWZ5IGlmIGJvZHkgaXMgbG9uZ2VyIHRoYW4gYWxsb3dlZAogICAgICAgICAgICBpZiAoIHNjYWxhciBAQm9keSA+ICRNYXhMaW5lcyApIHsKCiAgICAgICAgICAgICAgICAjIHNwbGljZSB0byBtYXguIGFsbG93ZWQgbGluZXMgYW5kIHJlYXNzZW1ibGUKICAgICAgICAgICAgICAgIEBCb2R5ICAgICAgID0gQEJvZHlbIDAgLi4gKCAkTWF4TGluZXMgLSAxICkgXTsKICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gam9pbiAiXG4iLCBAQm9keTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgICAgICMgcHJlcGFyZSBib2R5LCBzdWJqZWN0LCBSZXBseVRvCiAgICAgICAgICAgICMgcmV3cmFwIGJvZHkgaWYgZXhpc3RzCiAgICAgICAgICAgIGlmICggJERhdGF7Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9fiBzL1x0LyAvZzsKICAgICAgICAgICAgICAgIG15ICRRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpRdW90ZScpIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRRdW90ZSkgewoKICAgICAgICAgICAgICAgICAgICAjIHF1b3RlIHRleHQKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICI8YmxvY2txdW90ZSB0eXBlPVwiY2l0ZVwiPiREYXRhe0JvZHl9PC9ibG9ja3F1b3RlPlxuIjsKCiAgICAgICAgICAgICAgICAgICAgIyBjbGVhbnVwIG5vdCBjb21wYXQuIHRhZ3MKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDbGVhbnVwKAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICI8YnIvPiIgLiAkRGF0YXtCb2R5fTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXtDcmVhdGVUaW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0RhdGUnKSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiAkRGF0YXtDcmVhdGVUaW1lfTxici8+IiAuICREYXRhe0JvZHl9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZm9yIChxdyhTdWJqZWN0IFJlcGx5VG8gUmVwbHktVG8gQ2MgVG8gRnJvbSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXskX30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkXykgLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICREYXRheyRffTxici8+IiAuICREYXRhe0JvZHl9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkRnJvbSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGF7RnJvbX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2VGcm9tID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdNZXNzYWdlIGZyb20nKTsKICAgICAgICAgICAgICAgICAgICBteSAkRW5kTWVzc2FnZSAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0VuZCBtZXNzYWdlJyk7CgogICAgICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gIjxici8+LS0tLSAkTWVzc2FnZUZyb20gJEZyb20gLS0tPGJyLz48YnIvPiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSAuPSAiPGJyLz4tLS0tICRFbmRNZXNzYWdlIC0tLTxici8+IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgcHJlcGFyZSBib2R5LCBzdWJqZWN0LCBSZXBseVRvCiAgICAgICAgICAgICMgcmUtd3JhcCBib2R5IGlmIGV4aXN0cwogICAgICAgICAgICBpZiAoICREYXRhe0JvZHl9ICkgewogICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gPX4gcy9cdC8gL2c7CiAgICAgICAgICAgICAgICBteSAkUXVvdGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlF1b3RlJyk7CiAgICAgICAgICAgICAgICBpZiAoJFF1b3RlKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gPX4gcy9cbi9cbiRRdW90ZSAvZzsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbiRRdW90ZSAiIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRhe0NyZWF0ZVRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRGF0ZScpIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ICREYXRhe0NyZWF0ZVRpbWV9XG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmb3IgKHF3KFN1YmplY3QgUmVwbHlUbyBSZXBseS1UbyBDYyBUbyBGcm9tKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRffSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRfKSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogJERhdGF7JF99XG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlRnJvbSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTWVzc2FnZSBmcm9tJyk7CiAgICAgICAgICAgICAgICAgICAgbXkgJEVuZE1lc3NhZ2UgID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdFbmQgbWVzc2FnZScpOwoKICAgICAgICAgICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbi0tLS0gJE1lc3NhZ2VGcm9tICREYXRhe0Zyb219IC0tLVxuXG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Qm9keX0gLj0gIlxuLS0tLSAkRW5kTWVzc2FnZSAtLS1cbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHN5c3RlbSBhZGRyZXNzIG9iamVjdAogICAgICAgIG15ICRTeXN0ZW1BZGRyZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKTsKCiAgICAgICAgIyBhZGQgbm90IGxvY2FsIFRvIGFkZHJlc3NlcyB0byBDYwogICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICREYXRhe1RvfSApICkgewogICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRTeXN0ZW1BZGRyZXNzLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCwKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJElzTG9jYWwgKSB7CiAgICAgICAgICAgICAgICBpZiAoICREYXRhe0NjfSApIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YXtDY30gLj0gJywgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRhe0NjfSAuPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5Gb3JtYXQoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgUmVwbHlUbwogICAgICAgIGlmICggJERhdGF7UmVwbHlUb30gKSB7CiAgICAgICAgICAgICREYXRhe1RvfSA9ICREYXRhe1JlcGx5VG99OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGF7VG99ID0gJERhdGF7RnJvbX07CgogICAgICAgICAgICAjIHRyeSB0byByZW1vdmUgc29tZSB3cm9uZyB0ZXh0IHRvIGZyb20gbGluZSAoYnkgd2F5IG9mIC4uLikKICAgICAgICAgICAgIyBhZGRlZCBieSBzb21lIHN0cmFuZ2UgbWFpbCBwcm9ncmFtcyBvbiBib3VuY2UKICAgICAgICAgICAgJERhdGF7VG99ID1+IHMvKC4rP1w8Lis/XEAuKz9cPilccytcKGJ5XHMrd2F5XHMrb2ZccysuKz9cKS8kMS9pZzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRvIGVtYWlsIChqdXN0ICJzb21lQGV4YW1wbGUuY29tIikKICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkRGF0YXtUb30gKSApIHsKICAgICAgICAgICAgJERhdGF7VG9FbWFpbH0gPSAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApOwogICAgICAgIH0KCiAgICAgICAgIyBvbmx5IHJlcGx5IHRvIHNlbmRlcgogICAgICAgIGlmICggISRHZXRQYXJhbXtSZXBseUFsbH0gKSB7CiAgICAgICAgICAgICREYXRhe0NjfSAgPSAnJzsKICAgICAgICAgICAgJERhdGF7QmNjfSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyB1c2UgY3VzdG9tZXIgZGF0YWJhc2UgZW1haWwKICAgICAgICAjIGRvIG5vdCBhZGQgY3VzdG9tZXIgZW1haWwgdG8gY2MsIGlmIGFydGljbGUgaXMgdmlzaWJsZSBmb3IgY3VzdG9tZXIKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q29tcG9zZUFkZEN1c3RvbWVyQWRkcmVzcycpCiAgICAgICAgICAgICYmICREYXRhe0lzVmlzaWJsZUZvckN1c3RvbWVyfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAjIGNoZWNrIGlmIGN1c3RvbWVyIGlzIGluIHJlY2lwaWVudCBsaXN0CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVye1VzZXJFbWFpbH0gJiYgJERhdGF7VG9FbWFpbH0gIX4gL15cUSRDdXN0b21lcntVc2VyRW1haWx9XEUkL2kgKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkRGF0YXtTZW5kZXJUeXBlfSBlcSAnYWdlbnQnICYmICEkRGF0YXtJc1Zpc2libGVGb3JDdXN0b21lcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0YXtUb30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1RvfSAuPSAnLCAnIC4gJEN1c3RvbWVye1VzZXJFbWFpbH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtUb30gPSAkQ3VzdG9tZXJ7VXNlckVtYWlsfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZXBsYWNlIFRvIHdpdGggY3VzdG9tZXJzIGRhdGFiYXNlIGFkZHJlc3MKICAgICAgICAgICAgICAgIGVsc2lmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDb21wb3NlUmVwbGFjZVNlbmRlckFkZHJlc3MnKSApIHsKCiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FkZHJlc3MgJXMgcmVwbGFjZWQgd2l0aCByZWdpc3RlcmVkIGN1c3RvbWVyIGFkZHJlc3MuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRhe1RvRW1haWx9LAogICAgICAgICAgICAgICAgICAgICAgICApLAoKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICREYXRhe1RvfSA9ICRDdXN0b21lcntVc2VyRW1haWx9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgYWRkIGN1c3RvbWVycyBkYXRhYmFzZSBhZGRyZXNzIHRvIENjCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiBUcmFuc2xhdGFibGUoIkN1c3RvbWVyIHVzZXIgYXV0b21hdGljYWxseSBhZGRlZCBpbiBDYy4iKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggJERhdGF7Q2N9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXtDY30gLj0gJywgJyAuICRDdXN0b21lcntVc2VyRW1haWx9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7Q2N9ID0gJEN1c3RvbWVye1VzZXJFbWFpbH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGZpbmQgZHVwbGljYXRlIGFkZHJlc3NlcwogICAgICAgIG15ICVSZWNpcGllbnQ7CiAgICAgICAgZm9yIG15ICRUeXBlIChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgICAgIGlmICggJERhdGF7JFR5cGV9ICkgewogICAgICAgICAgICAgICAgbXkgJE5ld0xpbmUgPSAnJzsKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICREYXRheyRUeXBlfSApICkgewogICAgICAgICAgICAgICAgICAgIG15ICRBZGRyZXNzID0gbGMgJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0QWRkcmVzcyggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBvbmx5IHVzZSBlbWFpbCBhZGRyZXNzZXMgd2l0aCBAIGluc2lkZQogICAgICAgICAgICAgICAgICAgIGlmICggJEFkZHJlc3MgJiYgJEFkZHJlc3MgPX4gL0AvICYmICEkUmVjaXBpZW50eyRBZGRyZXNzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFJlY2lwaWVudHskQWRkcmVzc30gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRTeXN0ZW1BZGRyZXNzLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRBZGRyZXNzLAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJElzTG9jYWwgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJE5ld0xpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3TGluZSAuPSAnLCAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0xpbmUgLj0gJEVtYWlsQWRkcmVzc09iamVjdC0+Rm9ybWF0KCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJERhdGF7JFR5cGV9ID0gJE5ld0xpbmU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHRlbXBsYXRlCiAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CgogICAgICAgICMgdXNlIGtleSBTdGRSZXNwb25zZSB0byBwYXNzIHRoZSBkYXRhIHRvIHRoZSB0ZW1wbGF0ZSBmb3IgbGVnYWN5IHJlYXNvbnMsCiAgICAgICAgIyAgIGJlY2F1c2UgZXhpc3Rpbmcgc3lzdGVtcyBtYXkgaGF2ZSBpdCBpbiB0aGVpciBjb25maWd1cmF0aW9uIGFzIHRoYXQgd2FzCiAgICAgICAgIyAgIHRoZSBrZXkgdXNlZCBiZWZvcmUgdGhlIGludGVybmFsIHN3aXRjaCB0byBTdGFuZGFyZFJlc3BvbnNlIEFuZCBTdGFuZGFyZFRlbXBsYXRlCgogICAgICAgICREYXRhe1N0ZFJlc3BvbnNlfSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1Jlc3BvbnNlSUR9LAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2FsdXRhdGlvbgogICAgICAgICREYXRhe1NhbHV0YXRpb259ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TYWx1dGF0aW9uKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2lnbmF0dXJlCiAgICAgICAgJERhdGF7U2lnbmF0dXJlfSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyAkVGVtcGxhdGVHZW5lcmF0b3ItPkF0dHJpYnV0ZXMoKSBkb2VzIG5vdCBvdmVyd3JpdGUgJURhdGEsIGJ1dCBpdCBhZGRzIG1vcmUga2V5cwogICAgICAgICVEYXRhID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5BdHRyaWJ1dGVzKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRGF0YSAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkUmVzcG9uc2VGb3JtYXQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlJlc3BvbnNlRm9ybWF0Jyk7CgogICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgbXkgJURhdGFIVE1MID0gJURhdGE7CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgaWYgKCRSZXNwb25zZUZvcm1hdCkgewogICAgICAgICAgICAgICAgJFJlc3BvbnNlRm9ybWF0ID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRSZXNwb25zZUZvcm1hdCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZXN0b3JlIHFkYXRhIGZvcm1hdHRpbmcgZm9yIE91dHB1dCByZXBsYWNlbWVudAogICAgICAgICAgICAgICAgJFJlc3BvbnNlRm9ybWF0ID1+IHMvJnF1b3Q7LyIvZ2k7CgogICAgICAgICAgICAgICAgIyBodG1sIHF1b3RlIHRvIGhhdmUgaXQgY29ycmVjdCBpbiBlZGl0IGFyZWEKICAgICAgICAgICAgICAgICRSZXNwb25zZUZvcm1hdCA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkUmVzcG9uc2VGb3JtYXQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVzdG9yZSBxZGF0YSBmb3JtYXR0aW5nIGZvciBPdXRwdXQgcmVwbGFjZW1lbnQKICAgICAgICAgICAgICAgICRSZXNwb25zZUZvcm1hdCA9fiBzLyZxdW90Oy8iL2dpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHF1b3RlIGFsbCBub24gaHRtbCBjb250ZW50IHRvIGhhdmUgaXQgY29ycmVjdCBpbiBlZGl0IGFyZWEKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlRGF0YUhUTUwgKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhJERhdGFIVE1MeyRLZXl9OwogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnU2FsdXRhdGlvbic7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdCb2R5JzsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1N0ZFJlc3BvbnNlJzsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICRLZXkgZXEgJ1NpZ25hdHVyZSc7CiAgICAgICAgICAgICAgICAkRGF0YUhUTUx7JEtleX0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJERhdGFIVE1MeyRLZXl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBuZXcgcmVzcG9uc2UgZm9ybWF0IGJhc2VkIG9uIHRlbXBsYXRlCiAgICAgICAgJERhdGF7UmVzcG9uc2VGb3JtYXR9ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAkUmVzcG9uc2VGb3JtYXQsCiAgICAgICAgICAgIERhdGEgICAgID0+IHsgJVBhcmFtLCAlRGF0YUhUTUwgfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHNvbWUgdmFsdWVzCiAgICAgICAgbXkgJUVycm9yOwogICAgICAgIExJTkU6CiAgICAgICAgZm9yIG15ICRMaW5lIChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgICAgIG5leHQgTElORSBpZiAhJERhdGF7JExpbmV9OwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkRGF0YXskTGluZX0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkTGluZSAuICJJbnZhbGlkIiB9ID0gIiBTZXJ2ZXJFcnJvciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkRGF0YXtGcm9tfSApIHsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJERhdGF7RnJvbX0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyJGcm9tSW52YWxpZCJ9IC49ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGlzdCB0eXBlCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIEdldCB2YWx1ZXMgZm9yIFRpY2tldCBmaWVsZHMgYW5kIHVzZSBkZWZhdWx0IHZhbHVlIGZvciBBcnRpY2xlIGZpZWxkcywgaWYgZ2l2ZW4uCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICMgVGhpcyBvdmVyd3JpdGVzIHRoZSB2YWx1ZXMgdGhhdCBtaWdodCBoYXZlIGJlZW4gdGFrZW4gZnJvbSB0aGUgd2ViIHJlcXVlc3QuCiAgICAgICAgICAgICMgTm90ZSB0aGF0IHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgdmFsdWVzIGZyb20gdGhlIHdlYiByZXF1ZXN0LAogICAgICAgICAgICAjIGJlY2F1c2Ugc3VibWl0cywgc3VjY2Vzc2Z1bCBhbmQgdW5zdWNjZXNzZnVsIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkgYWJvdmUuCiAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdUaWNrZXQnICkgewoKICAgICAgICAgICAgICAgICMgVmFsdWUgaXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZSBmcm9tIFRpY2tldC4KICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdBcnRpY2xlJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKICAgICAgICAjIGdhdGhlciBmaWVsZHMgd2hpY2ggYXJlIHN1cHBvc2VkIHRvIGJlIGhpZGRlbiB3aGVuIGF1dG9zZWxlY3RlZAogICAgICAgIG15ICRIaWRlQXV0b3NlbGVjdGVkSlNPTjsKICAgICAgICBpZiAoJEF1dG9zZWxlY3QpIHsKICAgICAgICAgICAgbXkgQEhpZGVBdXRvc2VsZWN0ZWQgPSBncmVwIHsgIXJlZiggJEF1dG9zZWxlY3QtPnskX30gKSAmJiAkQXV0b3NlbGVjdC0+eyRffSA9PSAyIH0ga2V5cyAleyRBdXRvc2VsZWN0fTsKICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBIaWRlQXV0b3NlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIG1hcCB7ICJEeW5hbWljRmllbGRfIiAuICRfIH0KICAgICAgICAgICAgICAgICAgICAoIGdyZXAgeyAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH17JF99ID09IDIgfSBrZXlzICV7ICRBdXRvc2VsZWN0LT57RHluYW1pY0ZpZWxkfSB9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChASGlkZUF1dG9zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgICAgICAgICAgICAgJEhpZGVBdXRvc2VsZWN0ZWRKU09OID0gJEpTT05PYmplY3QtPkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxASGlkZUF1dG9zZWxlY3RlZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRBQ0xQcmVzZWxlY3Rpb247CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QUNMUHJlc2VsZWN0aW9uJykgKSB7CgogICAgICAgICAgICAjIGdldCBjYWNoZWQgcHJlc2VsZWN0aW9uIHJ1bGVzCiAgICAgICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdUaWNrZXRBQ0wnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAnUHJlc2VsZWN0aW9uJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbiApIHsKICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPlNldEFDTFByZXNlbGVjdGlvbkNhY2hlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVDb252ZXJnZW5jZSA9ICgKICAgICAgICAgICAgU3RkRmllbGRzID0+IDAsCiAgICAgICAgICAgIEZpZWxkcyAgICA9PiAwLAogICAgICAgICk7CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50czsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydDsKICAgICAgICBteSAlQ2hhbmdlZFN0ZEZpZWxkczsKCiAgICAgICAgbXkgJExvb3BQcm90ZWN0aW9uID0gMTAwOwogICAgICAgIG15ICVTdGRGaWVsZFZhbHVlczsKICAgICAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAoCiAgICAgICAgICAgIFZpc2liaWxpdHkgPT4ge30sCiAgICAgICAgICAgIEZpZWxkcyAgICAgPT4ge30sCiAgICAgICAgICAgIFNldHMgICAgICAgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEluaXRpYWxSdW4gPSAxOwoKICAgICAgICAjIGhhbmRsZSBkZWZhdWx0IHZhbHVlcyBmb3Igc3RhbmRhcmQgZmllbGRzCiAgICAgICAgaWYgKCAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSApIHsKCiAgICAgICAgICAgIG15ICROZXh0U3RhdGVzID0gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJEdldFBhcmFte1N0YXRlSUR9IC8vPSB7IHJldmVyc2UgJE5leHRTdGF0ZXMtPiUqIH0tPnsgJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0gfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkQ29uZmlnLT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJEZWZhdWx0fSApIHsKCiAgICAgICAgICAgICRHZXRQYXJhbXtJc1Zpc2libGVGb3JDdXN0b21lcn0gLy89ICRDb25maWctPntJc1Zpc2libGVGb3JDdXN0b21lckRlZmF1bHR9OwogICAgICAgIH0KCiAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7RmllbGRzfSApIHsKCiAgICAgICAgICAgICMgZGV0ZXJtaW5lIHN0YW5kYXJkIGZpZWxkIGlucHV0CiAgICAgICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gKSB7CgogICAgICAgICAgICAgICAgbXkgJU5ld0NoYW5nZWRFbGVtZW50czsKCiAgICAgICAgICAgICAgICAjIHdoaWNoIHN0YW5kYXJkIGZpZWxkcyB0byBjaGVjayAtIEZpZWxkSUQgPT4gR2V0UGFyYW1WYWx1ZSAobmVjY2Vzc2FyeSBmb3IgRGVzdCkKICAgICAgICAgICAgICAgIG15ICVDaGVjayA9ICgKICAgICAgICAgICAgICAgICAgICBOZXh0U3RhdGVJRCA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEFDTFByZXNlbGVjdGlvbiAmJiAhJEluaXRpYWxSdW4gKSB7CiAgICAgICAgICAgICAgICAgICAgRklFTEQ6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZElEICggc29ydCBrZXlzICVDaGVjayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEZpZWxkSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEZpZWxkSUQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57JEZpZWxkSUR9ICYmICRDaGFuZ2VkRWxlbWVudHN7JEZpZWxkSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBzb3J0IGtleXMgJUNoYW5nZWRFbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uLT57UnVsZXN9e1RpY2tldH17JEVsZW1lbnR9eyRGaWVsZElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57SW50ZXJuYWxEZXBlbmRhbmN5fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRWxlbWVudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRWxlbWVudCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHVuYWZmZWN0ZWQgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkQ2hlY2t7JEZpZWxkSUR9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGZvciBlYWNoIHN0YW5kYXJkIGZpZWxkIHdoaWNoIGhhcyB0byBiZSBjaGVja2VkLCBydW4gdGhlIGRlZmluZWQgbWV0aG9kCiAgICAgICAgICAgICAgICBNRVRIT0Q6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggQHsgJFNlbGYtPntGaWVsZE1ldGhvZHN9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBNRVRIT0QgdW5sZXNzICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfTsKCiAgICAgICAgICAgICAgICAgICAgIyB1c2UgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IGZvciBEZXN0PT5RdWV1ZUlECiAgICAgICAgICAgICAgICAgICAgJFN0ZEZpZWxkVmFsdWVzeyAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gfSA9ICRGaWVsZC0+e01ldGhvZH0tPigKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxlY3RlZCB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgc3R1ZmYgZm9yIFF1ZXVlSUQvRGVzdDogaW5jbHVkZWQgZm9yIG1vcmUgc2ltaWxhcml0eSB0byBBZ2VudFRpY2tldFBob25lIGV0Yy47CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRmllbGQtPntGaWVsZElEfSBlcSAnRGVzdCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3tEZXN0fSA9ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCBzZWxlY3Rpb24gb2YgUXVldWVJRCAoRGVzdCB3aWxsIGJlIGRvbmUgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXIgZmllbGRzKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAhJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyAkR2V0UGFyYW17UXVldWVJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAhJEdldFBhcmFte1F1ZXVlSUR9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57RGVzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgc2VsZWN0ZWQgdmFsdWUgaXMgc3RpbGwgdmFsaWQgZm9yIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH17ICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbm90IGVtcHR5IHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgIGVsc2lmICggISRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICElTmV3Q2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKAogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0LAogICAgICAgICAgICAgICAgICAgICVOZXdDaGFuZ2VkRWxlbWVudHMsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJExvb3BQcm90ZWN0aW9uLS0gPCAxICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmFuIGludG8gdW5yZXNvbHZhYmxlIGxvb3AhIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzICAgICAgICA9ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0OwogICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICgpOwoKICAgICAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICBteSAlQ3VyRmllbGRTdGF0ZXM7CiAgICAgICAgICAgIGlmICggJUNoYW5nZWRFbGVtZW50cyB8fCAkSW5pdGlhbFJ1biApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB2YWx1ZXMgYW5kIHZpc2liaWxpdHkgb2YgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgICAgICVDdXJGaWVsZFN0YXRlcyA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+R2V0RmllbGRTdGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0T2JqZWN0ICAgICAgICAgICAgICA9PiAkVGlja2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gJFNlbGYtPntEeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPT4gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZEVsZW1lbnRzICAgICAgICAgICA9PiBcJUNoYW5nZWRFbGVtZW50cywgICAgICAgICAgICAgIyBvcHRpb25hbCB0byByZWR1Y2UgQUNMIGV2YWx1YXRpb24KICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFRpY2tldHtDdXN0b21lclVzZXJ9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICRHZXRQYXJhbXtTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY29tYmluZSBGaWVsZFN0YXRlcwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7U2V0c30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEluaXRpYWxSdW4gPSAwOwogICAgICAgIH0KCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzID0gbWFwIHsKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJF8gPT4gZGVmaW5lZCAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskX30KICAgICAgICAgICAgICAgID8gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JF99e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgOiB1bmRlZgogICAgICAgIH0gKCBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKTsKCiAgICAgICAgIyBidWlsZCByZWZlcmVuY2VzIGlmIGV4aXN0CiAgICAgICAgbXkgJFJlZmVyZW5jZXMgPSAoICREYXRhe01lc3NhZ2VJRH0gfHwgJycgKSAuICggJERhdGF7UmVmZXJlbmNlc30gfHwgJycgKTsKCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICMgdXNlIHRpY2tldCBRdWV1ZUlEIGluIGNvbXBvc2UgbW9kdWxlcwogICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkVGlja2V0e1F1ZXVlSUR9OwoKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoICV7JFNlbGZ9LCBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICBteSAkTmV3UGFyYW1zID0gJE9iamVjdC0+UnVuKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgICAgIGlmICgkTmV3UGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICROZXdQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IGVycm9ycwogICAgICAgICAgICAgICAgJUVycm9yID0gKAogICAgICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYnVpbGQgdmlldwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBOZXh0U3RhdGVzID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICBSZXNwb25zZUlEICAgICAgICAgID0+ICRHZXRQYXJhbXtSZXNwb25zZUlEfSwKICAgICAgICAgICAgUmVwbHlBcnRpY2xlSUQgICAgICA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgIEluUmVwbHlUbyAgICAgICAgPT4gJERhdGF7TWVzc2FnZUlEfSwKICAgICAgICAgICAgUmVmZXJlbmNlcyAgICAgICA9PiAiJFJlZmVyZW5jZXMiLAogICAgICAgICAgICBUaWNrZXRCYWNrVHlwZSAgID0+ICRUaWNrZXRCYWNrVHlwZSwKICAgICAgICAgICAgREZQb3NzaWJsZVZhbHVlcyA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBEeW5hbWljRmllbGQgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9LAogICAgICAgICAgICBOZXh0U3RhdGUgICAgICAgID0+ICRHZXRQYXJhbXtTdGF0ZUlEfSA/ICRTdGRGaWVsZFZhbHVlc3tOZXh0U3RhdGVJRH17ICRHZXRQYXJhbXtTdGF0ZUlEfSB9IDogJycsCiAgICAgICAgICAgIEhpZGVBdXRvc2VsZWN0ZWQgPT4gJEhpZGVBdXRvc2VsZWN0ZWRKU09OLAogICAgICAgICAgICBWaXNpYmlsaXR5ICAgICAgID0+ICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmV4dCBzdGF0ZXMKICAgIG15ICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9NYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRFbWFpbEFkZHJlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJyk7CgogICAgaWYgKCAkUGFyYW17SGlkZUF1dG9zZWxlY3RlZH0gKSB7CgogICAgICAgICMgYWRkIEF1dG9zZWxlY3QgSlMKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU09uRG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgQ29kZSA9PiAiQ29yZS5Gb3JtLkluaXRIaWRlQXV0b3NlbGVjdGVkKHsgRmllbGRJRHM6ICRQYXJhbXtIaWRlQXV0b3NlbGVjdGVkfSB9KTsiLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIGZvciBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIG15ICVTdGF0ZTsKICAgIGlmICggJFBhcmFte0dldFBhcmFtfS0+e1N0YXRlSUR9ICkgewogICAgICAgICRTdGF0ZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtHZXRQYXJhbX0tPntTdGF0ZUlEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTdGF0ZXtTZWxlY3RlZFZhbHVlfSAvLz0gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH07CiAgICB9CiAgICAkUGFyYW17TmV4dFN0YXRlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtOZXh0U3RhdGVzfSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICVTdGF0ZSwKICAgICAgICAlUGFyYW0sCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZSBGb3JtVXBkYXRlJywKICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgKTsKCiAgICBteSAkSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPSAkQ29uZmlnLT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJEZWZhdWx0fTsKICAgIGlmICggJFBhcmFte0dldFBhcmFtfS0+e0lzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudH0gKSB7CiAgICAgICAgJElzVmlzaWJsZUZvckN1c3RvbWVyID0gJFBhcmFte0dldFBhcmFtfS0+e0lzVmlzaWJsZUZvckN1c3RvbWVyfSA/IDEgOiAwOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0lzVmlzaWJsZUZvckN1c3RvbWVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gJElzVmlzaWJsZUZvckN1c3RvbWVyLAogICAgICAgIH0sCiAgICApOwoKICAgICMgcHJlcGFyZSBlcnJvcnMhCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciBteSAkRXJyb3IgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Vycm9yc30gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRFcnJvcn0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCA9PiAkUGFyYW17RXJyb3JzfS0+eyRFcnJvcn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHVzZWQgY2FsZW5kYXIKICAgIG15ICRDYWxlbmRhciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0Q2FsZW5kYXJHZXQoCiAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgU0xBSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgKTsKCiAgICBteSAkUXVpY2tEYXRlQnV0dG9ucyA9ICRDb25maWctPntRdWlja0RhdGVCdXR0b25zfSAvLyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkRlZmF1bHRRdWlja0RhdGVCdXR0b25zJyk7CgogICAgIyBwZW5kaW5nIGRhdGEgc3RyaW5nCiAgICAkUGFyYW17UGVuZGluZ0RhdGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICVQYXJhbSwKICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICA9PiA1LAogICAgICAgIERpZmZUaW1lICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMCwKICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e0RhdGVJbnZhbGlkfSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICcgJywKICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICA9PiAxLAogICAgICAgIFZhbGlkYXRlRGF0ZUluRnV0dXJlID0+IDEsCiAgICAgICAgQ2FsZW5kYXIgICAgICAgICAgICAgPT4gJENhbGVuZGFyLAogICAgICAgIFF1aWNrRGF0ZUJ1dHRvbnMgICAgID0+ICRRdWlja0RhdGVCdXR0b25zLAogICAgKTsKCiAgICAjIE11bHRpcGxlLUF1dG9jb21wbGV0ZQogICAgJFBhcmFte1RvfSA9ICggc2NhbGFyIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSB9ID8gJycgOiAkUGFyYW17VG99ICk7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1RvfSAmJiAkUGFyYW17VG99IG5lICcnICkgewogICAgICAgICRQYXJhbXtUb0ludmFsaWR9ID0gJyc7CiAgICB9CgogICAgJFBhcmFte0NjfSA9ICggc2NhbGFyIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQ2N9IH0gPyAnJyA6ICRQYXJhbXtDY30gKTsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17Q2N9ICYmICRQYXJhbXtDY30gbmUgJycgKSB7CiAgICAgICAgJFBhcmFte0NjSW52YWxpZH0gPSAnJzsKICAgIH0KCiAgICAjIENjCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyQ2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSB9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjJyAuICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDY0N1c3RvbWVyRXJyb3JFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXJDYysrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyQ2MgKSB7CiAgICAgICAgJFBhcmFte0NjQ3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQ2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQ2MsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBCY2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjQ3VzdG9tZXJFcnJvckV4cGxhbmF0aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlckJjYysrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyQmNjICkgewogICAgICAgICRQYXJhbXtCY2NDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQmNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBUbwogICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJFcnJvckV4cGxhbmF0aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFBhcmFte1RvSW52YWxpZH0gJiYgJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RvU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAjIHNldCBwcmVzZWxlY3RlZCB2YWx1ZXMgZm9yIENjIGZpZWxkCiAgICBpZiAoICRQYXJhbXtDY30gJiYgJFBhcmFte0NjfSBuZSAnJyAmJiAhJEN1c3RvbWVyQ291bnRlckNjICkgewoKICAgICAgICAjIHNwbGl0IENjIHZhbHVlcwogICAgICAgIG15IEBFbWFpbEFkZHJlc3Nlc0NjOwogICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRQYXJhbXtDY30gKSApIHsKCiAgICAgICAgICAgIG15ICVDdXN0b21lclNlYXJjaCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApLAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBDdXN0b21lclNlYXJjaCBoYXNoIGNvdWxkIGhhdmUgb25lIGl0ZW0gZnJvbSBlYWNoIGJhY2tlbmQsIHNvIGluc2VydCBqdXN0IHRoZSBmaXJzdCBvbmUuCiAgICAgICAgICAgIGlmICglQ3VzdG9tZXJTZWFyY2gpIHsKICAgICAgICAgICAgICAgIENVU1RPTUVSVVNFUklEOgogICAgICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJJRCAoIHNvcnQga2V5cyAlQ3VzdG9tZXJTZWFyY2ggKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBARW1haWxBZGRyZXNzZXNDYywgewogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgICAgPT4gJEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclRpY2tldFRleHQgPT4gJEN1c3RvbWVyU2VhcmNoeyRDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBsYXN0IENVU1RPTUVSVVNFUklEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHVzaCBARW1haWxBZGRyZXNzZXNDYywgewogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclRpY2tldFRleHQgPT4gJEVtYWlsQWRkcmVzc09iamVjdC0+Rm9ybWF0KCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnRW1haWxBZGRyZXNzZXNDYycsCiAgICAgICAgICAgIFZhbHVlID0+IFxARW1haWxBZGRyZXNzZXNDYywKICAgICAgICApOwoKICAgICAgICAkUGFyYW17Q2N9ID0gJyc7CiAgICB9CgogICAgIyBzZXQgcHJlc2VsZWN0ZWQgdmFsdWVzIGZvciBUbyBmaWVsZAogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtUb30gJiYgJFBhcmFte1RvfSBuZSAnJyAmJiAhJEN1c3RvbWVyQ291bnRlciApIHsKCiAgICAgICAgIyBzcGxpdCBUbyB2YWx1ZXMKICAgICAgICBteSBARW1haWxBZGRyZXNzZXNUbzsKICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkUGFyYW17VG99ICkgKSB7CgogICAgICAgICAgICBteSAlQ3VzdG9tZXJTZWFyY2ggPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0QWRkcmVzcyggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSwKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ3VzdG9tZXJTZWFyY2ggaGFzaCBjb3VsZCBoYXZlIG9uZSBpdGVtIGZyb20gZWFjaCBiYWNrZW5kLCBzbyBpbnNlcnQganVzdCB0aGUgZmlyc3Qgb25lLgogICAgICAgICAgICBpZiAoJUN1c3RvbWVyU2VhcmNoKSB7CiAgICAgICAgICAgICAgICBDVVNUT01FUlVTRVJJRDoKICAgICAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VySUQgKCBzb3J0IGtleXMgJUN1c3RvbWVyU2VhcmNoICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEVtYWlsQWRkcmVzc2VzVG8sIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICAgID0+ICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJUaWNrZXRUZXh0ID0+ICRDdXN0b21lclNlYXJjaHskQ3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgbGFzdCBDVVNUT01FUlVTRVJJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2ggQEVtYWlsQWRkcmVzc2VzVG8sIHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJUaWNrZXRUZXh0ID0+ICRFbWFpbEFkZHJlc3NPYmplY3QtPkZvcm1hdCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0VtYWlsQWRkcmVzc2VzVG8nLAogICAgICAgICAgICBWYWx1ZSA9PiBcQEVtYWlsQWRkcmVzc2VzVG8sCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte1RvfSA9ICcnOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte1RpY2tldEJhY2tUeXBlfSwKICAgICAgICBEYXRhID0+IHsKCiAgICAgICAgICAgICMgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyByZW5kZXIgZHluYW1pYyBmaWVsZHMKICAgIHsKICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RHluYW1pY0ZpZWxkOjpNYXNrJyktPkVkaXRTZWN0aW9uUmVuZGVyKAogICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICA9PiAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgPT4gJFNlbGYtPntEeW5hbWljRmllbGR9LAogICAgICAgICAgICBWaXNpYmlsaXR5ICAgICAgICAgICA9PiAkUGFyYW17VmlzaWJpbGl0eX0sCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkVmFsdWVzICAgPT4gJFBhcmFte0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQYXJhbXtERlBvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICAgPT4gJFBhcmFte0RGRXJyb3JzfSwKICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgICAgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFBhcmFte0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGR9LT4lKiwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgIH0KCiAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWxNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17VGltZVVuaXRzUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17VGltZVVuaXRzUmVxdWlyZWR9ID0gJyc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNob3cgdGhlIGN1c3RvbWVyIHVzZXIgYWRkcmVzcyBib29rIGlmIHRoZSBtb2R1bGUgaXMgcmVnaXN0ZXJlZC4KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudEN1c3RvbWVyVXNlckFkZHJlc3NCb29rfSApIHsKICAgICAgICAkUGFyYW17T3B0aW9uQ3VzdG9tZXJVc2VyQWRkcmVzc0Jvb2t9ID0gMTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJENvbmZpZy0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICB9CgogICAgICAgIHB1c2ggQHsgJFBhcmFte0F0dGFjaG1lbnRMaXN0fSB9LCAkQXR0YWNobWVudDsKICAgIH0KCiAgICBteSAkTG9hZGVkRm9ybURyYWZ0OwogICAgaWYgKCAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSApIHsKICAgICAgICAkTG9hZGVkRm9ybURyYWZ0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZvcm1EcmFmdCcpLT5Gb3JtRHJhZnRHZXQoCiAgICAgICAgICAgIEZvcm1EcmFmdElEID0+ICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9LAogICAgICAgICAgICBHZXRDb250ZW50ICA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEFydGljbGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpLT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIE9ubHlMYXN0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKEBBcnRpY2xlcykgewogICAgICAgICAgICBteSAkTGFzdEFydGljbGUgPSAkQXJ0aWNsZXNbMF07CgogICAgICAgICAgICBteSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lOwogICAgICAgICAgICBpZiAoICRMYXN0QXJ0aWNsZS0+e0NyZWF0ZVRpbWV9ICkgewogICAgICAgICAgICAgICAgbXkgJExhc3RBcnRpY2xlU3lzdGVtVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRMYXN0QXJ0aWNsZS0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExhc3RBcnRpY2xlU3lzdGVtVGltZSA9ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWVPYmplY3QtPlRvRXBvY2goKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEZvcm1EcmFmdFN5c3RlbVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkTG9hZGVkRm9ybURyYWZ0LT57Q2hhbmdlVGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkRm9ybURyYWZ0U3lzdGVtVGltZSA9ICRGb3JtRHJhZnRTeXN0ZW1UaW1lT2JqZWN0LT5Ub0Vwb2NoKCk7CgogICAgICAgICAgICBpZiAoICEkTGFzdEFydGljbGVTeXN0ZW1UaW1lIHx8ICRGb3JtRHJhZnRTeXN0ZW1UaW1lIDw9ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWUgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Rm9ybURyYWZ0T3V0ZGF0ZWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRMb2FkZWRGb3JtRHJhZnQpICkgewoKICAgICAgICAkTG9hZGVkRm9ybURyYWZ0LT57Q2hhbmdlQnlOYW1lfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJOYW1lKAogICAgICAgICAgICBVc2VySUQgPT4gJExvYWRlZEZvcm1EcmFmdC0+e0NoYW5nZUJ5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZXhwbGFuYXRvcnkgbWVzc2FnZSBhYm91dCBhc3RlcmlzawogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFzdGVyaXNrRXhwbGFuYXRpb24nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXN0ZXJpc2tFeHBsYW5hdGlvbicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldENvbXBvc2UnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgRm9ybURyYWZ0ICAgICAgPT4gJENvbmZpZy0+e0Zvcm1EcmFmdH0sCiAgICAgICAgICAgIEZvcm1EcmFmdElEICAgID0+ICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9LAogICAgICAgICAgICBGb3JtRHJhZnRUaXRsZSA9PiAkTG9hZGVkRm9ybURyYWZ0ID8gJExvYWRlZEZvcm1EcmFmdC0+e1RpdGxlfSA6ICcnLAogICAgICAgICAgICBGb3JtRHJhZnRNZXRhICA9PiAkTG9hZGVkRm9ybURyYWZ0LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentTicketEmail.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiMjllZmMyNTBkMTZkYzM0NWUwMGY1MTFjZjkwNDUwOWJjZDM1ZDdjIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRFbWFpbC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRFbWFpbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSBibGVzcyB7JVBhcmFtfSwgJFR5cGU7CgogICAgIyBmcm9udGVuZCBzcGVjaWZpYyBjb25maWcKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgIG15ICREZWZpbml0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6TWFzaycpLT5EZWZpbml0aW9uR2V0KAogICAgICAgIE1hc2sgPT4gJFNlbGYtPntBY3Rpb259LAogICAgKSB8fCB7fTsKCiAgICAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSA9ICREZWZpbml0aW9uLT57TWFza307CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gICA9IHt9OwoKICAgICMgYWxpZ24gc3lzY29uZmlnIGFuZCB0aWNrZXQgbWFzayBkYXRhIEkKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHsgJER5bmFtaWNGaWVsZExpc3QgLy8gW10gfSApIHsKICAgICAgICBpZiAoIGV4aXN0cyAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgbXkgJFBhcmFtZXRlcnMgPSBkZWxldGUgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gLy8ge307CgogICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIGtleXMgJFBhcmFtZXRlcnMtPiUqICkgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZC0+eyRBdHRyaWJ1dGV9ID0gJFBhcmFtZXRlcnMtPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCAkU2VsZi0+e01hc2tEZWZpbml0aW9ufS0+QCosIHsKICAgICAgICAgICAgICAgIERGICAgICAgICA9PiAkRHluYW1pY0ZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgPyAxIDogMCwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57TWFuZGF0b3J5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgICMgYWxpZ24gc3lzY29uZmlnIGFuZCB0aWNrZXQgbWFzayBkYXRhIElJCiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCBrZXlzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc30tPiUqICkgewogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXskRHluYW1pY0ZpZWxkTmFtZX0gPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFBhcmFtZXRlcnMgPSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyREeW5hbWljRmllbGROYW1lfSAvLyB7fTsKCiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICRQYXJhbWV0ZXJzLT4lKiApIHsKICAgICAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfXskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5QcmVwYXJlRm9ybUlEKAogICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKSwKICAgICk7CgogICAgIyBtZXRob2RzIHdoaWNoIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICRTZWxmLT57RmllbGRNZXRob2RzfSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ0Rlc3QnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFRvcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdOZXdVc2VySUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFVzZXJzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFJlc3BvbnNpYmxlcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0TmV4dFN0YXRlcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRQcmlvcml0aWVzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0U2VydmljZXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnU0xBSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFNMQXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRTdGFuZGFyZFRlbXBsYXRlcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdUeXBlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFR5cGVzCiAgICAgICAgfSwKICAgIF07CgogICAgIyBkZXBlbmRlbmNpZXMgb2Ygc3RhbmRhcmQgZmllbGRzIHdoaWNoIGFyZSBub3QgZGVmaW5lZCB2aWEgQUNMcwogICAgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9ID0gewogICAgICAgIERlc3QgPT4gewogICAgICAgICAgICBOZXdVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTmV3UmVzcG9uc2libGVJRCAgID0+IDEsCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgU2VydmljZUlEID0+IHsKICAgICAgICAgICAgU0xBSUQgICAgID0+IDEsCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAxLCAgICAjQ3VzdG9tZXJVc2VyIHVwZGF0ZXMgY2FuIGJlIHN1Ym1pdHRlZCBhcyBFbGVtZW50Q2hhbmdlZDogU2VydmljZUlECiAgICAgICAgfSwKICAgICAgICBDdXN0b21lclVzZXIgPT4gewogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gMSwKICAgICAgICB9LAogICAgICAgIE93bmVyQWxsID0+IHsKICAgICAgICAgICAgTmV3VXNlcklEID0+IDEsCiAgICAgICAgfSwKICAgICAgICBSZXNwb25zaWJsZUFsbCA9PiB7CiAgICAgICAgICAgIE5ld1Jlc3BvbnNpYmxlSUQgPT4gMSwKICAgICAgICB9LAogICAgfTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHN0b3JlIGxhc3QgcXVldWUgc2NyZWVuCiAgICBpZiAoICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSAmJiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gIX4gL0FjdGlvbj1BZ2VudFRpY2tldEVtYWlsLyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkRW1haWxBZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycpOwoKICAgIG15ICREZWJ1ZyA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBUbyBDYyBCY2MgVGltZVVuaXRzIFByaW9yaXR5SUQgU3ViamVjdCBCb2R5CiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBPd25lckFsbCBSZXNwb25zaWJsZUFsbCBOZXdSZXNwb25zaWJsZUlEIE5ld1VzZXJJRAogICAgICAgIE5leHRTdGF0ZUlEIFN0YW5kYXJkVGVtcGxhdGVJRCBEZXN0IEFydGljbGVJRCBMaW5rVGlja2V0SUQKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KCiAgICAjIEFDTCBjb21wYXRpYmlsaXR5IHRyYW5zbGF0aW9uCiAgICBteSAlQUNMQ29tcGF0R2V0UGFyYW07CiAgICAkQUNMQ29tcGF0R2V0UGFyYW17T3duZXJJRH0gPSAkR2V0UGFyYW17TmV3VXNlcklEfTsKCiAgICAjIGhhc2ggZm9yIGNoZWNrIGR1cGxpY2F0ZWQgZW50cmllcwogICAgbXkgJUFkZHJlc3Nlc0xpc3Q7CgogICAgIyBNdWx0aXBsZUN1c3RvbWVyIFRvLWZpZWxkCiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJUbyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlclRvKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDE7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDdXN0b21lcnNOdW1iZXJUbyApIHsKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAkQ291bnQgPiAxXzAwMDsgICAgIyBiYWlsIG91dCB3aGVuIHRoZSBudW1iZXIgb2YgY3VzdG9tZXJzIGlzIGFibm9ybWFsbHkgaGlnaAoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudDsKCiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkU2VsZWN0ZWQgZXEgJENvdW50ID8gJ2NoZWNrZWQgJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RvfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2cgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZCA9ICcnOwogICAgICAgICAgICBteSAkQ291bnRBdXggICAgICAgICA9ICRDdXN0b21lckNvdW50ZXIrKzsKCiAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkQ3VzdG9tZXJFbGVtZW50ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSAmJiAkQ3VzdG9tZXJFcnJvciBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkID0gJ2Rpc2FibGVkJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnQsCiAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBNdWx0aXBsZUN1c3RvbWVyIENjLWZpZWxkCiAgICBteSBATXVsdGlwbGVDdXN0b21lckNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckNjQ3VzdG9tZXInICkgfHwgMDsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlckNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJEN1c3RvbWVyc051bWJlckNjICkgewogICAgICAgICAgICBsYXN0IENPVU5UIGlmICRDb3VudCA+IDFfMDAwOyAgICAjIGJhaWwgb3V0IHdoZW4gdGhlIG51bWJlciBvZiBjdXN0b21lcnMgaXMgYWJub3JtYWxseSBoaWdoCgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50Q2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudENjOwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5Q2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lcktleV8nIC4gJENvdW50ICkgfHwgJyc7CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJyc7CiAgICAgICAgICAgIG15ICRDb3VudEF1eENjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0NjfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDY30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnRDYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDY30gPSAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkQ3VzdG9tZXJFbGVtZW50Q2MgKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gJiYgJEN1c3RvbWVyRXJyb3JDYyBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JDYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQ2MgPSAnZGlzYWJsZWQnOwogICAgICAgICAgICAgICAgJENvdW50QXV4Q2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXJDYywgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXhDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudENjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXlDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3JDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWRDYywKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudENjfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgTXVsdGlwbGVDdXN0b21lciBCY2MtZmllbGQKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQmNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJCY2NDdXN0b21lcicgKSB8fCAwOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyQmNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDE7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDdXN0b21lcnNOdW1iZXJCY2MgKSB7CiAgICAgICAgICAgIGxhc3QgQ09VTlQgaWYgJENvdW50ID4gMV8wMDA7ICAgICMgYmFpbCBvdXQgd2hlbiB0aGUgbnVtYmVyIG9mIGN1c3RvbWVycyBpcyBhYm5vcm1hbGx5IGhpZ2gKCiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnRCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKCiAgICAgICAgICAgIG5leHQgQ09VTlQgdW5sZXNzICRDdXN0b21lckVsZW1lbnRCY2M7CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApIHx8ICcnOwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWRCY2MgPSAnJzsKICAgICAgICAgICAgbXkgJENvdW50QXV4QmNjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JjY30gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9ID0gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRDdXN0b21lckVsZW1lbnRCY2MgKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gJiYgJEN1c3RvbWVyRXJyb3JCY2MgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JCY2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICdkaXNhYmxlZCc7CiAgICAgICAgICAgICAgICAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXJCY2MsIHsKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXlCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZ0JjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWRCY2MsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYW4gZW1wdHkgdmFsdWUgaWYgbm90IGRlZmluZWQKICAgICRHZXRQYXJhbXtDY30gID0gJycgaWYgIWRlZmluZWQgJEdldFBhcmFte0NjfTsKICAgICRHZXRQYXJhbXtCY2N9ID0gJycgaWYgIWRlZmluZWQgJEdldFBhcmFte0JjY307CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZm9ybSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkUXVldWVPYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgbXkgJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpGaWVsZFJlc3RyaWN0aW9ucycpOwogICAgbXkgJE1haW5PYmplY3QgICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICMgZnJvbnRlbmQgc3BlY2lmaWMgY29uZmlnCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiMgUm90aGVyIE9TUyAvIElUU01Db3JlIC0gY2FsY3VsYXRlIFByaW9yaXR5IHZpYSBDSVAgbWF0cml4CiAgICBteSAkQ0lQQ2FsY3VsYXRlID0gJENvbmZpZy0+e1ByaW9yaXR5QnlDSVB9IC8vICRDb25maWdPYmplY3QtPkdldCgnSVRTTTo6RnJvbnRlbmQ6OkNJUEFsbG9jYXRpb25EZWZhdWx0Jyk7CiAgICBteSAkU2VydmljZU9iamVjdDsKICAgIG15ICRDSVBBbGxvY2F0ZU9iamVjdDsKICAgIGlmICggJENJUENhbGN1bGF0ZSApIHsKICAgICAgICAkU2VydmljZU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwogICAgICAgICRDSVBBbGxvY2F0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUnKTsKCiAgICAgICAgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9e1NlcnZpY2VJRH17UHJpb3JpdHlJRH0gICAgICAgICAgICAgICAgICAgID0gMTsKICAgICAgICAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9e1ByaW9yaXR5SUR9ICAgICAgPSAxOwogICAgICAgICRTZWxmLT57SW50ZXJuYWxEZXBlbmRhbmN5fXtEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fXtQcmlvcml0eUlEfSA9IDE7CiAgICB9CiMgRU8gSVRTTUNvcmUKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZDsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGQgfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKCiAgICAjIHRyYW5zZm9ybSBwZW5kaW5nIHRpbWUsIHRpbWUgc3RhbXAgYmFzZWQgb24gdXNlciB0aW1lIHpvbmUKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXtZZWFyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01vbnRofQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0RheX0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtIb3VyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01pbnV0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJUdldFBhcmFtID0gJExheW91dE9iamVjdC0+VHJhbnNmb3JtRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259IHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CiAgICAgICAgbXkgJVRpY2tldDsKICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgIH0KCiAgICAgICAgIyBoZWFkZXIgYW5kIG5hdmlnYXRpb24gYmFyCiAgICAgICAgbXkgJE91dHB1dCA9IGpvaW4gJycsCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkhlYWRlcigpLAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgaWYgdGhlcmUgaXMgbm8gdGlja2V0IGlkIQogICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRJRH0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGVkJyApIHsKCiAgICAgICAgICAgICMgbm90aWZ5IGluZm8KICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnVGlja2V0ICIlcyIgY3JlYXRlZCEnLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBMaW5rID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPScKICAgICAgICAgICAgICAgICAgICAuICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9CiAgICAgICAgICAgICYmICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSAhfiAvQWN0aW9uPUFnZW50VGlja2V0RW1haWwvCiAgICAgICAgICAgICYmICRTZWxmLT57UmVxdWVzdGVkVVJMfSAgICAgICAhfiAvQWN0aW9uPUFnZW50VGlja2V0RW1haWwuKkxpbmtUaWNrZXRJRD0vCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpLT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNwbGl0IGFydGljbGUgaWYgZ2l2ZW4KICAgICAgICAjIGdldCBBcnRpY2xlSUQKICAgICAgICBteSAlQXJ0aWNsZTsKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIG15ICRBcnRpY2xlRnJvbSA9ICcnOwogICAgICAgIG15ICVTcGxpdFRpY2tldERhdGE7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXJ0aWNsZUlEfSApIHsKCiAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICAgID0+IFRyYW5zbGF0YWJsZSgnWW91IG5lZWQgcm8gcGVybWlzc2lvbiEnKSwKICAgICAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBHZXQgaW5mb3JtYXRpb24gZnJvbSBvcmlnaW5hbCB0aWNrZXQgKFNwbGl0VGlja2V0KS4KICAgICAgICAgICAgJVNwbGl0VGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAlQXJ0aWNsZSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgYXJ0aWNsZSBpcyBmcm9tIHRoZSBzYW1lIFRpY2tldElEIGFzIHdlIGNoZWNrZWQgcGVybWlzc2lvbnMgZm9yLgogICAgICAgICAgICBpZiAoICRBcnRpY2xle1RpY2tldElEfSBuZSAkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0FydGljbGUgZG9lcyBub3QgYmVsb25nIHRvIHRpY2tldCAlcyEnLCAkU2VsZi0+e1RpY2tldElEfQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNhdmUgYXJ0aWNsZSBmcm9tIGZvciBhZGRyZXNzZXMgbGlzdAogICAgICAgICAgICAkQXJ0aWNsZUZyb20gPSAkQXJ0aWNsZXtGcm9tfTsKCiAgICAgICAgICAgICMgaWYgVG8gaXMgcHJlc2VudAogICAgICAgICAgICAjIGFuZCBpcyBubyBhIHF1ZXVlCiAgICAgICAgICAgICMgYW5kIGFsc28gaXMgbm8gYSBzeXN0ZW0gYWRkcmVzcwogICAgICAgICAgICAjIHNldCBUbyBhcyBhcnRpY2xlIGZyb20KICAgICAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkQXJ0aWNsZXtUb30gKSApIHsKICAgICAgICAgICAgICAgIG15ICVRdWV1ZXMgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCgpOwoKICAgICAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUXVldWUgKCBzb3J0IGtleXMgJXsgJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRDb25maWdPYmplY3QtPntDdXN0b21lclBhbmVsT3duU2VsZWN0aW9ufS0+eyRRdWV1ZX07CiAgICAgICAgICAgICAgICAgICAgICAgICRRdWV1ZXN7JFF1ZXVlfSA9ICRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJVF1ZXVlTG9va3VwICAgICAgICAgPSByZXZlcnNlICVRdWV1ZXM7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0xvb2t1cCA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0xpc3QoKTsKICAgICAgICAgICAgICAgIG15ICRTeXN0ZW1BZGRyZXNzRW1haWw7CgogICAgICAgICAgICAgICAgaWYgKCRBcnRpY2xlRnJvbSkgewogICAgICAgICAgICAgICAgICAgIG15ICgkQXJ0aWNsZUZyb21BZGRyZXNzKSA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEFydGljbGVGcm9tICk7CiAgICAgICAgICAgICAgICAgICAgJFN5c3RlbUFkZHJlc3NFbWFpbCA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEFydGljbGVGcm9tQWRkcmVzcyApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFF1ZXVlTG9va3VweyAkQXJ0aWNsZXtUb30gfSAmJiBkZWZpbmVkICRTeXN0ZW1BZGRyZXNzTG9va3VweyRTeXN0ZW1BZGRyZXNzRW1haWx9ICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xlRnJvbSA9ICRBcnRpY2xle1RvfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBib2R5IHByZXBhcmF0aW9uIGZvciBwbGFpbiB0ZXh0IHByb2Nlc3NpbmcKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ICA9PiAkVXBsb2FkQ2FjaGVPYmplY3QsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50c0luY2x1ZGUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEFydGljbGV7Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAlU2FmZXR5Q2hlY2tSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlNhZmV0eSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXJ0aWNsZXtCb2R5fSwKCiAgICAgICAgICAgICAgICAjIFN0cmlwIG91dCBleHRlcm5hbCBjb250ZW50IGlmIEJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQgaXMgZW5hYmxlZC4KICAgICAgICAgICAgICAgIE5vRXh0U3JjTG9hZCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQnKSwKCiAgICAgICAgICAgICAgICAjIERpc2FsbG93IHBvdGVudGlhbGx5IHVuc2FmZSBjb250ZW50LgogICAgICAgICAgICAgICAgTm9BcHBsZXQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBOb09iamVjdCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIE5vRW1iZWQgICAgICA9PiAxLAogICAgICAgICAgICAgICAgTm9TVkcgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBOb0phdmFTY3JpcHQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkU2FmZXR5Q2hlY2tSZXN1bHR7U3RyaW5nfTsKCiAgICAgICAgICAgICMgc2hvdyBjdXN0b21lciBpbmZvCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEFydGljbGV7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEFydGljbGV7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yIG15ICRLZXlDdXN0b21lclVzZXJMaXN0ICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xle0Zyb219ID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlckxpc3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG11bHRpcGxlIGFkZHJlc3NlcyBsaXN0CiAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgbXkgJENvdW50RnJvbSA9IHNjYWxhciBATXVsdGlwbGVDdXN0b21lciB8fCAxOwogICAgICAgIG15ICVDdXN0b21lckRhdGFGcm9tOwogICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlQ3VzdG9tZXJEYXRhRnJvbSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRBcnRpY2xlRnJvbSApICkgewoKICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnRGcm9tOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkID0gJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gJENvdW50RnJvbSBlcSAnMScgPyAnY2hlY2tlZCAnIDogJyc7CiAgICAgICAgICAgIG15ICRFbWFpbEFkZHJlc3MgICAgID0gJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0QWRkcmVzcyggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKTsKICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskRW1haWx9ICYmICRDdXN0b21lckVycm9yIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQnOwogICAgICAgICAgICAgICAgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnRGcm9tIC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFBocmFzZSAgICAgID0gJEVtYWlsQWRkcmVzc09iamVjdC0+R2V0UmVhbE5hbWUoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSA9ICcnOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRDdXN0b21lckRhdGFGcm9te1VzZXJFbWFpbH0KICAgICAgICAgICAgICAgICYmICRDdXN0b21lckRhdGFGcm9te1VzZXJFbWFpbH0gZXEgJEVtYWlsQWRkcmVzcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJLZXkgPSAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRFbWFpbEFkZHJlc3MpIHsKICAgICAgICAgICAgICAgIG15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiAkRW1haWxBZGRyZXNzLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJMb2dpbiAoIHNvcnQga2V5cyAlTGlzdCApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBTZXQgcmlnaHQgb25lIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY3VzdG9tZXIgdXNlciB3aXRoIHRoZSBzYW1lIGVtYWlsIGFkZHJlc3MuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGhyYXNlICYmICRMaXN0eyRVc2VyTG9naW59ID1+IC8kUGhyYXNlLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyS2V5ID0gJFVzZXJMb2dpbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnQgPSAkRW1haWxBZGRyZXNzOwogICAgICAgICAgICBpZiAoJFBocmFzZSkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRWxlbWVudCA9ICRQaHJhc2UgLiAiIDwkRW1haWxBZGRyZXNzPiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyU2VsZWN0ZWQgJiYgJEN1c3RvbWVyS2V5ICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3IsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZCwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEVtYWlsQWRkcmVzc30gPSAxOwogICAgICAgICAgICAkQ291bnRGcm9tKys7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVTcGxpdFRpY2tldFBhcmFtOwoKICAgICAgICAjIGluIGNhc2Ugb2Ygc3BsaXQgYSBUaWNrZXRJRCBhbmQgQXJ0aWNsZUlEIGFyZSBhbHdheXMgZ2l2ZW4sIHNlbmQgdGhlIFRpY2tldElEIHRvIGNhbGN1bGF0ZQogICAgICAgICMgQUNMcyBiYXNlZCBvbiBwYXJlbnQgaW5mb3JtYXRpb24KICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICYmICRBcnRpY2xle0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte1RpY2tldElEfSA9ICRTZWxmLT57VGlja2V0SUR9OwogICAgICAgIH0KCiAgICAgICAgIyBmaXggdG8gYnVnIyA4MDY4IEZpZWxkICYgRHluYW1pY0ZpZWxkIHByZXNlbGVjdGlvbiBvbiBUaWNrZXRTcGxpdAogICAgICAgICMgd2hlbiBzcGxpdHRpbmcgYSB0aWNrZXQgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZXMgbXVzdCByZW1haW4gaW4gdGhlIG5ldyB0aWNrZXQgc2NyZWVuCiAgICAgICAgIyB0aGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBTcGxpdFRpY2tldFBhcmFtIGhhc2gKICAgICAgICBpZiAoICRTcGxpdFRpY2tldFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGluZm9ybWF0aW9uIGZyb20gb3JpZ2luYWwgdGlja2V0IChTcGxpdFRpY2tldCkKICAgICAgICAgICAgbXkgJVNwbGl0VGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNwbGl0VGlja2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBzaW1wbGUgSURzIHRvIHBhc3MgdGhlbSB0byB0aGUgbWFzawogICAgICAgICAgICBmb3IgbXkgJFNwbGl0UGFyYW0gKHF3KFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgUHJpb3JpdHlJRCkpIHsKICAgICAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFteyRTcGxpdFBhcmFtfSA9ICRTcGxpdFRpY2tldERhdGF7JFNwbGl0UGFyYW19OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBTdGF0ZUlEIGFzIE5leHRTdGF0ZUlECiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte05leHRTdGF0ZUlEfSA9ICRTcGxpdFRpY2tldERhdGF7U3RhdGVJRH07CgogICAgICAgICAgICAjIHNldCBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17VXNlclNlbGVjdGVkfSAgICAgICAgICAgID0gJFNwbGl0VGlja2V0RGF0YXtPd25lcklEfTsKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9ID0gJFNwbGl0VGlja2V0RGF0YXtSZXNwb25zaWJsZUlEfTsKCiAgICAgICAgICAgICMgc2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9ICkgewogICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UXVldWVJRH0gPSAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ICAgICAgID0gMTsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CgogICAgICAgICAgICAjIHNldCB0aGUgc2VsZWN0ZWQgcXVldWUgaW4gZm9ybWF0IElEfHxOYW1lCiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte0Zyb21TZWxlY3RlZH0gPSAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9IC4gJ3x8JyAuICRTcGxpdFRpY2tldERhdGF7UXVldWV9OwoKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVNwbGl0VGlja2V0RGF0YSApIHsKICAgICAgICAgICAgICAgIGlmICggJEtleSA9fiAvRHluYW1pY0ZpZWxkXF8oLiopLyApIHsKICAgICAgICAgICAgICAgICAgICAkU3BsaXRUaWNrZXRQYXJhbXtEeW5hbWljRmllbGR9eyQxfSA9ICRTcGxpdFRpY2tldERhdGF7JEtleX07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTcGxpdFRpY2tldFBhcmFteyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSBzZWxlY3RlZCB2YWx1ZXMgYXQgdGhlIHN0YXJ0CgogICAgICAgICMgaW4gY2FzZSBvZiB0aWNrZXQgc3BsaXQgc2V0ICRTZWxmLT57UXVldWVJRH0gYXMgdGhlIFF1ZXVlSUQgb2YgdGhlIG9yaWdpbmFsIHRpY2tldCwKICAgICAgICAjIGluIG9yZGVyIHRvIHNldCBjb3JyZWN0IEFDTHMgb24gcGFnZSBsb2FkIChpbml0aWFsKS4gU2VlIGJ1ZyA4Njg3LgogICAgICAgIGlmICgKICAgICAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoIFwlU3BsaXRUaWNrZXRQYXJhbSApCiAgICAgICAgICAgICYmICRTcGxpdFRpY2tldFBhcmFte1F1ZXVlSUR9CiAgICAgICAgICAgICYmICEkU2VsZi0+e1F1ZXVlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRTcGxpdFRpY2tldFBhcmFte1F1ZXVlSUR9OwogICAgICAgICAgICAkR2V0UGFyYW17RGVzdH0gICAgPSAkU3BsaXRUaWNrZXRQYXJhbXtGcm9tU2VsZWN0ZWR9OwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgcHJlZGVmaW5lZCBRdWV1ZUlEIChpZiBubyBxdWV1ZSBmcm9tIHNwbGl0IHRpY2tldCBpcyBzZXQpLgogICAgICAgIGVsc2lmICggISRTZWxmLT57UXVldWVJRH0gJiYgJEdldFBhcmFte0Rlc3R9ICkgewogICAgICAgICAgICBteSBAUXVldWVQYXJ0cyA9IHNwbGl0KCAvXHxcfC8sICRHZXRQYXJhbXtEZXN0fSApOwogICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVQYXJ0c1swXTsKICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkVXNlckRlZmF1bHRRdWV1ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VXNlckRlZmF1bHRRdWV1ZScpIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRVc2VyRGVmYXVsdFF1ZXVlKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRVc2VyRGVmYXVsdFF1ZXVlICk7CiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RGVzdH0gPSAiJEdldFBhcmFte1F1ZXVlSUR9fHwkVXNlckRlZmF1bHRRdWV1ZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZG9uJ3QgdXNlIHRoZSBzcGxpdCB0aWNrZXQgc3RhdGUsIGp1c3QgdGhlIGRlZmF1bHQKICAgICAgICBpZiAoICRDb25maWctPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICBteSAlTmV4dFN0YXRlczsKCiAgICAgICAgICAgICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRHZXRQYXJhbXtRdWV1ZUlEfSB8fCAxLAogICAgICAgICAgICAgICAgQWN0aW9uICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0gPSB7IHJldmVyc2UgJU5leHRTdGF0ZXMgfS0+eyAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSB9IC8vICcnOwogICAgICAgIH0KCiAgICAgICAgIyBzcGxpdCB0aWNrZXQgaW5mbyBmb3IgdGhlIHJlc3QKICAgICAgICBpZiAoICRTcGxpdFRpY2tldFBhcmFte1VzZXJTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtOZXdVc2VySUR9ID0gJFNwbGl0VGlja2V0RGF0YXtPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXRQYXJhbXtSZXNwb25zaWJsZVVzZXJTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSA9ICRTcGxpdFRpY2tldERhdGF7UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9OwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJFNwbGl0UGFyYW0gKHF3KFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgUHJpb3JpdHlJRCkpIHsKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17JFNwbGl0UGFyYW19ID0gJFNwbGl0VGlja2V0RGF0YXskU3BsaXRQYXJhbX07CiAgICAgICAgfQoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30gKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKCiAgICAgICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgICAgIG15ICRWYWx1ZTsKCiAgICAgICAgICAgICMgaW4gY2FzZSBvZiBzcGxpdCBhIFRpY2tldElEIGFuZCBBcnRpY2xlSUQgYXJlIGFsd2F5cyBnaXZlbiwgR2V0IHRoZSB2YWx1ZQogICAgICAgICAgICAjIGZyb20gREIgdGhpcyBjYXNlcwogICAgICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICYmICRBcnRpY2xle0FydGljbGVJRH0gKSB7CgogICAgICAgICAgICAgICAgIyBzZWxlY3QgVGlja2V0SUQgb3IgQXJ0aWNsZUlEIHRvIGdldCB0aGUgdmFsdWUgZGVwZW5kaW5nIG9uIGR5bmFtaWMgZmllbGQgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgbXkgJE9iamVjdElEID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdUaWNrZXQnCiAgICAgICAgICAgICAgICAgICAgPyAkU2VsZi0+e1RpY2tldElEfQogICAgICAgICAgICAgICAgICAgIDogJEFydGljbGV7QXJ0aWNsZUlEfTsKCiAgICAgICAgICAgICAgICAjIGdldCB2YWx1ZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlIChzcGxpdCkKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJE9iamVjdElELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdGhlcndpc2UgKG9uIGEgbmV3IHRpY2tldCkuIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBhIHVzZXIgc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZSBmb3IKICAgICAgICAgICAgIyB0aGUgZHluYW1pYyBmaWVsZCwgb3RoZXJ3aXNlIHdpbGwgdXNlIER5bmFtaWMgRmllbGQgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBlbHNpZiAoICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgdmFsdWUgZnJvbSBkeW5hbWljIGZpZWxkIGNvbmZpZyAoaWYgYW55KQogICAgICAgICAgICAgICAgJFZhbHVlID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9IHx8ICcnOwoKICAgICAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIHZhbHVlIGZyb20gdXNlciBwcmVmZXJlbmNlcyBpZiBpcyBzZXQKICAgICAgICAgICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbHVlOwogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKICAgICAgICAjIGdhdGhlciBmaWVsZHMgd2hpY2ggYXJlIHN1cHBvc2VkIHRvIGJlIGhpZGRlbiB3aGVuIGF1dG9zZWxlY3RlZAogICAgICAgIG15ICRIaWRlQXV0b3NlbGVjdGVkSlNPTjsKICAgICAgICBpZiAoJEF1dG9zZWxlY3QpIHsKICAgICAgICAgICAgbXkgQEhpZGVBdXRvc2VsZWN0ZWQgPSBncmVwIHsgIXJlZiggJEF1dG9zZWxlY3QtPnskX30gKSAmJiAkQXV0b3NlbGVjdC0+eyRffSA9PSAyIH0ga2V5cyAleyRBdXRvc2VsZWN0fTsKICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBIaWRlQXV0b3NlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIG1hcCB7ICJEeW5hbWljRmllbGRfIiAuICRfIH0KICAgICAgICAgICAgICAgICAgICAoIGdyZXAgeyAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH17JF99ID09IDIgfSBrZXlzICV7ICRBdXRvc2VsZWN0LT57RHluYW1pY0ZpZWxkfSB9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChASGlkZUF1dG9zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgICAgICAgICAgICAgJEhpZGVBdXRvc2VsZWN0ZWRKU09OID0gJEpTT05PYmplY3QtPkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxASGlkZUF1dG9zZWxlY3RlZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdHJhY2sgY2hhbmdpbmcgc3RhbmRhcmQgZmllbGRzCiAgICAgICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBQ0xQcmVzZWxlY3Rpb24nKSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNhY2hlZCBwcmVzZWxlY3Rpb24gcnVsZXMKICAgICAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldEFDTCcsCiAgICAgICAgICAgICAgICBLZXkgID0+ICdQcmVzZWxlY3Rpb24nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+U2V0QUNMUHJlc2VsZWN0aW9uQ2FjaGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUNvbnZlcmdlbmNlID0gKAogICAgICAgICAgICBTdGRGaWVsZHMgPT4gMCwKICAgICAgICAgICAgRmllbGRzICAgID0+IDAsCiAgICAgICAgKTsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0OwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzOwoKIyBSb3RoZXIgT1NTIC8gSVRTTUNvcmUgLSBjYWxjdWxhdGUgUHJpb3JpdHkgdmlhIENJUCBtYXRyaXgKICAgICAgICBpZiAoICRDSVBDYWxjdWxhdGUgJiYgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9CiAgICAgICAgICAgICYmICggJEdldFBhcmFte0R5bmFtaWNGaWVsZH17RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eX0gfHwgJEdldFBhcmFte1NlcnZpY2VJRH0gKSApIHsKCiAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBhbiBpbml0aWFsIGNyaXRpY2FsaXR5IGFuZCBpbXBhY3QsIHRyaWdnZXIgcHJpb3JpdHkgY2FsY3VsYXRpb24KICAgICAgICAgICAgJENoYW5nZWRFbGVtZW50c3tEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAxOwogICAgICAgIH0KIyBFTyBJVFNNQ29yZQoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICAgICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICgKICAgICAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICBteSAkSW5pdGlhbFJ1biA9IDE7CgogICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle0ZpZWxkc30gKSB7CgogICAgICAgICAgICAjIGRldGVybWluZSBzdGFuZGFyZCBmaWVsZCBpbnB1dAogICAgICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ICkgewoKICAgICAgICAgICAgICAgIG15ICVOZXdDaGFuZ2VkRWxlbWVudHM7CgogICAgICAgICAgICAgICAgIyB3aGljaCBzdGFuZGFyZCBmaWVsZHMgdG8gY2hlY2sgLSBGaWVsZElEID0+IEdldFBhcmFtVmFsdWUgKG5lY2Vzc2FyeSBmb3IgRGVzdCkKICAgICAgICAgICAgICAgIG15ICVDaGVjayA9ICgKICAgICAgICAgICAgICAgICAgICBEZXN0ICAgICAgICAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCAgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICBOZXdSZXNwb25zaWJsZUlEICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkQUNMUHJlc2VsZWN0aW9uICYmICEkSW5pdGlhbFJ1biApIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9yIGVhY2ggc3RhbmRhcmQgZmllbGQgd2hpY2ggaGFzIHRvIGJlIGNoZWNrZWQsIHJ1biB0aGUgZGVmaW5lZCBtZXRob2QKICAgICAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IE1FVEhPRCBpZiAhJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9OwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7ICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSB9ID0gJEZpZWxkLT57TWV0aG9kfS0+KAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEICAgICAgICA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lclVzZXJJRH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRHZXRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZXMgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVze1NlcnZpY2VJRH0gfHwgdW5kZWYsICAgICAgIyBuZWVkZWQgZm9yIFNMQUlECiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIHN0dWZmIGZvciBRdWV1ZUlEL0Rlc3Q6IERlc3QgaXMgIlF1ZXVlSUR8fFF1ZXVlTmFtZSIgPT4gIlF1ZXVlTmFtZSI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRmllbGQtPntGaWVsZElEfSBlcSAnRGVzdCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRPczoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICV7ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBUT3MgaWYgKCAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9IGVxICctJyApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyIkUXVldWVJRHx8JFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyAkUXVldWVJRCB9In0gPSAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGN1cnJlbnQgc2VsZWN0aW9uIG9mIFF1ZXVlSUQgKERlc3Qgd2lsbCBiZSBkb25lIHRvZ2V0aGVyIHdpdGggdGhlIG90aGVyIGZpZWxkcykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UXVldWVJRH0gJiYgISRTdGRGaWVsZFZhbHVlc3tEZXN0fXsgJEdldFBhcmFte0Rlc3R9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+e0Rlc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgojIFJvdGhlciBPU1MgLyBJVFNNQ29yZSAtIGNhbGN1bGF0ZSBQcmlvcml0eSB2aWEgQ0lQIG1hdHJpeAogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJEZpZWxkLT57RmllbGRJRH0gZXEgJ1ByaW9yaXR5SUQnICYmICRDSVBDYWxjdWxhdGUgJiYgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIGNyaXRpY2FsaXR5IGVpdGhlciBmcm9tIHRoZSBtYW51YWxseSBzZXQgZHluYW1pYyBmaWVsZCwgb3IgdGhlIHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5ID0gJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9OwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENyaXRpY2FsaXR5ICYmICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVNlcnZpY2UgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDcml0aWNhbGl0eSA9ICRTZXJ2aWNle0NyaXRpY2FsaXR5fTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3JpdGljYWxpdHkgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZWNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkgaWYgYW55IG9mIHRoZSBpbXBhY3RpbmcgZWxlbWVudHMgY2hhbmdlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ2hhbmdlZEVsZW1lbnRze0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSB8fCAkQ2hhbmdlZEVsZW1lbnRze1NlcnZpY2VJRH0gfHwgJENoYW5nZWRFbGVtZW50c3tEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkUHJpb3JpdHlJRCA9ICRDSVBBbGxvY2F0ZU9iamVjdC0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkQ3JpdGljYWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRTdGRGaWVsZFZhbHVlc3tQcmlvcml0eUlEfXsgJFByaW9yaXR5SUQgfSAmJiAkUHJpb3JpdHlJRCBuZSAkR2V0UGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSAgICAgICAgICAgPSAkUHJpb3JpdHlJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3tQcmlvcml0eUlEfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRze1ByaW9yaXR5SUR9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIHdlIGVuZm9yY2UgQ0lQQWxsb2NhdGlvbiBpbiBhbnkgY2FzZSBkZWxldGUgYWxsIG90aGVyIHByaW9yaXR5IG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5SUR9ICYmICRDSVBDYWxjdWxhdGUgPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7UHJpb3JpdHlJRH0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9PiAkU3RkRmllbGRWYWx1ZXN7UHJpb3JpdHlJRH17ICRHZXRQYXJhbXtQcmlvcml0eUlEfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiMgRU8gSVRTTUNvcmUKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgc2VsZWN0ZWQgdmFsdWUgaXMgc3RpbGwgdmFsaWQgZm9yIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH17ICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbm90IGVtcHR5IHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICElTmV3Q2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKAogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0LAogICAgICAgICAgICAgICAgICAgICVOZXdDaGFuZ2VkRWxlbWVudHMsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJExvb3BQcm90ZWN0aW9uLS0gPCAxICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmFuIGludG8gdW5yZXNvbHZhYmxlIGxvb3AhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgICAgICAgID0gJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQ7CiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKCk7CgogICAgICAgICAgICAjIGNoZWNrIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICVDdXJGaWVsZFN0YXRlczsKICAgICAgICAgICAgaWYgKCAlQ2hhbmdlZEVsZW1lbnRzIHx8ICRJbml0aWFsUnVuICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgdG8gcmVkdWNlIEFDTCBldmFsdWF0aW9uCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVyVXNlcklEfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgQXV0b3NlbGVjdCAgICAgID0+ICRBdXRvc2VsZWN0LAogICAgICAgICAgICAgICAgICAgIEFDTFByZXNlbGVjdGlvbiA9PiAkQUNMUHJlc2VsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIExvb3BQcm90ZWN0aW9uICA9PiBcJExvb3BQcm90ZWN0aW9uLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNvbWJpbmUgRmllbGRTdGF0ZXMKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1Zpc2liaWxpdHl9IH0sCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEluaXRpYWxSdW4gPSAwOwogICAgICAgIH0KCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzID0gbWFwIHsKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nIC4gJF8gPT4gZGVmaW5lZCAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskX30KICAgICAgICAgICAgICAgID8gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JF99e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgOiB1bmRlZgogICAgICAgIH0gKCBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSogKTsKCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgaWYgKAogICAgICAgICAgICByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxCiAgICAgICAgICAgICdIQVNIJwogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17RGVzdH0gJiYgJEdldFBhcmFte0Rlc3R9ID1+IC9eKFxkezEsMTAwfSlcfFx8Lis/JC8gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkMTsKICAgICAgICAgICAgICAgIG15ICVBZGRyZXNzID0gJFF1ZXVlT2JqZWN0LT5HZXRTeXN0ZW1BZGRyZXNzKCBRdWV1ZUlEID0+ICRHZXRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJEFkZHJlc3N7RW1haWx9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgRGVidWcgPT4gJERlYnVnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbXkgJE5ld1BhcmFtcyA9ICRPYmplY3QtPlJ1biggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICBpZiAoJE5ld1BhcmFtcykgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkTmV3UGFyYW1zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFuZCBmb3JtYXQgZGVmYXVsdCBzdWJqZWN0IGFuZCBib2R5CiAgICAgICAgbXkgJFN1YmplY3QgPSAkQXJ0aWNsZXtTdWJqZWN0fTsKICAgICAgICBpZiAoICEkU3ViamVjdCApIHsKICAgICAgICAgICAgJFN1YmplY3QgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQ29uZmlnLT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRCb2R5ID0gJEFydGljbGV7Qm9keX0gfHwgJyc7CiAgICAgICAgaWYgKCAhJEJvZHkgKSB7CiAgICAgICAgICAgICRCb2R5ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENvbmZpZy0+e0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQgKGlmIGJvZHkgaXMgYmFzZWQgb24gY29uZmlnKQogICAgICAgIGlmICggISRHZXRQYXJhbXtBcnRpY2xlSUR9ICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkQm9keSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tFbWFpbE5ldygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBOZXh0U3RhdGUgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9ID8gJFN0ZEZpZWxkVmFsdWVze05leHRTdGF0ZUlEfXsgJEdldFBhcmFte05leHRTdGF0ZUlEfSB9IDogJycsCiAgICAgICAgICAgIEZyb21TZWxlY3RlZCAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEZXN0fSwKICAgICAgICAgICAgVXNlclNlbGVjdGVkICAgICAgICAgICAgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlclNlbGVjdGVkID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgTmV4dFN0YXRlcyAgICAgICAgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVze05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgUHJpb3JpdGllcyAgICAgICAgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVze1ByaW9yaXR5SUR9LAogICAgICAgICAgICBUeXBlcyAgICAgICAgICAgICAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7VHlwZUlEfSwKICAgICAgICAgICAgU2VydmljZXMgICAgICAgICAgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVze1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFNMQXMgICAgICAgICAgICAgICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tTTEFJRH0sCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVzICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VycyAgICAgICAgICAgICAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7TmV3VXNlcklEfSwKICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyAgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVze05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBGcm9tTGlzdCAgICAgICAgICAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH0sCiAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgICAgICAgID0+ICRBcnRpY2xle0Zyb219IC8vICcnLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICA9PiAkU3ViamVjdCwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgPT4gJEJvZHksCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgID0+ICRTcGxpdFRpY2tldERhdGF7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICA9PiAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lckRhdGEgICAgICAgICAgICA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgICAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgTGlua1RpY2tldElEICAgICAgICAgICAgPT4gJEdldFBhcmFte0xpbmtUaWNrZXRJRH0gfHwgJycsCiAgICAgICAgICAgIEhpZGVBdXRvc2VsZWN0ZWQgICAgICAgID0+ICRIaWRlQXV0b3NlbGVjdGVkSlNPTiwKICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgICAgICAgPT4gJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9LAogICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBUaW1lVW5pdHMgICAgICAgICAgICAgICA9PiAkU2VsZi0+X0dldFRpbWVVbml0cygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgPyAnVmFsaWRhdGVfUmVxdWlyZWQnCiAgICAgICAgICAgICAgICA6ICcnCiAgICAgICAgICAgICksCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIGRlbGl2ZXIgc2lnbmF0dXJlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2lnbmF0dXJlJyApIHsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApIHx8ICcnOwogICAgICAgIG15ICRRdWV1ZUlEICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUXVldWVJRCcgKTsKICAgICAgICBpZiAoICEkUXVldWVJRCApIHsKICAgICAgICAgICAgbXkgJERlc3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICAgICAgKCRRdWV1ZUlEKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0YXJ0IHdpdGggZW1wdHkgc2lnbmF0dXJlIChubyBxdWV1ZSBzZWxlY3RlZCkgLSBpZiB3ZSBoYXZlIGEgcXVldWUsIGdldCB0aGUgc2lnLgogICAgICAgIG15ICRTaWduYXR1cmUgPSAnJzsKICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRTZWxmLT5fR2V0U2lnbmF0dXJlKAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJE1pbWVUeXBlICA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICAkU2lnbmF0dXJlID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJE1pbWVUeXBlIC4gJzsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyB0aWNrZXQgYW5kIGFydGljbGUKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZU5ldycgKSB7CgogICAgICAgIG15ICVFcnJvcjsKICAgICAgICBteSAkTmV4dFN0YXRlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV4dFN0YXRlSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJVN0YXRlRGF0YTsKICAgICAgICBpZiAoJE5leHRTdGF0ZUlEKSB7CiAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkTmV4dFN0YXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICROZXh0U3RhdGUgICAgICAgID0gJFN0YXRlRGF0YXtOYW1lfTsKICAgICAgICBteSAkTmV3UmVzcG9uc2libGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdSZXNwb25zaWJsZUlEJyApIHx8ICcnOwogICAgICAgIG15ICROZXdVc2VySUQgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05ld1VzZXJJRCcgKSAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJERlc3QgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgIyBzZWUgaWYgb25seSBhIG5hbWUgaGFzIGJlZW4gcGFzc2VkCiAgICAgICAgaWYgKCAkRGVzdCAmJiAkRGVzdCAhfiBteyBcQSAoXGQrKT8gXHwgXHwgLisgXHogfXhtcyApIHsKCiAgICAgICAgICAgICMgc2VlIGlmIHdlIGNhbiBnZXQgYW4gSUQgZm9yIHRoaXMgcXVldWUgbmFtZQogICAgICAgICAgICBteSAkRGVzdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFF1ZXVlID0+ICREZXN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCREZXN0SUQpIHsKICAgICAgICAgICAgICAgICREZXN0ID0gJERlc3RJRCAuICd8fCcgLiAkRGVzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREZXN0ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICgkTmV3UXVldWVJRCkgPSBzcGxpdCggL1x8XHwvLCAkRGVzdCApOwogICAgICAgIGlmICggISROZXdRdWV1ZUlEICkgewogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICVBZGRyZXNzID0gJFF1ZXVlT2JqZWN0LT5HZXRTeXN0ZW1BZGRyZXNzKCBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSA9ICRBZGRyZXNze0VtYWlsfTsKICAgICAgICB9CgogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcmVTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVySUQgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICRFeHBhbmRDdXN0b21lck5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRXhwYW5kQ3VzdG9tZXJOYW1lJyApCiAgICAgICAgICAgIHx8IDA7CiAgICAgICAgbXkgJUZyb21FeHRlcm5hbEN1c3RvbWVyOwogICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gICAgICAgICAgICA9ICROZXdRdWV1ZUlEOwogICAgICAgICRHZXRQYXJhbXtFeHBhbmRDdXN0b21lck5hbWV9ID0gJEV4cGFuZEN1c3RvbWVyTmFtZTsKCiAgICAgICAgIyBnZXQgc2VuZGVyIHF1ZXVlIGZyb20KICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCROZXdRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlcgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3duZXJBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3BvbnNpYmxlQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGVhclRvJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJyc7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAyICkgewogICAgICAgICAgICBteSAkSXRlbSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJFeHBhbmRDdXN0b21lck5hbWUkQ291bnQiICkgfHwgMDsKICAgICAgICAgICAgaWYgKCAkQ291bnQgPT0gMSAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJENvdW50ID09IDIgJiYgJEl0ZW0gKSB7CiAgICAgICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIElUU01Db3JlIC0gY2FsY3VsYXRlIFByaW9yaXR5IHZpYSBDSVAgbWF0cml4CiAgICAgICAgaWYgKCAkQ0lQQ2FsY3VsYXRlICYmICRDSVBDYWxjdWxhdGUgPT0gMiAmJiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgY3JpdGljYWxpdHkgZWl0aGVyIGZyb20gdGhlIG1hbnVhbGx5IHNldCBkeW5hbWljIGZpZWxkLCBvciB0aGUgc2VydmljZQogICAgICAgICAgICBteSAkQ3JpdGljYWxpdHkgPSAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eX07CgogICAgICAgICAgICBpZiAoICEkQ3JpdGljYWxpdHkgJiYgJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAlU2VydmljZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJENyaXRpY2FsaXR5ID0gJFNlcnZpY2V7Q3JpdGljYWxpdHl9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDcml0aWNhbGl0eSApIHsKICAgICAgICAgICAgICAgIG15ICRQcmlvcml0eUlEID0gJENJUEFsbG9jYXRlT2JqZWN0LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJENyaXRpY2FsaXR5LAogICAgICAgICAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkUHJpb3JpdHlJRCBuZSAkR2V0UGFyYW17UHJpb3JpdHlJRH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuOyB3ZSBqdXN0IGVuZm9yY2UgdGhlIHByaW8gYW5kIHdyaXRlIGFuIGVycm9yIHRvIHRoZSBsb2cgZmlsZSBoZXJlCiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJHb3QgUHJpb3JpdHlJRCAnJEdldFBhcmFte1ByaW9yaXR5SUR9JywgYnV0IENJUCBlbmZvcmNlcyAnJFByaW9yaXR5SUQnIC0gb3ZlcnJpZGluZyB0aGUgZnJvbnRlbmQgdmFsdWUuIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gPSAkUHJpb3JpdHlJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KIyBFTyBJVFNNQ29yZQoKICAgICAgICAjIHNraXAgdmFsaWRhdGlvbiBvZiBoaWRkZW4gZmllbGRzCiAgICAgICAgbXkgJVZpc2liaWxpdHk7CgogICAgICAgICMgdHJhbnNmb3JtIGR5bmFtaWMgZmllbGQgZGF0YSBpbnRvIERGTmFtZSA9PiBERk5hbWUgcGFpcgogICAgICAgIG15ICVEeW5hbWljRmllbGRBY2wgPSBtYXAgeyAkXyA9PiAkXyB9IGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKjsKCiAgICAgICAgIyBjYWxsIHRpY2tldCBBQ0xzIGZvciBEeW5hbWljRmllbGRzIHRvIGNoZWNrIGZpZWxkIHZpc2liaWxpdHkKICAgICAgICBteSAkQUNMUmVzdWx0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ0Zvcm0nLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnLScsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkQWNsLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFDTFJlc3VsdCkgewogICAgICAgICAgICAlVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfID0+IDAgfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVBY2xEYXRhICkgewogICAgICAgICAgICAgICAgJFZpc2liaWxpdHl7ICdEeW5hbWljRmllbGRfJyAuICRGaWVsZCB9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVZpc2liaWxpdHkgPSBtYXAgeyAnRHluYW1pY0ZpZWxkXycgLiAkXyA9PiAxIH0ga2V5cyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqOwogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkIHZhbGlkYXRpb24gcmVzdWx0cyBpZiBlcnJvbmVvdXMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgb24gaW52aXNpYmxlIGZpZWxkcwogICAgICAgICAgICBpZiAoICEkRXhwYW5kQ3VzdG9tZXJOYW1lICYmICRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKCiAgICAgICAgICAgICAgICAgICAgIyBNYW5kYXRvcnkgaXMgYWRkZWQgdG8gdGhlIGNvbmZpZ3MgYnkgJFNlbGYtPm5ldwogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TWFuZGF0b3J5fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICksCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZXhwYW5kIGN1c3RvbWVyIG5hbWUKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YTsKICAgICAgICBpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMSApIHsKCiAgICAgICAgICAgICMgc2VhcmNoIGN1c3RvbWVyCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0OwogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgU2VhcmNoID0+ICRHZXRQYXJhbXtUb30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGp1c3Qgb25lIGN1c3RvbWVyIHVzZXIgZXhpc3RzCiAgICAgICAgICAgICMgaWYganVzdCBvbmUsIGZpbGx1cCBDdXN0b21lclVzZXJJRCBhbmQgQ3VzdG9tZXJJRAogICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9IDA7CiAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0rKzsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH0gICAgID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlcn07CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3RVc2VyfSA9ICRLZXlDdXN0b21lclVzZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9PSAxICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSAgICAgICAgICAgICAgPSAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3R9OwogICAgICAgICAgICAgICAgJEVycm9ye0V4cGFuZEN1c3RvbWVyTmFtZX0gPSAxOwogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0VXNlcn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgbW9yZSB0aGUgb25lIGN1c3RvbWVyIHVzZXIgZXhpc3RzLCBzaG93IGxpc3QKICAgICAgICAgICAgIyBhbmQgY2xlYW4gQ3VzdG9tZXJVc2VySUQgYW5kIEN1c3RvbWVySUQKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBkb24ndCBjaGVjayBlbWFpbCBzeW50YXggb24gbXVsdGkgY3VzdG9tZXIgc2VsZWN0CiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IDAKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICcnOwoKICAgICAgICAgICAgICAgICMgY2xlYXIgdG8gaWYgdGhlcmUgaXMgbm8gY3VzdG9tZXIgZm91bmQKICAgICAgICAgICAgICAgIGlmICggISVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRFcnJvcntFeHBhbmRDdXN0b21lck5hbWV9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJvbSBhbmQgY3VzdG9tZXIgaWQgaWYgY3VzdG9tZXIgdXNlciBpcyBnaXZlbgogICAgICAgICMgVGhpcyBpcyB1c2VkIGJ5IEtlcm5lbDo6TW9kdWxlczo6QWRtaW5DdXN0b21lclVzZXIKICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMiApIHsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICRDdXN0b21lclVzZXJMaXN0eyRLZXlDdXN0b21lclVzZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7Q3VzdG9tZXJ9ICkgewogICAgICAgICAgICAgICAgbXkgJUV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7Q3VzdG9tZXJ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntFbWFpbH0gPSAkRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhe1VzZXJNYWlsU3RyaW5nfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGEgbmV3IGRlc3RpbmF0aW9uIHF1ZXVlIGlzIHNlbGVjdGVkCiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDMgKSB7CiAgICAgICAgICAgICRFcnJvcntOb1N1Ym1pdH0gPSAxOwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlciB8fCAkU2VsZWN0ZWRDdXN0b21lclVzZXIgKSB7CiAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEN1c3RvbWVySUQpIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICAgICAgbmV4dCBQQVJBTUVURVIgaWYgISRHZXRQYXJhbXskUGFyYW1ldGVyfTsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEdldFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFBhcmFtZXRlciAuICdFcnJvclR5cGUnIH0gPSAkUGFyYW1ldGVyIC4gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKSAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUGFyYW1ldGVyIC4gJ0ludmFsaWQnIH0gICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgQWRkcmVzc09iamVjdCA9PiAkRW1haWwsCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkR2V0UGFyYW17UXVldWVJRH0sCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJElzTG9jYWwpIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRQYXJhbWV0ZXIgLiAnSXNMb2NhbEFkZHJlc3MnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIGl0IGlzIG5vdCBhIHN1YmFjdGlvbiBhYm91dCBhdHRhY2htZW50cywgY2hlY2sgZm9yIHNlcnZlciBlcnJvcnMKICAgICAgICBpZiAoICEkRXhwYW5kQ3VzdG9tZXJOYW1lICkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnRGVzdGluYXRpb25JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgZGF0ZSBpcyB2YWxpZAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJEV4cGFuZEN1c3RvbWVyTmFtZQogICAgICAgICAgICAgICAgJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0KICAgICAgICAgICAgICAgICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcGVuZGluZyBkYXRlIHRvIGEgZGF0ZXRpbWUgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZCA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IGN1cnJlbnQgc3lzdGVtIGVwb2NoCiAgICAgICAgICAgICAgICBteSAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkUGVuZGluZ0RhdGVUaW1lT2JqZWN0IHx8ICRQZW5kaW5nRGF0ZVRpbWVPYmplY3QgPCAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNlcnZpY2UKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NlcnZpY2VNYW5kYXRvcnl9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNsYQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTTEFJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICEkR2V0UGFyYW17VHlwZUlEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVHlwZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpCiAgICAgICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtUaW1lVW5pdHN9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVGltZVVuaXRzSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgbXkgJUFydGljbGVQYXJhbTsKICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgRGVidWcgPT4gJERlYnVnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgICAgIG15ICRNdWx0aXBsZTsKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgU3RvcmVOZXcgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkSm9ic3skSm9ifQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICAjIGFuZCBhZGQgdGhlbSBiYWNrIHRvIHRoZSBzZWxlY3Rpb24gc28gdGhhdCB0aGUgc3VibWl0CiAgICAgICAgICAgICAgICAjIHdpbGwgY29udGFpbiBvcHRpb25zIHRoYXQgd2VyZSBoaWRkZW4gZnJvbSB0aGUgYWdlbnQKICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAUmVtb3ZlZE9wdGlvbnMgPSAkT2JqZWN0LT5HZXRPcHRpb25zVG9SZW1vdmVBSkFYKCVHZXRQYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJE11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJlbW92ZWRPcHRpb24gKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJEdldFBhcmFteyRLZXl9IH0sICRSZW1vdmVkT3B0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gc2hpZnQgQFJlbW92ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdGlja2V0IHBhcmFtcwogICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSA9ICgKICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPkFydGljbGVPcHRpb24oICVHZXRQYXJhbSwgJUFydGljbGVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IGVycm9ycwogICAgICAgICAgICAgICAgJUVycm9yID0gKAogICAgICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgIGlmICggJEVycm9ye1RvSXNMb2NhbEFkZHJlc3N9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRFcnJvcntDY0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkRXJyb3J7QmNjSXNMb2NhbEFkZHJlc3N9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgYW5kIGZvcm1hdCBkZWZhdWx0IHN1YmplY3QgYW5kIGJvZHkKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQ29uZmlnLT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQm9keSA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRDb25maWctPntCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkQm9keSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQm9keSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IEJvZHkgYW5kIFN1YmplY3QgcGFyYW1ldGVycyBmb3IgT3V0cHV0CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTdWJqZWN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkQm9keTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc2VydmljZXMKICAgICAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCAgIHx8IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlc2V0IHByZXZpb3VzIFNlcnZpY2VJRCB0byByZXNldCBTTEEtTGlzdCBpZiBubyBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTZXJ2aWNlSUR9IHx8ICEkU2VydmljZXMtPnsgJEdldFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQgfHwgMSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaGVhZGVyIGFuZCBuYXZpZ2F0aW9uIGJhcgogICAgICAgICAgICBteSAkT3V0cHV0ID0gam9pbiAnJywKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkhlYWRlcigpLAogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza0VtYWlsTmV3KAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcnMgICA9PiAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFVzZXJTZWxlY3RlZCAgICAgPT4gJE5ld1VzZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlcnMgPT4gJFNlbGYtPl9HZXRSZXNwb25zaWJsZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VyU2VsZWN0ZWQgPT4gJE5ld1Jlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVzICAgICAgICAgICAgICA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBOZXh0U3RhdGUgID0+ICROZXh0U3RhdGUsCiAgICAgICAgICAgICAgICBQcmlvcml0aWVzID0+ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFR5cGVzID0+ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICBTTEFzICAgICAgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVzID0+ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8ICcnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEN1c3RvbWVySUQgKSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgICAgICA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICAgICA/ICdWYWxpZGF0ZV9SZXF1aXJlZCcKICAgICAgICAgICAgICAgICAgICA6ICcnCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgRnJvbUxpc3QgICAgID0+ICRTZWxmLT5fR2V0VG9zKCksCiAgICAgICAgICAgICAgICBGcm9tU2VsZWN0ZWQgPT4gJERlc3QsCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkR2V0UGFyYW17U3ViamVjdH0gKSwKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRHZXRQYXJhbXtCb2R5fSApLAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgIFNpZ25hdHVyZSAgICA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgICAgICAgICBGcm9tRXh0ZXJuYWxDdXN0b21lciA9PiBcJUZyb21FeHRlcm5hbEN1c3RvbWVyLAogICAgICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgICAgPT4gXCVWaXNpYmlsaXR5LAogICAgICAgICAgICAgICAgREZQb3NzaWJsZVZhbHVlcyAgICAgPT4gXCVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIERGRXJyb3JzICAgICAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFR5cGVJRCAgICAgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgU2VydmljZUlEICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBTTEFJRCAgICAgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgUHJpb3JpdHlJRCAgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ1RpY2tldCc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmlzaWJpbGl0eXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9OwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICAjIHByZXBhcmUgc3ViamVjdAogICAgICAgIG15ICRUbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCggVGlja2V0SUQgPT4gJFRpY2tldElEICk7CiAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRuLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ05ldycsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBuZXcgb3duZXIgaXMgZ2l2ZW4gKHRoZW4gc2VuZCBubyBhZ2VudCBub3RpZnkpCiAgICAgICAgbXkgJE5vQWdlbnROb3RpZnkgPSAwOwogICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICROb0FnZW50Tm90aWZ5ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9IC49ICc8YnIvPjxici8+JyAuICRTaWduYXR1cmU7CgogICAgICAgICAgICAjIHJlbW92ZSB1bnVzZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICBteSBATmV3QXR0YWNobWVudERhdGE7CiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkKICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciBpbmxpbmUgaW1hZ2VzIGFuZCBub3JtYWwgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIHB1c2ggQE5ld0F0dGFjaG1lbnREYXRhLCBcJXskQXR0YWNobWVudH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQEF0dGFjaG1lbnREYXRhID0gQE5ld0F0dGFjaG1lbnREYXRhOwoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9IC49ICJcblxuIiAuICRTaWduYXR1cmU7CiAgICAgICAgfQoKICAgICAgICAjIGxvb2t1cCBzZW5kZXIKICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKICAgICAgICBteSAkU2VuZGVyICAgICAgICAgICAgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNlbmRlcigKICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFydGljbGVPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQ2hhbm5lbCggQ2hhbm5lbE5hbWUgPT4gJ0VtYWlsJyApOwoKICAgICAgICAjIHNlbmQgZW1haWwKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlU2VuZCgKICAgICAgICAgICAgTm9BZ2VudE5vdGlmeSAgICAgICAgPT4gJE5vQWdlbnROb3RpZnksCiAgICAgICAgICAgIEF0dGFjaG1lbnQgICAgICAgICAgID0+IFxAQXR0YWNobWVudERhdGEsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAkQ29uZmlnLT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9LAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAkU2VuZGVyLAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgICAgICBCY2MgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17QmNjfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9CiAgICAgICAgICAgICAgICB8fCAiXCVcJSRHZXRQYXJhbXtUb30sICRHZXRQYXJhbXtDY30sICRHZXRQYXJhbXtCY2N9IiwKICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICApOwogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnQXJ0aWNsZSc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmlzaWJpbGl0eXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9OwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBhbGwgZm9ybSBkYXRhCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyktPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAjIGRlbGV0ZSBoaWRkZW4gZmllbGRzIGNhY2hlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAnSGlkZGVuRmllbGRzJywKICAgICAgICAgICAgS2V5ICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBsaW5rIHRpY2tldHMKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9CiAgICAgICAgICAgICYmICRDb25maWctPntTcGxpdExpbmtUeXBlfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U3BsaXRMaW5rVHlwZX0tPntMaW5rVHlwZX0KICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9LT57RGlyZWN0aW9ufQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkR2V0UGFyYW17TGlua1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgcm8gcGVybWlzc2lvbiEiLAogICAgICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU291cmNlS2V5ID0gJEdldFBhcmFte0xpbmtUaWNrZXRJRH07CiAgICAgICAgICAgIG15ICRUYXJnZXRLZXkgPSAkVGlja2V0SUQ7CgogICAgICAgICAgICBpZiAoICRDb25maWctPntTcGxpdExpbmtUeXBlfS0+e0RpcmVjdGlvbn0gZXEgJ1NvdXJjZScgKSB7CiAgICAgICAgICAgICAgICAkU291cmNlS2V5ID0gJFRpY2tldElEOwogICAgICAgICAgICAgICAgJFRhcmdldEtleSA9ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGxpbmsgdGhlIHRpY2tldHMKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0FkZCgKICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRUYXJnZXRLZXksCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9LT57TGlua1R5cGV9IHx8ICdOb3JtYWwnLAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgb3duZXIgKGlmIG5ldyB1c2VyIGlkIGlzIGdpdmVuKQogICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkTmV3VXNlcklELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGxvY2sKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZWxzZSBzZXQgb3duZXIgdG8gY3VycmVudCBhZ2VudCBidXQgZG8gbm90IGxvY2sgaXQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHJlc3BvbnNpYmxlIChpZiBuZXcgdXNlciBpZCBpcyBnaXZlbikKICAgICAgICBpZiAoJE5ld1Jlc3BvbnNpYmxlSUQpIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICROZXdSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjbG9zZWQgdGlja2V0cyBnZXQgdW5sb2NrZWQKICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKCiAgICAgICAgICAgICMgc2V0IGxvY2sKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHJlZGlyZWN0IHNjcmVlbgogICAgICAgIG15ICROZXh0U2NyZWVuID0gJFNlbGYtPntTZXNzaW9ufXtVc2VyQ3JlYXRlTmV4dE1hc2t9IHx8ICdBZ2VudFRpY2tldEVtYWlsJzsKCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbjtTdWJhY3Rpb249Q3JlYXRlZDtUaWNrZXRJRD0kVGlja2V0SUQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CiAgICAgICAgbXkgJERlc3QgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApOwogICAgICAgIG15ICRFbGVtZW50Q2hhbmdlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcgKSB8fCAnJzsKCiAgICAgICAgIyBnZXQgRnJvbSBiYXNlZCBvbiBzZWxlY3RlZCBxdWV1ZQogICAgICAgIG15ICRRdWV1ZUlEID0gJyc7CiAgICAgICAgaWYgKCAkRGVzdCA9fiAvXihcZHsxLDEwMH0pXHxcfC4rPyQvICkgewogICAgICAgICAgICAkUXVldWVJRCA9ICQxOwogICAgICAgICAgICBteSAlQWRkcmVzcyA9ICRRdWV1ZU9iamVjdC0+R2V0U3lzdGVtQWRkcmVzcyggUXVldWVJRCA9PiAkUXVldWVJRCApOwogICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkQWRkcmVzc3tFbWFpbH07CiAgICAgICAgfQogICAgICAgICRHZXRQYXJhbXtEZXN0fSAgICA9ICREZXN0OwogICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRRdWV1ZUlEOwoKICAgICAgICAjIGdldCBsaXN0IHR5cGUKICAgICAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRBdXRvc2VsZWN0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkF1dG9zZWxlY3QnKSB8fCB1bmRlZjsKICAgICAgICBteSAkQUNMUHJlc2VsZWN0aW9uOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkFDTFByZXNlbGVjdGlvbicpICkgewoKICAgICAgICAgICAgIyBnZXQgY2FjaGVkIHByZXNlbGVjdGlvbiBydWxlcwogICAgICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGlja2V0QUNMJywKICAgICAgICAgICAgICAgIEtleSAgPT4gJ1ByZXNlbGVjdGlvbicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24gKSB7CiAgICAgICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5TZXRBQ0xQcmVzZWxlY3Rpb25DYWNoZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlQ29udmVyZ2VuY2UgPSAoCiAgICAgICAgICAgIFN0ZEZpZWxkcyA9PiAwLAogICAgICAgICAgICBGaWVsZHMgICAgPT4gMCwKICAgICAgICApOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHMgPSAkRWxlbWVudENoYW5nZWQgPyAoICRFbGVtZW50Q2hhbmdlZCA9PiAxICkgOiAoKTsKICAgICAgICBpZiAoICRDaGFuZ2VkRWxlbWVudHN7U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJENoYW5nZWRFbGVtZW50c3tDdXN0b21lclVzZXJJRH0gPSAxOwogICAgICAgICAgICAkQ2hhbmdlZEVsZW1lbnRze0N1c3RvbWVySUR9ICAgICA9IDE7CiAgICAgICAgfQogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gJUNoYW5nZWRFbGVtZW50czsKICAgICAgICBteSAlQ2hhbmdlZFN0ZEZpZWxkcyAgICAgICA9ICRFbGVtZW50Q2hhbmdlZCAmJiAkRWxlbWVudENoYW5nZWQgIX4gL15EeW5hbWljRmllbGRfLyA/ICVDaGFuZ2VkRWxlbWVudHMgOiAoKTsKCiAgICAgICAgbXkgJExvb3BQcm90ZWN0aW9uID0gMTAwOwogICAgICAgIG15ICVTdGRGaWVsZFZhbHVlczsKICAgICAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAoCiAgICAgICAgICAgIFZpc2liaWxpdHkgPT4ge30sCiAgICAgICAgICAgIEZpZWxkcyAgICAgPT4ge30sCiAgICAgICAgICAgIFNldHMgICAgICAgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7RmllbGRzfSApIHsKCiAgICAgICAgICAgICMgZGV0ZXJtaW5lIHN0YW5kYXJkIGZpZWxkIGlucHV0CiAgICAgICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gKSB7CgogICAgICAgICAgICAgICAgbXkgJU5ld0NoYW5nZWRFbGVtZW50czsKCiAgICAgICAgICAgICAgICAjIHdoaWNoIHN0YW5kYXJkIGZpZWxkcyB0byBjaGVjayAtIEZpZWxkSUQgPT4gR2V0UGFyYW1WYWx1ZSAobmVjZXNzYXJ5IGZvciBEZXN0KQogICAgICAgICAgICAgICAgbXkgJUNoZWNrID0gKAogICAgICAgICAgICAgICAgICAgIERlc3QgICAgICAgICAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEICAgICAgICAgID0+ICdOZXdVc2VySUQnLAogICAgICAgICAgICAgICAgICAgIE5ld1Jlc3BvbnNpYmxlSUQgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgTmV4dFN0YXRlSUQgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgICAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJEFDTFByZXNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgICAgIEZJRUxEOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGRJRCAoIHNvcnQga2V5cyAlQ2hlY2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRGaWVsZElEIG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyRGaWVsZElEfSAmJiAkQ2hhbmdlZEVsZW1lbnRzeyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICggc29ydCBrZXlzICVDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbi0+e1J1bGVzfXtUaWNrZXR9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX17JEVsZW1lbnR9eyRGaWVsZElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEVsZW1lbnR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEVsZW1lbnQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB1bmFmZmVjdGVkIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJENoZWNreyRGaWVsZElEfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmb3IgZWFjaCBzdGFuZGFyZCBmaWVsZCB3aGljaCBoYXMgdG8gYmUgY2hlY2tlZCwgcnVuIHRoZSBkZWZpbmVkIG1ldGhvZAogICAgICAgICAgICAgICAgTUVUSE9EOgogICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRTZWxmLT57RmllbGRNZXRob2RzfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgTUVUSE9EIGlmICEkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH07CgogICAgICAgICAgICAgICAgICAgICMgdXNlICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSBmb3IgRGVzdD0+UXVldWVJRAogICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3sgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IH0gPSAkRmllbGQtPntNZXRob2R9LT4oCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgICAgICAgID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkR2V0UGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tTZXJ2aWNlSUR9IHx8IHVuZGVmLCAgICAjIG5lZWRlZCBmb3IgU0xBSUQKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgc3R1ZmYgZm9yIFF1ZXVlSUQvRGVzdDogRGVzdCBpcyAiUXVldWVJRHx8UXVldWVOYW1lIiA9PiAiUXVldWVOYW1lIjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVE9zOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJXsgJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7RGVzdH17IiRRdWV1ZUlEfHwkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17ICRRdWV1ZUlEIH0ifSA9ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCBzZWxlY3Rpb24gb2YgUXVldWVJRCAoRGVzdCB3aWxsIGJlIGRvbmUgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXIgZmllbGRzKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAhJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyAkR2V0UGFyYW17RGVzdH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1F1ZXVlSUR9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57RGVzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIElUU01Db3JlIC0gY2FsY3VsYXRlIFByaW9yaXR5IHZpYSBDSVAgbWF0cml4CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRmllbGQtPntGaWVsZElEfSBlcSAnUHJpb3JpdHlJRCcgJiYgJENJUENhbGN1bGF0ZSAmJiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgY3JpdGljYWxpdHkgZWl0aGVyIGZyb20gdGhlIG1hbnVhbGx5IHNldCBkeW5hbWljIGZpZWxkLCBvciB0aGUgc2VydmljZQogICAgICAgICAgICAgICAgICAgICAgICBteSAkQ3JpdGljYWxpdHkgPSAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eX07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ3JpdGljYWxpdHkgJiYgJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAlU2VydmljZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJENyaXRpY2FsaXR5ID0gJFNlcnZpY2V7Q3JpdGljYWxpdHl9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRDcml0aWNhbGl0eSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlY2FsY3VsYXRlIHRoZSBwcmlvcml0eSBpZiBhbnkgb2YgdGhlIGltcGFjdGluZyBlbGVtZW50cyBjaGFuZ2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRDaGFuZ2VkRWxlbWVudHN7RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9IHx8ICRDaGFuZ2VkRWxlbWVudHN7U2VydmljZUlEfSB8fCAkQ2hhbmdlZEVsZW1lbnRze0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRQcmlvcml0eUlEID0gJENJUEFsbG9jYXRlT2JqZWN0LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICRDcml0aWNhbGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFN0ZEZpZWxkVmFsdWVze1ByaW9yaXR5SUR9eyAkUHJpb3JpdHlJRCB9ICYmICRQcmlvcml0eUlEIG5lICRHZXRQYXJhbXtQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SUR9ICAgICAgICAgICA9ICRQcmlvcml0eUlEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRze1ByaW9yaXR5SUR9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7UHJpb3JpdHlJRH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgd2UgZW5mb3JjZSBDSVBBbGxvY2F0aW9uIGluIGFueSBjYXNlIGRlbGV0ZSBhbGwgb3RoZXIgcHJpb3JpdHkgb3B0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlJRH0gJiYgJENJUENhbGN1bGF0ZSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3tQcmlvcml0eUlEfSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SUR9ID0+ICRTdGRGaWVsZFZhbHVlc3tQcmlvcml0eUlEfXsgJEdldFBhcmFte1ByaW9yaXR5SUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KIyBFTyBJVFNNQ29yZQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHdoZXRoZXIgY3VycmVudCBzZWxlY3RlZCB2YWx1ZSBpcyBzdGlsbCB2YWxpZCBmb3IgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfXsgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBub3QgZW1wdHkgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAgICAgICAgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+QXV0b3NlbGVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggISVOZXdDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9ICVOZXdDaGFuZ2VkRWxlbWVudHM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoCiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgJU5ld0NoYW5nZWRFbGVtZW50cywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkTG9vcFByb3RlY3Rpb24tLSA8IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSYW4gaW50byB1bnJlc29sdmFibGUgbG9vcCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydDsKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJUN1ckZpZWxkU3RhdGVzOwogICAgICAgICAgICBpZiAoJUNoYW5nZWRFbGVtZW50cykgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAgICAgICMgb3B0aW9uYWwgdG8gcmVkdWNlIEFDTCBldmFsdWF0aW9uCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY29tYmluZSBGaWVsZFN0YXRlcwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7U2V0c30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIG15ICRTaWduYXR1cmUgPSAnJzsKICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRTZWxmLT5fR2V0U2lnbmF0dXJlKAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJEdldFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkQUpBWFJldHVybigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlncyA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgRHluRmllbGRTdGF0ZXMgICAgICA9PiBcJUR5bkZpZWxkU3RhdGVzLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgQUpBWCByZXR1cm4gZm9yIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICAgICBteSBAU3RkRmllbGRBSkFYOwogICAgICAgIG15ICVBdHRyaWJ1dGVzID0gKAogICAgICAgICAgICBEZXN0ID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBOZXdVc2VySUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5ld1Jlc3BvbnNpYmxlSUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VydmljZUlEID0+IHsKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTTEFJRCA9PiB7CiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBUeXBlSUQgPT4gewogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0KICAgICAgICApOwogICAgICAgIGRlbGV0ZSAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH07CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlU3RkRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgICAgIHB1c2ggQFN0ZEZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRmllbGQsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3skRmllbGR9LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17JEZpZWxkfSwKICAgICAgICAgICAgICAgICV7ICRBdHRyaWJ1dGVzeyRGaWVsZH0gfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIG15IEBUZW1wbGF0ZUFKQVg7CgogICAgICAgICMgdXBkYXRlIHRpY2tldCBib2R5IGFuZCBhdHRhY2htZW50cyBpZiBuZWVkZWQuCiAgICAgICAgaWYgKCAkQ2hhbmdlZFN0ZEZpZWxkc3tTdGFuZGFyZFRlbXBsYXRlSUR9ICkgewogICAgICAgICAgICBteSBAVGlja2V0QXR0YWNobWVudHM7CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZVRleHQ7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgVXBsb2FkIGNhY2hlCiAgICAgICAgICAgIG15ICRSZW1vdmVTdWNjZXNzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUmVtb3ZlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZvcm0gYXR0YWNobWVudHMgY291bGQgbm90IGJlIGRlbGV0ZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wbGF0ZSB0ZXh0IGFuZCBzZXQgbmV3IGF0dGFjaG1lbnRzIGlmIGEgdGVtcGxhdGUgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCBJc1Bvc2l0aXZlSW50ZWdlciggJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gKSApIHsKICAgICAgICAgICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwoKICAgICAgICAgICAgICAgICMgc2V0IHRlbXBsYXRlIHRleHQsIHJlcGxhY2Ugc21hcnQgdGFncyAobGltaXRlZCBhcyB0aWNrZXQgaXMgbm90IGNyZWF0ZWQpCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVUZXh0ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5UZW1wbGF0ZSgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgICA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgU3RkQXR0YWNobWVudE9iamVjdAogICAgICAgICAgICAgICAgbXkgJFN0ZEF0dGFjaG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudCcpOwoKICAgICAgICAgICAgICAgICMgYWRkIHN0ZC4gYXR0YWNobWVudHMgdG8gdGlja2V0CiAgICAgICAgICAgICAgICBteSAlQWxsU3RkQXR0YWNobWVudHMgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3IgKCBzb3J0IGtleXMgJUFsbFN0ZEF0dGFjaG1lbnRzICkgewogICAgICAgICAgICAgICAgICAgIG15ICVBdHRhY2htZW50c0RhdGEgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudEdldCggSUQgPT4gJF8gKTsKICAgICAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAlQXR0YWNobWVudHNEYXRhLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZW5kIGEgbGlzdCBvZiBhdHRhY2htZW50cyBpbiB0aGUgdXBsb2FkIGNhY2hlIGJhY2sgdG8gdGhlIGNsaWVudHNpZGUgSmF2YVNjcmlwdAogICAgICAgICAgICAgICAgIyB3aGljaCByZW5kZXJzIHRoZW4gdGhlIGxpc3Qgb2YgY3VycmVudGx5IHVwbG9hZGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBAVGlja2V0QXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBUaWNrZXRBdHRhY2htZW50cykgewogICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RmlsZXNpemV9ID0gJExheW91dE9iamVjdC0+SHVtYW5SZWFkYWJsZURhdGFTaXplKAogICAgICAgICAgICAgICAgICAgICAgICBTaXplID0+ICRBdHRhY2htZW50LT57RmlsZXNpemV9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBUZW1wbGF0ZUFKQVggPSAoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlVGVtcGxhdGVDcmVhdGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJzAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkVGVtcGxhdGVUZXh0IHx8ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnVGlja2V0QXR0YWNobWVudHMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFxAVGlja2V0QXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAgICAgS2VlcERhdGEgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSBARXh0ZW5kZWREYXRhOwoKICAgICAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICAgICAgSk9COgogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBuZXh0IEpPQiBpZiAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkRGVidWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRNdWx0aXBsZTsKCiAgICAgICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICAgICAkTXVsdGlwbGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+RGF0YSggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICAjIGdldCBBSkFYIHBhcmFtIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldFBhcmFtQUpBWCcpICkgewogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICggJUdldFBhcmFtLCAkT2JqZWN0LT5HZXRQYXJhbUFKQVgoJUdldFBhcmFtKSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IG9wdGlvbnMgdGhhdCBoYXZlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uIHZpc2libGUKICAgICAgICAgICAgICAgICMgdG8gdGhlIGFnZW50LiBUaGVzZSBvcHRpb25zIHdpbGwgYmUgYWRkZWQgYWdhaW4gb24gc3VibWl0LgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAT3B0aW9uc1RvUmVtb3ZlID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE9wdGlvblRvUmVtb3ZlIChAT3B0aW9uc1RvUmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskT3B0aW9uVG9SZW1vdmV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgICAgIGlmICgkS2V5KSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBARXh0ZW5kZWREYXRhLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAkTXVsdGlwbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NpZ25hdHVyZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBAU3RkRmllbGRBSkFYLAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAogICAgICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgXSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFN1YmFjdGlvbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9Cn0KCnN1YiBfR2V0TmV4dFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgbXkgJU5leHRTdGF0ZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRVc2VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXJzCiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBqdXN0IHNob3cgb25seSB1c2VycyB3aXRoIHNlbGVjdGVkIGN1c3RvbSBxdWV1ZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtPd25lckFsbH0gKSB7CiAgICAgICAgbXkgQFVzZXJJRHMgPSAkVGlja2V0T2JqZWN0LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgIGZvciBteSAkS2V5R3JvdXBNZW1iZXIgKCBzb3J0IGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkS2V5R3JvdXBNZW1iZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5R3JvdXBNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBhbGwgc3lzdGVtIHVzZXJzCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBhbGwgdXNlcnMgd2hvIGFyZSBvd25lciBvciBydyBpbiB0aGUgcXVldWUgZ3JvdXAKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15ICRHSUQgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRLZXlNZW1iZXIgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn0gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skS2V5TWVtYmVyfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnT3duZXInLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4geyAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0UmVzcG9uc2libGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1Jlc3BvbnNpYmxlQWxsfSApIHsKICAgICAgICBteSBAVXNlcklEcyA9ICRUaWNrZXRPYmplY3QtPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRLZXlHcm91cE1lbWJlciAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVUlEIChAVXNlcklEcykgewogICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRLZXlHcm91cE1lbWJlciApIHsKICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBbGxHcm91cHNNZW1iZXJzeyRLZXlHcm91cE1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGFsbCBzeXN0ZW0gdXNlcnMKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IGFsbCB1c2VycyB3aG8gYXJlIHJlc3BvbnNpYmxlIG9yIHJ3IGluIHRoZSBxdWV1ZSBncm91cAogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgbXkgJEdJRCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEtleU1lbWJlciAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkQWxsR3JvdXBzTWVtYmVyc3skS2V5TWVtYmVyfSApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1c2UgZGVmYXVsdCBRdWV1ZSBpZiBub25lIGlzIHByb3ZpZGVkCiAgICAkUGFyYW17UXVldWVJRH0gPSAkUGFyYW17UXVldWVJRH0gfHwgMTsKCiAgICAjIGdldCBwcmlvcml0eQogICAgbXkgJVByaW9yaXRpZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVQcmlvcml0aWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVUeXBlOwp9CgpzdWIgX0dldFNlcnZpY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2U7CgogICAgIyB1c2UgZGVmYXVsdCBRdWV1ZSBpZiBub25lIGlzIHByb3ZpZGVkCiAgICAkUGFyYW17UXVldWVJRH0gPSAkUGFyYW17UXVldWVJRH0gfHwgMTsKCiAgICAjIGdldCBvcHRpb25zIGZvciBkZWZhdWx0IHNlcnZpY2VzIGZvciB1bmtub3duIGN1c3RvbWVycwogICAgbXkgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgY2hlY2sgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2VsZWN0ZWQKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMCBsZWF2ZSBDdXN0b21lclVzZXJJRCBlbXB0eSwgaXQgd2lsbCBub3QgZ2V0IGFueSBzZXJ2aWNlcwogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAxIHNldCBDdXN0b21lclVzZXJJRCB0byBnZXQgZGVmYXVsdCBzZXJ2aWNlcwogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlIGlmIG5vbmUgaXMgcHJvdmlkZWQKICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRQYXJhbXtRdWV1ZUlEfSB8fCAxOwoKICAgICMgZ2V0IHNlcnZpY2VzIGlmIHRoZXkgd2VyZSBub3QgZGV0ZXJtaW5lZCBpbiBhbiBBSkFYIGNhbGwKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1NlcnZpY2VzfSApIHsKICAgICAgICAkUGFyYW17U2VydmljZXN9ID0gJFNlbGYtPl9HZXRTZXJ2aWNlcyglUGFyYW0pOwogICAgfQoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQTsKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gJiYgJFBhcmFte1NlcnZpY2VzfSAmJiAleyAkUGFyYW17U2VydmljZXN9IH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZXN9LT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0VG9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjaGVjayBvd24gc2VsZWN0aW9uCiAgICBteSAlTmV3VG9zOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJykgKSB7CiAgICAgICAgJU5ld1RvcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgU2VsZWN0aW9uVHlwZSBRdWV1ZSBvciBTeXN0ZW1BZGRyZXNzPwogICAgICAgIG15ICVUb3M7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgICAgICVUb3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPk1vdmVMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVG9zID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc1F1ZXVlTGlzdCgpOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3JlYXRlIHBlcm1pc3Npb24gcXVldWVzCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICApOwoKICAgICAgICBteSAkU3lzdGVtQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyk7CiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAgICAgIyBidWlsZCBzZWxlY3Rpb24gc3RyaW5nCiAgICAgICAgUVVFVUVJRDoKICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJVRvcyApIHsKCiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgUVVFVUVJRCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uU3RyaW5nJykKICAgICAgICAgICAgICAgIHx8ICc8UmVhbG5hbWU+IDw8RW1haWw+PiAtIFF1ZXVlOiA8UXVldWU+JzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZT4vJFF1ZXVlRGF0YXtOYW1lfS9nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlQ29tbWVudD4vJFF1ZXVlRGF0YXtDb21tZW50fS9nOwoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgIGlmICggISRRdWV1ZURhdGF7Q29tbWVudH0gKSB7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHN7XHMrXHp9e307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBuZSAnUXVldWUnICkgewogICAgICAgICAgICAgICAgbXkgJVN5c3RlbUFkZHJlc3NEYXRhID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFRvc3skUXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxSZWFsbmFtZT4vJFN5c3RlbUFkZHJlc3NEYXRhe1JlYWxuYW1lfS9nOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxFbWFpbD4vJFN5c3RlbUFkZHJlc3NEYXRhe05hbWV9L2c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5ld1Rvc3skUXVldWVJRH0gPSAkU3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBlbXB0eSBzZWxlY3Rpb24KICAgICROZXdUb3N7Jyd9ID0gJy0nOwoKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9HZXRTaWduYXR1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHByZXBhcmUgc2lnbmF0dXJlCiAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKICAgIG15ICRTaWduYXR1cmUgICAgICAgICA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgIERhdGEgICAgPT4gXCVQYXJhbSwKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRTaWduYXR1cmU7Cn0KCnN1YiBfR2V0VGltZVVuaXRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEFjY291bnRlZFRpbWUgPSAnJzsKCiAgICAjIEdldCBhY2NvdW50ZWQgdGltZSBpZiBBY2NvdW50VGltZSBjb25maWcgaXRlbSBpcyBlbmFibGVkLgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgJiYgZGVmaW5lZCAkUGFyYW17QXJ0aWNsZUlEfSApIHsKICAgICAgICAkQWNjb3VudGVkVGltZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QXJ0aWNsZUFjY291bnRlZFRpbWVHZXQoCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkQWNjb3VudGVkVGltZSA/ICRBY2NvdW50ZWRUaW1lIDogJyc7Cn0KCnN1YiBfR2V0U3RhbmRhcmRUZW1wbGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVGVtcGxhdGVzOwogICAgbXkgJFF1ZXVlSUQgPSAkUGFyYW17UXVldWVJRH0gfHwgJyc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUXVldWVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgaWYgKCAhJFF1ZXVlSUQgKSB7CiAgICAgICAgbXkgJFVzZXJEZWZhdWx0UXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlVzZXJEZWZhdWx0UXVldWUnKSB8fCAnJzsKCiAgICAgICAgaWYgKCRVc2VyRGVmYXVsdFF1ZXVlKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFVzZXJEZWZhdWx0UXVldWUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFF1ZXVlSUQgJiYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgaWYgKCAhJFF1ZXVlSUQgJiYgJFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgIyBnZXQgUXVldWVJRCBmcm9tIHRoZSB0aWNrZXQKICAgICAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRRdWV1ZUlEID0gJFRpY2tldHtRdWV1ZUlEfSB8fCAnJzsKICAgIH0KCiAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfSApOwoKICAgICMgcmV0dXJuIGp1c3QgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBzY3JlZW4KICAgIHJldHVybiAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfTsKfQoKc3ViIF9NYXNrRW1haWxOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgc2V0IEpTIGRhdGEKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJTZWFyY2gnLAogICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgU2hvd0N1c3RvbWVyVGlja2V0cyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlNob3dDdXN0b21lclRpY2tldHMnKSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtIaWRlQXV0b3NlbGVjdGVkfSApIHsKCiAgICAgICAgIyBhZGQgQXV0b3NlbGVjdCBKUwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTT25Eb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBDb2RlID0+ICJDb3JlLkZvcm0uSW5pdEhpZGVBdXRvc2VsZWN0ZWQoeyBGaWVsZElEczogJFBhcmFte0hpZGVBdXRvc2VsZWN0ZWR9IH0pOyIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHN0cmluZwogICAgJFBhcmFte09wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtVc2Vyc30sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtVc2VyU2VsZWN0ZWR9LAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIEZvcm1VcGRhdGUnLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICk7CgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICRQYXJhbXtOZXh0U3RhdGVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRQYXJhbXtOZXh0U3RhdGVzfSwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnTW9kZXJuaXplIEZvcm1VcGRhdGUnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRQYXJhbXtOZXh0U3RhdGV9IHx8ICRDb25maWctPntTdGF0ZURlZmF1bHR9LAogICAgKTsKCiAgICAjIGJ1aWxkIERlc3RpbmF0aW9uIHN0cmluZwogICAgbXkgJU5ld1RvOwogICAgaWYgKCAkUGFyYW17RnJvbUxpc3R9ICkgewogICAgICAgIGZvciBteSAkS2V5RnJvbSAoIHNvcnQga2V5cyAleyAkUGFyYW17RnJvbUxpc3R9IH0gKSB7CiAgICAgICAgICAgICROZXdUb3siJEtleUZyb218fCRQYXJhbXtGcm9tTGlzdH0tPnskS2V5RnJvbX0ifSA9ICRQYXJhbXtGcm9tTGlzdH0tPnskS2V5RnJvbX07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhJFBhcmFte0Zyb21TZWxlY3RlZH0gKSB7CiAgICAgICAgbXkgJFVzZXJEZWZhdWx0UXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlVzZXJEZWZhdWx0UXVldWUnKSB8fCAnJzsKCiAgICAgICAgaWYgKCRVc2VyRGVmYXVsdFF1ZXVlKSB7CiAgICAgICAgICAgIG15ICRRdWV1ZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkVXNlckRlZmF1bHRRdWV1ZSApOwogICAgICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtGcm9tU2VsZWN0ZWR9ID0gIiRRdWV1ZUlEfHwkVXNlckRlZmF1bHRRdWV1ZSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgJFBhcmFte0Zyb21TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgICAgICBDbGFzcyAgICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplIEZvcm1VcGRhdGUgJyAuICggJFBhcmFte0Vycm9yc30tPntEZXN0aW5hdGlvbkludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJU5ld1RvLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJFBhcmFte0Zyb21TZWxlY3RlZH0sCiAgICAgICAgICAgIE9uQ2hhbmdlU3VibWl0ID0+IDAsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtGcm9tU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSBGb3JtVXBkYXRlICcgLiAoICRQYXJhbXtFcnJvcnN9LT57RGVzdGluYXRpb25JbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte0Zyb21TZWxlY3RlZH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN1c3RvbWVyIGluZm8gc3RyaW5nCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclRhYmxlfSA9ICRMYXlvdXRPYmplY3QtPkFnZW50Q3VzdG9tZXJWaWV3VGFibGUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0N1c3RvbWVyRGF0YX0sCiAgICAgICAgICAgIE1heCAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlTWF4U2l6ZScpLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyVGFibGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgZXJyb3JzIQogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgbXkgJEtleUVycm9yICggc29ydCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskS2V5RXJyb3J9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkUGFyYW17RXJyb3JzfS0+eyRLZXlFcnJvcn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBGcm9tIGV4dGVybmFsCiAgICBteSAkU2hvd0Vycm9ycyA9IDE7CiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9ICYmCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LT57RW1haWx9ICYmCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LT57Q3VzdG9tZXJ9CiAgICAgICAgKQogICAgewogICAgICAgICRTaG93RXJyb3JzID0gMDsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRnJvbUV4dGVybmFsQ3VzdG9tZXInLAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnRGF0YUVtYWlsJywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0VtYWlsfSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0RhdGFDdXN0b21lcicsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0tPntDdXN0b21lcn0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENjCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyQ2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckNjfSB9ICkgewogICAgICAgICAgICBpZiAoICEkU2hvd0Vycm9ycyApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBlbXB0eSB2YWx1ZXMgZm9yIGVycm9ycwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yfSAgICA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckRpc2FibGVkfSA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NDdXN0b21lckVycm9yRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckNjICkgewogICAgICAgICRQYXJhbXtDY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBCY2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9IH0gKSB7CiAgICAgICAgICAgIGlmICggISRTaG93RXJyb3JzICkgewoKICAgICAgICAgICAgICAgICMgc2V0IGVtcHR5IHZhbHVlcyBmb3IgZXJyb3JzCiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRGlzYWJsZWR9ID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9ID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY0N1c3RvbWVyRXJyb3JFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckJjYyApIHsKICAgICAgICAkUGFyYW17QmNjQ3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckJjYysrLAogICAgICAgIH0sCiAgICApOwoKICAgICMgVG8KICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9IH0gKSB7CiAgICAgICAgICAgIGlmICggISRTaG93RXJyb3JzICkgewoKICAgICAgICAgICAgICAgICMgc2V0IGVtcHR5IHZhbHVlcyBmb3IgZXJyb3JzCiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRGlzYWJsZWR9ID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9ID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckVycm9yRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXIrKywKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtUb0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e1RvRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnVG9TZXJ2ZXJFcnJvck1zZycgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0Vycm9yc30tPntUb0Vycm9yVHlwZX0gfHwgISRTaG93RXJyb3JzICkgewogICAgICAgICRQYXJhbXtUb0ludmFsaWR9ID0gJyc7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntDY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NjU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtFcnJvcnN9LT57Q2NFcnJvclR5cGV9IHx8ICEkU2hvd0Vycm9ycyApIHsKICAgICAgICAkUGFyYW17Q2NJbnZhbGlkfSA9ICcnOwogICAgfQoKICAgIGlmICggJFBhcmFte0JjY0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e0JjY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JjY1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17RXJyb3JzfS0+e0JjY0Vycm9yVHlwZX0gfHwgISRTaG93RXJyb3JzICkgewogICAgICAgICRQYXJhbXtCY2NJbnZhbGlkfSA9ICcnOwogICAgfQoKICAgICMgYnVpbGQgdHlwZSBzdHJpbmcKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplIEZvcm1VcGRhdGUgJyAuICggJFBhcmFte0Vycm9yc30tPntUeXBlSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17VHlwZXN9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgc2VydmljZSBzdHJpbmcKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICA9PiAkUGFyYW17U2VydmljZXN9LAogICAgICAgICAgICBOYW1lICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZSBGb3JtVXBkYXRlICcKICAgICAgICAgICAgICAgIC4gKCAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gPyAnVmFsaWRhdGVfUmVxdWlyZWQgJyA6ICcnICkKICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17RXJyb3JzfS0+e1NlcnZpY2VJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+ICRUcmVlVmlldywKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuZGF0b3J5ID0+ICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtTTEFzfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBGb3JtVXBkYXRlICcKICAgICAgICAgICAgICAgIC4gKCAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSA/ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIDogJycgKQogICAgICAgICAgICAgICAgLiAoICRQYXJhbXtFcnJvcnN9LT57U0xBSW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTTEEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNMQU1hbmRhdG9yeSA9PiAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiBleGlzdHMgY3JlYXRlIHRlbXBsYXRlcyByZWdhcmRsZXNzIHRoZSBxdWV1ZQogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKS0+U3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICBUeXBlICA9PiAnQ3JlYXRlJywKICAgICk7CgogICAgIyBidWlsZCB0ZXh0IHRlbXBsYXRlIHN0cmluZwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdGFuZGFyZFRlbXBsYXRlcyApICkgewogICAgICAgICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlc30gfHwge30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9IHx8ICcnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhbmRhcmRUZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHByaW9yaXR5IHN0cmluZwogICAgaWYgKCAhJFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICRQYXJhbXtQcmlvcml0eX0gPSAkQ29uZmlnLT57UHJpb3JpdHl9OwogICAgfQogICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdNb2Rlcm5pemUgRm9ybVVwZGF0ZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUGFyYW17UHJpb3JpdGllc30sCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgICA9PiAkUGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17UHJpb3JpdHl9LAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICk7CgogICAgbXkgJFF1aWNrRGF0ZUJ1dHRvbnMgPSAkQ29uZmlnLT57UXVpY2tEYXRlQnV0dG9uc30gLy8gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpEZWZhdWx0UXVpY2tEYXRlQnV0dG9ucycpOwoKICAgICMgcGVuZGluZyBkYXRhIHN0cmluZwogICAgJFBhcmFte1BlbmRpbmdEYXRlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAlUGFyYW0sCiAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgID0+IDAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgPT4gNSwKICAgICAgICBEaWZmVGltZSAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpIHx8IDAsCiAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntEYXRlSW52YWxpZH0gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAnICcsCiAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgICAgIFF1aWNrRGF0ZUJ1dHRvbnMgICAgID0+ICRRdWlja0RhdGVCdXR0b25zLAogICAgKTsKCiAgICAjIHNob3cgb3duZXIgc2VsZWN0aW9uCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3T3duZXJTZWxlY3Rpb24nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgcmVzcG9uc2libGUgc2VsZWN0aW9uCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1Jlc3BvbnNpYmxlU2VsZWN0aW9uJykKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LT57Jyd9ID0gJy0nOwogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZU9wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJTZWxlY3RlZH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgRm9ybVVwZGF0ZScsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGVTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlbmRlciBkeW5hbWljIGZpZWxkcwogICAgJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkR5bmFtaWNGaWVsZDo6TWFzaycpLT5FZGl0U2VjdGlvblJlbmRlcigKICAgICAgICBDb250ZW50ICAgICAgICAgICAgICA9PiAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSwKICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgRHluYW1pY0ZpZWxkVmFsdWVzICAgPT4gJFBhcmFte0R5bmFtaWNGaWVsZH0sCiAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBhcmFte0RGUG9zc2libGVWYWx1ZXN9LAogICAgICAgIEVycm9ycyAgICAgICAgICAgICAgID0+ICRQYXJhbXtERkVycm9yc30sCiAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgICAgPT4gJFBhcmFte1Zpc2liaWxpdHl9LAogICAgICAgIE9iamVjdCAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgICAgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkfS0+JSosCiAgICAgICAgfSwKICAgICk7CgogICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBTaG93IHRoZSBjdXN0b21lciB1c2VyIGFkZHJlc3MgYm9vayBpZiB0aGUgbW9kdWxlIGlzIHJlZ2lzdGVyZWQuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRDdXN0b21lclVzZXJBZGRyZXNzQm9va30gKSB7CiAgICAgICAgJFBhcmFte09wdGlvbkN1c3RvbWVyVXNlckFkZHJlc3NCb29rfSA9IDE7CiAgICB9CgogICAgIyBzaG93IGN1c3RvbWVyIGVkaXQgbGluawogICAgbXkgJE9wdGlvbkN1c3RvbWVyID0gJExheW91dE9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBBY3Rpb24gPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICk7CgogICAgbXkgJFNob3duT3B0aW9uc0Jsb2NrOwoKICAgIGlmICgkT3B0aW9uQ3VzdG9tZXIpIHsKCiAgICAgICAgIyBjaGVjayBpZiBuZWVkIHRvIGNhbGwgT3B0aW9ucyBibG9jawogICAgICAgIGlmICggISRTaG93bk9wdGlvbnNCbG9jayApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRPcHRpb25zJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBmbGFnIHRvICJ0cnVlIiBpbiBvcmRlciB0byBwcmV2ZW50IGNhbGxpbmcgdGhlIE9wdGlvbnMgYmxvY2sgYWdhaW4KICAgICAgICAgICAgJFNob3duT3B0aW9uc0Jsb2NrID0gMTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPcHRpb25DdXN0b21lcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBleHBsYW5hdG9yeSBtZXNzYWdlIGFib3V0IGFzdGVyaXNrCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXN0ZXJpc2tFeHBsYW5hdGlvbicpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBc3Rlcmlza0V4cGxhbmF0aW9uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRFbWFpbCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0KICAgICk7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentTicketEmailOutbound.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiMjllZmMyNTBkMTZkYzM0NWUwMGY1MTFjZjkwNDUwOWJjZDM1ZDdjIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEVtYWlsT3V0Ym91bmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgojIGNvcmUgbW9kdWxlcwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7JVBhcmFtfSwgJFR5cGU7CgogICAgIyBUcnkgdG8gbG9hZCBkcmFmdCBpZiByZXF1ZXN0ZWQuCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e0Zvcm1EcmFmdH0KICAgICAgICAmJiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnTG9hZEZvcm1EcmFmdCcgKQogICAgICAgICYmICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRJRCcgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+TG9hZEZvcm1EcmFmdCgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdElEJyApLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkTGlzdCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgbXkgJERlZmluaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpNYXNrJyktPkRlZmluaXRpb25HZXQoCiAgICAgICAgTWFzayA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICApIHx8IHt9OwoKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfSAgID0gW107CiAgICAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSA9ICREZWZpbml0aW9uLT57TWFza307CgogICAgIyBhbGlnbiBzeXNjb25maWcgYW5kIHRpY2tldCBtYXNrIGRhdGEgSQogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyAkRHluYW1pY0ZpZWxkTGlzdCAvLyBbXSB9ICkgewogICAgICAgIGlmICggZXhpc3RzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc317ICREeW5hbWljRmllbGQtPntOYW1lfSB9ICkgewogICAgICAgICAgICBteSAkUGFyYW1ldGVycyA9IGRlbGV0ZSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSAvLyB7fTsKCiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAkUGFyYW1ldGVycy0+JSogKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57JEF0dHJpYnV0ZX0gPSAkUGFyYW1ldGVycy0+eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoICRTZWxmLT57TWFza0RlZmluaXRpb259LT5AKiwgewogICAgICAgICAgICAgICAgREYgICAgICAgID0+ICREeW5hbWljRmllbGQtPntOYW1lfSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPT0gMiA/IDEgOiAwLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGQtPntNYW5kYXRvcnl9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVzaCAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPkAqLCAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgICMgYWxpZ24gc3lzY29uZmlnIGFuZCB0aWNrZXQgbWFzayBkYXRhIElJCiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCBrZXlzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc30tPiUqICkgewogICAgICAgIHB1c2ggJFNlbGYtPntEeW5hbWljRmllbGR9LT5AKiwgJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROYW1lLAogICAgICAgICk7CgogICAgICAgIG15ICRQYXJhbWV0ZXJzID0gJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXskRHluYW1pY0ZpZWxkTmFtZX0gLy8ge307CgogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAkUGFyYW1ldGVycy0+JSogKSB7CiAgICAgICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfVstMV17JEF0dHJpYnV0ZX0gPSAkUGFyYW1ldGVycy0+eyRBdHRyaWJ1dGV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+UHJlcGFyZUZvcm1JRCgKICAgICAgICBQYXJhbU9iamVjdCAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLAogICAgICAgIExheW91dE9iamVjdCA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyksCiAgICApOwoKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9ucyA9ICggMSA9PiAkU2VsZi0+e0FjdGlvbn0gKTsKCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGZldGNoIHRoZSBhY3R1YWwgYWNsIGFjdGlvbiBkYXRhCiAgICBteSAlQWNsQWN0aW9uID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICBpZiAoJEFDTCkgewoKICAgICAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICAgICAjIHNob3cgZXJyb3Igc2NyZWVuIGlmIEFDTCBwcm9oaWJpdHMgdGhpcyBhY3Rpb24KICAgICAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KICAgIH0KCiAgICAjIENoZWNrIGZvciBmYWlsZWQgZHJhZnQgbG9hZGluZyByZXF1ZXN0LgogICAgaWYgKAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdMb2FkRm9ybURyYWZ0JyApCiAgICAgICAgJiYgISRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0xvYWRpbmcgZHJhZnQgZmFpbGVkIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VuZEVtYWlsJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT5TZW5kRW1haWwoKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlVGVtcGxhdGUnICkgewoKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgZm9yIG15ICRLZXkgKAogICAgICAgICAgICBxdygKICAgICAgICAgICAgICAgIE5ld1N0YXRlSUQgTmV3UHJpb3JpdHlJRCBUaW1lVW5pdHMgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgVGl0bGUgQm9keSBTdWJqZWN0IE5ld1F1ZXVlSUQKICAgICAgICAgICAgICAgIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlIE5ld093bmVySUQgTmV3T3duZXJUeXBlIE9sZE93bmVySUQgTmV3UmVzcG9uc2libGVJRAogICAgICAgICAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBFeHBhbmQgUmVwbHlUb0FydGljbGUgU3RhbmRhcmRUZW1wbGF0ZUlEIENyZWF0ZUFydGljbGUKICAgICAgICAgICAgICAgIEVsZW1lbnRDaGFuZ2VkCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVRpY2tldCAgICAgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFRpY2tldHtDdXN0b21lclVzZXJJRH07CiAgICAgICAgbXkgJFF1ZXVlSUQgICAgICA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBnZXQgY29uZmlnIGZvciBmcm9udGVuZCBtb2R1bGUKICAgICAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAgICAgbXkgJE5leHRTdGF0ZXMgPSAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXN9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFRlbXBsYXRlQUpBWDsKCiAgICAgICAgIyBnZXQgdXBsb2FkIGNhY2hlIG9iamVjdAogICAgICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgICAgICMgdXBkYXRlIHRpY2tldCBib2R5IGFuZCBhdHRhY2htZW50cyBpZiBuZWVkZWQuCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTdGFuZGFyZFRlbXBsYXRlSUQnICkgewogICAgICAgICAgICBteSBAVGlja2V0QXR0YWNobWVudHM7CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZVRleHQ7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgVXBsb2FkIGNhY2hlCiAgICAgICAgICAgIG15ICRSZW1vdmVTdWNjZXNzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUmVtb3ZlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZvcm0gYXR0YWNobWVudHMgY291bGQgbm90IGJlIGRlbGV0ZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wbGF0ZSB0ZXh0IGFuZCBzZXQgbmV3IGF0dGFjaG1lbnRzIGlmIGEgdGVtcGxhdGUgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CgogICAgICAgICAgICBpZiAoIElzUG9zaXRpdmVJbnRlZ2VyKCAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSApICkgewoKICAgICAgICAgICAgICAgICMgc2V0IHRlbXBsYXRlIHRleHQsIHJlcGxhY2Ugc21hcnQgdGFncyAobGltaXRlZCBhcyB0aWNrZXQgaXMgbm90IGNyZWF0ZWQpCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVUZXh0ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5UZW1wbGF0ZSgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIFN0ZEF0dGFjaG1lbnRPYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIHRpY2tldAogICAgICAgICAgICAgICAgbXkgJUFsbFN0ZEF0dGFjaG1lbnRzID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yIG15ICRJRCAoIHNvcnQga2V5cyAlQWxsU3RkQXR0YWNobWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzRGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50R2V0KCBJRCA9PiAkSUQgKTsKICAgICAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAlQXR0YWNobWVudHNEYXRhLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZW5kIGEgbGlzdCBvZiBhdHRhY2htZW50cyBpbiB0aGUgdXBsb2FkIGNhY2hlIGJhY2sgdG8gdGhlIGNsaWVudCBzaWRlIEphdmFTY3JpcHQKICAgICAgICAgICAgICAgICMgd2hpY2ggcmVuZGVycyB0aGVuIHRoZSBsaXN0IG9mIGN1cnJlbnRseSB1cGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgQFRpY2tldEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAVGlja2V0QXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSA9ICRMYXlvdXRPYmplY3QtPkh1bWFuUmVhZGFibGVEYXRhU2l6ZSgKICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9PiAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEdldCB0aGUgZmlyc3QgYXJ0aWNsZSBvZiB0aGUgdGlja2V0LgogICAgICAgICAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgICAgICAgICAgbXkgQE1ldGFBcnRpY2xlcyAgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgT25seUZpcnN0ID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVBcnRpY2xlID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyAkTWV0YUFydGljbGVzWzBdIH0gKS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgICV7ICRNZXRhQXJ0aWNsZXNbMF0gfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBtYXRjaGluZyBzaWduYXR1cmUgZm9yIHRoZSBjdXJyZW50IHVzZXIKICAgICAgICAgICAgbXkgJFNpZ25hdHVyZSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBEYXRhICAgICAgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYXBwZW5kIHRoZSBzaWduYXR1cmUgdG8gdGhlIGJvZHkgdGV4dAogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZVRleHQgLiAnPGJyPjxicj4nIC4gJFNpZ25hdHVyZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVUZXh0IC4gIlxuXG4iIC4gJFNpZ25hdHVyZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCA9ICgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VUZW1wbGF0ZU5vdGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJzAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkVGVtcGxhdGVUZXh0IHx8ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnVGlja2V0QXR0YWNobWVudHMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFxAVGlja2V0QXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAgICAgS2VlcERhdGEgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICROZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+ICRDb25maWctPntTdGF0ZURlZmF1bHR9ID8gMCA6IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCwKICAgICAgICAgICAgXSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPkFqYXhVcGRhdGUoKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0gKSB7CiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT5TZW5kRW1haWwoKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+Rm9ybSgpOwogICAgfQoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgRm9ybSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVFcnJvcjsKICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIEFDTCBjb21wYXRpYmlsaXR5IHRyYW5zbGF0aW9uCiAgICAkQUNMQ29tcGF0R2V0UGFyYW17TmV4dFN0YXRlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05leHRTdGF0ZUlEJyApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0dvdCBubyBUaWNrZXRJRCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1N5c3RlbSBFcnJvciEnKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkVGlja2V0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgfQoKICAgIG15ICVHZXRQYXJhbUV4dGVuZGVkID0gJFNlbGYtPl9HZXRFeHRlbmRlZFBhcmFtcygpOwoKICAgIG15ICVHZXRQYXJhbSAgICAgICAgICAgID0gJXsgJEdldFBhcmFtRXh0ZW5kZWR7R2V0UGFyYW19IH07CiAgICBteSBATXVsdGlwbGVDdXN0b21lciAgICA9IEB7ICRHZXRQYXJhbUV4dGVuZGVke011bHRpcGxlQ3VzdG9tZXJ9IH07CiAgICBteSBATXVsdGlwbGVDdXN0b21lckNjICA9IEB7ICRHZXRQYXJhbUV4dGVuZGVke011bHRpcGxlQ3VzdG9tZXJDY30gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQmNjID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lckJjY30gfTsKCiAgICAjIGdldCBsb2NrIHN0YXRlCiAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CgogICAgICAgICAgICBteSAkTG9jayA9ICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRMb2NrKSB7CgogICAgICAgICAgICAgICAgIyBTZXQgbmV3IG93bmVyIGlmIHRpY2tldCBvd25lciBpcyBkaWZmZXJlbnQgdGhlbiBsb2dnZWQgdXNlci4KICAgICAgICAgICAgICAgIGlmICggJFRpY2tldHtPd25lcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgcHJldmlvdXMgb3duZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXN0b3JlIHRpY2tldCBvd25lciBvbiB1bmRvIGFjdGlvbi4KICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJldmlvdXNPd25lcn0gPSAkVGlja2V0e093bmVySUR9OwoKICAgICAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBTaG93IGxvY2sgc3RhdGUuCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRUaWNrZXRPYmplY3QtPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4gJycsCiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSB0aWNrZXQgb3duZXIgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicpLAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgc2VsZWN0ZWQgb3IgbGFzdCBjdXN0b21lciBhcnRpY2xlLgogICAgbXkgJURhdGE7CiAgICBpZiAoICRHZXRQYXJhbXtBcnRpY2xlSUR9ICkgewogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgKTsKICAgICAgICAlRGF0YSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgaWYgYXJ0aWNsZSBpcyBmcm9tIHRoZSBzYW1lIFRpY2tldElEIGFzIHdlIGNoZWNrZWQgcGVybWlzc2lvbnMgZm9yLgogICAgICAgIGlmICggJERhdGF7VGlja2V0SUR9IG5lICRTZWxmLT57VGlja2V0SUR9ICkgewoKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdBcnRpY2xlIGRvZXMgbm90IGJlbG9uZyB0byB0aWNrZXQgJXMhJywgJFNlbGYtPntUaWNrZXRJRH0gKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBHZXQgbGFzdCBjdXN0b21lciBhcnRpY2xlLgogICAgICAgIG15IEBNZXRhQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFNlbmRlclR5cGUgPT4gJ2N1c3RvbWVyJywKICAgICAgICAgICAgT25seUxhc3QgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmIChATWV0YUFydGljbGVzKSB7CiAgICAgICAgICAgICVEYXRhID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyAkTWV0YUFydGljbGVzWzBdIH0gKS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgJXsgJE1ldGFBcnRpY2xlc1swXSB9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgc2lnbmF0dXJlCiAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKICAgICREYXRhe1NpZ25hdHVyZX0gPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNpZ25hdHVyZSgKICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZUlEID0+ICREYXRhe0FydGljbGVJRH0sCiAgICAgICAgRGF0YSAgICAgID0+IFwlRGF0YSwKICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICRHZXRQYXJhbXtFbWFpbFRlbXBsYXRlSUR9ICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZQogICAgICAgICREYXRhe1N0ZFRlbXBsYXRlfSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCAgPT4gJERhdGF7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17RW1haWxUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNpZ25hdHVyZQogICAgICAgICREYXRhe1NpZ25hdHVyZX0gPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNpZ25hdHVyZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIERhdGEgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBlbXB0eSB0aGUgYm9keSBmb3IgcHJlcGFyYXRpb24KICAgICREYXRhe0JvZHl9ID0gJyc7CgogICAgIyBwcmVwYXJlIGJvZHkgZm9yIHJpY2h0ZXh0IG9yIHBsYWludGV4dCBjb250ZW50CiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIGFkZCB0aGUgdGVtcAogICAgICAgIGlmICggJEdldFBhcmFte0VtYWlsVGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICREYXRhe0JvZHl9ID0gJERhdGF7U3RkVGVtcGxhdGV9IC4gJzxici8+JyAuICREYXRhe0JvZHl9OwogICAgICAgIH0KCiAgICAgICAgJERhdGF7Qm9keX0gPSAkRGF0YXtCb2R5fSAuICREYXRhe1NpZ25hdHVyZX07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBhZGQgdGhlIHRlbXAKICAgICAgICBpZiAoICRHZXRQYXJhbXtFbWFpbFRlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICREYXRhe1N0ZFRlbXBsYXRlfSAuICJcbiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICB9CgogICAgICAgICREYXRhe0JvZHl9ID0gJERhdGF7Qm9keX0gLiAkRGF0YXtTaWduYXR1cmV9OwoKICAgICAgICAjIHByZXBhcmUgYm9keSBmb3IgcGxhaW4gdGV4dAogICAgICAgICREYXRhe0JvZHl9ID1+IHMvXHQvIC9nOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50Jyk7CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byBlbWFpbAogICAgaWYgKCAkR2V0UGFyYW17RW1haWxUZW1wbGF0ZUlEfSApIHsKICAgICAgICBteSAlQWxsU3RkQXR0YWNobWVudHMgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte0VtYWlsVGVtcGxhdGVJRH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJElEICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzRGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50R2V0KCBJRCA9PiAkSUQgKTsKICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICVBdHRhY2htZW50c0RhdGEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgIG15IEBBdHRhY2htZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHNvbWUgdmFsdWVzCiAgICBmb3IgbXkgJFJlY2lwaWVudCAocXcoVG8gQ2MgQmNjIFN1YmplY3QpKSB7CiAgICAgICAgaWYgKCAkRGF0YXskUmVjaXBpZW50fSApIHsKICAgICAgICAgICAgZGVsZXRlICREYXRheyRSZWNpcGllbnR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHB1dCAmIGdldCBhdHRyaWJ1dGVzIGxpa2Ugc2VuZGVyIGFkZHJlc3MKICAgICVEYXRhID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5BdHRyaWJ1dGVzKAogICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgRGF0YSAgICAgID0+IFwlRGF0YSwKICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIHByZXBhcmUgdGhlIHN1YmplY3QKICAgICREYXRhe1N1YmplY3R9ID1+IHN7IFxBICg/OiAuKj8gOiBccyopIH17fXhtczsKCiAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgIGlmICggcmVmKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICMgdXNlIHRpY2tldCBRdWV1ZUlEIGluIGNvbXBvc2UgbW9kdWxlcwogICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIERlYnVnID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJE5ld1BhcmFtcyA9ICRPYmplY3QtPlJ1biggJURhdGEsICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICBpZiAoJE5ld1BhcmFtcykgewogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJE5ld1BhcmFtczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZXJyb3JzCiAgICAgICAgICAgICVFcnJvciA9ICggJUVycm9yLCAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGQgdmFsaWRhdGlvbiByZXN1bHRzIGlmIGVycm9uZW91cwogICAgbXkgJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzOwoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPkAqICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICApOwoKICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJER5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKICAgIH0KCiAgICAjIGV4dHJhY3QgZHluYW1pYyBmaWVsZCB2YWx1ZXMgZnJvbSB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldERGVmFsdWVzID0KICAgICAgICBtYXAgIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8tPntOYW1lfSA9PiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkXy0+e05hbWV9IH0gfQogICAgICAgIGdyZXAgeyAkXy0+e09iamVjdFR5cGV9IGVxICdUaWNrZXQnIH0KICAgICAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPkAqOwoKICAgICMgYnVpbGQgdmlldwogICAgIyBzdGFydCB3aXRoIHBhZ2UKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICk7CgogICAgIyBJbmZvcm0gYSB1c2VyIHRoYXQgYXJ0aWNsZSBzdWJqZWN0IHdpbGwgYmUgZW1wdHkgaWYgY29udGFpbnMgb25seSB0aGUgdGlja2V0IGhvb2sgKGlmIG5vdGhpbmcgaXMgbW9kaWZpZWQpLgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgRGF0YSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0FydGljbGUgc3ViamVjdCB3aWxsIGJlIGVtcHR5IGlmIHRoZSBzdWJqZWN0IGNvbnRhaW5zIG9ubHkgdGhlIHRpY2tldCBob29rIScpLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICBUaWNrZXROdW1iZXIgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVGl0bGUgICAgICAgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgQ3VzdG9tZXJJRCAgICAgPT4gJFRpY2tldHtDdXN0b21lcklEfSwKICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIE5leHRTdGF0ZXMgICAgID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgKSwKICAgICAgICBUaW1lVW5pdHNSZXF1aXJlZCA9PiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICA/ICdWYWxpZGF0ZV9SZXF1aXJlZCcKICAgICAgICAgICAgOiAnJwogICAgICAgICksCiAgICAgICAgRXJyb3JzICAgICAgICAgICAgICA9PiBcJUVycm9yLAogICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgIE11bHRpcGxlQ3VzdG9tZXJDYyAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgTXVsdGlwbGVDdXN0b21lckJjYyA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgQXR0YWNobWVudHMgICAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICVEYXRhLAogICAgICAgICVHZXRQYXJhbSwKICAgICAgICBERlBvc3NpYmxlVmFsdWVzID0+IFwlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgREZWYWx1ZXMgICAgICAgICA9PiBcJVRpY2tldERGVmFsdWVzLAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBTZW5kRW1haWwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlRXJyb3I7CiAgICBteSAlQUNMQ29tcGF0R2V0UGFyYW07CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKCiAgICAjIEFDTCBjb21wYXRpYmlsaXR5IHRyYW5zbGF0aW9uCiAgICAkQUNMQ29tcGF0R2V0UGFyYW17TmV4dFN0YXRlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05leHRTdGF0ZUlEJyApOwoKICAgIG15ICVHZXRQYXJhbUV4dGVuZGVkID0gJFNlbGYtPl9HZXRFeHRlbmRlZFBhcmFtcygpOwoKICAgIG15ICVHZXRQYXJhbSAgICAgICAgICAgID0gJXsgJEdldFBhcmFtRXh0ZW5kZWR7R2V0UGFyYW19IH07CiAgICBteSBATXVsdGlwbGVDdXN0b21lciAgICA9IEB7ICRHZXRQYXJhbUV4dGVuZGVke011bHRpcGxlQ3VzdG9tZXJ9IH07CiAgICBteSBATXVsdGlwbGVDdXN0b21lckNjICA9IEB7ICRHZXRQYXJhbUV4dGVuZGVke011bHRpcGxlQ3VzdG9tZXJDY30gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQmNjID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lckJjY30gfTsKCiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIEdldCBhbmQgdmFsaWRhdGUgZHJhZnQgYWN0aW9uLgogICAgbXkgJEZvcm1EcmFmdEFjdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRBY3Rpb24nICk7CiAgICBpZiAoICRGb3JtRHJhZnRBY3Rpb24gJiYgISRDb25maWctPntGb3JtRHJhZnR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0Zvcm1EcmFmdCBmdW5jdGlvbmFsaXR5IGRpc2FibGVkIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAlRm9ybURyYWZ0UmVzcG9uc2U7CgogICAgIyBDaGVjayBkcmFmdCBuYW1lLgogICAgaWYgKAogICAgICAgICRGb3JtRHJhZnRBY3Rpb24KICAgICAgICAmJiAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0FkZCcgfHwgJEZvcm1EcmFmdEFjdGlvbiBlcSAnVXBkYXRlJyApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRUaXRsZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRUaXRsZScgKTsKCiAgICAgICAgIyBBIGRyYWZ0IG5hbWUgaXMgcmVxdWlyZWQuCiAgICAgICAgaWYgKCAhJFRpdGxlICkgewoKICAgICAgICAgICAgJUZvcm1EcmFmdFJlc3BvbnNlID0gKAogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoIkRyYWZ0IG5hbWUgaXMgcmVxdWlyZWQhIiksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENob3NlbiBkcmFmdCBuYW1lIG11c3QgYmUgdW5pcXVlLgogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkRm9ybURyYWZ0TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0TGlzdEdldCgKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgRFJBRlQ6CiAgICAgICAgICAgIGZvciBteSAkRm9ybURyYWZ0ICggQHskRm9ybURyYWZ0TGlzdH0gKSB7CgogICAgICAgICAgICAgICAgIyBObyBleGlzdGluZyBkcmFmdCB3aXRoIHNhbWUgbmFtZS4KICAgICAgICAgICAgICAgIG5leHQgRFJBRlQgaWYgJFRpdGxlIG5lICRGb3JtRHJhZnQtPntUaXRsZX07CgogICAgICAgICAgICAgICAgIyBTYW1lIG5hbWUgZm9yIHVwZGF0ZSBvbiBleGlzdGluZyBkcmFmdC4KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9CiAgICAgICAgICAgICAgICAgICAgJiYgJEZvcm1EcmFmdEFjdGlvbiBlcSAnVXBkYXRlJwogICAgICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0gZXEgJEZvcm1EcmFmdC0+e0Zvcm1EcmFmdElEfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IERSQUZUOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgQW5vdGhlciBkcmFmdCB3aXRoIHRoZSBjaG9zZW4gbmFtZSBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgICAgICAgICVGb3JtRHJhZnRSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoICJGb3JtRHJhZnQgbmFtZSAlcyBpcyBhbHJlYWR5IGluIHVzZSEiLCAkVGl0bGUgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBsYXN0IERSQUZUOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgUGVyZm9ybSBkcmFmdCBhY3Rpb24gaW5zdGVhZCBvZiBzYXZpbmcgZm9ybSBkYXRhIGluIHRpY2tldC9hcnRpY2xlLgogICAgaWYgKCAkRm9ybURyYWZ0QWN0aW9uICYmICElRm9ybURyYWZ0UmVzcG9uc2UgKSB7CgogICAgICAgICMgUmVzZXQgRm9ybURyYWZ0SUQgdG8gcHJldmVudCB1cGRhdGluZyBleGlzdGluZyBkcmFmdC4KICAgICAgICBpZiAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0FkZCcgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSApIHsKCiAgICAgICAgICAgICMgbWVkZGxpbmcgd2l0aCB0aGUgaW5uYXJkcyBvZiBLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0CiAgICAgICAgICAgICRQYXJhbU9iamVjdC0+U2V0QXJyYXkoCiAgICAgICAgICAgICAgICBQYXJhbSAgPT4gJ0Zvcm1EcmFmdElEJywKICAgICAgICAgICAgICAgIFZhbHVlcyA9PiBbJyddCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRm9ybURyYWZ0QWN0aW9uT2s7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkRm9ybURyYWZ0QWN0aW9uIGVxICdBZGQnCiAgICAgICAgICAgIHx8CiAgICAgICAgICAgICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnVXBkYXRlJyAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEZvcm1EcmFmdEFjdGlvbk9rID0gJFBhcmFtT2JqZWN0LT5TYXZlRm9ybURyYWZ0KAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRm9ybURyYWZ0QWN0aW9uIGVxICdEZWxldGUnICYmICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0gKSB7CiAgICAgICAgICAgICRGb3JtRHJhZnRBY3Rpb25PayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0RGVsZXRlKAogICAgICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEdldFBhcmFte0Zvcm1EcmFmdElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkRm9ybURyYWZ0QWN0aW9uT2spIHsKICAgICAgICAgICAgJEZvcm1EcmFmdFJlc3BvbnNle1N1Y2Nlc3N9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVGb3JtRHJhZnRSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdDb3VsZCBub3QgcGVyZm9ybSByZXF1ZXN0ZWQgZHJhZnQgYWN0aW9uIScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICglRm9ybURyYWZ0UmVzcG9uc2UpIHsKCiAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiBcJUZvcm1EcmFmdFJlc3BvbnNlLAogICAgICAgICk7CgogICAgICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZEl0ZW0gKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZEl0ZW07CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIWRlZmluZWQgJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkSXRlbSB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKCiAgICBteSAlU3RhdGVEYXRhOwoKICAgIGlmICggJEdldFBhcmFte0NvbXBvc2VTdGF0ZUlEfSApIHsKICAgICAgICAlU3RhdGVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlR2V0KAogICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17Q29tcG9zZVN0YXRlSUR9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJE5leHRTdGF0ZSA9ICRTdGF0ZURhdGF7TmFtZX07CgogICAgIyBjaGVjayBwZW5kaW5nIGRhdGUKICAgIGlmICggZGVmaW5lZCAkU3RhdGVEYXRhe1R5cGVOYW1lfSAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgIyBjb252ZXJ0IHBlbmRpbmcgZGF0ZSB0byBhIGRhdGV0aW1lIG9iamVjdAogICAgICAgIG15ICRQZW5kaW5nRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFNlY29uZCA9PiAwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGN1cnJlbnQgc3lzdGVtIGVwb2NoCiAgICAgICAgbXkgJEN1clN5c3RlbURhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CgogICAgICAgIGlmICggISRQZW5kaW5nRGF0ZVRpbWVPYmplY3QgfHwgJFBlbmRpbmdEYXRlVGltZU9iamVjdCA8ICRDdXJTeXN0ZW1EYXRlVGltZU9iamVjdCApIHsKICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBUbwogICAgaWYgKCAhJEdldFBhcmFte1RvfSApIHsKICAgICAgICAkRXJyb3J7J1RvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGNoZWNrIGJvZHkKICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAkRXJyb3J7J0JvZHlJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgY2hlY2sgc3ViamVjdAogICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICRFcnJvcnsnU3ViamVjdEludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKQogICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICYmICRHZXRQYXJhbXtUaW1lVW5pdHN9IGVxICcnCiAgICAgICAgKQogICAgewogICAgICAgICRFcnJvcnsnVGltZVVuaXRzSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgZ2V0IGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW50IHRpY2tldAogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdXBsb2FkIGNhY2hlIG9iamVjdAogICAgbXkgJFVwbG9hZENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKTsKCiAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgKTsKCiAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGQgdmFsaWRhdGlvbiByZXN1bHRzIGlmIGVycm9uZW91cwogICAgbXkgJUR5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHQ7CiAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXM7CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICApOwoKICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJER5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCgogICAgICAgICAgICAjIE1hbmRhdG9yeSBpcyBhZGRlZCB0byB0aGUgY29uZmlncyBieSAkU2VsZi0+bmV3CiAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TWFuZGF0b3J5fSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICRFcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gICAgICAgICAgICAgICAgICAgICAgICA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICB9CgogICAgfQoKICAgICMgdHJhbnNmb3JtIHBlbmRpbmcgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgaWYgKAogICAgICAgIGRlZmluZWQgJEdldFBhcmFte1llYXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TW9udGh9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RGF5fQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0hvdXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TWludXRlfQogICAgICAgICkKICAgIHsKICAgICAgICAlR2V0UGFyYW0gPSAkTGF5b3V0T2JqZWN0LT5UcmFuc2Zvcm1EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAjIGNoZWNrIHNvbWUgdmFsdWVzCiAgICBMSU5FOgogICAgZm9yIG15ICRMaW5lIChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgbmV4dCBMSU5FIGlmICEkR2V0UGFyYW17JExpbmV9OwogICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRHZXRQYXJhbXskTGluZX0gKSApIHsKICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnRXJyb3JUeXBlJyB9ID0gJExpbmUgLiAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsLAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJElzTG9jYWwpIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSXNMb2NhbEFkZHJlc3MnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgTWFrZSBzdXJlIHNlbmRlciBpcyBjb3JyZWN0IG9uZS4gU2VlIGJ1ZyMxNDg3MiAoIGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4NzIgKS4KICAgICRHZXRQYXJhbXtGcm9tfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5TZW5kZXIoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewoKICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBkb24ndCBzYXZlIGZvcm0gaWYgYSBkcmFmdCB3YXMgbG9hZGVkLgogICAgICAgICVFcnJvciA9ICggTG9hZGVkRm9ybURyYWZ0ID0+IDEgKTsKICAgIH0KCiAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgIG15ICVBcnRpY2xlUGFyYW07CiAgICBpZiAoIHJlZiggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpICkgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIERlYnVnID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJE11bHRpcGxlOwoKICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgJE11bHRpcGxlID0gMTsKICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBTdG9yZU5ldyA9PiAxLAogICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uCiAgICAgICAgICAgICMgYW5kIGFkZCB0aGVtIGJhY2sgdG8gdGhlIHNlbGVjdGlvbiBzbyB0aGF0IHRoZSBzdWJtaXQKICAgICAgICAgICAgIyB3aWxsIGNvbnRhaW4gb3B0aW9ucyB0aGF0IHdlcmUgaGlkZGVuIGZyb20gdGhlIGFnZW50CiAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCcpICkgewogICAgICAgICAgICAgICAgbXkgQFJlbW92ZWRPcHRpb25zID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwogICAgICAgICAgICAgICAgaWYgKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGlmICgkTXVsdGlwbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdmVkT3B0aW9uIChAUmVtb3ZlZE9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJEdldFBhcmFteyRLZXl9IH0sICRSZW1vdmVkT3B0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSBzaGlmdCBAUmVtb3ZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpY2tldCBwYXJhbXMKICAgICAgICAgICAgJUFydGljbGVQYXJhbSA9ICgKICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBlcnJvcnMKICAgICAgICAgICAgJUVycm9yID0gKAogICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgJE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhbiBlcnJvci4KICAgICMgQW4gZXJyb3IgaXMgbm90IG5lY2Vzc2FyaWx5IGJhZCwgb2Z0ZW4gaXQgaXMganVzdCB0aGF0IGEgZm9ybSBkcmFmdCBoYXMgYmVlbiBsb2FkZWQuCiAgICBpZiAoJUVycm9yKSB7CiAgICAgICAgbXkgJFF1ZXVlSUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRRdWV1ZUlEKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgICAgICAjIGV4dHJhY3QgZHluYW1pYyBmaWVsZCB2YWx1ZXMgZnJvbSB0aWNrZXQgZGF0YQogICAgICAgIG15ICVUaWNrZXRERlZhbHVlcyA9CiAgICAgICAgICAgIG1hcCAgeyAnRHluYW1pY0ZpZWxkXycgLiAkXy0+e05hbWV9ID0+ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICRfLT57TmFtZX0gfSB9CiAgICAgICAgICAgIGdyZXAgeyAkXy0+e09iamVjdFR5cGV9IGVxICdUaWNrZXQnIH0KICAgICAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9LT5AKjsKCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICk7CgogICAgICAgICMgV2hlbiBhIGRyYWZ0IGlzIGxvYWRlZCwgaW5mb3JtIGEgdXNlciB0aGF0IGFydGljbGUgc3ViamVjdCB3aWxsIGJlIGVtcHR5CiAgICAgICAgIyBpZiBjb250YWlucyBvbmx5IHRoZSB0aWNrZXQgaG9vayAoaWYgbm90aGluZyBpcyBtb2RpZmllZCkuCiAgICAgICAgaWYgKCAkRXJyb3J7TG9hZGVkRm9ybURyYWZ0fSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnQXJ0aWNsZSBzdWJqZWN0IHdpbGwgYmUgZW1wdHkgaWYgdGhlIHN1YmplY3QgY29udGFpbnMgb25seSB0aGUgdGlja2V0IGhvb2shJwogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgID0+ICRUaWNrZXR7VGl0bGV9LAogICAgICAgICAgICBDdXN0b21lcklEICAgICA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBOZXh0U3RhdGVzICAgICA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJDYyAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQmNjLAogICAgICAgICAgICBBdHRhY2htZW50cyAgICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgREZQb3NzaWJsZVZhbHVlcyA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBERkVycm9ycyAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgREZWYWx1ZXMgICAgICAgICA9PiBcJVRpY2tldERGVmFsdWVzLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIHJlcGxhY2UgPE9UT0JPX1RJQ0tFVF9TVEFURT4gd2l0aCBuZXh0IHRpY2tldCBzdGF0ZSBuYW1lCiAgICBpZiAoJE5leHRTdGF0ZSkgewogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLygmbHQ7fDwpT1RPQk9fVElDS0VUX1NUQVRFKCZndDt8PikvJE5leHRTdGF0ZS9nOwogICAgfQoKICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudHMKICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICApOwoKICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICApOwogICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgIHB1c2ggQEF0dGFjaG1lbnREYXRhLCBcJVVwbG9hZFN0dWZmOwogICAgfQoKICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICMgcmVtb3ZlIHVudXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgbXkgQE5ld0F0dGFjaG1lbnREYXRhOwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgaWYgKCAkQ29udGVudElEICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKSApIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICMgaWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5CiAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVtZW1iZXIgaW5saW5lIGltYWdlcyBhbmQgbm9ybWFsIGF0dGFjaG1lbnRzCiAgICAgICAgICAgIHB1c2ggQE5ld0F0dGFjaG1lbnREYXRhLCBcJXskQXR0YWNobWVudH07CiAgICAgICAgfQogICAgICAgIEBBdHRhY2htZW50RGF0YSA9IEBOZXdBdHRhY2htZW50RGF0YTsKCiAgICAgICAgIyB2ZXJpZnkgSFRNTCBkb2N1bWVudAogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgc2VuZCBlbWFpbAogICAgbXkgJFRvID0gJyc7CiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgIG5leHQgS0VZIGlmICEkR2V0UGFyYW17JEtleX07CiAgICAgICAgaWYgKCRUbykgewogICAgICAgICAgICAkVG8gLj0gJywgJzsKICAgICAgICB9CiAgICAgICAgJFRvIC49ICRHZXRQYXJhbXskS2V5fTsKICAgIH0KCiAgICAjIEdldCBhdHRyaWJ1dGVzIGxpa2Ugc2VuZGVyIGFkZHJlc3MuCiAgICBteSAlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5BdHRyaWJ1dGVzKAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIERhdGEgICAgID0+IHt9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CiAgICBteSAkQXJ0aWNsZUlEICAgICA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQ2hhbm5lbCggQ2hhbm5lbE5hbWUgPT4gJ0VtYWlsJyApLT5BcnRpY2xlU2VuZCgKICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+ICRHZXRQYXJhbXtJc1Zpc2libGVGb3JDdXN0b21lcn0gLy8gMCwKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnRW1haWxBZ2VudCcsCiAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gIlwlXCUkVG8iLAogICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICREYXRhe0Zyb219LAogICAgICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUb30sCiAgICAgICAgQ2MgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0NjfSwKICAgICAgICBCY2MgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17QmNjfSwKICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKCiAgICAgICAgIyBXZSBzdGFydCBhIG5ldyBjb21tdW5pY2F0aW9uIGhlcmUsIHNvIGRvbid0IHNlbmQgYW55IHJlZmVyZW5jZXMuCiAgICAgICAgIyAgIFRoaXMgbWlnaHQgbGVhZCB0byBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlIChkb21haW4gbmFtZXM7IHNlZSBidWcjMTEyNDYpLgogICAgICAgIEluUmVwbHlUbyAgPT4gJycsCiAgICAgICAgUmVmZXJlbmNlcyA9PiAnJywKICAgICAgICBDaGFyc2V0ICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgTWltZVR5cGUgICA9PiAkTWltZVR5cGUsCiAgICAgICAgQXR0YWNobWVudCA9PiBcQEF0dGFjaG1lbnREYXRhLAogICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICApOwoKICAgICMgZXJyb3IgcGFnZQogICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgdGltZSBhY2NvdW50aW5nCiAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBkeW5hbWljIGZpZWxkcwogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9OwoKICAgICAgICAjIHNldCB0aGUgb2JqZWN0IElEIChUaWNrZXRJRCBvciBBcnRpY2xlSUQpIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgY29uZmlndXJhdGlvbgogICAgICAgIG15ICRPYmplY3RJRCA9ICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnQXJ0aWNsZScgPyAkQXJ0aWNsZUlEIDogJFNlbGYtPntUaWNrZXRJRH07CgogICAgICAgICMgc2V0IHRoZSB2YWx1ZQogICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRPYmplY3RJRCwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgc3RhdGUKICAgIGlmICgkTmV4dFN0YXRlKSB7CiAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVTZXQoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgIFN0YXRlICAgICA9PiAkTmV4dFN0YXRlLAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdWxkIEkgc2V0IGFuIHVubG9jaz8KICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlbW92ZSBhbGwgZm9ybSBkYXRhCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgIyBJZiBmb3JtIHdhcyBjYWxsZWQgYmFzZWQgb24gYSBkcmFmdCwKICAgICMgICBkZWxldGUgZHJhZnQgc2luY2UgaXRzIGNvbnRlbnQgaGFzIG5vdyBiZWVuIHVzZWQuCiAgICBpZiAoCiAgICAgICAgJEdldFBhcmFte0Zvcm1EcmFmdElEfQogICAgICAgICYmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdERlbGV0ZSgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEdldFBhcmFte0Zvcm1EcmFmdElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ291bGQgbm90IGRlbGV0ZSBkcmFmdCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyByZWRpcmVjdAogICAgaWYgKAogICAgICAgIGRlZmluZWQgJFN0YXRlRGF0YXtUeXBlTmFtZX0KICAgICAgICAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kKICAgICAgICAmJiAhJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpSZWRpcmVjdEFmdGVyQ2xvc2VEaXNhYmxlZCcpCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICBVUkwgPT4gKCAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gfHwgJ0FjdGlvbj1BZ2VudERhc2hib2FyZCcgKSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGVJRCIsCiAgICApOwp9CgpzdWIgQWpheFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIEFDTCBjb21wYXRpYmlsaXR5IHRyYW5zbGF0aW9uCiAgICAkQUNMQ29tcGF0R2V0UGFyYW17TmV4dFN0YXRlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05leHRTdGF0ZUlEJyApOwoKICAgIG15ICVHZXRQYXJhbUV4dGVuZGVkID0gJFNlbGYtPl9HZXRFeHRlbmRlZFBhcmFtcygpOwogICAgbXkgJUdldFBhcmFtICAgICAgICAgPSAleyAkR2V0UGFyYW1FeHRlbmRlZHtHZXRQYXJhbX0gfTsKCiAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgIyBNYWtlIHN1cmUgc2VuZGVyIGlzIGNvcnJlY3Qgb25lLiBTZWUgYnVnIzE0ODcyICggaHR0cHM6Ly9idWdzLm90cnMub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDg3MiApLgogICAgJEdldFBhcmFte0Zyb219ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyktPlNlbmRlcigKICAgICAgICBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIG15IEBFeHRlbmRlZERhdGE7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgIEpPQjoKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgbmV4dCBKT0IgaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRNdWx0aXBsZTsKCiAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICRNdWx0aXBsZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJURhdGEgPSAkT2JqZWN0LT5EYXRhKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgIyBnZXQgQUpBWCBwYXJhbSB2YWx1ZXMKICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldFBhcmFtQUpBWCcpICkgewogICAgICAgICAgICAgICAgJUdldFBhcmFtID0gKCAlR2V0UGFyYW0sICRPYmplY3QtPkdldFBhcmFtQUpBWCglR2V0UGFyYW0pICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IG9wdGlvbnMgdGhhdCBoYXZlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uIHZpc2libGUKICAgICAgICAgICAgIyB0byB0aGUgYWdlbnQuIFRoZXNlIG9wdGlvbnMgd2lsbCBiZSBhZGRlZCBhZ2FpbiBvbiBzdWJtaXQuCiAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRPcHRpb25zVG9SZW1vdmVBSkFYJykgKSB7CiAgICAgICAgICAgICAgICBteSBAT3B0aW9uc1RvUmVtb3ZlID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwoKICAgICAgICAgICAgICAgIGZvciBteSAkT3B0aW9uVG9SZW1vdmUgKEBPcHRpb25zVG9SZW1vdmUpIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJERhdGF7JE9wdGlvblRvUmVtb3ZlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEtleSA9ICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICAgICAgaWYgKCRLZXkpIHsKICAgICAgICAgICAgICAgIHB1c2ggQEV4dGVuZGVkRGF0YSwgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gJE11bHRpcGxlLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICVEeW5hbWljRmllbGRWYWx1ZXM7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZEl0ZW0gKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZEl0ZW07CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIWRlZmluZWQgJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkSXRlbSB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKCiAgICBteSAkTmV4dFN0YXRlcyA9ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgKTsKCiAgICAjIHVwZGF0ZSBEeW5hbWljIEZpZWxkcyBQb3NzaWJsZSBWYWx1ZXMgdmlhIEFKQVgKICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICk7CgogICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9IGtleXMgJUZpbHRlcjsKICAgICAgICB9CgogICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICApIHx8ICRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9OwogICAgfQoKICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgIFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDb21wb3NlU3RhdGVJRCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0NvbXBvc2VTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCnN1YiBfR2V0TmV4dFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5leHQgc3RhdGVzCiAgICBteSAlTmV4dFN0YXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICVQYXJhbSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gXCVOZXh0U3RhdGVzOwp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgIG15ICVTdGF0ZTsKICAgIGlmICggISRQYXJhbXtDb21wb3NlU3RhdGVJRH0gKSB7CiAgICAgICAgJFN0YXRle1NlbGVjdGVkVmFsdWV9ID0gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU3RhdGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17Q29tcG9zZVN0YXRlSUR9OwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJFBhcmFte05leHRTdGF0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17TmV4dFN0YXRlc30sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdDb21wb3NlU3RhdGVJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgRm9ybVVwZGF0ZScsCiAgICAgICAgJVN0YXRlLAogICAgKTsKCiAgICBpZiAoICEkUGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJQcmVzZW50fSApIHsKICAgICAgICAkUGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9ID0gJENvbmZpZy0+e0lzVmlzaWJsZUZvckN1c3RvbWVyRGVmYXVsdH07CiAgICB9CgogICAgIyBwcmVwYXJlIGVycm9ycyEKICAgIGlmICggJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgZm9yIG15ICRFcnJvciAoIHNvcnQga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JEVycm9yfSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBUZXh0ID0+ICRQYXJhbXtFcnJvcnN9LT57JEVycm9yfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFF1aWNrRGF0ZUJ1dHRvbnMgPSAkQ29uZmlnLT57UXVpY2tEYXRlQnV0dG9uc30gLy8gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpEZWZhdWx0UXVpY2tEYXRlQnV0dG9ucycpOwoKICAgICMgcGVuZGluZyBkYXRhIHN0cmluZwogICAgJFBhcmFte1BlbmRpbmdEYXRlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAlUGFyYW0sCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICA9PiA1LAogICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICBEaWZmVGltZSAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpIHx8IDAsCiAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntEYXRlSW52YWxpZH0gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAnICcsCiAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgICAgIFF1aWNrRGF0ZUJ1dHRvbnMgICAgID0+ICRRdWlja0RhdGVCdXR0b25zLAogICAgKTsKCiAgICAjIE11bHRpcGxlLUF1dG9jb21wbGV0ZQogICAgIyBDYwogICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NDdXN0b21lckVycm9yRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckNjICkgewogICAgICAgICRQYXJhbXtDY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBCY2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjQ3VzdG9tZXJFcnJvckV4cGxhbmF0aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlckJjYysrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyQmNjICkgewogICAgICAgICRQYXJhbXtCY2NDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQmNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBUbwogICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJFcnJvckV4cGxhbmF0aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyKyssCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17VG9JbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntUb0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RvU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17VG9Jc0xvY2FsQWRkcmVzc30gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57VG9FcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUb0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtDY0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e0NjRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtDY0lzTG9jYWxBZGRyZXNzfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntDY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0JjY0ludmFsaWR9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e0JjY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0JjY1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0JjY0lzTG9jYWxBZGRyZXNzfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntCY2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCY2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyByZW5kZXIgZHluYW1pYyBmaWVsZHMKICAgIHsKICAgICAgICBteSAlRHluYW1pY0ZpZWxkQ29uZmlncyA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPkAqOwoKICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RHluYW1pY0ZpZWxkOjpNYXNrJyktPkVkaXRTZWN0aW9uUmVuZGVyKAogICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICA9PiAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgPT4gXCVEeW5hbWljRmllbGRDb25maWdzLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgICAgIER5bmFtaWNGaWVsZFZhbHVlcyAgID0+ICRQYXJhbXtERlZhbHVlc30sCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQYXJhbXtERlBvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICAgPT4gJFBhcmFte0RGRXJyb3JzfSwKICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgICAgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFBhcmFte0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICRQYXJhbXtERlZhbHVlc30tPiUqLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBTaG93IHRoZSBjdXN0b21lciB1c2VyIGFkZHJlc3MgYm9vayBpZiB0aGUgbW9kdWxlIGlzIHJlZ2lzdGVyZWQuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRDdXN0b21lclVzZXJBZGRyZXNzQm9va30gKSB7CiAgICAgICAgJFBhcmFte09wdGlvbkN1c3RvbWVyVXNlckFkZHJlc3NCb29rfSA9IDE7CiAgICB9CgogICAgIyBidWlsZCB0ZXh0IHRlbXBsYXRlIHN0cmluZwogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKS0+U3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICBUeXBlICA9PiAnRW1haWwnLAogICAgKTsKCiAgICBteSAkUXVldWVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgJVBhcmFtLAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IHx8ICcnLAogICAgKTsKCiAgICBpZiAoCiAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoCiAgICAgICAgICAgICRRdWV1ZVN0YW5kYXJkVGVtcGxhdGVzCiAgICAgICAgICAgICAgICB8fCAoICRQYXJhbXtRdWV1ZX0gJiYgSXNIYXNoUmVmV2l0aERhdGEoIFwlU3RhbmRhcmRUZW1wbGF0ZXMgKSApCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUXVldWVTdGFuZGFyZFRlbXBsYXRlcyB8fCB7fSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGFuZGFyZFRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJExvYWRlZEZvcm1EcmFmdDsKICAgIGlmICggJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0gKSB7CiAgICAgICAgJExvYWRlZEZvcm1EcmFmdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0R2V0KAogICAgICAgICAgICBGb3JtRHJhZnRJRCA9PiAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSwKICAgICAgICAgICAgR2V0Q29udGVudCAgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15IEBBcnRpY2xlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBPbmx5TGFzdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmIChAQXJ0aWNsZXMpIHsKICAgICAgICAgICAgbXkgJExhc3RBcnRpY2xlID0gJEFydGljbGVzWzBdOwoKICAgICAgICAgICAgbXkgJExhc3RBcnRpY2xlU3lzdGVtVGltZTsKICAgICAgICAgICAgaWYgKCAkTGFzdEFydGljbGUtPntDcmVhdGVUaW1lfSApIHsKICAgICAgICAgICAgICAgIG15ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkTGFzdEFydGljbGUtPntDcmVhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWUgPSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lT2JqZWN0LT5Ub0Vwb2NoKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRGb3JtRHJhZnRTeXN0ZW1UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExvYWRlZEZvcm1EcmFmdC0+e0NoYW5nZVRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEZvcm1EcmFmdFN5c3RlbVRpbWUgPSAkRm9ybURyYWZ0U3lzdGVtVGltZU9iamVjdC0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgaWYgKCAhJExhc3RBcnRpY2xlU3lzdGVtVGltZSB8fCAkRm9ybURyYWZ0U3lzdGVtVGltZSA8PSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lICkgewogICAgICAgICAgICAgICAgJFBhcmFte0Zvcm1EcmFmdE91dGRhdGVkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkTG9hZGVkRm9ybURyYWZ0KSApIHsKCiAgICAgICAgJExvYWRlZEZvcm1EcmFmdC0+e0NoYW5nZUJ5TmFtZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTmFtZSgKICAgICAgICAgICAgVXNlcklEID0+ICRMb2FkZWRGb3JtRHJhZnQtPntDaGFuZ2VCeX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGV4cGxhbmF0b3J5IG1lc3NhZ2UgYWJvdXQgYXN0ZXJpc2sKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBc3Rlcmlza0V4cGxhbmF0aW9uJykgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FzdGVyaXNrRXhwbGFuYXRpb24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgRm9ybURyYWZ0ICAgICAgPT4gJENvbmZpZy0+e0Zvcm1EcmFmdH0sCiAgICAgICAgICAgIEZvcm1EcmFmdElEICAgID0+ICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9LAogICAgICAgICAgICBGb3JtRHJhZnRUaXRsZSA9PiAkTG9hZGVkRm9ybURyYWZ0ID8gJExvYWRlZEZvcm1EcmFmdC0+e1RpdGxlfSA6ICcnLAogICAgICAgICAgICBGb3JtRHJhZnRNZXRhICA9PiAkTG9hZGVkRm9ybURyYWZ0LAogICAgICAgIH0sCiAgICApOwp9CgpzdWIgX0dldEV4dGVuZGVkUGFyYW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdyhUbyBDYyBCY2MgU3ViamVjdCBCb2R5IENvbXBvc2VTdGF0ZUlEIElzVmlzaWJsZUZvckN1c3RvbWVyIElzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudAogICAgICAgIEFydGljbGVJRCBUaW1lVW5pdHMgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgRm9ybURyYWZ0SUQgVGl0bGUpCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICBpZiAoIGRlZmluZWQgJFZhbHVlICkgewogICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkVmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgICRHZXRQYXJhbXtFbWFpbFRlbXBsYXRlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VtYWlsVGVtcGxhdGVJRCcgKSB8fCAnJzsKCiAgICAjIGhhc2ggZm9yIGNoZWNrIGR1cGxpY2F0ZWQgZW50cmllcwogICAgbXkgJUFkZHJlc3Nlc0xpc3Q7CiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJUbyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlclRvKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDE7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uICRDdXN0b21lcnNOdW1iZXJUbyApIHsKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAkQ291bnQgPiAxXzAwMDsgICAgIyBiYWlsIG91dCB3aGVuIHRoZSBudW1iZXIgb2YgY3VzdG9tZXJzIGlzIGFibm9ybWFsbHkgaGlnaAoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudDsKCiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkU2VsZWN0ZWQgZXEgJENvdW50ID8gJ2NoZWNrZWQgJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKSAgIHx8ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJRdWV1ZSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclF1ZXVlXycgLiAkQ291bnQgKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RvfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3IgICAgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEN1c3RvbWVyRWxlbWVudCApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSAmJiAkQ3VzdG9tZXJFcnJvciBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3IgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZCA9ICdkaXNhYmxlZCc7CiAgICAgICAgICAgICAgICAkQ291bnRBdXggICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyUXVldWUgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZSA9ICRDb3VudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnQsCiAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlLAogICAgICAgICAgICB9OwogICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQ2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQ2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyQ2NDdXN0b21lcicgKSB8fCAwOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyQ2MpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyQ2MgPSAxOwoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAkQ3VzdG9tZXJzTnVtYmVyQ2MgKSB7CiAgICAgICAgICAgIGxhc3QgQ09VTlQgaWYgJENvdW50ID4gMV8wMDA7ICAgICMgYmFpbCBvdXQgd2hlbiB0aGUgbnVtYmVyIG9mIGN1c3RvbWVycyBpcyBhYm5vcm1hbGx5IGhpZ2gKCiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnRDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDY0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CgogICAgICAgICAgICBuZXh0IENPVU5UIHVubGVzcyAkQ3VzdG9tZXJFbGVtZW50Q2M7CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlDYyAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlQ2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lclF1ZXVlXycgLiAkQ291bnQgKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0NjfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDY30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnRDYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDY30gPSAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkQ3VzdG9tZXJFbGVtZW50Q2MgKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gJiYgJEN1c3RvbWVyRXJyb3JDYyBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkQ2MgPSAnJzsKICAgICAgICAgICAgbXkgJENvdW50QXV4Q2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJDYysrOwogICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yQ2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJ2Rpc2FibGVkJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eENjICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDdXN0b21lclF1ZXVlQ2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZUNjID0gJENvdW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyQ2MsIHsKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4Q2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnRDYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5Q2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQ2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnQ2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkQ2MsCiAgICAgICAgICAgICAgICBDdXN0b21lclF1ZXVlICAgID0+ICRDdXN0b21lclF1ZXVlQ2MsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSBATXVsdGlwbGVDdXN0b21lckJjYzsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyQmNjQ3VzdG9tZXInICkgfHwgMDsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlckJjYykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAxOwoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAkQ3VzdG9tZXJzTnVtYmVyQmNjICkgewogICAgICAgICAgICBsYXN0IENPVU5UIGlmICRDb3VudCA+IDFfMDAwOyAgICAjIGJhaWwgb3V0IHdoZW4gdGhlIG51bWJlciBvZiBjdXN0b21lcnMgaXMgYWJub3JtYWxseSBoaWdoCgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50QmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CgogICAgICAgICAgICBuZXh0IENPVU5UIHVubGVzcyAkQ3VzdG9tZXJFbGVtZW50QmNjOwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5QmNjICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlQmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17QmNjfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50QmNjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0JjY30gPSAkQ3VzdG9tZXJFbGVtZW50QmNjOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkQ3VzdG9tZXJFbGVtZW50QmNjICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ICYmICRDdXN0b21lckVycm9yQmNjIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICcnOwogICAgICAgICAgICBteSAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQmNjID0gJ2Rpc2FibGVkJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eEJjYyAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZUJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclF1ZXVlQmNjID0gJENvdW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyQmNjLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eEJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudEJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvckJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkQmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZUJjYywKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKAogICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgID0+IFxATXVsdGlwbGVDdXN0b21lciwKICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQmNjLAogICAgKTsKfQoKc3ViIF9HZXRTdGFuZGFyZFRlbXBsYXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNyZWF0ZSB0ZW1wbGF0ZXMKICAgIG15ICVUZW1wbGF0ZXM7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgIG15ICRRdWV1ZUlEID0gJFBhcmFte1F1ZXVlSUR9IHx8ICcnOwogICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICYmICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZ2V0IFF1ZXVlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUXVldWVJRCA9ICRUaWNrZXR7UXVldWVJRH0gfHwgJyc7CiAgICB9CgogICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7RW1haWx9ICk7CgogICAgIyByZXR1cm4ganVzdCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuICRTdGFuZGFyZFRlbXBsYXRlc3tFbWFpbH07Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentTicketEmailResend.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiMjllZmMyNTBkMTZkYzM0NWUwMGY1MTFjZjkwNDUwOWJjZDM1ZDdjIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRFbWFpbFJlc2VuZC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRFbWFpbFJlc2VuZDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIEdldCBmb3JtIElELgogICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyktPlByZXBhcmVGb3JtSUQoCiAgICAgICAgUGFyYW1PYmplY3QgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKSwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBUaWNrZXRJRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdFbWFpbCcgKTsKCiAgICAjIEdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZS4KICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgQ2hlY2sgcGVybWlzc2lvbnMuCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgRXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IGFydGljbGUgYWN0aW9uLgogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRDb25maWctPntQZXJtaXNzaW9ufSApLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgQUNMIHJlc3RyaWN0aW9ucy4KICAgIG15ICVQb3NzaWJsZUFjdGlvbnMgPSAoIDEgPT4gJFNlbGYtPntBY3Rpb259ICk7CgogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAlQWNsQWN0aW9uID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICMgQ2hlY2sgaWYgQUNMIHJlc3RyaWN0aW9ucyBleGlzdC4KICAgIGlmICgkQUNMKSB7CgogICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICMgU2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbi4KICAgICAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxCiAgICApOwoKICAgICMgR2V0IGxvY2sgc3RhdGUuCiAgICBteSAkVGlja2V0QmFja1R5cGUgPSAnVGlja2V0QmFjayc7CiAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CgogICAgICAgICAgICBteSAkTG9jayA9ICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTZXQgbmV3IG93bmVyIGlmIHRpY2tldCBvd25lciBpcyBkaWZmZXJlbnQgdGhlbiBsb2dnZWQgdXNlci4KICAgICAgICAgICAgaWYgKCAkTG9jayAmJiAoICRUaWNrZXR7T3duZXJJRH0gIT0gJFNlbGYtPntVc2VySUR9ICkgKSB7CgogICAgICAgICAgICAgICAgIyBSZW1lbWJlciBwcmV2aW91cyBvd25lciwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlc3RvcmUgdGlja2V0IG93bmVyIG9uIHVuZG8gYWN0aW9uLgogICAgICAgICAgICAgICAgJFRpY2tldHtQcmV2aW91c093bmVyfSA9ICRUaWNrZXR7T3duZXJJRH07CgogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFNob3cgbG9jayBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRUaWNrZXRCYWNrVHlwZSAuPSAnVW5kbyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkVGlja2V0T2JqZWN0LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1NvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgdGlja2V0IG93bmVyIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uJyksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgbXkgJUdldFBhcmFtOwogICAgZm9yICgKICAgICAgICBxdygKICAgICAgICAgICAgRnJvbSBUbyBDYyBCY2MgU3ViamVjdCBCb2R5IEluUmVwbHlUbyBSZWZlcmVuY2VzIEFydGljbGVJRAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lclByZXNlbnQgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgVGltZVVuaXRzIEZvcm1JRAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRffSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICB9CgogICAgaWYgKCAhJEdldFBhcmFte0FydGljbGVJRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gQXJ0aWNsZUlEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEhhc2ggZm9yIGxvb2t1cCBvZiBkdXBsaWNhdGVkIGVudHJpZXMuCiAgICBteSAlQWRkcmVzc2VzTGlzdDsKCiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJUbyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyVG8pIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJEN1c3RvbWVyc051bWJlclRvICkgewogICAgICAgICAgICBsYXN0IENPVU5UIGlmICRDb3VudCA+IDFfMDAwOyAgICAjIGJhaWwgb3V0IHdoZW4gdGhlIG51bWJlciBvZiBjdXN0b21lcnMgaXMgYWJub3JtYWxseSBoaWdoCgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CgogICAgICAgICAgICBuZXh0IENPVU5UIHVubGVzcyAkQ3VzdG9tZXJFbGVtZW50OwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyU2VsZWN0ZWQgPSAoICRTZWxlY3RlZCBlcSAkQ291bnQgPyAnY2hlY2tlZCAnIDogJycgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAkQ3VzdG9tZXJFbGVtZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIGVtYWlsIGFkZHJlc3MuCiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3IgICAgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEN1c3RvbWVyRWxlbWVudCApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzLgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gJiYgJEN1c3RvbWVyRXJyb3IgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkID0gJyc7CiAgICAgICAgICAgIG15ICRDb3VudEF1eCAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQnOwogICAgICAgICAgICAgICAgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDdXN0b21lclF1ZXVlIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyUXVldWUgPSAkQ291bnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXIsIHsKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJTZWxlY3RlZCA9PiAkQ3VzdG9tZXJTZWxlY3RlZCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvciwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2csCiAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSBATXVsdGlwbGVDdXN0b21lckNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckNjQ3VzdG9tZXInICkgfHwgMDsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlckNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJEN1c3RvbWVyc051bWJlckNjICkgewogICAgICAgICAgICBsYXN0IENPVU5UIGlmICRDb3VudCA+IDFfMDAwOyAgICAjIGJhaWwgb3V0IHdoZW4gdGhlIG51bWJlciBvZiBjdXN0b21lcnMgaXMgYWJub3JtYWxseSBoaWdoCgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50Q2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudENjOwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5Q2MgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDY0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKSAgIHx8ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJRdWV1ZUNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJRdWV1ZV8nIC4gJENvdW50ICkgfHwgJyc7CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtDY30gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9ID0gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yQ2MgICAgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEN1c3RvbWVyRWxlbWVudENjICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckNjID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50Q2N9ICYmICRDdXN0b21lckVycm9yQ2MgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJyc7CiAgICAgICAgICAgIG15ICRDb3VudEF1eENjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckNjIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWRDYyA9ICdkaXNhYmxlZCc7CiAgICAgICAgICAgICAgICAkQ291bnRBdXhDYyAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZUNjIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyUXVldWVDYyA9ICRDb3VudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckNjLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eENjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50Q2MsCiAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvckNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZ0NjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZENjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZUNjLAogICAgICAgICAgICB9OwogICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50Q2N9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJCY2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckJjY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJCY2MpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyQmNjID0gMTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJEN1c3RvbWVyc051bWJlckJjYyApIHsKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAkQ291bnQgPiAxXzAwMDsgICAgIyBiYWlsIG91dCB3aGVuIHRoZSBudW1iZXIgb2YgY3VzdG9tZXJzIGlzIGFibm9ybWFsbHkgaGlnaAoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudEJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudEJjYzsKCiAgICAgICAgICAgIG15ICRDdXN0b21lcktleUJjYyAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKSAgIHx8ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJRdWV1ZUJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lclF1ZXVlXycgLiAkQ291bnQgKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JjY30gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9ID0gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBlbWFpbCBhZGRyZXNzLgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yQmNjICAgID0gJyc7CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRDdXN0b21lckVsZW1lbnRCY2MgKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcy4KICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ICYmICRDdXN0b21lckVycm9yQmNjIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dCY2MgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICcnOwogICAgICAgICAgICBteSAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQmNjID0gJ2Rpc2FibGVkJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eEJjYyAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZUJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclF1ZXVlQmNjID0gJENvdW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyQmNjLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eEJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudEJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5QmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvckJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkQmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZUJjYywKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwogICAgbXkgJE1haW5PYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIFNlbmQgZW1haWwuCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VuZEVtYWlsJyApIHsKCiAgICAgICAgIyBDaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbi4KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAgICAgIyBDaGVjayBzb21lIHZhbHVlcy4KICAgICAgICBMSU5FOgogICAgICAgIGZvciBteSAkTGluZSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBuZXh0IExJTkUgaWYgISRHZXRQYXJhbXskTGluZX07CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRHZXRQYXJhbXskTGluZX0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkTGluZSAuICdFcnJvclR5cGUnIH0gPSAkTGluZSAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRJc0xvY2FsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsLAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiMgRU8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJElzTG9jYWwpIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRMaW5lIC4gJ0lzTG9jYWxBZGRyZXNzJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkRXJyb3J7VG9Jc0xvY2FsQWRkcmVzc30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEVycm9ye0NjSXNMb2NhbEFkZHJlc3N9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRFcnJvcntCY2NJc0xvY2FsQWRkcmVzc30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhLgogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgc29tZSB2YWx1ZXMuCiAgICAgICAgTElORToKICAgICAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICAgICAgbmV4dCBMSU5FIGlmICEkR2V0UGFyYW17JExpbmV9OwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkR2V0UGFyYW17JExpbmV9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgc3ViamVjdC4KICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRFcnJvcntTdWJqZWN0SW52YWxpZH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgYm9keS4KICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICRFcnJvcntCb2R5SW52YWxpZH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgdGltZSB1bml0cy4KICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9ye1RpbWVVbml0c0ludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgUHJlcGFyZSBzdWJqZWN0LgogICAgICAgIG15ICRUbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVG4sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0gfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUFydGljbGVQYXJhbTsKCiAgICAgICAgIyBSdW4gY29tcG9zZSBtb2R1bGVzLgogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIFVzZSB0aWNrZXQgUXVldWVJRCBpbiBjb21wb3NlIG1vZHVsZXMuCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0sIERlYnVnID0+ICRTZWxmLT57RGVidWd9ICk7CgogICAgICAgICAgICAgICAgbXkgJE11bHRpcGxlOwoKICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgUEFSQU1FVEVSOgogICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE11bHRpcGxlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBSdW4gbW9kdWxlLgogICAgICAgICAgICAgICAgJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBTdG9yZU5ldyA9PiAxLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRKb2JzeyRKb2J9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIEdldCBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uIGFuZCBhZGQgdGhlbSBiYWNrIHRvIHRoZSBzZWxlY3Rpb24gc28gdGhhdCB0aGUKICAgICAgICAgICAgICAgICMgICBzdWJtaXQgd2lsbCBjb250YWluIG9wdGlvbnMgdGhhdCB3ZXJlIGhpZGRlbiBmcm9tIHRoZSBhZ2VudC4KICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAUmVtb3ZlZE9wdGlvbnMgPSAkT2JqZWN0LT5HZXRPcHRpb25zVG9SZW1vdmVBSkFYKCVHZXRQYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJE11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJlbW92ZWRPcHRpb24gKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJEdldFBhcmFteyRLZXl9IH0sICRSZW1vdmVkT3B0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gc2hpZnQgQFJlbW92ZWRPcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgVGlja2V0IHBhcmFtcy4KICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0gPSAoCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKCAlR2V0UGFyYW0sICVBcnRpY2xlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIEdldCBlcnJvcnMuCiAgICAgICAgICAgICAgICAlRXJyb3IgPSAoCiAgICAgICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgICAgICRPYmplY3QtPkVycm9yKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhbiBlcnJvci4KICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlfSA9ICRHZXRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICA9PiBcJUVycm9yLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lckJjYyA9PiBcQE11bHRpcGxlQ3VzdG9tZXJCY2MsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXRCYWNrVHlwZSAgICAgID0+ICRUaWNrZXRCYWNrVHlwZSwKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgR2V0IHByZS1sb2FkZWQgYXR0YWNobWVudHMuCiAgICAgICAgbXkgQEF0dGFjaG1lbnREYXRhID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgc3VibWl0IGF0dGFjaG1lbnQuCiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICAjIEdldCByZWNpcGllbnRzLgogICAgICAgIG15ICRSZWNpcGllbnRzID0gJyc7CiAgICAgICAgTElORToKICAgICAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKCiAgICAgICAgICAgIG5leHQgTElORSBpZiAhJEdldFBhcmFteyRMaW5lfTsKCiAgICAgICAgICAgIGlmICgkUmVjaXBpZW50cykgewogICAgICAgICAgICAgICAgJFJlY2lwaWVudHMgLj0gJywgJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAkR2V0UGFyYW17JExpbmV9OwogICAgICAgIH0KCiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgIyBSZW1vdmUgdW51c2VkIGlubGluZSBpbWFnZXMuCiAgICAgICAgICAgIG15IEBOZXdBdHRhY2htZW50RGF0YTsKICAgICAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SUQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgV29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzLgogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgIyBJZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkuCiAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICRHZXRQYXJhbXtCb2R5fSAhfiAvKFxRJENvbnRlbnRJREhUTUxRdW90ZVxFfFxRJENvbnRlbnRJRFxFKS9pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgaW5saW5lIGltYWdlcyBhbmQgbm9ybWFsIGF0dGFjaG1lbnRzLgogICAgICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAQXR0YWNobWVudERhdGEgPSBATmV3QXR0YWNobWVudERhdGE7CgogICAgICAgICAgICAjIFZlcmlmeSBIVE1MIGRvY3VtZW50LgogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJElzVmlzaWJsZUZvckN1c3RvbWVyID0gJENvbmZpZy0+e0lzVmlzaWJsZUZvckN1c3RvbWVyRGVmYXVsdH07CiAgICAgICAgaWYgKCAkR2V0UGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJQcmVzZW50fSApIHsKICAgICAgICAgICAgJElzVmlzaWJsZUZvckN1c3RvbWVyID0gJEdldFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSA/IDEgOiAwOwogICAgICAgIH0KCiAgICAgICAgIyBTZW5kIGVtYWlsLgogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAkSXNWaXNpYmxlRm9yQ3VzdG9tZXIsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnRW1haWxSZXNlbmQnLAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAiXCVcJSRSZWNpcGllbnRzIiwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0Zyb219LAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgICAgICBCY2MgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17QmNjfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgSW5SZXBseVRvICAgICAgICAgICAgPT4gJEdldFBhcmFte0luUmVwbHlUb30sCiAgICAgICAgICAgIFJlZmVyZW5jZXMgICAgICAgICAgID0+ICRHZXRQYXJhbXtSZWZlcmVuY2VzfSwKICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBBdHRhY2htZW50ICAgICAgICAgICA9PiBcQEF0dGFjaG1lbnREYXRhLAogICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgRXJyb3IgcGFnZS4KICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgVGltZSBhY2NvdW50aW5nLgogICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZW1vdmUgYWxsIGZvcm0gZGF0YQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBMb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAuCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENoZWNrIGZvciBTTUlNRSAvIFBHUCBpZiBjdXN0b21lciBoYXMgY2hhbmdlZC4KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgbXkgQEV4dGVuZGVkRGF0YTsKCiAgICAgICAgIyBSdW4gY29tcG9zZSBtb2R1bGVzLgogICAgICAgIGlmICggcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICAjIFVzZSB0aWNrZXQgUXVldWVJRCBpbiBjb21wb3NlIG1vZHVsZXMuCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBKT0I6CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgTG9hZCBtb2R1bGUuCiAgICAgICAgICAgICAgICBuZXh0IEpPQiBpZiAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJE11bHRpcGxlOwoKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRNdWx0aXBsZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgUnVuIG1vZHVsZS4KICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+RGF0YSggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICAjIEdldCBBSkFYIHBhcmFtIHZhbHVlcy4KICAgICAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRQYXJhbUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0gPSAoICVHZXRQYXJhbSwgJE9iamVjdC0+R2V0UGFyYW1BSkFYKCVHZXRQYXJhbSkgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIEdldCBvcHRpb25zIHRoYXQgaGF2ZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGlvbiB2aXNpYmxlIHRvIHRoZSBhZ2VudC4gVGhlc2Ugb3B0aW9ucyB3aWxsIGJlCiAgICAgICAgICAgICAgICAjICAgYWRkZWQgYWdhaW4gb24gc3VibWl0LgogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldE9wdGlvbnNUb1JlbW92ZUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAT3B0aW9uc1RvUmVtb3ZlID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE9wdGlvblRvUmVtb3ZlIChAT3B0aW9uc1RvUmVtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskT3B0aW9uVG9SZW1vdmV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICAgICAgaWYgKCRLZXkpIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBFeHRlbmRlZERhdGEsIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+ICRNdWx0aXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDE1MCwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICk7CgogICAgICAgICMgR2V0IGFydGljbGUgZGF0YS4KICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICk7CiAgICAgICAgbXkgJURhdGEgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgICMgR2V0IGFydGljbGUgdG8gcXVvdGUuCiAgICAgICAgJERhdGF7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICREYXRhe0FydGljbGVJRH0sCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ICA9PiAkVXBsb2FkQ2FjaGVPYmplY3QsCiAgICAgICAgICAgIEF0dGFjaG1lbnRzSW5jbHVkZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgR2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEuCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFN5c3RlbUFkZHJlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpOwoKICAgICAgICAjIEdldCBvbmx5IGVtYWlsIGFkZHJlc3MgaW4gJ1RvJyAoanVzdCAnc29tZUBleGFtcGxlLmNvbScpLgogICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICREYXRhe1RvfSApICkgewogICAgICAgICAgICAkRGF0YXtUb0VtYWlsfSA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICk7CiAgICAgICAgfQoKICAgICAgICAjIEZpbmQgZHVwbGljYXRlIGFkZHJlc3Nlcy4KICAgICAgICBteSAlUmVjaXBpZW50OwogICAgICAgIGZvciBteSAkVHlwZSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBpZiAoICREYXRheyRUeXBlfSApIHsKICAgICAgICAgICAgICAgIG15ICROZXdMaW5lID0gJyc7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkRGF0YXskVHlwZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQWRkcmVzcyA9IGxjICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICk7CgogICAgICAgICAgICAgICAgICAgICMgT25seSB1c2UgZW1haWwgYWRkcmVzc2VzIHdpdGggJ0AnIGluc2lkZS4KICAgICAgICAgICAgICAgICAgICBpZiAoICRBZGRyZXNzICYmICRBZGRyZXNzID1+IC9ALyAmJiAhJFJlY2lwaWVudHskQWRkcmVzc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZWNpcGllbnR7JEFkZHJlc3N9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkU3lzdGVtQWRkcmVzcy0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyA9PiAkQWRkcmVzcywKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRJc0xvY2FsICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCROZXdMaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0xpbmUgLj0gJywgJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdMaW5lIC49ICRFbWFpbEFkZHJlc3NPYmplY3QtPkZvcm1hdCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRheyRUeXBlfSA9ICROZXdMaW5lOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIHNvbWUgdmFsdWVzLgogICAgICAgIG15ICVFcnJvcjsKICAgICAgICBMSU5FOgogICAgICAgIGZvciBteSAkTGluZSAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBuZXh0IExJTkUgaWYgISREYXRheyRMaW5lfTsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJERhdGF7JExpbmV9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAiSW52YWxpZCIgfSA9ICIgU2VydmVyRXJyb3IiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJERhdGF7RnJvbX0gKSB7CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICREYXRhe0Zyb219ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsiRnJvbUludmFsaWQifSAuPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgUnVuIGNvbXBvc2UgbW9kdWxlcy4KICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgIyB1c2UgdGlja2V0IFF1ZXVlSUQgaW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIExvYWQgbW9kdWxlLgogICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoICV7JFNlbGZ9LCBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSApOwoKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgUnVuIG1vZHVsZS4KICAgICAgICAgICAgICAgIG15ICROZXdQYXJhbXMgPSAkT2JqZWN0LT5SdW4oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgaWYgKCROZXdQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJE5ld1BhcmFtczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBHZXQgZXJyb3JzLgogICAgICAgICAgICAgICAgJUVycm9yID0gKAogICAgICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5FcnJvciggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgQnVpbGQgdmlldy4KICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFzaygKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgVGlja2V0QmFja1R5cGUgPT4gJFRpY2tldEJhY2tUeXBlLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkRW1haWxBZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycpOwoKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIG15ICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRQYXJhbXtJc1Zpc2libGVGb3JDdXN0b21lcn07CiAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX0tPntJc1Zpc2libGVGb3JDdXN0b21lclByZXNlbnR9ICkgewogICAgICAgICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRQYXJhbXtHZXRQYXJhbX0tPntJc1Zpc2libGVGb3JDdXN0b21lcn0gPyAxIDogMDsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJc1Zpc2libGVGb3JDdXN0b21lcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+ICRJc1Zpc2libGVGb3JDdXN0b21lciwKICAgICAgICB9LAogICAgKTsKCiAgICAjIFByZXBhcmUgZXJyb3JzIGZvciB0aGUgb3V0cHV0LgogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgbXkgJEVycm9yICggc29ydCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskRXJyb3J9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskRXJyb3J9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEhhbmRsZSBtdWx0aXBsZSBhdXRvY29tcGxldGUgaW4gcmVjaXBpZW50IGZpZWxkcy4KICAgICRQYXJhbXtUb30gPSAoIHNjYWxhciBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gfSA/ICcnIDogJFBhcmFte1RvfSApOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtUb30gJiYgJFBhcmFte1RvfSBuZSAnJyApIHsKICAgICAgICAkUGFyYW17VG9JbnZhbGlkfSA9ICcnOwogICAgfQogICAgJFBhcmFte0NjfSA9ICggc2NhbGFyIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQ2N9IH0gPyAnJyA6ICRQYXJhbXtDY30gKTsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17Q2N9ICYmICRQYXJhbXtDY30gbmUgJycgKSB7CiAgICAgICAgJFBhcmFte0NjSW52YWxpZH0gPSAnJzsKICAgIH0KICAgICRQYXJhbXtCY2N9ID0gKCBzY2FsYXIgQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9IH0gPyAnJyA6ICRQYXJhbXtCY2N9ICk7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0JjY30gJiYgJFBhcmFte0JjY30gbmUgJycgKSB7CiAgICAgICAgJFBhcmFte0JjY0ludmFsaWR9ID0gJyc7CiAgICB9CgogICAgIyBQcm9jZXNzIHRoZSAnQ2MnIGZpZWxkLgogICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDYycgLiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NDdXN0b21lckVycm9yRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckNjICkgewogICAgICAgICRQYXJhbXtDY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgU2V0IGN1c3RvbWVyIGNvdW50ZXIuCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXJDYywKICAgICAgICB9LAogICAgKTsKCiAgICAjIFByb2Nlc3MgdGhlICdCY2MnIGZpZWxkLgogICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQmNjfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjJyAuICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2NDdXN0b21lckVycm9yRXhwbGFuYXRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXJCY2MgKSB7CiAgICAgICAgJFBhcmFte0JjY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgU2V0IGN1c3RvbWVyIGNvdW50ZXIuCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQmNjLAogICAgICAgIH0sCiAgICApOwoKICAgICMgUHJvY2VzcyB0aGUgJ1RvJyBmaWVsZC4KICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyRXJyb3JFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBTZXQgY3VzdG9tZXIgY291bnRlci4KICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXIsCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17VG9JbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVG9TZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgICMgU2V0IHByZXNlbGVjdGVkIHZhbHVlcyBmb3IgJ0JjYycgZmllbGQuCiAgICBpZiAoICRQYXJhbXtCY2N9ICYmICRQYXJhbXtCY2N9IG5lICcnICYmICEkQ3VzdG9tZXJDb3VudGVyQmNjICkgewoKICAgICAgICAjIHNwbGl0IENjIHZhbHVlcwogICAgICAgIG15IEBFbWFpbEFkZHJlc3Nlc0JjYzsKICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkUGFyYW17QmNjfSApICkgewoKICAgICAgICAgICAgbXkgJUN1c3RvbWVyU2VhcmNoID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJUN1c3RvbWVyU2VhcmNoKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcklEICggc29ydCBrZXlzICVDdXN0b21lclNlYXJjaCApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBFbWFpbEFkZHJlc3Nlc0JjYywgewogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgICAgPT4gJEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclRpY2tldFRleHQgPT4gJEN1c3RvbWVyU2VhcmNoeyRDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2ggQEVtYWlsQWRkcmVzc2VzQmNjLCB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVGlja2V0VGV4dCA9PiAkRW1haWxBZGRyZXNzT2JqZWN0LT5Gb3JtYXQoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICksCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdFbWFpbEFkZHJlc3Nlc0JjYycsCiAgICAgICAgICAgIFZhbHVlID0+IFxARW1haWxBZGRyZXNzZXNCY2MsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0JjY30gPSAnJzsKICAgIH0KCiAgICAjIHNldCBwcmVzZWxlY3RlZCB2YWx1ZXMgZm9yIENjIGZpZWxkCiAgICBpZiAoICRQYXJhbXtDY30gJiYgJFBhcmFte0NjfSBuZSAnJyAmJiAhJEN1c3RvbWVyQ291bnRlckNjICkgewoKICAgICAgICAjIHNwbGl0IENjIHZhbHVlcwogICAgICAgIG15IEBFbWFpbEFkZHJlc3Nlc0NjOwogICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRQYXJhbXtDY30gKSApIHsKCiAgICAgICAgICAgIG15ICVDdXN0b21lclNlYXJjaCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiAkRW1haWxBZGRyZXNzT2JqZWN0LT5HZXRBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApLAogICAgICAgICAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCVDdXN0b21lclNlYXJjaCkgewogICAgICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJJRCAoIHNvcnQga2V5cyAlQ3VzdG9tZXJTZWFyY2ggKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBARW1haWxBZGRyZXNzZXNDYywgewogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgICAgPT4gJEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclRpY2tldFRleHQgPT4gJEN1c3RvbWVyU2VhcmNoeyRDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2ggQEVtYWlsQWRkcmVzc2VzQ2MsIHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJUaWNrZXRUZXh0ID0+ICRFbWFpbEFkZHJlc3NPYmplY3QtPkZvcm1hdCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0VtYWlsQWRkcmVzc2VzQ2MnLAogICAgICAgICAgICBWYWx1ZSA9PiBcQEVtYWlsQWRkcmVzc2VzQ2MsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0NjfSA9ICcnOwogICAgfQoKICAgICMgc2V0IHByZXNlbGVjdGVkIHZhbHVlcyBmb3IgVG8gZmllbGQKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VG99ICYmICRQYXJhbXtUb30gbmUgJycgJiYgISRDdXN0b21lckNvdW50ZXIgKSB7CgogICAgICAgICMgc3BsaXQgVG8gdmFsdWVzCiAgICAgICAgbXkgQEVtYWlsQWRkcmVzc2VzVG87CiAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJFBhcmFte1RvfSApICkgewoKICAgICAgICAgICAgbXkgJUN1c3RvbWVyU2VhcmNoID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICksCiAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJUN1c3RvbWVyU2VhcmNoKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcklEICggc29ydCBrZXlzICVDdXN0b21lclNlYXJjaCApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBFbWFpbEFkZHJlc3Nlc1RvLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgICA9PiAkQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVGlja2V0VGV4dCA9PiAkQ3VzdG9tZXJTZWFyY2h7JEN1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHVzaCBARW1haWxBZGRyZXNzZXNUbywgewogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclRpY2tldFRleHQgPT4gJEVtYWlsQWRkcmVzc09iamVjdC0+Rm9ybWF0KCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnRW1haWxBZGRyZXNzZXNUbycsCiAgICAgICAgICAgIFZhbHVlID0+IFxARW1haWxBZGRyZXNzZXNUbywKICAgICAgICApOwoKICAgICAgICAkUGFyYW17VG99ID0gJyc7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17VGlja2V0QmFja1R5cGV9LAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBTaG93IHRpbWUgYWNjb3VudGluZyBib3guCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHNSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHNSZXF1aXJlZH0gPSAnJzsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyB0aGUgY3VzdG9tZXIgdXNlciBhZGRyZXNzIGJvb2sgaWYgdGhlIG1vZHVsZSBpcyByZWdpc3RlcmVkLgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50Q3VzdG9tZXJVc2VyQWRkcmVzc0Jvb2t9ICkgewogICAgICAgICRQYXJhbXtPcHRpb25DdXN0b21lclVzZXJBZGRyZXNzQm9va30gPSAxOwogICAgfQoKICAgICMgQWRkIHJpY2ggdGV4dCBlZGl0b3IuCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIFVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4uCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAjIFNldCB1cCByaWNoIHRleHQgZWRpdG9yLgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBTaG93IGF0dGFjaG1lbnRzLgogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICB9CgogICAgICAgIHB1c2ggQHsgJFBhcmFte0F0dGFjaG1lbnRMaXN0fSB9LCAkQXR0YWNobWVudDsKICAgIH0KCiAgICAjIGV4cGxhbmF0b3J5IG1lc3NhZ2UgYWJvdXQgYXN0ZXJpc2sKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBc3Rlcmlza0V4cGxhbmF0aW9uJykgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FzdGVyaXNrRXhwbGFuYXRpb24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBDcmVhdGUgJiByZXR1cm4gb3V0cHV0LgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0RW1haWxSZXNlbmQnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AgentTicketForward.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiMjllZmMyNTBkMTZkYzM0NWUwMGY1MTFjZjkwNDUwOWJjZDM1ZDdjIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRGb3J3YXJkLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEZvcndhcmQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgojIGNvcmUgbW9kdWxlcwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7JVBhcmFtfSwgJFR5cGU7CgogICAgIyBUcnkgdG8gbG9hZCBkcmFmdCBpZiByZXF1ZXN0ZWQuCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e0Zvcm1EcmFmdH0KICAgICAgICAmJiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnTG9hZEZvcm1EcmFmdCcgKQogICAgICAgICYmICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRJRCcgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+TG9hZEZvcm1EcmFmdCgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdElEJyApLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkTGlzdCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgbXkgJERlZmluaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpNYXNrJyktPkRlZmluaXRpb25HZXQoCiAgICAgICAgTWFzayA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICApIHx8IHt9OwoKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfSAgID0gW107CiAgICAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSA9ICREZWZpbml0aW9uLT57TWFza307CgogICAgIyBhbGlnbiBzeXNjb25maWcgYW5kIHRpY2tldCBtYXNrIGRhdGEgSQogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyAkRHluYW1pY0ZpZWxkTGlzdCAvLyBbXSB9ICkgewogICAgICAgIGlmICggZXhpc3RzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc317ICREeW5hbWljRmllbGQtPntOYW1lfSB9ICkgewogICAgICAgICAgICBteSAkUGFyYW1ldGVycyA9IGRlbGV0ZSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSAvLyB7fTsKCiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAkUGFyYW1ldGVycy0+JSogKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57JEF0dHJpYnV0ZX0gPSAkUGFyYW1ldGVycy0+eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoICRTZWxmLT57TWFza0RlZmluaXRpb259LT5AKiwgewogICAgICAgICAgICAgICAgREYgICAgICAgID0+ICREeW5hbWljRmllbGQtPntOYW1lfSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPT0gMiA/IDEgOiAwLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGQtPntNYW5kYXRvcnl9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVzaCAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPkAqLCAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgICMgYWxpZ24gc3lzY29uZmlnIGFuZCB0aWNrZXQgbWFzayBkYXRhIElJCiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCBrZXlzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc30tPiUqICkgewogICAgICAgIHB1c2ggJFNlbGYtPntEeW5hbWljRmllbGR9LT5AKiwgJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROYW1lLAogICAgICAgICk7CgogICAgICAgIG15ICRQYXJhbWV0ZXJzID0gJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXskRHluYW1pY0ZpZWxkTmFtZX0gLy8ge307CgogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAkUGFyYW1ldGVycy0+JSogKSB7CiAgICAgICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfVstMV17JEF0dHJpYnV0ZX0gPSAkUGFyYW1ldGVycy0+eyRBdHRyaWJ1dGV9OwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgZm9yICgKICAgICAgICBxdyhUbyBDYyBCY2MgU3ViamVjdCBCb2R5IEluUmVwbHlUbyBSZWZlcmVuY2VzIENvbXBvc2VTdGF0ZUlEIElzVmlzaWJsZUZvckN1c3RvbWVyUHJlc2VudAogICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyIEFydGljbGVJRCBUaW1lVW5pdHMgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgRm9ybURyYWZ0SUQgVGl0bGUpCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRfICk7CiAgICAgICAgaWYgKCBkZWZpbmVkICRWYWx1ZSApIHsKICAgICAgICAgICAgJFNlbGYtPntHZXRQYXJhbX0tPnskX30gPSAkVmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57R2V0UGFyYW19LT57Rm9yd2FyZFRlbXBsYXRlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZvcndhcmRUZW1wbGF0ZUlEJyApIHx8ICcnOwoKICAgICMgQUNMIGNvbXBhdGliaWxpdHkgdHJhbnNsYXRpb24KICAgICRTZWxmLT57QUNMQ29tcGF0R2V0UGFyYW19LT57TmV4dFN0YXRlSUR9ID0gJFNlbGYtPntHZXRQYXJhbX0tPntDb21wb3NlU3RhdGVJRH07CgogICAgIyBHZXQgZm9ybSBJRC4KICAgICRTZWxmLT57R2V0UGFyYW19LT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5QcmVwYXJlRm9ybUlEKAogICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE91dHB1dDsKCiAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICBteSAlUG9zc2libGVBY3Rpb25zID0gKCAxID0+ICRTZWxmLT57QWN0aW9ufSApOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgdGlja2V0IGRhdGEKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICRTZWxmLT57R2V0UGFyYW19LT57RnJvbX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKS0+U2VuZGVyKAogICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAlQWNsQWN0aW9uID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICBpZiAoJEFDTCkgewoKICAgICAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICAgICAjIHNob3cgZXJyb3Igc2NyZWVuIGlmIEFDTCBwcm9oaWJpdHMgdGhpcyBhY3Rpb24KICAgICAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KICAgIH0KCiAgICAjIENoZWNrIGZvciBmYWlsZWQgZHJhZnQgbG9hZGluZyByZXF1ZXN0LgogICAgaWYgKAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdMb2FkRm9ybURyYWZ0JyApCiAgICAgICAgJiYgISRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9CiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0xvYWRpbmcgZHJhZnQgZmFpbGVkIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VuZEVtYWlsJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT5TZW5kRW1haWwoKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKICAgICAgICAkT3V0cHV0ID0gJFNlbGYtPkFqYXhVcGRhdGUoKTsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0gKSB7CiAgICAgICAgJE91dHB1dCA9ICRTZWxmLT5TZW5kRW1haWwoKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXQgPSAkU2VsZi0+Rm9ybSgpOwogICAgfQoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgRm9ybSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVFcnJvcjsKICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbSA9ICV7ICRTZWxmLT57QUNMQ29tcGF0R2V0UGFyYW19IH07CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnR290IG5vIFRpY2tldElEIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnU3lzdGVtIEVycm9yIScpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRUaWNrZXRPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgIyBnZXQgdGlja2V0IGRhdGEKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgZ2V0IGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgbXkgJUdldFBhcmFtRXh0ZW5kZWQgPSAkU2VsZi0+X0dldEV4dGVuZGVkUGFyYW1zKCk7CgogICAgbXkgJUdldFBhcmFtICAgICAgICAgICAgPSAleyAkR2V0UGFyYW1FeHRlbmRlZHtHZXRQYXJhbX0gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyICAgID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lcn0gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQ2MgID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lckNjfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJCY2MgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyQmNjfSB9OwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgaWYgKCAhJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja0dldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKCiAgICAgICAgICAgIG15ICRMb2NrID0gJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJExvY2spIHsKCiAgICAgICAgICAgICAgICAjIFNldCBuZXcgb3duZXIgaWYgdGlja2V0IG93bmVyIGlzIGRpZmZlcmVudCB0aGVuIGxvZ2dlZCB1c2VyLgogICAgICAgICAgICAgICAgaWYgKCAkVGlja2V0e093bmVySUR9ICE9ICRTZWxmLT57VXNlcklEfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBSZW1lbWJlciBwcmV2aW91cyBvd25lciwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJlc3RvcmUgdGlja2V0IG93bmVyIG9uIHVuZG8gYWN0aW9uLgogICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcmV2aW91c093bmVyfSA9ICRUaWNrZXR7T3duZXJJRH07CgogICAgICAgICAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFNob3cgbG9jayBzdGF0ZS4KICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXNMb2NrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFRpY2tldE9iamVjdC0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gam9pbiAnJywKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdTb3JyeSwgeW91IG5lZWQgdG8gYmUgdGhlIHRpY2tldCBvd25lciB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLicpLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNoYW5nZSB0aGUgb3duZXIgZmlyc3QuJyksCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCBzZWxlY3RlZCBvciBsYXN0IGN1c3RvbWVyIGFydGljbGUuCiAgICBteSAlRGF0YTsKICAgIGlmICggJEdldFBhcmFte0FydGljbGVJRH0gKSB7CiAgICAgICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICApOwogICAgICAgICVEYXRhID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBpZiBhcnRpY2xlIGV4aXN0cy4KICAgICAgICBpZiAoICElRGF0YSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdBcnRpY2xlICVzIGNvdWxkIG5vdCBiZSBmb3VuZCEnLCAkR2V0UGFyYW17QXJ0aWNsZUlEfSApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIEdldCBsYXN0IGN1c3RvbWVyIGFydGljbGUuCiAgICAgICAgbXkgQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBTZW5kZXJUeXBlID0+ICdjdXN0b21lcicsCiAgICAgICAgICAgIE9ubHlMYXN0ICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIElmIHRoZSB0aWNrZXQgaGFzIG5vIGN1c3RvbWVyIGFydGljbGUsIGdldCB0aGUgbGFzdCBhZ2VudCBhcnRpY2xlLgogICAgICAgIGlmICggIUBBcnRpY2xlcyApIHsKICAgICAgICAgICAgQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIE9ubHlMYXN0ICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRmluYWxseSwgaWYgZXZlcnl0aGluZyBmYWlsZWQsIGdldCBsYXRlc3QgYXJ0aWNsZS4KICAgICAgICBpZiAoICFAQXJ0aWNsZXMgKSB7CiAgICAgICAgICAgIEBBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT25seUxhc3QgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkQXJ0aWNsZSAoQEFydGljbGVzKSB7CiAgICAgICAgICAgICVEYXRhID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyRBcnRpY2xlfSApLT5BcnRpY2xlR2V0KAogICAgICAgICAgICAgICAgJXskQXJ0aWNsZX0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBzaWduYXR1cmUKICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwogICAgJERhdGF7U2lnbmF0dXJlfSA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBBcnRpY2xlSUQgPT4gJERhdGF7QXJ0aWNsZUlEfSwKICAgICAgICBEYXRhICAgICAgPT4gXCVEYXRhLAogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggJEdldFBhcmFte0ZvcndhcmRUZW1wbGF0ZUlEfSApIHsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUKICAgICAgICAkRGF0YXtTdGRUZW1wbGF0ZX0gPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlRlbXBsYXRlKAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgID0+ICREYXRhe0FydGljbGVJRH0sCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte0ZvcndhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNpZ25hdHVyZQogICAgICAgICREYXRhe1NpZ25hdHVyZX0gPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNpZ25hdHVyZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIERhdGEgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICMgYm9keSBwcmVwYXJhdGlvbiBmb3IgcGxhaW4gdGV4dCBwcm9jZXNzaW5nCiAgICAkRGF0YXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPkFydGljbGVRdW90ZSgKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJERhdGF7VGlja2V0SUR9LAogICAgICAgIEFydGljbGVJRCAgICAgICAgICA9PiAkRGF0YXtBcnRpY2xlSUR9LAogICAgICAgIEZvcm1JRCAgICAgICAgICAgICA9PiAkU2VsZi0+e0dldFBhcmFtfS0+e0Zvcm1JRH0sCiAgICAgICAgVXBsb2FkQ2FjaGVPYmplY3QgID0+ICRVcGxvYWRDYWNoZU9iamVjdCwKICAgICAgICBBdHRhY2htZW50c0luY2x1ZGUgPT4gMSwKICAgICk7CgogICAgbXkgJVNhZmV0eUNoZWNrUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5TYWZldHkoCiAgICAgICAgU3RyaW5nID0+ICREYXRhe0JvZHl9LAoKICAgICAgICAjIFN0cmlwIG91dCBleHRlcm5hbCBjb250ZW50IGlmIEJsb2NrTG9hZGluZ1JlbW90ZUNvbnRlbnQgaXMgZW5hYmxlZC4KICAgICAgICBOb0V4dFNyY0xvYWQgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCbG9ja0xvYWRpbmdSZW1vdGVDb250ZW50JyksCgogICAgICAgICMgRGlzYWxsb3cgcG90ZW50aWFsbHkgdW5zYWZlIGNvbnRlbnQuCiAgICAgICAgTm9BcHBsZXQgICAgID0+IDEsCiAgICAgICAgTm9PYmplY3QgICAgID0+IDEsCiAgICAgICAgTm9FbWJlZCAgICAgID0+IDEsCiAgICAgICAgTm9TVkcgICAgICAgID0+IDEsCiAgICAgICAgTm9KYXZhU2NyaXB0ID0+IDEsCiAgICApOwogICAgJERhdGF7Qm9keX0gPSAkU2FmZXR5Q2hlY2tSZXN1bHR7U3RyaW5nfTsKCiAgICAjIElmIGFydGljbGUgaXMgbm90IGEgTUlNRUJhc2UgYXJ0aWNsZSwgaW5jbHVkZSBzZW5kZXIgbmFtZSBmb3IgY29ycmVjdCBxdW90aW5nLgogICAgaWYgKCAhJERhdGF7RnJvbX0gKSB7CiAgICAgICAgbXkgJUFydGljbGVGaWVsZHMgPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlRmllbGRzKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkRGF0YXtBcnRpY2xlSUR9LAogICAgICAgICk7CiAgICAgICAgJERhdGF7U2VuZGVyfSA9ICRBcnRpY2xlRmllbGRze1NlbmRlcn0tPntWYWx1ZX0gLy8gJyc7CiAgICB9CgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyBwcmVwYXJlIGJvZHksIHN1YmplY3QsIFJlcGx5VG8sIC4uLgogICAgICAgICREYXRhe0JvZHl9ID0gJzxici8+JyAuICREYXRhe0JvZHl9OwogICAgICAgIGlmICggJERhdGF7Q3JlYXRlVGltZX0gKSB7CiAgICAgICAgICAgICREYXRhe0NyZWF0ZVRpbWV9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZyggJERhdGF7Q3JlYXRlVGltZX0gKTsKICAgICAgICAgICAgJERhdGF7Qm9keX0gICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0RhdGUnKSAuCiAgICAgICAgICAgICAgICAiOiAkRGF0YXtDcmVhdGVUaW1lfTxici8+IiAuICREYXRhe0JvZHl9OwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJEtleSAocXcoU3ViamVjdCBSZXBseVRvIFJlcGx5LVRvIENjIFRvIEZyb20gU2VuZGVyKSkgewogICAgICAgICAgICBpZiAoICREYXRheyRLZXl9ICkgewogICAgICAgICAgICAgICAgbXkgJEtleVRleHQgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJEtleSk7CgogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICREYXRheyRLZXl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gIiRLZXlUZXh0OiAkVmFsdWU8YnIvPiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlF1b3RlJykgfHwgJycsCiAgICAgICAgKTsKICAgICAgICBpZiAoJFF1b3RlKSB7CgogICAgICAgICAgICAjIHF1b3RlIHRleHQKICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAiPGJsb2NrcXVvdGUgdHlwZT1cImNpdGVcIj4kRGF0YXtCb2R5fTwvYmxvY2txdW90ZT5cbiI7CgogICAgICAgICAgICAjIGNsZWFudXAgbm90IGNvbXBhdC4gdGFncwogICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDbGVhbnVwKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICREYXRhe0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJERhdGF7Qm9keX0gPSAiPGJyLz4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgfQogICAgICAgIG15ICRGcm9tID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgIFN0cmluZyA9PiAkRGF0YXtGcm9tfSB8fCAkRGF0YXtTZW5kZXJ9LAogICAgICAgICk7CgogICAgICAgIG15ICRGb3J3YXJkZWRNZXNzYWdlRnJvbSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRm9yd2FyZGVkIG1lc3NhZ2UgZnJvbScpOwogICAgICAgIG15ICRFbmRGb3J3YXJkZWRNZXNzYWdlICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRW5kIGZvcndhcmRlZCBtZXNzYWdlJyk7CgogICAgICAgICREYXRhe0JvZHl9ID0gIjxici8+LS0tLSAkRm9yd2FyZGVkTWVzc2FnZUZyb20gJEZyb20gLS0tPGJyLz48YnIvPiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICAkRGF0YXtCb2R5fSAuPSAiPGJyLz4tLS0tICRFbmRGb3J3YXJkZWRNZXNzYWdlIC0tLTxici8+IjsKICAgICAgICAkRGF0YXtCb2R5fSA9ICREYXRhe1NpZ25hdHVyZX0gLiAkRGF0YXtCb2R5fTsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Rm9yd2FyZFRlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICREYXRhe1N0ZFRlbXBsYXRlfSAuICc8YnIvPicgLiAkRGF0YXtCb2R5fTsKICAgICAgICB9CgogICAgICAgICREYXRhe0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgcHJlcGFyZSBib2R5LCBzdWJqZWN0LCBSZXBseVRvLCAuLi4KICAgICAgICAkRGF0YXtCb2R5fSA9fiBzL1x0LyAvZzsKICAgICAgICBteSAkUXVvdGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlF1b3RlJyk7CiAgICAgICAgaWYgKCRRdW90ZSkgewogICAgICAgICAgICAkRGF0YXtCb2R5fSA9fiBzL1xuL1xuJFF1b3RlIC9nOwogICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbiRRdW90ZSAiIC4gJERhdGF7Qm9keX07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRGF0YXtCb2R5fSA9ICJcbiIgLiAkRGF0YXtCb2R5fTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkRGF0YXtDcmVhdGVUaW1lfSApIHsKICAgICAgICAgICAgJERhdGF7Q3JlYXRlVGltZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKCAkRGF0YXtDcmVhdGVUaW1lfSApOwogICAgICAgICAgICAkRGF0YXtCb2R5fSAgICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRGF0ZScpIC4KICAgICAgICAgICAgICAgICI6ICREYXRhe0NyZWF0ZVRpbWV9XG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgfQogICAgICAgIGZvciAocXcoU3ViamVjdCBSZXBseVRvIFJlcGx5LVRvIENjIFRvIEZyb20gU2VuZGVyKSkgewogICAgICAgICAgICBpZiAoICREYXRheyRffSApIHsKICAgICAgICAgICAgICAgICREYXRhe0JvZHl9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRfKSAuCiAgICAgICAgICAgICAgICAgICAgIjogJERhdGF7JF99XG4iIC4gJERhdGF7Qm9keX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRGb3J3YXJkZWRNZXNzYWdlRnJvbSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRm9yd2FyZGVkIG1lc3NhZ2UgZnJvbScpOwogICAgICAgIG15ICRFbmRGb3J3YXJkZWRNZXNzYWdlICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRW5kIGZvcndhcmRlZCBtZXNzYWdlJyk7CgogICAgICAgIG15ICRGcm9tID0gJERhdGF7RnJvbX0gfHwgJERhdGF7U2VuZGVyfTsKCiAgICAgICAgJERhdGF7Qm9keX0gPSAiXG4tLS0tICRGb3J3YXJkZWRNZXNzYWdlRnJvbSAkRnJvbSAtLS1cblxuIiAuICREYXRhe0JvZHl9OwogICAgICAgICREYXRhe0JvZHl9IC49ICJcbi0tLS0gJEVuZEZvcndhcmRlZE1lc3NhZ2UgLS0tXG4iOwogICAgICAgICREYXRhe0JvZHl9ID0gJERhdGF7U2lnbmF0dXJlfSAuICREYXRhe0JvZHl9OwoKICAgICAgICBpZiAoICRHZXRQYXJhbXtGb3J3YXJkVGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICREYXRhe0JvZHl9ID0gJERhdGF7U3RkVGVtcGxhdGV9IC4gIlxuIiAuICREYXRhe0JvZHl9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBzdGQuIGF0dGFjaG1lbnQgb2JqZWN0CiAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50Jyk7CgogICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byBlbWFpbAogICAgaWYgKCAkR2V0UGFyYW17Rm9yd2FyZFRlbXBsYXRlSUR9ICkgewogICAgICAgIG15ICVBbGxTdGRBdHRhY2htZW50cyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17Rm9yd2FyZFRlbXBsYXRlSUR9LAogICAgICAgICk7CiAgICAgICAgZm9yICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzRGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50R2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0dldFBhcmFtfS0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAlQXR0YWNobWVudHNEYXRhLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZm9yd2FyZCBwcmVzZWxlY3RlZCBzdGF0ZQogICAgICAgIG15ICVGb3J3YXJkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKS0+U3RhbmRhcmRUZW1wbGF0ZUdldCgKICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte0ZvcndhcmRUZW1wbGF0ZUlEfSwKICAgICAgICApOwogICAgICAgICRHZXRQYXJhbXtDb21wb3NlU3RhdGVJRH0gfHw9ICRGb3J3YXJke1ByZVNlbGVjdGVkVGlja2V0U3RhdGVJRH07CiAgICB9CgogICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57R2V0UGFyYW19LT57Rm9ybUlEfSwKICAgICk7CgogICAgIyBjaGVjayBzb21lIHZhbHVlcwogICAgZm9yIG15ICRSZWNpcGllbnQgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICBpZiAoICREYXRheyRSZWNpcGllbnR9ICkgewogICAgICAgICAgICBkZWxldGUgJERhdGF7JFJlY2lwaWVudH07CiAgICAgICAgfQogICAgfQoKICAgICMgcHV0ICYgZ2V0IGF0dHJpYnV0ZXMgbGlrZSBzZW5kZXIgYWRkcmVzcwogICAgJURhdGEgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPkF0dHJpYnV0ZXMoCiAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICBEYXRhICAgICAgPT4gXCVEYXRhLAogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQWN0aW9uICAgID0+ICdGb3J3YXJkJywKICAgICk7CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICBpZiAoIHJlZiggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpICkgZXEgJ0hBU0gnICkgewoKICAgICAgICAjIHVzZSB0aWNrZXQgUXVldWVJRCBpbiBjb21wb3NlIG1vZHVsZXMKICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkVGlja2V0e1F1ZXVlSUR9OwoKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15ICROZXdQYXJhbXMgPSAkT2JqZWN0LT5SdW4oICVEYXRhLCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgaWYgKCROZXdQYXJhbXMpIHsKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICROZXdQYXJhbXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGVycm9ycwogICAgICAgICAgICAlRXJyb3IgPSAoICVFcnJvciwgJE9iamVjdC0+RXJyb3IoICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkIHZhbGlkYXRpb24gcmVzdWx0cyBpZiBlcnJvbmVvdXMKICAgIG15ICVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlczsKCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICk7CgogICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwogICAgfQoKICAgICMgZXh0cmFjdCBkeW5hbWljIGZpZWxkIHZhbHVlcyBmcm9tIHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0REZWYWx1ZXMgPQogICAgICAgIG1hcCAgeyAnRHluYW1pY0ZpZWxkXycgLiAkXy0+e05hbWV9ID0+ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICRfLT57TmFtZX0gfSB9CiAgICAgICAgZ3JlcCB7ICRfLT57T2JqZWN0VHlwZX0gZXEgJ1RpY2tldCcgfQogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+QCo7CgogICAgIyBidWlsZCB2aWV3CiAgICAjIHN0YXJ0IHdpdGggcGFnZQogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgKTsKCiAgICAjIGJ1aWxkIHJlZmVyZW5jZXMgc3RyaW5nCiAgICBteSAkUmVmZXJlbmNlcyA9IGRlZmluZWQgJERhdGF7UmVmZXJlbmNlc30gPyAkRGF0YXtSZWZlcmVuY2VzfSAuICcgJyA6ICcnOwogICAgJFJlZmVyZW5jZXMgLj0gZGVmaW5lZCAkRGF0YXtNZXNzYWdlSUR9ID8gJERhdGF7TWVzc2FnZUlEfSA6ICcnOwoKICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgIFRpY2tldE51bWJlciAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBUaXRsZSAgICAgICAgICA9PiAkVGlja2V0e1RpdGxlfSwKICAgICAgICBDdXN0b21lcklEICAgICA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRUaWNrZXR7UXVldWVJRH0sCiAgICAgICAgU0xBSUQgICAgICAgICAgPT4gJFRpY2tldHtTTEFJRH0sCiAgICAgICAgTmV4dFN0YXRlcyAgICAgPT4gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICApLAogICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJwogICAgICAgICAgICA6ICcnCiAgICAgICAgKSwKICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJDYywKICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICBBdHRhY2htZW50cyAgICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgJURhdGEsCiAgICAgICAgJUdldFBhcmFtLAogICAgICAgIEluUmVwbHlUbyAgICAgICAgPT4gJERhdGF7TWVzc2FnZUlEfSwKICAgICAgICBSZWZlcmVuY2VzICAgICAgID0+ICRSZWZlcmVuY2VzLAogICAgICAgIERGUG9zc2libGVWYWx1ZXMgPT4gXCVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlcywKICAgICAgICBERlZhbHVlcyAgICAgICAgID0+IFwlVGlja2V0REZWYWx1ZXMsCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIFNlbmRFbWFpbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVFcnJvcjsKICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbSA9ICV7ICRTZWxmLT57QUNMQ29tcGF0R2V0UGFyYW19IH07CgogICAgbXkgJUdldFBhcmFtRXh0ZW5kZWQgPSAkU2VsZi0+X0dldEV4dGVuZGVkUGFyYW1zKCk7CgogICAgbXkgJUdldFBhcmFtICAgICAgICAgICAgPSAleyAkR2V0UGFyYW1FeHRlbmRlZHtHZXRQYXJhbX0gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyICAgID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lcn0gfTsKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQ2MgID0gQHsgJEdldFBhcmFtRXh0ZW5kZWR7TXVsdGlwbGVDdXN0b21lckNjfSB9OwogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJCY2MgPSBAeyAkR2V0UGFyYW1FeHRlbmRlZHtNdWx0aXBsZUN1c3RvbWVyQmNjfSB9OwoKICAgIG15ICVEeW5hbWljRmllbGRWYWx1ZXM7CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgY29uZmlnIGZvciBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBHZXQgYW5kIHZhbGlkYXRlIGRyYWZ0IGFjdGlvbi4KICAgIG15ICRGb3JtRHJhZnRBY3Rpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybURyYWZ0QWN0aW9uJyApOwogICAgaWYgKCAkRm9ybURyYWZ0QWN0aW9uICYmICEkQ29uZmlnLT57Rm9ybURyYWZ0fSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdGb3JtRHJhZnQgZnVuY3Rpb25hbGl0eSBkaXNhYmxlZCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJUZvcm1EcmFmdFJlc3BvbnNlOwoKICAgICMgQ2hlY2sgZHJhZnQgbmFtZS4KICAgIGlmICgKICAgICAgICAkRm9ybURyYWZ0QWN0aW9uCiAgICAgICAgJiYgKCAkRm9ybURyYWZ0QWN0aW9uIGVxICdBZGQnIHx8ICRGb3JtRHJhZnRBY3Rpb24gZXEgJ1VwZGF0ZScgKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkVGl0bGUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybURyYWZ0VGl0bGUnICk7CgogICAgICAgICMgQSBkcmFmdCBuYW1lIGlzIHJlcXVpcmVkLgogICAgICAgIGlmICggISRUaXRsZSApIHsKCiAgICAgICAgICAgICVGb3JtRHJhZnRSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICA9PiAwLAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCJEcmFmdCBuYW1lIGlzIHJlcXVpcmVkISIpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDaG9zZW4gZHJhZnQgbmFtZSBtdXN0IGJlIHVuaXF1ZS4KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEZvcm1EcmFmdExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdExpc3RHZXQoCiAgICAgICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIERSQUZUOgogICAgICAgICAgICBmb3IgbXkgJEZvcm1EcmFmdCAoIEB7JEZvcm1EcmFmdExpc3R9ICkgewoKICAgICAgICAgICAgICAgICMgTm8gZXhpc3RpbmcgZHJhZnQgd2l0aCBzYW1lIG5hbWUuCiAgICAgICAgICAgICAgICBuZXh0IERSQUZUIGlmICRUaXRsZSBuZSAkRm9ybURyYWZ0LT57VGl0bGV9OwoKICAgICAgICAgICAgICAgICMgU2FtZSBuYW1lIGZvciB1cGRhdGUgb24gZXhpc3RpbmcgZHJhZnQuCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Zvcm1EcmFmdElEfQogICAgICAgICAgICAgICAgICAgICYmICRGb3JtRHJhZnRBY3Rpb24gZXEgJ1VwZGF0ZScKICAgICAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9IGVxICRGb3JtRHJhZnQtPntGb3JtRHJhZnRJRH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBEUkFGVDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIEFub3RoZXIgZHJhZnQgd2l0aCB0aGUgY2hvc2VuIG5hbWUgYWxyZWFkeSBleGlzdHMuCiAgICAgICAgICAgICAgICAlRm9ybURyYWZ0UmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCAiRm9ybURyYWZ0IG5hbWUgJXMgaXMgYWxyZWFkeSBpbiB1c2UhIiwgJFRpdGxlICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbGFzdCBEUkFGVDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIFBlcmZvcm0gZHJhZnQgYWN0aW9uIGluc3RlYWQgb2Ygc2F2aW5nIGZvcm0gZGF0YSBpbiB0aWNrZXQvYXJ0aWNsZS4KICAgIGlmICggJEZvcm1EcmFmdEFjdGlvbiAmJiAhJUZvcm1EcmFmdFJlc3BvbnNlICkgewoKICAgICAgICAjIFJlc2V0IEZvcm1EcmFmdElEIHRvIHByZXZlbnQgdXBkYXRpbmcgZXhpc3RpbmcgZHJhZnQuCiAgICAgICAgaWYgKCAkRm9ybURyYWZ0QWN0aW9uIGVxICdBZGQnICYmICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0gKSB7CgogICAgICAgICAgICAjIG1lZGRsaW5nIHdpdGggdGhlIGlubmFyZHMgb2YgS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdAogICAgICAgICAgICAkUGFyYW1PYmplY3QtPlNldEFycmF5KAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdGb3JtRHJhZnRJRCcsCiAgICAgICAgICAgICAgICBWYWx1ZXMgPT4gWycnXQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEZvcm1EcmFmdEFjdGlvbk9rOwogICAgICAgIGlmICgKICAgICAgICAgICAgJEZvcm1EcmFmdEFjdGlvbiBlcSAnQWRkJwogICAgICAgICAgICB8fAogICAgICAgICAgICAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ1VwZGF0ZScgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGb3JtRHJhZnRBY3Rpb25PayA9ICRQYXJhbU9iamVjdC0+U2F2ZUZvcm1EcmFmdCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnRGVsZXRlJyAmJiAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9ICkgewogICAgICAgICAgICAkRm9ybURyYWZ0QWN0aW9uT2sgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdERlbGV0ZSgKICAgICAgICAgICAgICAgIEZvcm1EcmFmdElEID0+ICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJEZvcm1EcmFmdEFjdGlvbk9rKSB7CiAgICAgICAgICAgICRGb3JtRHJhZnRSZXNwb25zZXtTdWNjZXNzfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlRm9ybURyYWZ0UmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAnQ291bGQgbm90IHBlcmZvcm0gcmVxdWVzdGVkIGRyYWZ0IGFjdGlvbiEnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJUZvcm1EcmFmdFJlc3BvbnNlKSB7CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gXCVGb3JtRHJhZnRSZXNwb25zZSwKICAgICAgICApOwoKICAgICAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0KICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICk7CiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRJdGVtICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRJdGVtOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFkZWZpbmVkICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZEl0ZW19OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZEl0ZW0gfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZEl0ZW19OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CgogICAgbXkgJVN0YXRlRGF0YTsKCiAgICBpZiAoICRHZXRQYXJhbXtDb21wb3NlU3RhdGVJRH0gKSB7CiAgICAgICAgJVN0YXRlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldCgKICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte0NvbXBvc2VTdGF0ZUlEfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICROZXh0U3RhdGUgPSAkU3RhdGVEYXRhe05hbWV9OwoKICAgICMgY2hlY2sgcGVuZGluZyBkYXRlCiAgICBpZiAoIGRlZmluZWQgJFN0YXRlRGF0YXtUeXBlTmFtZX0gJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICMgY3JlYXRlIGEgZGF0ZXRpbWUgb2JqZWN0IGJzZWQgb24gcGVuZGluZyBkYXRlCiAgICAgICAgbXkgJFBlbmRpbmdEYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgU2Vjb25kID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY3VycmVudCBzeXN0ZW0gZXBvY2gKICAgICAgICBteSAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAgICAgaWYgKCAhJFBlbmRpbmdEYXRlVGltZU9iamVjdCB8fCAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0IDwgJEN1clN5c3RlbURhdGVUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIFRvCiAgICBpZiAoICEkR2V0UGFyYW17VG99ICkgewogICAgICAgICRFcnJvcnsnVG9JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgY2hlY2sgYm9keQogICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICRFcnJvcnsnQm9keUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBjaGVjayBzdWJqZWN0CiAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpCiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICApCiAgICB7CiAgICAgICAgJEVycm9yeydUaW1lVW5pdHNJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgaW5mb3JtYXRpb24gb24gdGhlIGN1cnJlbnQgdGlja2V0CiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICAjIHByZXBhcmUgdGhlIHN1YmplY3QKICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgIEFjdGlvbiAgICAgICA9PiAnRm9yd2FyZCcsCiAgICAgICAgU3ViamVjdCAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSB8fCAnJywKICAgICk7CgogICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkIHZhbGlkYXRpb24gcmVzdWx0cyBpZiBlcnJvbmVvdXMKICAgIG15ICVEeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0OwogICAgbXkgJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzOwoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICREeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAoKICAgICAgICAgICAgIyBNYW5kYXRvcnkgaXMgYWRkZWQgdG8gdGhlIGNvbmZpZ3MgYnkgJFNlbGYtPm5ldwogICAgICAgICAgICBNYW5kYXRvcnkgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e01hbmRhdG9yeX0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHR7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgfQoKICAgIH0KCiAgICAjIHRyYW5zZm9ybSBwZW5kaW5nIHRpbWUsIHRpbWUgc3RhbXAgYmFzZWQgb24gdXNlciB0aW1lIHpvbmUKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXtZZWFyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01vbnRofQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0RheX0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtIb3VyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01pbnV0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJUdldFBhcmFtID0gJExheW91dE9iamVjdC0+VHJhbnNmb3JtRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgIyBjaGVjayBzb21lIHZhbHVlcwogICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKICAgIExJTkU6CiAgICBmb3IgbXkgJExpbmUgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICBuZXh0IExJTkUgdW5sZXNzICRHZXRQYXJhbXskTGluZX07CgogICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRHZXRQYXJhbXskTGluZX0gKSApIHsKICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnRXJyb3JUeXBlJyB9ID0gJExpbmUgLiAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSW52YWxpZCcgfSAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsLAojIFJvdGhlciBPU1MgLyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKIyBFTyBEaXNjcmV0ZVN5c3RlbUFkZHJlc3NlcwogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJElzTG9jYWwpIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJExpbmUgLiAnSXNMb2NhbEFkZHJlc3MnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgTWFrZSBzdXJlIHNlbmRlciBpcyBjb3JyZWN0IG9uZS4gU2VlIGJ1ZyMxNDg3MiAoIGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ4NzIgKS4KICAgICRHZXRQYXJhbXtGcm9tfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpLT5TZW5kZXIoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewoKICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBkb24ndCBzYXZlIGZvcm0gaWYgYSBkcmFmdCB3YXMgbG9hZGVkLgogICAgICAgICVFcnJvciA9ICggTG9hZGVkRm9ybURyYWZ0ID0+IDEgKTsKICAgIH0KCiAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgIG15ICVBcnRpY2xlUGFyYW07CiAgICBpZiAoIHJlZiggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpICkgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIERlYnVnID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJE11bHRpcGxlOwoKICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKCAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSAmJiAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gbmUgJ1NpbmdsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgJE11bHRpcGxlID0gMTsKICAgICAgICAgICAgICAgICAgICBuZXh0IFBBUkFNRVRFUjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBTdG9yZU5ldyA9PiAxLAogICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBvcHRpb25zIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uCiAgICAgICAgICAgICMgYW5kIGFkZCB0aGVtIGJhY2sgdG8gdGhlIHNlbGVjdGlvbiBzbyB0aGF0IHRoZSBzdWJtaXQKICAgICAgICAgICAgIyB3aWxsIGNvbnRhaW4gb3B0aW9ucyB0aGF0IHdlcmUgaGlkZGVuIGZyb20gdGhlIGFnZW50CiAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICBpZiAoICRPYmplY3QtPmNhbignR2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCcpICkgewogICAgICAgICAgICAgICAgbXkgQFJlbW92ZWRPcHRpb25zID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwogICAgICAgICAgICAgICAgaWYgKEBSZW1vdmVkT3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgIGlmICgkTXVsdGlwbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdmVkT3B0aW9uIChAUmVtb3ZlZE9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJEdldFBhcmFteyRLZXl9IH0sICRSZW1vdmVkT3B0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPSBzaGlmdCBAUmVtb3ZlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRpY2tldCBwYXJhbXMKICAgICAgICAgICAgJUFydGljbGVQYXJhbSA9ICgKICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBlcnJvcnMKICAgICAgICAgICAgJUVycm9yID0gKAogICAgICAgICAgICAgICAgJUVycm9yLAogICAgICAgICAgICAgICAgJE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHVwbG9hZCBjYWNoZSBvYmplY3QKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57R2V0UGFyYW19LT57Rm9ybUlEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiB0aGVyZSBpcyBhbiBlcnJvcgogICAgaWYgKCVFcnJvcikgewogICAgICAgIG15ICRRdWV1ZUlEID0gJFRpY2tldE9iamVjdC0+VGlja2V0UXVldWVJRCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKCiAgICAgICAgIyBleHRyYWN0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGZyb20gdGlja2V0IGRhdGEKICAgICAgICBteSAlVGlja2V0REZWYWx1ZXMgPQogICAgICAgICAgICBtYXAgIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8tPntOYW1lfSA9PiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkXy0+e05hbWV9IH0gfQogICAgICAgICAgICBncmVwIHsgJF8tPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyB9CiAgICAgICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+QCo7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICApOwoKICAgICAgICAjIFRPREQ6IE5vdGlmaWNhdGlvbiBhYm91dCBGb3JtRHJhZnQKCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgIFRpY2tldE51bWJlciAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgIEN1c3RvbWVySUQgICAgID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIFNMQUlEICAgICAgICAgID0+ICRUaWNrZXR7U0xBSUR9LAogICAgICAgICAgICBOZXh0U3RhdGVzICAgICA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJDYyAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQmNjLAogICAgICAgICAgICBBdHRhY2htZW50cyAgICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgREZQb3NzaWJsZVZhbHVlcyA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBERkVycm9ycyAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgREZWYWx1ZXMgICAgICAgICA9PiBcJVRpY2tldERGVmFsdWVzLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIHJlcGxhY2UgPE9UT0JPX1RJQ0tFVF9TVEFURT4gd2l0aCBuZXh0IHRpY2tldCBzdGF0ZSBuYW1lCiAgICBpZiAoJE5leHRTdGF0ZSkgewogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLygmbHQ7fDwpT1RPQk9fVElDS0VUX1NUQVRFKCZndDt8PikvJE5leHRTdGF0ZS9nOwogICAgfQoKICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudHMKICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0dldFBhcmFtfS0+e0Zvcm1JRH0sCiAgICApOwoKICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICApOwogICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgIHB1c2ggQEF0dGFjaG1lbnREYXRhLCBcJVVwbG9hZFN0dWZmOwogICAgfQoKICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICMgcmVtb3ZlIHVudXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgbXkgQE5ld0F0dGFjaG1lbnREYXRhOwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgaWYgKCAkQ29udGVudElEICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKSApIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICMgSUYgdGhlIGltYWdlIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGJvZHkgc2V0IGl0IGFzIGlubGluZS4KICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JvZHl9ID1+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gPSAnaW5saW5lJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKSB7CgogICAgICAgICAgICAgICAgICAgICMgSWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5LgogICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1lbWJlciBpbmxpbmUgaW1hZ2VzIGFuZCBub3JtYWwgYXR0YWNobWVudHMKICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICB9CiAgICAgICAgQEF0dGFjaG1lbnREYXRhID0gQE5ld0F0dGFjaG1lbnREYXRhOwoKICAgICAgICAjIHZlcmlmeSBIVE1MIGRvY3VtZW50CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZW5kIGVtYWlsCiAgICBteSAkVG8gPSAnJzsKICAgIEtFWToKICAgIGZvciBteSAkS2V5IChxdyhUbyBDYyBCY2MpKSB7CiAgICAgICAgbmV4dCBLRVkgaWYgISRHZXRQYXJhbXskS2V5fTsKICAgICAgICBpZiAoJFRvKSB7CiAgICAgICAgICAgICRUbyAuPSAnLCAnOwogICAgICAgIH0KICAgICAgICAkVG8gLj0gJEdldFBhcmFteyRLZXl9OwogICAgfQoKICAgIG15ICRJc1Zpc2libGVGb3JDdXN0b21lciA9ICRDb25maWctPntJc1Zpc2libGVGb3JDdXN0b21lckRlZmF1bHR9OwogICAgaWYgKCAkR2V0UGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJQcmVzZW50fSApIHsKICAgICAgICAkSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPSAkR2V0UGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9ID8gMSA6IDA7CiAgICB9CgogICAgbXkgJEVtYWlsQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JDaGFubmVsKAogICAgICAgIENoYW5uZWxOYW1lID0+ICdFbWFpbCcsCiAgICApOwoKICAgICMgR2V0IGF0dHJpYnV0ZXMgbGlrZSBzZW5kZXIgYWRkcmVzcy4KICAgIG15ICVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyktPkF0dHJpYnV0ZXMoCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgRGF0YSAgICAgPT4ge30sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkQXJ0aWNsZUlEID0gJEVtYWlsQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gJElzVmlzaWJsZUZvckN1c3RvbWVyLAogICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdGb3J3YXJkJywKICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAiXCVcJSRUbyIsCiAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJERhdGF7RnJvbX0sCiAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICBDYyAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgIEJjYyAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCY2N9LAogICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgIEluUmVwbHlUbyAgICAgICAgICAgID0+ICRHZXRQYXJhbXtJblJlcGx5VG99LAogICAgICAgIFJlZmVyZW5jZXMgICAgICAgICAgID0+ICRHZXRQYXJhbXtSZWZlcmVuY2VzfSwKICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICBBdHRhY2htZW50ICAgICAgICAgICA9PiBcQEF0dGFjaG1lbnREYXRhLAogICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICApOwoKICAgICMgZXJyb3IgcGFnZQogICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgdGltZSBhY2NvdW50aW5nCiAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBkeW5hbWljIGZpZWxkcwogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9OwoKICAgICAgICAjIHNldCB0aGUgb2JqZWN0IElEIChUaWNrZXRJRCBvciBBcnRpY2xlSUQpIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgY29uZmlndXJhdGlvbgogICAgICAgIG15ICRPYmplY3RJRCA9ICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnQXJ0aWNsZScgPyAkQXJ0aWNsZUlEIDogJFNlbGYtPntUaWNrZXRJRH07CgogICAgICAgICMgc2V0IHRoZSB2YWx1ZQogICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRPYmplY3RJRCwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgc3RhdGUKICAgIGlmICgkTmV4dFN0YXRlKSB7CiAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVTZXQoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgIFN0YXRlICAgICA9PiAkTmV4dFN0YXRlLAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdWxkIEkgc2V0IGFuIHVubG9jaz8KICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlbW92ZSBhbGwgZm9ybSBkYXRhCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntHZXRQYXJhbX0tPntGb3JtSUR9ICk7CgogICAgIyBJZiBmb3JtIHdhcyBjYWxsZWQgYmFzZWQgb24gYSBkcmFmdCwKICAgICMgICBkZWxldGUgZHJhZnQgc2luY2UgaXRzIGNvbnRlbnQgaGFzIG5vdyBiZWVuIHVzZWQuCiAgICBpZiAoCiAgICAgICAgJEdldFBhcmFte0Zvcm1EcmFmdElEfQogICAgICAgICYmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdERlbGV0ZSgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEdldFBhcmFte0Zvcm1EcmFmdElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ291bGQgbm90IGRlbGV0ZSBkcmFmdCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyByZWRpcmVjdAogICAgaWYgKAogICAgICAgIGRlZmluZWQgJFN0YXRlRGF0YXtUeXBlTmFtZX0KICAgICAgICAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kKICAgICAgICAmJiAhJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpSZWRpcmVjdEFmdGVyQ2xvc2VEaXNhYmxlZCcpCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICBVUkwgPT4gKCAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gfHwgJ0FjdGlvbj1BZ2VudERhc2hib2FyZCcgKSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgIFVSTCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGVJRCIsCiAgICApOwp9CgpzdWIgQWpheFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbSA9ICV7ICRTZWxmLT57QUNMQ29tcGF0R2V0UGFyYW19IH07CgogICAgbXkgJUdldFBhcmFtRXh0ZW5kZWQgPSAkU2VsZi0+X0dldEV4dGVuZGVkUGFyYW1zKCk7CgogICAgbXkgJUdldFBhcmFtID0gJXsgJEdldFBhcmFtRXh0ZW5kZWR7R2V0UGFyYW19IH07CgogICAgbXkgQEV4dGVuZGVkRGF0YTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgIEpPQjoKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgbmV4dCBKT0IgaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRNdWx0aXBsZTsKCiAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgIEB7ICRHZXRQYXJhbXskUGFyYW1ldGVyfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgICAgICRNdWx0aXBsZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJURhdGEgPSAkT2JqZWN0LT5EYXRhKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgIyBnZXQgQUpBWCBwYXJhbSB2YWx1ZXMKICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldFBhcmFtQUpBWCcpICkgewogICAgICAgICAgICAgICAgJUdldFBhcmFtID0gKCAlR2V0UGFyYW0sICRPYmplY3QtPkdldFBhcmFtQUpBWCglR2V0UGFyYW0pICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IG9wdGlvbnMgdGhhdCBoYXZlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uIHZpc2libGUKICAgICAgICAgICAgIyB0byB0aGUgYWdlbnQuIFRoZXNlIG9wdGlvbnMgd2lsbCBiZSBhZGRlZCBhZ2FpbiBvbiBzdWJtaXQuCiAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRPcHRpb25zVG9SZW1vdmVBSkFYJykgKSB7CiAgICAgICAgICAgICAgICBteSBAT3B0aW9uc1RvUmVtb3ZlID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwoKICAgICAgICAgICAgICAgIGZvciBteSAkT3B0aW9uVG9SZW1vdmUgKEBPcHRpb25zVG9SZW1vdmUpIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJERhdGF7JE9wdGlvblRvUmVtb3ZlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEtleSA9ICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICAgICAgaWYgKCRLZXkpIHsKICAgICAgICAgICAgICAgIHB1c2ggQEV4dGVuZGVkRGF0YSwgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gJE11bHRpcGxlLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICVEeW5hbWljRmllbGRWYWx1ZXM7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZEl0ZW0gKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZEl0ZW07CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIWRlZmluZWQgJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkSXRlbSB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKCiAgICBteSAkTmV4dFN0YXRlcyA9ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgKTsKCiAgICAjIHVwZGF0ZSBEeW5hbWljIEZpZWxkcyBQb3NzaWJsZSBWYWx1ZXMgdmlhIEFKQVgKICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICk7CgogICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9IGtleXMgJUZpbHRlcjsKICAgICAgICB9CgogICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICApIHx8ICRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9OwogICAgfQoKICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgIFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdDb21wb3NlU3RhdGVJRCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0NvbXBvc2VTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCnN1YiBfR2V0TmV4dFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5leHQgc3RhdGVzCiAgICBteSAlTmV4dFN0YXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICVQYXJhbSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gXCVOZXh0U3RhdGVzOwp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgIG15ICVTdGF0ZTsKICAgIGlmICggISRQYXJhbXtDb21wb3NlU3RhdGVJRH0gKSB7CiAgICAgICAgJFN0YXRle1NlbGVjdGVkVmFsdWV9ID0gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU3RhdGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17Q29tcG9zZVN0YXRlSUR9OwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJFBhcmFte05leHRTdGF0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17TmV4dFN0YXRlc30sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdDb21wb3NlU3RhdGVJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgRm9ybVVwZGF0ZScsCiAgICAgICAgJVN0YXRlLAogICAgKTsKCiAgICAkUGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9ID0gJENvbmZpZy0+e0lzVmlzaWJsZUZvckN1c3RvbWVyRGVmYXVsdH07CiAgICBpZiAoICRTZWxmLT57R2V0UGFyYW19LT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJQcmVzZW50fSApIHsKICAgICAgICAkUGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9ID0gJFNlbGYtPntHZXRQYXJhbX0tPntJc1Zpc2libGVGb3JDdXN0b21lcn0gPyAxIDogMDsKICAgIH0KCiAgICAjIHByZXBhcmUgZXJyb3JzIQogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgbXkgJEVycm9yICggc29ydCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskRXJyb3J9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskRXJyb3J9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB1c2VkIGNhbGVuZGFyCiAgICBteSAkQ2FsZW5kYXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldENhbGVuZGFyR2V0KAogICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgIFNMQUlEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICk7CgogICAgbXkgJFF1aWNrRGF0ZUJ1dHRvbnMgPSAkQ29uZmlnLT57UXVpY2tEYXRlQnV0dG9uc30gLy8gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpEZWZhdWx0UXVpY2tEYXRlQnV0dG9ucycpOwoKICAgICMgcGVuZGluZyBkYXRhIHN0cmluZwogICAgJFBhcmFte1BlbmRpbmdEYXRlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAlUGFyYW0sCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICA9PiA1LAogICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICBEaWZmVGltZSAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpIHx8IDAsCiAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntEYXRlSW52YWxpZH0gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAnICcsCiAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgICAgIENhbGVuZGFyICAgICAgICAgICAgID0+ICRDYWxlbmRhciwKICAgICAgICBRdWlja0RhdGVCdXR0b25zICAgICA9PiAkUXVpY2tEYXRlQnV0dG9ucywKICAgICk7CgogICAgIyBNdWx0aXBsZS1BdXRvY29tcGxldGUKICAgICMgQ2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJDYyA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQ2N9ICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQ2N9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjQ3VzdG9tZXJFcnJvckV4cGxhbmF0aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlckNjKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXJDYyApIHsKICAgICAgICAkUGFyYW17Q2NDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXJDYysrLAogICAgICAgIH0sCiAgICApOwoKICAgICMgQmNjCiAgICBteSAkQ3VzdG9tZXJDb3VudGVyQmNjID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9ICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQmNjfSB9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY0N1c3RvbWVyRXJyb3JFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXJCY2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckJjYyApIHsKICAgICAgICAkUGFyYW17QmNjQ3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckJjYysrLAogICAgICAgIH0sCiAgICApOwoKICAgICMgVG8KICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9IH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyRXJyb3JFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlcisrLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFBhcmFte1RvSW52YWxpZH0gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57VG9FcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUb1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte1RvSXNMb2NhbEFkZHJlc3N9ICYmICRQYXJhbXtFcnJvcnN9ICYmICEkUGFyYW17RXJyb3JzfS0+e1RvRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntDY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NjU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2NJc0xvY2FsQWRkcmVzc30gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57Q2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDY0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtCY2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntCY2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCY2NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtCY2NJc0xvY2FsQWRkcmVzc30gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57QmNjRXJyb3JUeXBlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmNjSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgcmVuZGVyIGR5bmFtaWMgZmllbGRzCiAgICB7CiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZENvbmZpZ3MgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gJFNlbGYtPntEeW5hbWljRmllbGR9LT5AKjsKCiAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkR5bmFtaWNGaWVsZDo6TWFzaycpLT5FZGl0U2VjdGlvblJlbmRlcigKICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICAgPT4gJFNlbGYtPntNYXNrRGVmaW5pdGlvbn0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkQ29uZmlncywKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLAogICAgICAgICAgICBEeW5hbWljRmllbGRWYWx1ZXMgICA9PiAkUGFyYW17REZWYWx1ZXN9LAogICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUGFyYW17REZQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgICAgID0+ICRQYXJhbXtERkVycm9yc30sCiAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgID0+ICRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRQYXJhbXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAkUGFyYW17REZWYWx1ZXN9LT4lKiwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgU2hvdyB0aGUgY3VzdG9tZXIgdXNlciBhZGRyZXNzIGJvb2sgaWYgdGhlIG1vZHVsZSBpcyByZWdpc3RlcmVkLgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50Q3VzdG9tZXJVc2VyQWRkcmVzc0Jvb2t9ICkgewogICAgICAgICRQYXJhbXtPcHRpb25DdXN0b21lclVzZXJBZGRyZXNzQm9va30gPSAxOwogICAgfQoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0gKTsKICAgICAgICAgICAgaWYgKCAkUGFyYW17Qm9keX0gPX4gL0NvbnRlbnRJRD1cUSRDb250ZW50SURMaW5rRW5jb2RlXEUvaSApIHsKICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJExvYWRlZEZvcm1EcmFmdDsKICAgIGlmICggJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0gKSB7CiAgICAgICAgJExvYWRlZEZvcm1EcmFmdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0R2V0KAogICAgICAgICAgICBGb3JtRHJhZnRJRCA9PiAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSwKICAgICAgICAgICAgR2V0Q29udGVudCAgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15IEBBcnRpY2xlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBPbmx5TGFzdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmIChAQXJ0aWNsZXMpIHsKICAgICAgICAgICAgbXkgJExhc3RBcnRpY2xlID0gJEFydGljbGVzWzBdOwoKICAgICAgICAgICAgbXkgJExhc3RBcnRpY2xlU3lzdGVtVGltZTsKICAgICAgICAgICAgaWYgKCAkTGFzdEFydGljbGUtPntDcmVhdGVUaW1lfSApIHsKICAgICAgICAgICAgICAgIG15ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkTGFzdEFydGljbGUtPntDcmVhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWUgPSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lT2JqZWN0LT5Ub0Vwb2NoKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRGb3JtRHJhZnRTeXN0ZW1UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExvYWRlZEZvcm1EcmFmdC0+e0NoYW5nZVRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEZvcm1EcmFmdFN5c3RlbVRpbWUgPSAkRm9ybURyYWZ0U3lzdGVtVGltZU9iamVjdC0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgaWYgKCAhJExhc3RBcnRpY2xlU3lzdGVtVGltZSB8fCAkRm9ybURyYWZ0U3lzdGVtVGltZSA8PSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lICkgewogICAgICAgICAgICAgICAgJFBhcmFte0Zvcm1EcmFmdE91dGRhdGVkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkTG9hZGVkRm9ybURyYWZ0KSApIHsKCiAgICAgICAgJExvYWRlZEZvcm1EcmFmdC0+e0NoYW5nZUJ5TmFtZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTmFtZSgKICAgICAgICAgICAgVXNlcklEID0+ICRMb2FkZWRGb3JtRHJhZnQtPntDaGFuZ2VCeX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGV4cGxhbmF0b3J5IG1lc3NhZ2UgYWJvdXQgYXN0ZXJpc2sKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBc3Rlcmlza0V4cGxhbmF0aW9uJykgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FzdGVyaXNrRXhwbGFuYXRpb24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRGb3J3YXJkJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEZvcm1EcmFmdCAgICAgID0+ICRDb25maWctPntGb3JtRHJhZnR9LAogICAgICAgICAgICBGb3JtRHJhZnRJRCAgICA9PiAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSwKICAgICAgICAgICAgRm9ybURyYWZ0VGl0bGUgPT4gJExvYWRlZEZvcm1EcmFmdCA/ICRMb2FkZWRGb3JtRHJhZnQtPntUaXRsZX0gOiAnJywKICAgICAgICAgICAgRm9ybURyYWZ0TWV0YSAgPT4gJExvYWRlZEZvcm1EcmFmdCwKICAgICAgICB9LAogICAgKTsKfQoKc3ViIF9HZXRFeHRlbmRlZFBhcmFtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtID0gJXsgJFNlbGYtPntHZXRQYXJhbX0gfTsKCiAgICAjIGhhc2ggZm9yIGNoZWNrIGR1cGxpY2F0ZWQgZW50cmllcwogICAgbXkgJUFkZHJlc3Nlc0xpc3Q7CiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJUbyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlclRvKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciAgICA9IDE7CiAgICAgICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJEN1c3RvbWVyc051bWJlclRvICkgewogICAgICAgICAgICBsYXN0IENPVU5UIGlmICRDb3VudCA+IDFfMDAwOyAgICAjIGJhaWwgb3V0IHdoZW4gdGhlIG51bWJlciBvZiBjdXN0b21lcnMgaXMgYWJub3JtYWxseSBoaWdoCgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CgogICAgICAgICAgICBuZXh0IENPVU5UIHVubGVzcyAkQ3VzdG9tZXJFbGVtZW50OwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyU2VsZWN0ZWQgPSAoICRTZWxlY3RlZCBlcSAkQ291bnQgPyAnY2hlY2tlZCAnIDogJycgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5ICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApICAgfHwgJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclF1ZXVlICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyUXVldWVfJyAuICRDb3VudCApIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAkQ3VzdG9tZXJFbGVtZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2cgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkQ3VzdG9tZXJFbGVtZW50ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ICYmICRDdXN0b21lckVycm9yIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZCA9ICcnOwogICAgICAgICAgICBteSAkQ291bnRBdXggICAgICAgICA9ICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkID0gJ2Rpc2FibGVkJzsKICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZSBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclF1ZXVlID0gJENvdW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3IsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyUXVldWUgICAgPT4gJEN1c3RvbWVyUXVldWUsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYzsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJDYyAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyQ2NDdXN0b21lcicgKSB8fCAwOwogICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlckNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJEN1c3RvbWVyc051bWJlckNjICkgewogICAgICAgICAgICBsYXN0IENPVU5UIGlmICRDb3VudCA+IDFfMDAwOyAgICAjIGJhaWwgb3V0IHdoZW4gdGhlIG51bWJlciBvZiBjdXN0b21lcnMgaXMgYWJub3JtYWxseSBoaWdoCgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50Q2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudENjOwoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5Q2MgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDY0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKSAgIHx8ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJRdWV1ZUNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJRdWV1ZV8nIC4gJENvdW50ICkgfHwgJyc7CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtDY30gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9ID0gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yQ2MgICAgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEN1c3RvbWVyRWxlbWVudENjICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckNjID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50Q2N9ICYmICRDdXN0b21lckVycm9yQ2MgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJyc7CiAgICAgICAgICAgIG15ICRDb3VudEF1eENjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckNjIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWRDYyA9ICdkaXNhYmxlZCc7CiAgICAgICAgICAgICAgICAkQ291bnRBdXhDYyAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJRdWV1ZUNjIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyUXVldWVDYyA9ICRDb3VudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckNjLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eENjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50Q2MsCiAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvckNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZ0NjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZENjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJRdWV1ZSAgICA9PiAkQ3VzdG9tZXJRdWV1ZUNjLAogICAgICAgICAgICB9OwogICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50Q2N9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJCY2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQmNjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckJjY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJCY2MpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyQmNjID0gMTsKCiAgICAgICAgQ09VTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gJEN1c3RvbWVyc051bWJlckJjYyApIHsKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAkQ291bnQgPiAxXzAwMDsgICAgIyBiYWlsIG91dCB3aGVuIHRoZSBudW1iZXIgb2YgY3VzdG9tZXJzIGlzIGFibm9ybWFsbHkgaGlnaAoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudEJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwoKICAgICAgICAgICAgbmV4dCBDT1VOVCB1bmxlc3MgJEN1c3RvbWVyRWxlbWVudEJjYzsKCiAgICAgICAgICAgIG15ICRDdXN0b21lcktleUJjYyAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKSAgIHx8ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJRdWV1ZUJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lclF1ZXVlXycgLiAkQ291bnQgKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JjY30gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9ID0gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JCY2MgICAgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoICRFbWFpbEFkZHJlc3NPYmplY3QtPlBhcnNlQWRkcmVzc0xpbmUoIExpbmUgPT4gJEN1c3RvbWVyRWxlbWVudEJjYyApICkgewogICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzc09iamVjdCA9PiAkRW1haWwgKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQmNjID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50QmNjfSAmJiAkQ3VzdG9tZXJFcnJvckJjYyBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQmNjICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWRCY2MgPSAnJzsKICAgICAgICAgICAgbXkgJENvdW50QXV4QmNjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JCY2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICdkaXNhYmxlZCc7CiAgICAgICAgICAgICAgICAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyUXVldWVCY2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJRdWV1ZUJjYyA9ICRDb3VudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckJjYywgewogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXhCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnRCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3JCY2MsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnQmNjLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZEJjYywKICAgICAgICAgICAgICAgIEN1c3RvbWVyUXVldWUgICAgPT4gJEN1c3RvbWVyUXVldWVCY2MsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICgKICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+IFwlR2V0UGFyYW0sCiAgICAgICAgTXVsdGlwbGVDdXN0b21lciAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgTXVsdGlwbGVDdXN0b21lckNjICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJDYywKICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICk7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentTicketMerge.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA5YTRmYTA4Y2RkODE1Nzk4YjI5YjY4NDg1NDdlY2Y1OTAwZDFkNjRhIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRNZXJnZS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRNZXJnZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGJsZXNzIHslUGFyYW19LCAkVHlwZTsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVFcnJvcjsKICAgIG15ICVHZXRQYXJhbTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFRpY2tldElEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgY29uZmlnIHBhcmFtCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9ucyA9ICggMSA9PiAkU2VsZi0+e0FjdGlvbn0gKTsKCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICBpZiAoJEFDTCkgewoKICAgICAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICAgICAjIHNob3cgZXJyb3Igc2NyZWVuIGlmIEFDTCBwcm9oaWJpdHMgdGhpcyBhY3Rpb24KICAgICAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKCiAgICAjIGdldCBsb2NrIHN0YXRlICYmIHdyaXRlIChsb2NrKSBwZXJtaXNzaW9ucwogICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrR2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewoKICAgICAgICAgICAgbXkgJExvY2sgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2V0IG5ldyBvd25lciBpZiB0aWNrZXQgb3duZXIgaXMgZGlmZmVyZW50IHRoZW4gbG9nZ2VkIHVzZXIuCiAgICAgICAgICAgIGlmICggJExvY2sgJiYgKCAkVGlja2V0e093bmVySUR9ICE9ICRTZWxmLT57VXNlcklEfSApICkgewoKICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgcHJldmlvdXMgb3duZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXN0b3JlIHRpY2tldCBvd25lciBvbiB1bmRvIGFjdGlvbi4KICAgICAgICAgICAgICAgICRQYXJhbXtQcmV2aW91c093bmVyfSA9ICRUaWNrZXR7T3duZXJJRH07CgogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFNob3cgbG9jayBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkVGlja2V0T2JqZWN0LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRUaWNrZXR7TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1NvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgdGlja2V0IG93bmVyIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uJyksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGJhY2sgbGluawogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBzaG93IGJhY2sgbGluawogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfSwKICAgICAgICApOwogICAgfQoKICAgICMgbWVyZ2UgYWN0aW9uCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTWVyZ2UnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCBhbGwgcGFyYW1ldGVycwogICAgICAgIGZvciBteSAkUGFyYW1ldGVyIChxdyggRnJvbSBUbyBTdWJqZWN0IEJvZHkgSW5mb3JtU2VuZGVyIE1haW5UaWNrZXROdW1iZXIgKSkgewogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICkKICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyByZXdyYXAgYm9keSBpZiBubyByaWNoIHRleHQgaXMgdXNlZAogICAgICAgIGlmICggJEdldFBhcmFte0JvZHl9ICYmICEkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+V3JhcFBsYWluVGV4dCgKICAgICAgICAgICAgICAgIE1heENoYXJhY3RlcnMgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUnKSwKICAgICAgICAgICAgICAgIFBsYWluVGV4dCAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgICAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgICAgICAjIHJlbW92aW5nIGJsYW5rIHNwYWNlcyBmcm9tIHRoZSB0aWNrZXQgbnVtYmVyCiAgICAgICAgJENoZWNrSXRlbU9iamVjdC0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiA9PiBcJEdldFBhcmFteydNYWluVGlja2V0TnVtYmVyJ30sCiAgICAgICAgICAgIFRyaW1MZWZ0ICA9PiAxLAogICAgICAgICAgICBUcmltUmlnaHQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHNvbWUgc3R1ZmYKICAgICAgICBteSAkTWFpblRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0SURMb29rdXAoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkR2V0UGFyYW17J01haW5UaWNrZXROdW1iZXInfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHNvdXJjZSBhbmQgdGFyZ2V0IFRpY2tldElEIGFyZSB0aGUgc2FtZSAoYnVnIzg2NjcpCiAgICAgICAgaWYgKCAkTWFpblRpY2tldElEICYmICRNYWluVGlja2V0SUQgPT0gJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ2FuXCd0IG1lcmdlIHRpY2tldCB3aXRoIGl0c2VsZiEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZm9yIGVycm9ycwogICAgICAgIGlmICggISRNYWluVGlja2V0SUQgKSB7CiAgICAgICAgICAgICRFcnJvcnsnTWFpblRpY2tldE51bWJlckludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRHZXRQYXJhbXtJbmZvcm1TZW5kZXJ9ICkgewogICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAocXcoIFRvIFN1YmplY3QgQm9keSApKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17JFBhcmFtZXRlcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUGFyYW1ldGVyIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGZvcndhcmQgZW1haWwgYWRkcmVzcyhlcykKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCAkRW1haWxBZGRyZXNzT2JqZWN0LT5QYXJzZUFkZHJlc3NMaW5lKCBMaW5lID0+ICRHZXRQYXJhbXtUb30gKSApIHsKCiMgUm90aGVyIE9TUyAvIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiMgICAgICAgICAgICAgICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKCBBZGRyZXNzT2JqZWN0ID0+ICRFbWFpbCApICkgewogICAgICAgICAgICAgICAgICAgIG15ICRJc0xvY2FsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzT2JqZWN0ICA9PiAkRW1haWwsCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkSXNMb2NhbCkgewojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdUb0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJyApOwogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J1RvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgICAgIGVsc2lmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3NPYmplY3QgPT4gJEVtYWlsICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUb0Vycm9yTXNnID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAkVG9FcnJvck1zZyApOwogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J1RvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnVG9DdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZycgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcikgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAgICAgICAgICMgc2V0IHVwIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte0luZm9ybVNlbmRlckNoZWNrZWR9ID0gJEdldFBhcmFte0luZm9ybVNlbmRlcn0gPyAnY2hlY2tlZCAnIDogJyc7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRNZXJnZScsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4geyAlUGFyYW0sICVHZXRQYXJhbSwgJVRpY2tldCwgJUVycm9yIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgICAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkTWFpblRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFRpY2tldE1lcmdlUmVzdWx0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0TWVyZ2UoCiAgICAgICAgICAgIE1haW5UaWNrZXRJRCAgPT4gJE1haW5UaWNrZXRJRCwKICAgICAgICAgICAgTWVyZ2VUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBlcnJvcnMKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57VGlja2V0SUR9ID09ICRNYWluVGlja2V0SUQKICAgICAgICAgICAgfHwgISRUaWNrZXRNZXJnZVJlc3VsdAogICAgICAgICAgICB8fCAkVGlja2V0TWVyZ2VSZXN1bHQgZXEgJ05vVmFsaWRNZXJnZVN0YXRlcycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRUaWNrZXRNZXJnZVJlc3VsdCBlcSAnTm9WYWxpZE1lcmdlU3RhdGVzJyApIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJ05vIG1lcmdlIHN0YXRlIGZvdW5kISBQbGVhc2UgYWRkIGEgdmFsaWQgbWVyZ2Ugc3RhdGUgYmVmb3JlIG1lcmdlIGFjdGlvbi4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE1lcmdlJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7ICVQYXJhbSwgJVRpY2tldCB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBzZW5kIGN1c3RvbWVyIGluZm8/CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0luZm9ybVNlbmRlcn0gKSB7CiAgICAgICAgICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKCZsdDt8PClPVE9CT19USUNLRVQoJmd0O3w+KS8kVGlja2V0e1RpY2tldE51bWJlcn0vZzsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fQogICAgICAgICAgICAgICAgICAgID1+IHMvKCZsdDt8PClPVE9CT19NRVJHRV9UT19USUNLRVQoJmd0O3w+KS8kR2V0UGFyYW17J01haW5UaWNrZXROdW1iZXInfS9nOwoKICAgICAgICAgICAgICAgIG15ICRFbWFpbEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpLT5CYWNrZW5kRm9yQ2hhbm5lbCgKICAgICAgICAgICAgICAgICAgICBDaGFubmVsTmFtZSA9PiAnRW1haWwnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUlEID0gJEVtYWlsQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVTZW5kKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnU2VuZEFuc3dlcicsCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gIk1lcmdlIGluZm8gdG8gJyRHZXRQYXJhbXtUb30nLiIsCiAgICAgICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0Zyb219LAogICAgICAgICAgICAgICAgICAgIEVtYWlsICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtFbWFpbH0sCiAgICAgICAgICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewoKICAgICAgICAgICAgICAgICAgICAjIGVycm9yIHBhZ2UKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWRpcmVjdCB0byBtZXJnZWQgdGlja2V0CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgVVJMID0+ICJBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRNYWluVGlja2V0SUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKICAgICAgICAjIEdldCBsYXN0IGN1c3RvbWVyIGFydGljbGUuCiAgICAgICAgbXkgQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBTZW5kZXJUeXBlID0+ICdjdXN0b21lcicsCiAgICAgICAgICAgIE9ubHlMYXN0ICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIElmIHRoZSB0aWNrZXQgaGFzIG5vIGN1c3RvbWVyIGFydGljbGUsIGdldCB0aGUgbGFzdCBhZ2VudCBhcnRpY2xlLgogICAgICAgIGlmICggIUBBcnRpY2xlcyApIHsKICAgICAgICAgICAgQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIE9ubHlMYXN0ICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRmluYWxseSwgaWYgZXZlcnl0aGluZyBmYWlsZWQsIGdldCBsYXRlc3QgYXJ0aWNsZS4KICAgICAgICBpZiAoICFAQXJ0aWNsZXMgKSB7CiAgICAgICAgICAgIEBBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT25seUxhc3QgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVBcnRpY2xlOwogICAgICAgIGZvciBteSAkQXJ0aWNsZSAoQEFydGljbGVzKSB7CiAgICAgICAgICAgICVBcnRpY2xlID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyRBcnRpY2xlfSApLT5BcnRpY2xlR2V0KAogICAgICAgICAgICAgICAgJXskQXJ0aWNsZX0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG1lcmdlIGJveAogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgc2FsdXRhdGlvbgogICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwogICAgICAgIG15ICRTYWx1dGF0aW9uICAgICAgICA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2FsdXRhdGlvbigKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRGF0YSAgICAgID0+IHsKICAgICAgICAgICAgICAgICVBcnRpY2xlLAoKICAgICAgICAgICAgICAgICMgTk9URSBpbiBjYXNlIHRoYXQgd2UgYW5zd2VyIHRvIGEgY3VzdG9tZXIsIHRoZSBmb3JtZXIgc2VuZGVyICh0aGUgY3VzdG9tZXIpCiAgICAgICAgICAgICAgICAjICAgbm93IGJlY29tZXMgdGhlIG5ldyByZWNpcGllbnQgYW5kIHRoZSBmb3JtZXIgcmVjaXBpZW50ICh0aGUgT1RPQk8gc3lzdGVtKQogICAgICAgICAgICAgICAgIyAgIG5vdyBiZWNvbWVzIHRoZSBuZXcgc2VuZGVyCiAgICAgICAgICAgICAgICBGcm9tID0+ICRBcnRpY2xle1NlbmRlclR5cGV9IGVxICdjdXN0b21lcicgPyAkQXJ0aWNsZXtUb30gICA6ICRBcnRpY2xle0Zyb219LAogICAgICAgICAgICAgICAgVG8gICA9PiAkQXJ0aWNsZXtTZW5kZXJUeXBlfSBlcSAnY3VzdG9tZXInID8gJEFydGljbGV7RnJvbX0gOiAkQXJ0aWNsZXtUb30sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIHNpZ25hdHVyZQogICAgICAgIG15ICRTaWduYXR1cmUgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlNpZ25hdHVyZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRGF0YSAgICAgID0+IHslQXJ0aWNsZX0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmVwYXJlIHN1YmplY3QgLi4uCiAgICAgICAgJEFydGljbGV7U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkQXJ0aWNsZXtTdWJqZWN0fSB8fCAnJywKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgZnJvbSAuLi4KICAgICAgICBpZiAoICRBcnRpY2xle1NlbmRlclR5cGV9IGVxICdjdXN0b21lcicgKSB7CiAgICAgICAgICAgICRBcnRpY2xle1RvfSA9ICRBcnRpY2xle0Zyb219OwogICAgICAgIH0KCiAgICAgICAgbXkgJUFkZHJlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0U3lzdGVtQWRkcmVzcyggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgJEFydGljbGV7RnJvbX0gPSAkQWRkcmVzc3tGb3JtYXR0ZWRBZGRyZXNzfTsKCiAgICAgICAgIyBhZGQgc2FsdXRhdGlvbiBhbmQgc2lnbmF0dXJlIHRvIGJvZHkKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICBteSAkQm9keSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TWVyZ2VUZXh0JyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xle0JvZHl9ID0gJFNhbHV0YXRpb24KICAgICAgICAgICAgICAgIC4gJzxici8+PGJyLz4nCiAgICAgICAgICAgICAgICAuICRCb2R5CiAgICAgICAgICAgICAgICAuICc8YnIvPjxici8+JwogICAgICAgICAgICAgICAgLiAkU2lnbmF0dXJlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkU2FsdXRhdGlvbgogICAgICAgICAgICAgICAgLiAiXG5cbiIKICAgICAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNZXJnZVRleHQnKQogICAgICAgICAgICAgICAgLiAiXG5cbiIKICAgICAgICAgICAgICAgIC4gJFNpZ25hdHVyZTsKICAgICAgICB9CgogICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZXhwbGFuYXRvcnkgbWVzc2FnZSBhYm91dCBhc3RlcmlzawogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBc3Rlcmlza0V4cGxhbmF0aW9uJykgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXN0ZXJpc2tFeHBsYW5hdGlvbicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE1lcmdlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsgJVBhcmFtLCAlVGlja2V0LCAlQXJ0aWNsZSwgfQogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Output/HTML/ArticleAction/AgentTicketCompose.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBkN2RhYTczZWUzZjQzZjE2NTdjZDY4M2I2YTE3NDBiY2MyMmQ3OGQ4IC0gS2VybmVsL091dHB1dC9IVE1ML0FydGljbGVBY3Rpb24vQWdlbnRUaWNrZXRDb21wb3NlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkFydGljbGVBY3Rpb246OkFnZW50VGlja2V0Q29tcG9zZTsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UXVldWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW1haWxBZGRyZXNzJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgojIG9wdGlvbmFsIEFjbEFjdGlvbkxvb2t1cApzdWIgQ2hlY2tBY2Nlc3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIENoZWNrIG5lZWRlZCBzdHVmZi4KICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXQgQXJ0aWNsZSBDaGFubmVsTmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2hhbm5lbE5hbWV9IGVxICdFbWFpbCcgJiYgJFBhcmFte0FydGljbGV9LT57U2VuZGVyVHlwZX0gZXEgJ3N5c3RlbScgKSB7CgogICAgICAgICMgc2tpcCBlbWFpbCBub3RpZmljYXRpb25zCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY2hlY2sgaWYgbW9kdWxlIGlzIHJlZ2lzdGVyZWQKICAgIHJldHVybiBpZiAhJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldENvbXBvc2V9OwoKICAgICMgY2hlY2sgQWNsCiAgICByZXR1cm4gaWYgISRQYXJhbXtBY2xBY3Rpb25Mb29rdXB9LT57QWdlbnRUaWNrZXRDb21wb3NlfTsKCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZScpOwogICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgbXkgJE9rID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0fS0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gaWYgISRPazsKICAgIH0KICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgbXkgJExvY2tlZCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXR9LT57VGlja2V0SUR9CiAgICAgICAgKTsKICAgICAgICBpZiAoJExvY2tlZCkgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkVGlja2V0T2JqZWN0LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldH0tPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuIGlmICEkQWNjZXNzT2s7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgR2V0Q29uZmlnIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBDaGVjayBuZWVkZWQgc3R1ZmYuCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0IEFydGljbGUgU3RhbmRhcmRUZW1wbGF0ZXMgVHlwZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGdldCBTdGFuZGFyZFJlc3BvbnNlc1N0cmcKICAgICMgbXkgJVN0YW5kYXJkUmVzcG9uc2VIYXNoID0gJXsgJFBhcmFte1N0YW5kYXJkUmVzcG9uc2VzfSB8fCB7fSB9OwogICAgbXkgJVN0YW5kYXJkUmVzcG9uc2VIYXNoID0gJXsgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVzfS0+e0Fuc3dlcn0gfHwge30gfTsKCiAgICAjIGdldCByZXZlcnMgU3RhbmRhcmRSZXNwb25zZUhhc2ggYmVjYXVzZSB3ZSBuZWVkIHRvIHNvcnQgYnkgVmFsdWVzCiAgICAjIGZyb20gJVJldmVyc2VTdGFuZGFyZFJlc3BvbnNlSGFzaCB3ZSBnZXQgdmFsdWUgb2YgS2V5IGJ5ICVTdGFuZGFyZFJlc3BvbnNlSGFzaCBWYWx1ZQogICAgIyBhbmQgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSBpcyBjcmVhdGVkIGFzIGFycmF5IG9mIGhhc2hlcyB3aXRoIGVsZW1lbnRzIEtleSBhbmQgVmFsdWUKCiAgICBteSAlUmV2ZXJzZVN0YW5kYXJkUmVzcG9uc2VIYXNoID0gcmV2ZXJzZSAlU3RhbmRhcmRSZXNwb25zZUhhc2g7CiAgICBteSBAU3RhbmRhcmRSZXNwb25zZUFycmF5ICAgICAgID0gbWFwIHsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRSZXZlcnNlU3RhbmRhcmRSZXNwb25zZUhhc2h7JF99LAogICAgICAgICAgICBWYWx1ZSA9PiAkXwogICAgICAgIH0KICAgIH0gc29ydCB2YWx1ZXMgJVN0YW5kYXJkUmVzcG9uc2VIYXNoOwoKICAgICMgdXNlIHRoaXMgYXJyYXkgdHdpY2UgKGFsc28gZm9yIFJlcGx5IEFsbCksIHNvIGNvcHkgaXQgZmlyc3QKICAgIG15IEBTdGFuZGFyZFJlc3BvbnNlQXJyYXlSZXBseUFsbCA9IEBTdGFuZGFyZFJlc3BvbnNlQXJyYXk7CgogICAgbXkgQE1lbnVJdGVtczsKICAgIGlmIChAU3RhbmRhcmRSZXNwb25zZUFycmF5KSB7CgogICAgICAgICMgYnVpbGQgSFRNTCBzdHJpbmcKICAgICAgICBteSAkU3RhbmRhcmRSZXNwb25zZXNTdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgICAgIElEICAgICAgICAgICA9PiAnUmVzcG9uc2VJRCcgLiAkUGFyYW17QXJ0aWNsZX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBTbWFsbCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQFN0YW5kYXJkUmVzcG9uc2VBcnJheSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICBJdGVtVHlwZSAgICAgICAgICAgICAgPT4gJ0Ryb3Bkb3duJywKICAgICAgICAgICAgRHJvcGRvd25UeXBlICAgICAgICAgID0+ICdSZXBseScsCiAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzU3RyZyA9PiAkU3RhbmRhcmRSZXNwb25zZXNTdHJnLAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdSZXBseScpLAogICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICA9PiAnQWdlbnRUaWNrZXRDb21wb3NlJywKICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgID0+ICdSZXBseScgLiAkUGFyYW17QXJ0aWNsZX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICBSZXNwb25zZUVsZW1lbnRJRCAgICAgPT4gJ1Jlc3BvbnNlSUQnIC4gJFBhcmFte0FydGljbGV9LT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICB9OwogICAgfQoKICAgICMgY2hlY2sgaWYgcmVwbHkgYWxsIGlzIG5lZWRlZAogICAgbXkgJFJlY2lwaWVudHMgPSAnJzsKICAgIEtFWToKICAgIGZvciBteSAkS2V5IChxdyhGcm9tIFRvIENjKSkgewogICAgICAgIG5leHQgS0VZIGlmICEkUGFyYW17QXJ0aWNsZX0tPnskS2V5fTsKICAgICAgICBpZiAoJFJlY2lwaWVudHMpIHsKICAgICAgICAgICAgJFJlY2lwaWVudHMgLj0gJywgJzsKICAgICAgICB9CiAgICAgICAgJFJlY2lwaWVudHMgLj0gJFBhcmFte0FydGljbGV9LT57JEtleX07CiAgICB9CiAgICBteSAkUmVjaXBpZW50Q291bnQgPSAwOwogICAgaWYgKCRSZWNpcGllbnRzKSB7CiAgICAgICAgbXkgJEVtYWlsQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnKTsKICAgICAgICBteSBAQWRkcmVzc2VzICAgICAgICAgID0gJEVtYWlsQWRkcmVzc09iamVjdC0+UGFyc2VBZGRyZXNzTGluZSggTGluZSA9PiAkUmVjaXBpZW50cyApOwogICAgICAgIEFERFJFU1M6CiAgICAgICAgZm9yIG15ICRBZGRyZXNzIChAQWRkcmVzc2VzKSB7CiAgICAgICAgICAgIG15ICRFbWFpbCA9ICRFbWFpbEFkZHJlc3NPYmplY3QtPkdldEFkZHJlc3MoIEFkZHJlc3NPYmplY3QgPT4gJEFkZHJlc3MgKTsKCiAgICAgICAgICAgIG5leHQgQUREUkVTUyB1bmxlc3MgJEVtYWlsOwoKICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRFbWFpbCwKIyBSb3RoZXIgT1NTIC8gRGlzY3JldGVTeXN0ZW1BZGRyZXNzZXMKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXR9LT57VGlja2V0SUR9LAojIEVPIERpc2NyZXRlU3lzdGVtQWRkcmVzc2VzCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFERFJFU1MgaWYgJElzTG9jYWw7CgogICAgICAgICAgICAkUmVjaXBpZW50Q291bnQrKzsKICAgICAgICB9CiAgICB9CiAgICBpZiAoIEBTdGFuZGFyZFJlc3BvbnNlQXJyYXlSZXBseUFsbCAmJiAkUmVjaXBpZW50Q291bnQgPiAxICkgewoKICAgICAgICBteSAkU3RhbmRhcmRSZXNwb25zZXNTdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgICAgIElEICAgICAgICAgICA9PiAnUmVzcG9uc2VJREFsbCcgLiAkUGFyYW17QXJ0aWNsZX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBTbWFsbCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQFN0YW5kYXJkUmVzcG9uc2VBcnJheVJlcGx5QWxsLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgIEl0ZW1UeXBlICAgICAgICAgICAgICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICBEcm9wZG93blR5cGUgICAgICAgICAgPT4gJ1JlcGx5JywKICAgICAgICAgICAgU3RhbmRhcmRSZXNwb25zZXNTdHJnID0+ICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ1JlcGx5IEFsbCcpLAogICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICA9PiAnQWdlbnRUaWNrZXRDb21wb3NlJywKICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgID0+ICdSZXBseUFsbCcgLiAkUGFyYW17QXJ0aWNsZX0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICBSZXBseUFsbCAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUmVzcG9uc2VFbGVtZW50SUQgICAgID0+ICdSZXNwb25zZUlEQWxsJyAuICRQYXJhbXtBcnRpY2xlfS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gQE1lbnVJdGVtczsKfQoKMTsK</File>
        <File Location="scripts/test/PostMaster/AddressPool.t" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKIyBTZXQgdXAgdGhlIHRlc3QgZHJpdmVyICRTZWxmIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYSBzdGFuZGFsb25lIHNjcmlwdC4KdXNlIEtlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6TW9ja1RpbWUgcXcoOmFsbCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlJlZ2lzdGVyRHJpdmVyOwoKb3VyICRTZWxmOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgIFZhbHVlID0+IDAsCik7CgpteSAkUXVldWVPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwpteSAkVGlja2V0T2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKbXkgJEFydGljbGVPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7Cm15ICRTeXN0ZW1BZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlICA9PiAxLAogICAgICAgIFVzZVRtcEFydGljbGVEaXIgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpGaXhlZFRpbWVTZXQoKTsKCiMgUG9vbCB8ICAgICAgICBBZGRyZXNzIHwgUXVldWUKIyAgIFAxICAgYTFwMUBvdG9iby5vcmcgICAgICBxMQojICAgUDEgICBhMnAxQG90b2JvLm9yZwojICAgUDIgICBhMXAyQG90b2JvLm9yZyAgICAgIHEyCiMgICBQMiAgIGEycDJAb3RvYm8ub3JnICAgICAgcTUKIyAgIFAzICAgYTFwM0BvdG9iby5vcmcgICAgICBxMwojICAgUDMgICBhMnAzQG90b2JvLm9yZwojICAgICAgICAgIGF4QG90b2JvLm9yZwoKIyBQb29sIHwgRGVmUXVldWUKIyAgIFAxICAgICAgICAgcTQKIyAgIFAyICAgICAgICAgcTUKIyAgIFAzICAgICAgICAgcTMKIyAgICAgICAgICAgICAgcTUKCiMgYWRkIHN5c3RlbSBhZGRyZXNzZXMKbXkgJVN5c3RlbUFkZHJlc3NJRHM7CmZvciBteSAkQWRkcmVzcyAocXcvYTFQMUBvdG9iby5vcmcgYTFwMkBvdG9Cby5vcmcgYTFwM0BvdG9iby5vcmcgYTJwMkBvdG9iby5vcmcgdW51c2VkQG90b2JvLm9yZy8pIHsKICAgIG15ICRTeXN0ZW1BZGRyZXNzSUQgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc0FkZCgKICAgICAgICBOYW1lICAgICA9PiAkQWRkcmVzcywKICAgICAgICBSZWFsbmFtZSA9PiAnQVBUZXN0JywKICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgIFF1ZXVlSUQgID0+IDEsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7CgogICAgJFN5c3RlbUFkZHJlc3NJRHN7JEFkZHJlc3N9ID0gJFN5c3RlbUFkZHJlc3NJRDsKfQoKbXkgJVF1ZXVlQWRkcmVzc2VzID0gKAogICAgcTEgPT4gJ2ExUDFAb3RvYm8ub3JnJywKICAgIHEyID0+ICdhMXAyQG90b0JvLm9yZycsCiAgICBxMyA9PiAnYTFwM0BvdG9iby5vcmcnLAogICAgcTQgPT4gJ3VudXNlZEBvdG9iby5vcmcnLAogICAgcTUgPT4gJ2EycDJAb3RvYm8ub3JnJywKKTsKCiMgYWRkIHF1ZXVlcwpteSAlUXVldWVJRHM7CmZvciBteSAkUXVldWUgKCBrZXlzICVRdWV1ZUFkZHJlc3NlcyApIHsKICAgIG15ICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUFkZCgKICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJFF1ZXVlLAogICAgICAgIFZhbGlkSUQgICAgICAgICA9PiAxLAogICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAxLAogICAgICAgIFN5c3RlbUFkZHJlc3NJRCA9PiAkU3lzdGVtQWRkcmVzc0lEc3sgJFF1ZXVlQWRkcmVzc2VzeyRRdWV1ZX0gfSwKICAgICAgICBTYWx1dGF0aW9uSUQgICAgPT4gMSwKICAgICAgICBTaWduYXR1cmVJRCAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgJFF1ZXVlSURzeyRRdWV1ZX0gPSAkUXVldWVJRDsKCiAgICAjIHVwZGF0ZSBzeXN0ZW0gYWRkcmVzcwogICAgbXkgJVN5c3RlbUFkZHJlc3NEYXRhID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgSUQgPT4gJFN5c3RlbUFkZHJlc3NJRHN7ICRRdWV1ZUFkZHJlc3Nlc3skUXVldWV9IH0sCiAgICApOwoKICAgICRTeXN0ZW1BZGRyZXNzRGF0YXtRdWV1ZUlEfSA9ICRRdWV1ZUlEOwoKICAgICRTeXN0ZW1BZGRyZXNzT2JqZWN0LT5TeXN0ZW1BZGRyZXNzVXBkYXRlKAogICAgICAgICVTeXN0ZW1BZGRyZXNzRGF0YSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cn0KCiMgc2V0IGFkZHJlc3MgcG9vbHMKewogICAgbXkgJUFkZHJlc3NQb29sRGF0YSA9ICgKICAgICAgICBQb29sMDEgPT4gewogICAgICAgICAgICBOYW1lICAgPT4gJ1AxJywKICAgICAgICAgICAgRW1haWxzID0+IFsKICAgICAgICAgICAgICAgICdhMXAxQG90b2JvLm9yZycsCiAgICAgICAgICAgICAgICAnYTJwMUBvdG9iby5vcmcnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBEZWZhdWx0UXVldWUgPT4gJ3E0JywKICAgICAgICB9LAogICAgICAgIFBvb2wwMiA9PiB7CiAgICAgICAgICAgIE5hbWUgICA9PiAnUDInLAogICAgICAgICAgICBFbWFpbHMgPT4gWwogICAgICAgICAgICAgICAgJ2ExcDJAb3RvYm8ub3JnJywKICAgICAgICAgICAgICAgICdhMnAyQG90b2JvLm9yZycsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIERlZmF1bHRRdWV1ZSA9PiAncTUnLAogICAgICAgIH0sCiAgICAgICAgUG9vbDAzID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdQMycsCiAgICAgICAgICAgIEVtYWlscyA9PiBbCiAgICAgICAgICAgICAgICAnQTFwM0BvdG9iby5vcmcnLAogICAgICAgICAgICAgICAgJ0EycDNAb3RvYm8ub3JnJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRGVmYXVsdFF1ZXVlID0+ICdxMycsCiAgICAgICAgfSwKICAgICk7CgogICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgIEtleSAgID0+ICdQb3N0TWFzdGVyOjpBZGRyZXNzUG9vbCcsCiAgICAgICAgVmFsdWUgPT4gXCVBZGRyZXNzUG9vbERhdGEsCiAgICApOwp9CgojIFN0YXJ0IHRlc3RzCgojIFRlc3Q6IFRpY2tldCN4IGluIHExIChpZ25vcmUgZGVmcXVldWUgb2YgYTJwMSksIFRpY2tldCN5IGluIHEyLCBub3RoaW5nIGluIHE1Cm15ICRFbWFpbCA9IEdlbmVyYXRlRW1haWwoCiAgICBUbyAgICAgICAgPT4gJ2EycDFAb3RvYm8ub3JHLCBhMXAxQG90b2JvLm9yRywgYTFwMkBvdG9iby5vckcsIG5vdEBvdXJzLmNvbScsCiAgICBTdWJqZWN0ICAgPT4gJ0luaXRpYWwnLAogICAgTWVzc2FnZUlEID0+ICc8MjAyMzAyMTQwMDI4MTQuQWRkcmVzc1Bvb2xzMUB0ZXN0PicsCik7CgpteSAoICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCggJEVtYWlsLCAxICk7CgojIHR3byB0aWNrZXRzIHNob3VsZCBiZSBjcmVhdGVkLi4uCiRTZWxmLT5JcygKICAgIHNjYWxhciBAVGlja2V0SURzLAogICAgMiwKICAgICJNYWlsMSAtIGNyZWF0ZSB0d28gdGlja2V0cy4iLAopOwoKbXkgQFRlc3RUaWNrZXRzOwpmb3IgbXkgJElEIChAVGlja2V0SURzKSB7CiAgICBwdXNoIEBUZXN0VGlja2V0cywgewogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJElEICkKICAgIH07Cn0KCiMgdGlja2V0IDEgc2hvdWxkIGJlIGluIHExCiRTZWxmLT5JcygKICAgICRUZXN0VGlja2V0c1swXXtRdWV1ZX0gLy8gJycsCiAgICAncTEnLAogICAgIk1haWwxIC0gVGlja2V0MSBpcyBpbiBxMS4iLAopOwoKIyB0aWNrZXQgMiBzaG91bGQgYmUgaW4gcTIKJFNlbGYtPklzKAogICAgJFRlc3RUaWNrZXRzWzFde1F1ZXVlfSAvLyAnJywKICAgICdxMicsCiAgICAiTWFpbDEgLSBUaWNrZXQyIGlzIGluIHEyLiIsCik7CgpteSBAQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICBUaWNrZXRJRCA9PiAkVGVzdFRpY2tldHNbMF17VGlja2V0SUR9LAopOwoKIyB0aWNrZXQgMSBzaG91bGQgaGF2ZSBleGFjdGx5IDEgYXJ0aWNsZQokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEFydGljbGVzLAogICAgMSwKICAgICJNYWlsMSAtIFRpY2tldDEgaGFzIDEgYXJ0aWNsZS4iLAopOwoKIyBUZXN0OiBUaWNrZXQxI051bWJlciAtPiBGb2xsb3dVcCBpbiBxMiwgTmV3IGluIHEzIChkZWZxdWV1ZSkKbXkgJE5ld1N1YmplY3QgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICBUaWNrZXROdW1iZXIgPT4gJFRlc3RUaWNrZXRzWzBde1RpY2tldE51bWJlcn0sCiAgICBTdWJqZWN0ICAgICAgPT4gJ0luaXRpYWwnLAogICAgQWN0aW9uICAgICAgID0+ICdSZXBseScsCik7CgokRW1haWwgPSBHZW5lcmF0ZUVtYWlsKAogICAgVG8gICAgICAgID0+ICdhMXAyQG9Ub2JvLm9yZywgYTJwM0BvdG9iby5vckcnLAogICAgU3ViamVjdCAgID0+ICROZXdTdWJqZWN0LAogICAgTWVzc2FnZUlEID0+ICc8MjAyMzAyMTQwMDI4MTQuQWRkcmVzc1Bvb2xzMkB0ZXN0PicsCik7CgooICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCgkRW1haWwpOwoKIyB0d28gYXJ0aWNsZXMgc2hvdWxkIGJlIGNyZWF0ZWQuLi4KJFNlbGYtPklzKAogICAgc2NhbGFyIEBUaWNrZXRJRHMsCiAgICAyLAogICAgIk1haWwyIC0gY3JlYXRlIHR3byBhcnRpY2xlcy4iLAopOwoKIyB0aWNrZXQgMSBzaG91bGQgYmUgdGlja2V0IDIgb2YgbGFzdCBlbWFpbAokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzWzBdLAogICAgJFRlc3RUaWNrZXRzWzFde1RpY2tldElEfSwKICAgICJNYWlsMiAtIFRpY2tldDEgaXMgb2xkIFRpY2tldDIuIiwKKTsKCnB1c2ggQFRlc3RUaWNrZXRzLCB7CiAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRUaWNrZXRJRHNbMV0gKSwKfTsKCiMgdGlja2V0IDMgc2hvdWxkIGJlIGluIHEzCiRTZWxmLT5JcygKICAgICRUZXN0VGlja2V0c1syXXtRdWV1ZX0gLy8gJycsCiAgICAncTMnLAogICAgIk1haWwyIC0gVGlja2V0MiBpcyBpbiBxMy4iLAopOwoKIyBrZWVwIGZvciBsYXRlcgpteSAkRW1haWwyID0gJEVtYWlsOwoKIyBUZXN0OiBSZSBUaWNrZXQzI051bWJlciBjcmVhdGVzIGFydGljbGUgaW4gVGlja2V0MQokTmV3U3ViamVjdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RCdWlsZCgKICAgIFRpY2tldE51bWJlciA9PiAkVGVzdFRpY2tldHNbMl17VGlja2V0TnVtYmVyfSwKICAgIFN1YmplY3QgICAgICA9PiAnSW5pdGlhbCcsCiAgICBBY3Rpb24gICAgICAgPT4gJ1JlcGx5JywKKTsKCiRFbWFpbCA9IEdlbmVyYXRlRW1haWwoCiAgICBUbyAgICAgICAgPT4gJ2ExcDFAb3RvYm8ub3JnJywKICAgIFN1YmplY3QgICA9PiAkTmV3U3ViamVjdCwKICAgIE1lc3NhZ2VJRCA9PiAnPDIwMjMwMjE0MDAyODE0LkFkZHJlc3NQb29sczNAdGVzdD4nLAopOwoKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoJEVtYWlsKTsKCiMgdGlja2V0IDEgc2hvdWxkIGJlIHRpY2tldCAxIG9mIHRoZSBmaXJzdCBlbWFpbAokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzWzBdLAogICAgJFRlc3RUaWNrZXRzWzBde1RpY2tldElEfSwKICAgICJNYWlsMyAtIFRpY2tldDEgaXMgb2xkIFRpY2tldDEuIiwKKTsKCkBBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgIFRpY2tldElEID0+ICRUZXN0VGlja2V0c1swXXtUaWNrZXRJRH0sCik7CgojIHRpY2tldCAxIHNob3VsZCBoYXZlIDIgYXJ0aWNsZXMKJFNlbGYtPklzKAogICAgc2NhbGFyIEBBcnRpY2xlcywKICAgIDIsCiAgICAiTWFpbDMgLSBUaWNrZXQxIGhhcyAyIGFydGljbGVzLiIsCik7CgojIGNsZWFuIGFsbCBUaWNrZXRudW1iZXJzCm15ICRDbGVhbmVkU3ViamVjdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgIFRpY2tldE51bWJlciA9PiAkVGVzdFRpY2tldHNbMF17VGlja2V0TnVtYmVyfSwKICAgIFN1YmplY3QgICAgICA9PiAnJwogICAgICAgIC4gJ1snIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKSAuICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rRGl2aWRlcicpIC4gJFRlc3RUaWNrZXRzWzBde1RpY2tldE51bWJlcn0gLiAnXScKICAgICAgICAuICdbJyAuICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJykgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9va0RpdmlkZXInKSAuICRUZXN0VGlja2V0c1sxXXtUaWNrZXROdW1iZXJ9IC4gJ10nCiAgICAgICAgLiAnWycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9vaycpIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJykgLiAkVGVzdFRpY2tldHNbMl17VGlja2V0TnVtYmVyfSAuICddJwogICAgICAgIC4gJ1snIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKSAuICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rRGl2aWRlcicpIC4gJzIwMDMwMzAxMTIzNDEyMzQwMDAxXSBUZXN0JywKICAgIFNpemUgPT4gMCwKKTsKCiMgYWxsIGxpbmtlZCB0aWNrZXQgbnVtYmVycyBhcmUgY2xlYW5lZAokU2VsZi0+SXMoCiAgICAkQ2xlYW5lZFN1YmplY3QsCiAgICAnWycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9vaycpIC4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJykgLiAnMjAwMzAzMDExMjM0MTIzNDAwMDFdIFRlc3QnLAogICAgIlRpY2tldFN1YmplY3RDbGVhbiBpbmNsdWRlcyBpbnRlcmRpdiB0aWNrZXQgbnVtYmVycy4iLAopOwoKIyBUZXN0OiBzdGFuZGFyZCBjYXNlCiRFbWFpbCA9IEdlbmVyYXRlRW1haWwoCiAgICBUbyAgICAgICAgPT4gJ2F4QG90b2JvLm9yZycsCiAgICBTdWJqZWN0ICAgPT4gJ0tlaW4gUG9vbCcsCiAgICBNZXNzYWdlSUQgPT4gJzwyMDIzMDIxNDAwMjgxNC5BZGRyZXNzUG9vbHM0QHRlc3Q+JywKKTsKCiggJFJldHVybiwgQFRpY2tldElEcyApID0gUmVhZEVtYWlsKCRFbWFpbCk7CgojIG9uZSB0aWNrZXQgc2hvdWxkIGJlIGNyZWF0ZWQKJFNlbGYtPklzKAogICAgc2NhbGFyIEBUaWNrZXRJRHMsCiAgICAxLAogICAgIk1haWw0IC0gYSB0aWNrZXQgaXMgY3JlYXRlZC4iLAopOwoKbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFRpY2tldElEc1swXSApOwoKIyB0aWNrZXQgaXMgaW4gZGVmYXVsdCBxdWV1ZQokU2VsZi0+SXMoCiAgICAkVGlja2V0e1F1ZXVlfSwKICAgICRDb25maWdPYmplY3QtPkdldCgnUG9zdG1hc3RlckRlZmF1bHRRdWV1ZScpLAogICAgIk1haWw0IC0gdGlja2V0IGlzIGNyZWF0ZWQgaW4gZGVmIHF1ZXVlLiIsCik7CgojIFRlc3Q6IGlnbm9yZSBhbHJlYWR5IHJlY2VpdmVkIG1haWxzCiggJFJldHVybiwgQFRpY2tldElEcyApID0gUmVhZEVtYWlsKCRFbWFpbDIpOwoKIyBubyB0aWNrZXQgc2hvdWxkIGJlIGNyZWF0ZWQKJFNlbGYtPklzKAogICAgJFJldHVybiwKICAgIDUsCiAgICAiTWFpbDUgLSBtYWlsIGlnbm9yZWQuIiwKKTsKCiMgbm8gdGlja2V0IHNob3VsZCBiZSBjcmVhdGVkCiRTZWxmLT5JcygKICAgIHNjYWxhciBAVGlja2V0SURzLAogICAgMCwKICAgICJNYWlsNSAtIG5vIGFydGljbGUuIiwKKTsKCiMgVGVzdDogUmUgVGlja2V0MyNOdW1iZXIgY3JlYXRlcyBhcnRpY2xlIGluIFRpY2tldDEKJE5ld1N1YmplY3QgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICBUaWNrZXROdW1iZXIgPT4gJFRlc3RUaWNrZXRzWzJde1RpY2tldE51bWJlcn0sCiAgICBTdWJqZWN0ICAgICAgPT4gJ0luaXRpYWwnLAogICAgQWN0aW9uICAgICAgID0+ICdSZXBseScsCik7CgokRW1haWwgPSBHZW5lcmF0ZUVtYWlsKAogICAgVG8gICAgICAgID0+ICdhMXAxQG90b2JvLm9yZywgYTFwMkBvdG9iby5vcmcnLAogICAgU3ViamVjdCAgID0+ICROZXdTdWJqZWN0LAogICAgTWVzc2FnZUlEID0+ICc8MjAyMzAyMTQwMDI4MTQuQWRkcmVzc1Bvb2xzNkB0ZXN0PicsCiAgICBYSGVhZGVyICAgPT4gIlxuWC1PVE9CTy1Gb2xsb3dVcC1RdWV1ZTogcTUiLAopOwoKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoJEVtYWlsKTsKCiMgdGlja2V0IDEgc2hvdWxkIGJlIHRpY2tldCAxIG9mIHRoZSBmaXJzdCBlbWFpbAokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzWzBdLAogICAgJFRlc3RUaWNrZXRzWzBde1RpY2tldElEfSwKICAgICJNYWlsNiAtIFRpY2tldDEgaXMgb2xkIFRpY2tldDEuIiwKKTsKCiMgdGlja2V0IDIgc2hvdWxkIGJlIHRpY2tldCAyIG9mIHRoZSBmaXJzdCBlbWFpbAokU2VsZi0+SXMoCiAgICAkVGlja2V0SURzWzFdLAogICAgJFRlc3RUaWNrZXRzWzFde1RpY2tldElEfSwKICAgICJNYWlsNiAtIFRpY2tldDIgaXMgb2xkIFRpY2tldDIuIiwKKTsKCmZvciBteSAkaSAoIDAsIDEgKSB7CiAgICAkVGVzdFRpY2tldHNbJGldID0geyAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRUaWNrZXRJRHNbJGldICkgfTsKfQoKIyB0aWNrZXRxdWV1ZSAxIHNob3VsZCBzdGlsbCBiZSBxMQokU2VsZi0+SXMoCiAgICAkVGVzdFRpY2tldHNbMF0tPntRdWV1ZX0sCiAgICAncTEnLAogICAgIk1haWw2IC0gUXVldWUgb2YgVGlja2V0IDEgaXMgcTEuIiwKKTsKCiMgdGlja2V0cXVldWUgMiBzaG91bGQgbm93IGJlIHE1IG9mIHRoZSBYLU9UT0JPLUZvbGxvd1VwLVF1ZXVlIGhlYWRlcgokU2VsZi0+SXMoCiAgICAkVGVzdFRpY2tldHNbMV0tPntRdWV1ZX0sCiAgICAncTUnLAogICAgIk1haWw2IC0gUXVldWUgb2YgVGlja2V0IDIgaXMgcTUuIiwKKTsKCiMgVGVzdDogRG8gbm90IGlnbm9yZSBtYWlscyBzZW50IGZyb20gdGhlIHN5c3RlbQpteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnRW1haWwnICk7CiRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKICAgIFRpY2tldElEICAgICAgICAgICAgID0+ICRUZXN0VGlja2V0c1swXXtUaWNrZXRJRH0sCiAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEsCiAgICBGcm9tICAgICAgICAgICAgICAgICA9PiAnIlAxIiA8YTFwMUBvdG9iby5vcmc+JywKICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICciUDIiIDxhMXAyQG90b2JvLm9yZz4nLAogICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJ3NvbWUgc2hvcnQgZGVzY3JpcHRpb24nLAogICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ3RoZSBtZXNzYWdlIHRleHQnLAogICAgTWVzc2FnZUlEICAgICAgICAgICAgPT4gJzwyMDIzMDIxNDAwMjgxNC5BZGRyZXNzUG9vbHM3QHRlc3Q+JywKICAgIENvbnRlbnRUeXBlICAgICAgICAgID0+ICd0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTE1JywKICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdBZGROb3RlJywKICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICdTb21lIGZyZWUgdGV4dCEnLAogICAgTm9BZ2VudE5vdGlmeSAgICAgICAgPT4gMSwKKTsKCiROZXdTdWJqZWN0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgVGlja2V0TnVtYmVyID0+ICRUZXN0VGlja2V0c1swXXtUaWNrZXROdW1iZXJ9LAogICAgU3ViamVjdCAgICAgID0+ICdzb21lIHNob3J0IGRlc2NyaXB0aW9uJywKICAgIEFjdGlvbiAgICAgICA9PiAnUmVwbHknLAopOwoKJEVtYWlsID0gR2VuZXJhdGVFbWFpbCgKICAgIFRvICAgICAgICA9PiAnYTFwMkBvdG9iby5vcmcnLAogICAgU3ViamVjdCAgID0+ICROZXdTdWJqZWN0LAogICAgTWVzc2FnZUlEID0+ICc8MjAyMzAyMTQwMDI4MTQuQWRkcmVzc1Bvb2xzN0B0ZXN0PicsCik7CgooICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCgkRW1haWwpOwoKIyBvbmUgYXJ0aWNsZSBzaG91bGQgYmUgY3JlYXRlZAokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFRpY2tldElEcywKICAgIDEsCiAgICAiTWFpbDcgLSBvbmUgYXJ0aWNsZS4iLAopOwoKIyB0aWNrZXQgMSBzaG91bGQgYmUgdGlja2V0IDIgb2YgdGhlIGZpcnN0IGVtYWlsCiRTZWxmLT5JcygKICAgICRUaWNrZXRJRHNbMF0sCiAgICAkVGVzdFRpY2tldHNbMV17VGlja2V0SUR9LAogICAgIk1haWw3IC0gVGlja2V0MSBpcyBvbGQgVGlja2V0Mi4iLAopOwoKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoJEVtYWlsKTsKCiMgb24gc2Vjb25kIHJvdW5kIHRob3VnaCwgbWFpbCBzaG91bGQgYmUgaWdub3JlZAokU2VsZi0+SXMoCiAgICAkUmV0dXJuLAogICAgNSwKICAgICJNYWlsNy41IC0gbWFpbCBpZ25vcmVkLiIsCik7CgojIG5vIHRpY2tldCBzaG91bGQgYmUgY3JlYXRlZAokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFRpY2tldElEcywKICAgIDAsCiAgICAiTWFpbDcuNSAtIG5vIGFydGljbGUuIiwKKTsKCiMgVGVzdDogRGlzcGF0Y2hpbmcgdmlhIFF1ZXVlCiRFbWFpbCA9IEdlbmVyYXRlRW1haWwoCiAgICBUbyAgICAgICAgPT4gJ2ExcDFAb3RvYm8ub3JnJywKICAgIFN1YmplY3QgICA9PiAnTmV3JywKICAgIE1lc3NhZ2VJRCA9PiAnPDIwMjMwMjE0MDAyODE0LkFkZHJlc3NQb29sczhAdGVzdD4nLAopOwoKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoICRFbWFpbCwgJFF1ZXVlSURze3EyfSApOwoKIyB0d28gdGlja2V0cyBzaG91bGQgYmUgY3JlYXRlZC4uLgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFRpY2tldElEcywKICAgIDIsCiAgICAiTWFpbDggLSBjcmVhdGUgdHdvIHRpY2tldHMuIiwKKTsKCm15IEBUZXN0OFRpY2tldHM7CmZvciBteSAkSUQgKEBUaWNrZXRJRHMpIHsKICAgIHB1c2ggQFRlc3Q4VGlja2V0cywgewogICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJElEICkKICAgIH07Cn0KCiMgdGlja2V0IDEgc2hvdWxkIGJlIGluIHEyCiRTZWxmLT5JcygKICAgICRUZXN0OFRpY2tldHNbMF17UXVldWV9IC8vICcnLAogICAgJ3EyJywKICAgICJNYWlsOCAtIFRpY2tldDEgaXMgaW4gcTIuIiwKKTsKCiMgdGlja2V0IDIgc2hvdWxkIGJlIGluIHExCiRTZWxmLT5JcygKICAgICRUZXN0OFRpY2tldHNbMV17UXVldWV9IC8vICcnLAogICAgJ3ExJywKICAgICJNYWlsOCAtIFRpY2tldDIgaXMgaW4gcTEuIiwKKTsKCiMgVGVzdDogRGlzcGF0Y2hpbmcgdmlhIFF1ZXVlIHNlY29uZCByb3VuZAooICRSZXR1cm4sIEBUaWNrZXRJRHMgKSA9IFJlYWRFbWFpbCggJEVtYWlsLCAkUXVldWVJRHN7cTN9ICk7CgojIG9uZSBhZGRpdGlvbmFsIHRpY2tldCBzaG91bGQgYmUgY3JlYXRlZC4uLgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFRpY2tldElEcywKICAgIDEsCiAgICAiTWFpbDguNSAtIG9uZSB0aWNrZXQuIiwKKTsKCm15ICggJExpbmtlZFRpY2tldE51bWJlciwgJExpbmtlZFRpY2tldElEICkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6QWRkcmVzc1Bvb2wnKS0+RmluZExpbmtlZFRpY2tldCgKICAgIFRpY2tldElEICAgID0+ICRUaWNrZXRJRHNbMF0sCiAgICBBZGRyZXNzUG9vbCA9PiAnUG9vbDAyJywKICAgIFVzZXJJRCAgICAgID0+IDEsCik7CgojIC4uLmFuZCBiZSBsaW5rZWQgdG8gdGhlIGZvcm1lciBvbmVzCiRTZWxmLT5JcygKICAgICRMaW5rZWRUaWNrZXRJRCwKICAgICRUZXN0OFRpY2tldHNbMF17VGlja2V0SUR9LAogICAgIk1haWw4LjUgLSBjb3JyZWN0bHkgbGlua2VkLiIsCik7CgojIFRlc3Q6IERpc3BhdGNoaW5nIHZpYSBRdWV1ZSB0aGlyZCB0aW1lIHVubHVja3kKKCAkUmV0dXJuLCBAVGlja2V0SURzICkgPSBSZWFkRW1haWwoICRFbWFpbCwgJFF1ZXVlSURze3EzfSApOwoKIyBvbiB0aGlyZCByb3VuZCB0aG91Z2gsIG1haWwgc2hvdWxkIGJlIGlnbm9yZWQsIGFzIGFsbCBwb29scyBhcmUgZnVsbAokU2VsZi0+SXMoCiAgICAkUmV0dXJuLAogICAgNSwKICAgICJNYWlsOC42IC0gbWFpbCBpZ25vcmVkLiIsCik7CgojIG5vIHRpY2tldCBzaG91bGQgYmUgY3JlYXRlZAokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFRpY2tldElEcywKICAgIDAsCiAgICAiTWFpbDguNiAtIG5vIGFydGljbGUuIiwKKTsKCiMgY2xlYW51cCBpcyBkb25lIGJ5IFJlc3RvcmVEYXRhYmFzZS4KJFNlbGYtPkRvbmVUZXN0aW5nKCk7CgpzdWIgR2VuZXJhdGVFbWFpbCB7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAkUGFyYW17WEhlYWRlcn0gLy89ICcnOwoKICAgIHJldHVybiA8PCJFTkQiOwpGcm9tIHNreXdhbGtlclxAb3RvYm8ub3JnIEZyaSBEZWMgMjEgMjM6NTk6MjQgMjAwMQpSZXR1cm4tUGF0aDogPHNreXdhbGtlclxAb3RvYm8ub3JnPgpSZWNlaXZlZDogKGZyb20gc2t5d2Fsa2VyXEBsb2NhbGhvc3QpCiAgICBieSBhdnJvLmRlICg4LjExLjMvOC4xMS4zL1N1U0UgTGludXggOC4xMS4xLTAuNSkgaWQgZjNNTVNFMzAzNjk0CiAgICBmb3IgbWFydGluXEBsb2NhbGhvc3Q7IEZyaSwgMjEgRGVjIDIwMDEgMjM6NTk6MjQgKzAyMDAKRGF0ZTogRnJpLCAyMSBEZWMgMjAwMSAyMzo1OToyNCArMDIwMApGcm9tOiBTa3l3YWxrZXIgQXR0YWNobWVudCA8c2t5d2Fsa2VyXEBvdG9iby5vcmc+ClRvOiAkUGFyYW17VG99ClN1YmplY3Q6ICRQYXJhbXtTdWJqZWN0fQpNZXNzYWdlLUlEOiAkUGFyYW17TWVzc2FnZUlEfQpNaW1lLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lJFBhcmFte1hIZWFkZXJ9ClgtT3BlcmF0aW5nLVN5c3RlbTogTGludXggMi40LjEwLTRHQiBpNjg2ClgtVXB0aW1lOiAxMjoyM2FtICB1cCAgNToxOSwgIDYgdXNlcnMsICBsb2FkIGF2ZXJhZ2U6IDAuMTEsIDAuMTMsIDAuMTgKQ29udGVudC1MZW5ndGg6IDEzOQpMaW5lczogMTEKClRoaXMgaXMgdGhlIGZpcnN0IHRlc3QuCgpBZGlvcyAuLi4KCiAgTGl0dGxlICJTa3l3YWxrZXIiCgotLQpTeXN0ZW0gVGVzdGVyIEkgLSA8c2t5d2Fsa2VyXEBvdG9iby5vcmc+Ci0tCk9sZCBwcm9ncmFtbWVycyBuZXZlciBkaWUuIFRoZXkganVzdCBicmFuY2ggdG8gYSBuZXcgYWRkcmVzcy4KRU5ECn0KCiMjIG5vIGNyaXRpYyAoUGVybDo6Q3JpdGljOjpQb2xpY3k6OlN1YnJvdXRpbmVzOjpSZXF1aXJlQXJnVW5wYWNraW5nKQoKc3ViIFJlYWRFbWFpbCB7CgogICAgIyBzdGFydCBhIG5ldyBpbmNvbWluZyBjb21tdW5pY2F0aW9uCiAgICBteSAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpDb21tdW5pY2F0aW9uTG9nJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBUcmFuc3BvcnQgICA9PiAnRW1haWwnLAogICAgICAgICAgICBEaXJlY3Rpb24gICA9PiAnSW5jb21pbmcnLAogICAgICAgICAgICBBY2NvdW50VHlwZSA9PiAnU1RESU4nLAogICAgICAgIH0sCiAgICApOwoKICAgICMgc3RhcnQgb2JqZWN0IGxvZyBmb3IgdGhlIGluY29taW5nIGNvbm5lY3Rpb24KICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdGFydCggT2JqZWN0TG9nVHlwZSA9PiAnQ29ubmVjdGlvbicgKTsKCiAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+T2JqZWN0TG9nKAogICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ0Nvbm5lY3Rpb24nLAogICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OlBvc3RNYXN0ZXI6OlJlYWQnLAogICAgICAgIFZhbHVlICAgICAgICAgPT4gJ1JlYWQgRW1haWwgZnJvbSBBZGRyZXNzUG9vbFRlc3QuJywKICAgICk7CgogICAgIyBzdGFydCBvYmplY3QgbG9nIGZvciB0aGUgZW1haWwgcHJvY2Vzc2luZwogICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZ1N0YXJ0KCBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJyApOwoKICAgICMgcmVtZW1iZXIgdGhlIHJldHVybiBjb2RlIHRvIHN0b3AgdGhlIGNvbW11bmljdGFpb24gbGF0ZXIgd2l0aCBhIHByb3BlciBzdGF0dXMKICAgIG15ICRQb3N0TWFzdGVyUmV0dXJuQ29kZSA9IDA7CiAgICBteSBAUmV0dXJuOwoKICAgICMgV3JhcCB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBzY3JpcHQgaW4gYW4gImV2YWwiIGJsb2NrIHNvIHRoYXQgYW55CiAgICAjIHVuZXhwZWN0ZWQgKGJ1dCBwcm9iYWJseSB0cmFuc2llbnQpIGZhdGFsIGVycm9ycyAoc3VjaCBhcyB0aGUKICAgICMgZGF0YWJhc2UgYmVpbmcgdW5hdmFpbGFibGUpIGNhbiBiZSB0cmFwcGVkIHdpdGhvdXQgY2F1c2luZyBhCiAgICAjIGJvdW5jZQogICAgZXZhbCB7CgogICAgICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2coCiAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdEZWJ1ZycsCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6UG9zdE1hc3Rlcjo6UmVhZCcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJ1Byb2Nlc3NpbmcgZW1haWwgd2l0aCBQb3N0TWFzdGVyIG1vZHVsZS4nLAogICAgICAgICk7CgogICAgICAgIG15ICRQb3N0TWFzdGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIENvbW11bmljYXRpb25Mb2dPYmplY3QgPT4gJENvbW11bmljYXRpb25Mb2dPYmplY3QsCiAgICAgICAgICAgICAgICBFbWFpbCAgICAgICAgICAgICAgICAgID0+IFsgc3BsaXQoIC9cbi8sICRfWzBdICkgXSwKICAgICAgICAgICAgICAgIFRydXN0ZWQgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBAUmV0dXJuID0gJFBvc3RNYXN0ZXJPYmplY3QtPlJ1biggUXVldWVJRCA9PiAkX1sxXSApOwoKICAgICAgICBpZiAoICEkUmV0dXJuWzBdICkgewoKICAgICAgICAgICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZygKICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6Ok1haW50OjpQb3N0TWFzdGVyOjpSZWFkJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJ1Bvc3RNYXN0ZXIgbW9kdWxlIGV4aXRlZCB3aXRoIGVycm9ycywgY291bGQgbm90IHByb2Nlc3MgZW1haWwuIFBsZWFzZSByZWZlciB0byB0aGUgbG9nIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5Db21tdW5pY2F0aW9uU3RvcCggU3RhdHVzID0+ICdGYWlsZWQnICk7CgogICAgICAgICAgICBkaWUgIkNvdWxkIG5vdCBwcm9jZXNzIGVtYWlsLiBQbGVhc2UgcmVmZXIgdG8gdGhlIGxvZyFcbiI7CiAgICAgICAgfQoKICAgICAgICBteSAkRHVtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkR1bXAoIFxAUmV0dXJuICk7CiAgICAgICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZygKICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6Ok1haW50OjpQb3N0TWFzdGVyOjpSZWFkJywKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiRW1haWwgcHJvY2Vzc2luZyB3aXRoIFBvc3RNYXN0ZXIgbW9kdWxlIGNvbXBsZXRlZCwgcmV0dXJuIGRhdGE6ICREdW1wIiwKICAgICAgICApOwoKICAgICAgICAkUG9zdE1hc3RlclJldHVybkNvZGUgPSAkUmV0dXJuWzBdOwogICAgfTsKCiAgICBpZiAoJEApIHsKCiAgICAgICAgIyBBbiB1bmV4cGVjdGVkIHByb2JsZW0gb2NjdXJyZWQgKGZvciBleGFtcGxlLCB0aGUgZGF0YWJhc2Ugd2FzCiAgICAgICAgIyB1bmF2YWlsYWJsZSkuIFJldHVybiBhbiBFWF9URU1QRkFJTCBlcnJvciB0byBjYXVzZSB0aGUgbWFpbAogICAgICAgICMgcHJvZ3JhbSB0byByZXF1ZXVlIHRoZSBtZXNzYWdlIGluc3RlYWQgb2YgaW1tZWRpYXRlbHkgYm91bmNpbmcKICAgICAgICAjIGl0OyBzZWUgc3lzZXhpdHMuaC4gTW9zdCBtYWlsIHByb2dyYW1zIHdpbGwgcmV0cnkgYW4KICAgICAgICAjIEVYX1RFTVBGQUlMIGRlbGl2ZXJ5IGZvciBhYm91dCBmb3VyIGRheXMsIHRoZW4gYm91bmNlIHRoZQogICAgICAgICMgbWVzc2FnZS4pCiAgICAgICAgbXkgJE1lc3NhZ2UgPSAkQDsKCiAgICAgICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPk9iamVjdExvZygKICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0Vycm9yJywKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6Ok1haW50OjpQb3N0TWFzdGVyOjpSZWFkJywKICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCwgbWVzc2FnZTogJE1lc3NhZ2UiLAogICAgICAgICk7CgogICAgICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdG9wKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgU3RhdHVzICAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICApOwogICAgICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdG9wKAogICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdDb25uZWN0aW9uJywKICAgICAgICAgICAgU3RhdHVzICAgICAgICA9PiAnRmFpbGVkJywKICAgICAgICApOwogICAgICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5Db21tdW5pY2F0aW9uU3RvcCggU3RhdHVzID0+ICdGYWlsZWQnICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkQ29tbXVuaWNhdGlvbkxvZ09iamVjdC0+T2JqZWN0TG9nKAogICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ0Nvbm5lY3Rpb24nLAogICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ0RlYnVnJywKICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OlBvc3RNYXN0ZXI6OlJlYWQnLAogICAgICAgIFZhbHVlICAgICAgICAgPT4gJ0Nsb3NpbmcgY29ubmVjdGlvbiBmcm9tIFNURElOLicsCiAgICApOwoKICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdG9wKAogICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgIFN0YXR1cyAgICAgICAgPT4gJ1N1Y2Nlc3NmdWwnLAogICAgKTsKICAgICRDb21tdW5pY2F0aW9uTG9nT2JqZWN0LT5PYmplY3RMb2dTdG9wKAogICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ0Nvbm5lY3Rpb24nLAogICAgICAgIFN0YXR1cyAgICAgICAgPT4gJ1N1Y2Nlc3NmdWwnLAogICAgKTsKCiAgICBteSAlUmV0dXJuQ29kZU1hcCA9ICgKICAgICAgICAwID0+ICdGYWlsZWQnLCAgICAgICAgIyBlcnJvciAoYWxzbyBmYWxzZSkKICAgICAgICAxID0+ICdTdWNjZXNzZnVsJywgICAgIyBuZXcgdGlja2V0IGNyZWF0ZWQKICAgICAgICAyID0+ICdTdWNjZXNzZnVsJywgICAgIyBmb2xsb3cgdXAgLyBvcGVuL3Jlb3BlbgogICAgICAgIDMgPT4gJ1N1Y2Nlc3NmdWwnLCAgICAjIGZvbGxvdyB1cCAvIGNsb3NlIC0+IG5ldyB0aWNrZXQKICAgICAgICA0ID0+ICdGYWlsZWQnLCAgICAgICAgIyBmb2xsb3cgdXAgLyBjbG9zZSAtPiByZWplY3QKICAgICAgICA1ID0+ICdTdWNjZXNzZnVsJywgICAgIyBpZ25vcmVkIChiZWNhdXNlIG9mIFgtT1RPQk8tSWdub3JlIGhlYWRlcikKICAgICk7CgogICAgJENvbW11bmljYXRpb25Mb2dPYmplY3QtPkNvbW11bmljYXRpb25TdG9wKAogICAgICAgIFN0YXR1cyA9PiAkUmV0dXJuQ29kZU1hcHskUG9zdE1hc3RlclJldHVybkNvZGV9IC8vICdGYWlsZWQnLAogICAgKTsKCiAgICByZXR1cm4gQFJldHVybjsKfQo=</File>
        <File Location="doc/en/DiscreteSystemAddresses.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
</otrs_package>