<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>Checklist</Name>
    <Version>6.5.0</Version>
    <Framework>6.5.x</Framework>
    <Vendor>wolkig.it - Stephan Lang</Vendor>
    <URL>https://codeberg.org/wolkig-it/znuny_checklist</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3</License>
    <Description Lang="en">Checklist management for tickets in Znuny. Create templates, assign to queues, track mandatory and optional items.</Description>
    <Description Lang="de">Checklistenverwaltung fuer Tickets in Znuny. Vorlagen erstellen, Queues zuordnen, Pflicht- und optionale Schritte verfolgen.</Description>

    <ChangeLog Version="6.5.0" Date="2026-09-20 00:00:00">
        Initial release for Znuny 6.5.x, ported from the 7.2.x line: template management with queue assignment, multiple item types (checkbox, status, value, rating), remarks field, documentation links, ticket integration with sidebar widget, ACL-based close blocking, process management integration, XML import/export, permission control via ChecklistManager group. Fixes a close-lock ACL bug (module was not mutating the ACL hash in place, silently doing nothing), a foreign-key crash on TemplateDelete for templates already assigned to tickets, and a ChecklistList() query that never selected checklist_template_id, breaking ChecklistAssign's duplicate-avoidance check. Adds 121 unit tests covering ChecklistTemplate, Checklist, ChecklistACL and ChecklistAssign (previously untested).
    </ChangeLog>
    <ChangeLog Version="7.2.1" Date="2025-01-02 00:00:00">
        Added "Checklists" main menu entry for template management. Updated breadcrumb navigation and page titles.
    </ChangeLog>
    <ChangeLog Version="7.2.0" Date="2024-12-24 00:00:00">
        Initial release: Template management with queue assignment, multiple item types (checkbox, status, value, rating), remarks field, documentation links, ticket integration with sidebar widget, ACL-based close blocking, process management integration, XML import/export, permission control via ChecklistManager group.
    </ChangeLog>

    <!-- File list -->
    <Filelist>
        <!-- Config -->
        <File Permission="660" Location="Kernel/Config/Files/XML/Checklist.xml" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjIuMCIgaW5pdD0iQXBwbGljYXRpb24iPgoKICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIENoZWNrbGlzdCBUZW1wbGF0ZSBNb2R1bGUgIC0tPgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRDaGVja2xpc3RUZW1wbGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciBjaGVja2xpc3QgdGVtcGxhdGUgbWFuYWdlbWVudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q2hlY2tsaXN0TWFuYWdlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q2hlY2tsaXN0TWFuYWdlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5NYW5hZ2UgY2hlY2tsaXN0IHRlbXBsYXRlczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkNoZWNrbGlzdCBUZW1wbGF0ZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5DaGVja2xpc3RzPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tIENoZWNrbGlzdHMgTWFpbiBNZW51IEl0ZW0gLS0+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FnZW50Q2hlY2tsaXN0VGVtcGxhdGUjIyMwMDEtQ2hlY2tsaXN0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1haW4gbWVudSBpdGVtIGZvciBjaGVja2xpc3QgdGVtcGxhdGVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNoZWNrbGlzdE1hbmFnZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q2hlY2tsaXN0TWFuYWdlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5NYW5hZ2UgY2hlY2tsaXN0IHRlbXBsYXRlczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkNoZWNrbGlzdHM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50Q2hlY2tsaXN0VGVtcGxhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGlua09wdGlvbiI+PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhciI+Q2hlY2tsaXN0czwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUeXBlIj5NZW51PC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5JdGVtQXJlYTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBY2Nlc3NLZXkiPjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvIj45MTAwPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDwhLS0gQWdlbnQgTmF2aWdhdGlvbiBNb2R1bGUgKGFwcGVhcnMgaW4gQWRtaW4gb3ZlcnZpZXcpIC0tPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok5hdmlnYXRpb25Nb2R1bGUjIyNBZ2VudENoZWNrbGlzdFRlbXBsYXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk5hdmlnYXRpb24gZm9yIGNoZWNrbGlzdCB0ZW1wbGF0ZSBtYW5hZ2VtZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246OkFkbWluT3ZlcnZpZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q2hlY2tsaXN0TWFuYWdlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNoZWNrbGlzdE1hbmFnZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyOjpNb2R1bGVBZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5DaGVja2xpc3QgVGVtcGxhdGVzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgYW5kIG1hbmFnZSBjaGVja2xpc3QgdGVtcGxhdGVzIGZvciB0aWNrZXRzLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSWNvbkJpZyI+ZmEtY2hlY2stc3F1YXJlLW88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikljb25TbWFsbCI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgPCEtLSBBZ2VudCBGcm9udGVuZCBNb2R1bGUgICAgICAtLT4KICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50VGlja2V0Q2hlY2tsaXN0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSBmb3IgdGlja2V0IGNoZWNrbGlzdHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPnVzZXJzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPk1hbmFnZSBjaGVja2xpc3RzIGZvciB0aWNrZXRzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+VGlja2V0IENoZWNrbGlzdHM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5UaWNrZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIFRpY2tldCBab29tIEludGVncmF0aW9uICAgIC0tPgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8IS0tIFNpZGViYXIgV2lkZ2V0IC0tPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRab29tIyMjV2lkZ2V0cyMjIzA0MDAtQ2hlY2tsaXN0V2lkZ2V0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNoZWNrbGlzdCB3aWRnZXQgaW4gdGlja2V0IHpvb20gc2lkZWJhci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0Wm9vbTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRab29tOjpDaGVja2xpc3RXaWRnZXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPkNoZWNrbGlzdHM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxvY2F0aW9uIj5TaWRlYmFyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBc3luYyI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gQUNMIE1vZHVsZSBSZWdpc3RyYXRpb24gICAgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDwhLS0gTm8gUmV0dXJuVHlwZS9SZXR1cm5TdWJUeXBlIGtleSBoZXJlIChtYXRjaGluZyBabnVueSBjb3JlJ3Mgb3duCiAgICAgICAgIFRpY2tldDo6QWNsOjpNb2R1bGUjIyMxLVRpY2tldDo6QWNsOjpNb2R1bGUgLwogICAgICAgICBDbG9zZVBhcmVudEFmdGVyQ2xvc2VkQ2hpbGRzIHJlZ2lzdHJhdGlvbikgLSB0aGF0IG1lYW5zIFJ1bigpIGlzCiAgICAgICAgIGludm9rZWQgb24gZXZlcnkgVGlja2V0QWNsKCkgY2FsbCwgbm90IGp1c3QgU3RhdGUgY2hlY2tzLiBJdAogICAgICAgICBuZWVkcyB0aGUgIkFjdGlvbiIgY2hlY2tzIHRvbywgc28gaXQgY2FuIGFsc28gaGlkZSB0aGUgIkNsb3NlIgogICAgICAgICB0aWNrZXQgbWVudSBpdGVtIChSZXR1cm5UeXBlICJBY3Rpb24iKSBmb3IgdGlja2V0cyB3aXRoIGFuCiAgICAgICAgIGluY29tcGxldGUgbWFuZGF0b3J5IGNoZWNrbGlzdCwgbm90IGp1c3QgbmFycm93IHRoZSBzdGF0ZQogICAgICAgICBkcm9wZG93bi4gLS0+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkFjbDo6TW9kdWxlIyMjMTAwLUNoZWNrbGlzdEFDTCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BQ0wgbW9kdWxlIHRvIGJsb2NrIHRpY2tldCBjbG9zZSBzdGF0ZXMgYW5kIGhpZGUgdGhlIENsb3NlIG1lbnUgaXRlbSB3aGVuIGNoZWNrbGlzdHMgaGF2ZSBpbmNvbXBsZXRlIG1hbmRhdG9yeSBpdGVtcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlRpY2tldDo6QUNMPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QWNsOjpDaGVja2xpc3RBQ0w8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIENoZWNrbGlzdCBTZXR0aW5ncyAgICAgICAgIC0tPgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJDaGVja2xpc3Q6OkJsb2NrQ2xvc2VTdGF0ZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGlja2V0IHN0YXRlIHR5cGVzIHRoYXQgc2hvdWxkIGJlIGJsb2NrZWQgd2hlbiBjaGVja2xpc3RzIGhhdmUgaW5jb21wbGV0ZSBtYW5kYXRvcnkgaXRlbXMuIERlZmF1bHQ6IGNsb3NlZCwgbWVyZ2VkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6VGlja2V0OjpDaGVja2xpc3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5jbG9zZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5tZXJnZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDaGVja2xpc3Q6Okl0ZW1TdGF0ZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UG9zc2libGUgc3RhdGVzIGZvciBjaGVja2xpc3QgaXRlbXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpUaWNrZXQ6OkNoZWNrbGlzdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJvcGVuIiBUcmFuc2xhdGFibGU9IjEiPk9wZW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImRvbmUiIFRyYW5zbGF0YWJsZT0iMSI+RG9uZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90X2FwcGxpY2FibGUiIFRyYW5zbGF0YWJsZT0iMSI+Tm90IEFwcGxpY2FibGU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNoZWNrbGlzdDo6Q29tcGxldGVkU3RhdGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkl0ZW0gc3RhdGVzIHRoYXQgY291bnQgYXMgY29tcGxldGVkIChmb3IgbWFuZGF0b3J5IGl0ZW1zKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlRpY2tldDo6Q2hlY2tsaXN0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+ZG9uZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPm5vdF9hcHBsaWNhYmxlPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gTG9hZGVyIENvbmZpZ3VyYXRpb24gICAgICAgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudENoZWNrbGlzdFRlbXBsYXRlIyMjMDAxLUNoZWNrbGlzdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgY2hlY2tsaXN0IHRlbXBsYXRlIG1hbmFnZW1lbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTUyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkNoZWNrbGlzdC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkFkbWluLkNoZWNrbGlzdC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRUaWNrZXRab29tIyMjMDAyLUNoZWNrbGlzdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGlja2V0IHpvb20gY2hlY2tsaXN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5DaGVja2xpc3QuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5UaWNrZXRab29tLkNoZWNrbGlzdFdpZGdldC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRUaWNrZXRDaGVja2xpc3QjIyMwMDItQ2hlY2tsaXN0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciBhZ2VudCB0aWNrZXQgY2hlY2tsaXN0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5DaGVja2xpc3QuY3NzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5UaWNrZXRDaGVja2xpc3QuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gRXZlbnQgSGFuZGxlciBmb3IgSGlzdG9yeSAgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RXZlbnRNb2R1bGVQb3N0IyMjOTgwMC1DaGVja2xpc3RIaXN0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkV2ZW50IG1vZHVsZSBmb3IgY2hlY2tsaXN0IGhpc3RvcnkgZW50cmllcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpUaWNrZXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6Q2hlY2tsaXN0SGlzdG9yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDaGVja2xpc3RBZGR8Q2hlY2tsaXN0UmVtb3ZlfENoZWNrbGlzdEl0ZW1TdGF0ZUNoYW5nZSk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIFByb2Nlc3MgTWFuYWdlbWVudCAgICAgICAgIC0tPgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbkFjdGlvbjo6TW9kdWxlIyMjQ2hlY2tsaXN0QXNzaWduIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRyYW5zaXRpb25BY3Rpb24gbW9kdWxlIHRvIGFzc2lnbiBhIGNoZWNrbGlzdCB0ZW1wbGF0ZSB0byBhIHRpY2tldCBkdXJpbmcgcHJvY2VzcyBleGVjdXRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpQcm9jZXNzTWFuYWdlbWVudDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbkFjdGlvbjo6Q2hlY2tsaXN0QXNzaWduPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5Bc3NpZ25zIGEgY2hlY2tsaXN0IHRlbXBsYXRlIHRvIHRoZSB0aWNrZXQuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb25maWdEaWFsb2ciPkFkbWluUHJvY2Vzc01hbmFnZW1lbnRUcmFuc2l0aW9uQWN0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDb25maWdQYXJhbXMiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRlbXBsYXRlSUQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYWJlbCIgVHJhbnNsYXRhYmxlPSIxIj5UZW1wbGF0ZSBJRDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPlRlbXBsYXRlIElEIG9mIHRoZSBjaGVja2xpc3QgdG8gYXNzaWduLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPlRleHQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1aXJlZCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRlbXBsYXRlTmFtZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIiBUcmFuc2xhdGFibGU9IjEiPlRlbXBsYXRlIE5hbWU8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5UZW1wbGF0ZSBuYW1lIG9mIHRoZSBjaGVja2xpc3QgdG8gYXNzaWduIChhbHRlcm5hdGl2ZSB0byBJRCkuIFN1cHBvcnRzIHRpY2tldCBwbGFjZWhvbGRlcnMgbGlrZSAmbHQ7T1RSU19USUNLRVRfUXVldWUmZ3Q7LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlR5cGUiPlRleHQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSZXF1aXJlZCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cgo8L290cnNfY29uZmlnPgo=</File>

        <!-- System modules -->
        <File Permission="660" Location="Kernel/System/Checklist.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdFRlbXBsYXRlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpKU09OJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0IC0gVGlja2V0IGNoZWNrbGlzdCBtYW5hZ2VtZW50Cgo9aGVhZDEgREVTQ1JJUFRJT04KCkZ1bmN0aW9ucyB0byBtYW5hZ2UgY2hlY2tsaXN0cyBhdHRhY2hlZCB0byB0aWNrZXRzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCiAgICBteSAkQ2hlY2tsaXN0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntDYWNoZVR5cGV9ID0gJ1RpY2tldENoZWNrbGlzdCc7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSA2MCAqIDYwICogMjQ7ICAgICMgMSBkYXkKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBDaGVja2xpc3RBZGQoKQoKQWRkIGEgY2hlY2tsaXN0IHRvIGEgdGlja2V0IChmcm9tIGEgdGVtcGxhdGUpLgoKICAgIG15ICRDaGVja2xpc3RJRCA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdEFkZCgKICAgICAgICBUaWNrZXRJRCAgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZUlEID0+IDQ1NiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKUmV0dXJucyB0aGUgbmV3IGNoZWNrbGlzdCBJRCBvciB1bmRlZiBvbiBmYWlsdXJlLgoKPWN1dAoKc3ViIENoZWNrbGlzdEFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICREQk9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdFRlbXBsYXRlJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpY2tldElEIFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAlVGVtcGxhdGUgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlR2V0KCBJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0gKTsKICAgIGlmICggISVUZW1wbGF0ZSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSBJRCAkUGFyYW17VGVtcGxhdGVJRH0gbm90IGZvdW5kISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBJbnNlcnQgY2hlY2tsaXN0CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgSU5TRVJUIElOVE8gdGlja2V0X2NoZWNrbGlzdAogICAgICAgICAgICAgICAgKHRpY2tldF9pZCwgY2hlY2tsaXN0X3RlbXBsYXRlX2lkLCBuYW1lLCBkZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICBsaW5rX3VybCwgbGlua190ZXh0LAogICAgICAgICAgICAgICAgIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpCiAgICAgICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBcJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBcJFRlbXBsYXRle05hbWV9LAogICAgICAgICAgICBcJFRlbXBsYXRle0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgXCRUZW1wbGF0ZXtMaW5rVVJMfSwKICAgICAgICAgICAgXCRUZW1wbGF0ZXtMaW5rVGV4dH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgR2V0IG5ldyBjaGVja2xpc3QgSUQKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBpZCBGUk9NIHRpY2tldF9jaGVja2xpc3QKICAgICAgICAgICAgV0hFUkUgdGlja2V0X2lkID0gPyBBTkQgY2hlY2tsaXN0X3RlbXBsYXRlX2lkID0gPwogICAgICAgICAgICBPUkRFUiBCWSBpZCBERVNDJywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGlja2V0SUR9LCBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJENoZWNrbGlzdElEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENoZWNrbGlzdElEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gaWYgISRDaGVja2xpc3RJRDsKCiAgICAjIENvcHkgdGVtcGxhdGUgaXRlbXMgdG8gY2hlY2tsaXN0CiAgICBteSBAVGVtcGxhdGVJdGVtcyA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtTGlzdCggVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0gKTsKICAgIGZvciBteSAkSXRlbSAoQFRlbXBsYXRlSXRlbXMpIHsKICAgICAgICAkU2VsZi0+SXRlbUFkZCgKICAgICAgICAgICAgQ2hlY2tsaXN0SUQgPT4gJENoZWNrbGlzdElELAogICAgICAgICAgICBJdGVtVHlwZSAgICA9PiAkSXRlbS0+e0l0ZW1UeXBlfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJEl0ZW0tPntUaXRsZX0sCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICBDb25maWcgICAgICA9PiAkSXRlbS0+e0NvbmZpZ30sCiAgICAgICAgICAgIExpbmtVUkwgICAgID0+ICRJdGVtLT57TGlua1VSTH0sCiAgICAgICAgICAgIExpbmtUZXh0ICAgID0+ICRJdGVtLT57TGlua1RleHR9LAogICAgICAgICAgICBJc01hbmRhdG9yeSA9PiAkSXRlbS0+e0lzTWFuZGF0b3J5fSwKICAgICAgICAgICAgU29ydE9yZGVyICAgPT4gJEl0ZW0tPntTb3J0T3JkZXJ9LAogICAgICAgICAgICBTdGF0ZSAgICAgICA9PiAnb3BlbicsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBBZGQgaGlzdG9yeSBlbnRyeQogICAgJFRpY2tldE9iamVjdC0+SGlzdG9yeUFkZCgKICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBIaXN0b3J5VHlwZSAgPT4gJ01pc2MnLAogICAgICAgIE5hbWUgICAgICAgICA9PiAiQ2hlY2tsaXN0ICckVGVtcGxhdGV7TmFtZX0nIGFkZGVkIiwKICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICRTZWxmLT5fQ2FjaGVDbGVhbnVwKCBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9ICk7CgogICAgcmV0dXJuICRDaGVja2xpc3RJRDsKfQoKPWhlYWQyIENoZWNrbGlzdEdldCgpCgpHZXQgYSBjaGVja2xpc3QgYnkgSUQuCgogICAgbXkgJUNoZWNrbGlzdCA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdEdldCgKICAgICAgICBJRCA9PiAxMjMsCiAgICApOwoKUmV0dXJuczoKCiAgICAlQ2hlY2tsaXN0ID0gKAogICAgICAgIElEICAgICAgICAgID0+IDEyMywKICAgICAgICBUaWNrZXRJRCAgICA9PiA0NTYsCiAgICAgICAgVGVtcGxhdGVJRCAgPT4gNzg5LAogICAgICAgIE5hbWUgICAgICAgID0+ICdTZXJ2ZXIgTWFpbnRlbmFuY2UnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICcuLi4nLAogICAgICAgIExpbmtVUkwgICAgID0+ICdodHRwczovL2RvY3MuZXhhbXBsZS5jb20nLAogICAgICAgIExpbmtUZXh0ICAgID0+ICdEb2N1bWVudGF0aW9uJywKICAgICAgICBDcmVhdGVUaW1lICA9PiAnLi4uJywKICAgICAgICBDcmVhdGVCeSAgICA9PiAxLAogICAgICAgIENoYW5nZVRpbWUgID0+ICcuLi4nLAogICAgICAgIENoYW5nZUJ5ICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENoZWNrbGlzdEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICREQk9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgaWYgKCAhJFBhcmFte0lEfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJENhY2hlS2V5ID0gJ0NoZWNrbGlzdEdldDo6JyAuICRQYXJhbXtJRH07CiAgICBteSAkQ2FjaGUgICAgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJXskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQsIHRpY2tldF9pZCwgY2hlY2tsaXN0X3RlbXBsYXRlX2lkLCBuYW1lLCBkZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgIGxpbmtfdXJsLCBsaW5rX3RleHQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkKICAgICAgICAgICAgRlJPTSB0aWNrZXRfY2hlY2tsaXN0CiAgICAgICAgICAgIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0lEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICVDaGVja2xpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAlQ2hlY2tsaXN0ID0gKAogICAgICAgICAgICBJRCAgICAgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBUZW1wbGF0ZUlEICA9PiAkUm93WzJdLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkUm93WzNdLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkUm93WzRdLAogICAgICAgICAgICBMaW5rVVJMICAgICA9PiAkUm93WzVdLAogICAgICAgICAgICBMaW5rVGV4dCAgICA9PiAkUm93WzZdLAogICAgICAgICAgICBDcmVhdGVUaW1lICA9PiAkUm93WzddLAogICAgICAgICAgICBDcmVhdGVCeSAgICA9PiAkUm93WzhdLAogICAgICAgICAgICBDaGFuZ2VUaW1lICA9PiAkUm93WzldLAogICAgICAgICAgICBDaGFuZ2VCeSAgICA9PiAkUm93WzEwXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBpZiAhJUNoZWNrbGlzdDsKCiAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFwlQ2hlY2tsaXN0LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gJUNoZWNrbGlzdDsKfQoKPWhlYWQyIENoZWNrbGlzdERlbGV0ZSgpCgpEZWxldGUgYSBjaGVja2xpc3QgYW5kIGFsbCBpdHMgaXRlbXMuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3REZWxldGUoCiAgICAgICAgSUQgICAgICAgPT4gMTIzLAogICAgICAgIFRpY2tldElEID0+IDQ1NiwgICAjIGZvciBoaXN0b3J5CiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ2hlY2tsaXN0RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICREQk9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgY2hlY2tsaXN0IGRhdGEgZm9yIGhpc3RvcnkKICAgIG15ICVDaGVja2xpc3QgPSAkU2VsZi0+Q2hlY2tsaXN0R2V0KCBJRCA9PiAkUGFyYW17SUR9ICk7CiAgICByZXR1cm4gaWYgISVDaGVja2xpc3Q7CgogICAgIyBEZWxldGUgaXRlbXMgZmlyc3QKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSB0aWNrZXRfY2hlY2tsaXN0X2l0ZW0gV0hFUkUgdGlja2V0X2NoZWNrbGlzdF9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0lEfSBdLAogICAgKTsKCiAgICAjIERlbGV0ZSBjaGVja2xpc3QKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSB0aWNrZXRfY2hlY2tsaXN0IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SUR9IF0sCiAgICApOwoKICAgICMgQWRkIGhpc3RvcnkgZW50cnkKICAgICRUaWNrZXRPYmplY3QtPkhpc3RvcnlBZGQoCiAgICAgICAgVGlja2V0SUQgICAgID0+ICRDaGVja2xpc3R7VGlja2V0SUR9LAogICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICJDaGVja2xpc3QgJyRDaGVja2xpc3R7TmFtZX0nIHJlbW92ZWQiLAogICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgJFNlbGYtPl9DYWNoZUNsZWFudXAoIFRpY2tldElEID0+ICRDaGVja2xpc3R7VGlja2V0SUR9ICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDaGVja2xpc3RMaXN0KCkKCkdldCBhbGwgY2hlY2tsaXN0cyBmb3IgYSB0aWNrZXQuCgogICAgbXkgQENoZWNrbGlzdHMgPSAkQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3RMaXN0KAogICAgICAgIFRpY2tldElEID0+IDEyMywKICAgICk7CgpSZXR1cm5zIGFycmF5IG9mIGNoZWNrbGlzdCBoYXNoZXMgd2l0aCBwcm9ncmVzcyBpbmZvLgoKPWN1dAoKc3ViIENoZWNrbGlzdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgIGlmICggISRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUaWNrZXRJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDYWNoZUtleSA9ICdDaGVja2xpc3RMaXN0OjonIC4gJFBhcmFte1RpY2tldElEfTsKICAgIG15ICRDYWNoZSAgICA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiBAeyRDYWNoZX0gaWYgJENhY2hlOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBpZCwgY2hlY2tsaXN0X3RlbXBsYXRlX2lkLCBuYW1lLCBkZXNjcmlwdGlvbiwgbGlua191cmwsIGxpbmtfdGV4dCwgY3JlYXRlX3RpbWUKICAgICAgICAgICAgRlJPTSB0aWNrZXRfY2hlY2tsaXN0CiAgICAgICAgICAgIFdIRVJFIHRpY2tldF9pZCA9ID8KICAgICAgICAgICAgT1JERVIgQlkgY3JlYXRlX3RpbWUgQVNDJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUaWNrZXRJRH0gXSwKICAgICk7CgogICAgbXkgQENoZWNrbGlzdHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBDaGVja2xpc3RzLCB7CiAgICAgICAgICAgIElEICAgICAgICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIFRlbXBsYXRlSUQgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRSb3dbM10sCiAgICAgICAgICAgIExpbmtVUkwgICAgID0+ICRSb3dbNF0sCiAgICAgICAgICAgIExpbmtUZXh0ICAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgIENyZWF0ZVRpbWUgID0+ICRSb3dbNl0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIEFkZCBwcm9ncmVzcyBpbmZvIGZvciBlYWNoIGNoZWNrbGlzdAogICAgZm9yIG15ICRDaGVja2xpc3QgKEBDaGVja2xpc3RzKSB7CiAgICAgICAgbXkgJVByb2dyZXNzID0gJFNlbGYtPkNoZWNrbGlzdFByb2dyZXNzKCBDaGVja2xpc3RJRCA9PiAkQ2hlY2tsaXN0LT57SUR9ICk7CiAgICAgICAgJENoZWNrbGlzdC0+e1RvdGFsSXRlbXN9ICAgICA9ICRQcm9ncmVzc3tUb3RhbEl0ZW1zfTsKICAgICAgICAkQ2hlY2tsaXN0LT57Q29tcGxldGVkSXRlbXN9ID0gJFByb2dyZXNze0NvbXBsZXRlZEl0ZW1zfTsKICAgICAgICAkQ2hlY2tsaXN0LT57TWFuZGF0b3J5SXRlbXN9ID0gJFByb2dyZXNze01hbmRhdG9yeUl0ZW1zfTsKICAgICAgICAkQ2hlY2tsaXN0LT57TWFuZGF0b3J5RG9uZX0gID0gJFByb2dyZXNze01hbmRhdG9yeURvbmV9OwogICAgICAgICRDaGVja2xpc3QtPntJc0NvbXBsZXRlfSAgICAgPSAkUHJvZ3Jlc3N7SXNDb21wbGV0ZX07CiAgICB9CgogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcQENoZWNrbGlzdHMsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiBAQ2hlY2tsaXN0czsKfQoKPWhlYWQyIENoZWNrbGlzdFByb2dyZXNzKCkKCkdldCBwcm9ncmVzcyBpbmZvcm1hdGlvbiBmb3IgYSBjaGVja2xpc3QuCgogICAgbXkgJVByb2dyZXNzID0gJENoZWNrbGlzdE9iamVjdC0+Q2hlY2tsaXN0UHJvZ3Jlc3MoCiAgICAgICAgQ2hlY2tsaXN0SUQgPT4gMTIzLAogICAgKTsKClJldHVybnM6CgogICAgJVByb2dyZXNzID0gKAogICAgICAgIFRvdGFsSXRlbXMgICAgID0+IDUsCiAgICAgICAgQ29tcGxldGVkSXRlbXMgPT4gMywKICAgICAgICBNYW5kYXRvcnlJdGVtcyA9PiAyLAogICAgICAgIE1hbmRhdG9yeURvbmUgID0+IDEsCiAgICAgICAgSXNDb21wbGV0ZSAgICAgPT4gMCwgICAgIyAxIGlmIGFsbCBtYW5kYXRvcnkgaXRlbXMgYXJlIGRvbmUvbm90X2FwcGxpY2FibGUKICAgICk7Cgo9Y3V0CgpzdWIgQ2hlY2tsaXN0UHJvZ3Jlc3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIGlmICggISRQYXJhbXtDaGVja2xpc3RJRH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDaGVja2xpc3RJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgU2VjdXJpdHk6IFdoaXRlbGlzdCBhbGxvd2VkIHN0YXRlcyB0byBwcmV2ZW50IFNRTCBpbmplY3Rpb24KICAgIG15ICVBbGxvd2VkU3RhdGVzID0gKCBkb25lID0+IDEsIG5vdF9hcHBsaWNhYmxlID0+IDEsIG9wZW4gPT4gMSApOwogICAgbXkgJENvbXBsZXRlZFN0YXRlcyA9ICRDb25maWdPYmplY3QtPkdldCgnQ2hlY2tsaXN0OjpDb21wbGV0ZWRTdGF0ZXMnKSB8fCBbICdkb25lJywgJ25vdF9hcHBsaWNhYmxlJyBdOwogICAgbXkgQFNhZmVTdGF0ZXMgPSBncmVwIHsgJEFsbG93ZWRTdGF0ZXN7JF99IH0gQHskQ29tcGxldGVkU3RhdGVzfTsKCiAgICAjIEZhbGxiYWNrIGlmIG5vIHZhbGlkIHN0YXRlcyBjb25maWd1cmVkCiAgICBAU2FmZVN0YXRlcyA9ICggJ2RvbmUnLCAnbm90X2FwcGxpY2FibGUnICkgaWYgIUBTYWZlU3RhdGVzOwoKICAgIG15ICRQbGFjZWhvbGRlcnMgPSBqb2luKCAnLCAnLCAoJz8nKSB4IHNjYWxhciBAU2FmZVN0YXRlcyApOwoKICAgICMgR2V0IHRvdGFsIGFuZCBjb21wbGV0ZWQgY291bnRzCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIgogICAgICAgICAgICBTRUxFQ1QKICAgICAgICAgICAgICAgIENPVU5UKCopIEFTIHRvdGFsLAogICAgICAgICAgICAgICAgU1VNKENBU0UgV0hFTiBzdGF0ZSBJTiAoJFBsYWNlaG9sZGVycykgVEhFTiAxIEVMU0UgMCBFTkQpIEFTIGNvbXBsZXRlZCwKICAgICAgICAgICAgICAgIFNVTShDQVNFIFdIRU4gaXNfbWFuZGF0b3J5ID0gMSBUSEVOIDEgRUxTRSAwIEVORCkgQVMgbWFuZGF0b3J5LAogICAgICAgICAgICAgICAgU1VNKENBU0UgV0hFTiBpc19tYW5kYXRvcnkgPSAxIEFORCBzdGF0ZSBJTiAoJFBsYWNlaG9sZGVycykgVEhFTiAxIEVMU0UgMCBFTkQpIEFTIG1hbmRhdG9yeV9kb25lCiAgICAgICAgICAgIEZST00gdGlja2V0X2NoZWNrbGlzdF9pdGVtCiAgICAgICAgICAgIFdIRVJFIHRpY2tldF9jaGVja2xpc3RfaWQgPSA/IiwKICAgICAgICBCaW5kID0+IFsgKCBtYXAgeyBcJF8gfSBAU2FmZVN0YXRlcyApLCAoIG1hcCB7IFwkXyB9IEBTYWZlU3RhdGVzICksIFwkUGFyYW17Q2hlY2tsaXN0SUR9IF0sCiAgICApOwoKICAgIG15ICVQcm9ncmVzczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICVQcm9ncmVzcyA9ICgKICAgICAgICAgICAgVG90YWxJdGVtcyAgICAgPT4gJFJvd1swXSB8fCAwLAogICAgICAgICAgICBDb21wbGV0ZWRJdGVtcyA9PiAkUm93WzFdIHx8IDAsCiAgICAgICAgICAgIE1hbmRhdG9yeUl0ZW1zID0+ICRSb3dbMl0gfHwgMCwKICAgICAgICAgICAgTWFuZGF0b3J5RG9uZSAgPT4gJFJvd1szXSB8fCAwLAogICAgICAgICk7CiAgICB9CgogICAgJFByb2dyZXNze0lzQ29tcGxldGV9ID0gKCAkUHJvZ3Jlc3N7TWFuZGF0b3J5SXRlbXN9ID09ICRQcm9ncmVzc3tNYW5kYXRvcnlEb25lfSApID8gMSA6IDA7CgogICAgcmV0dXJuICVQcm9ncmVzczsKfQoKPWhlYWQyIFRpY2tldENhbkNsb3NlKCkKCkNoZWNrIGlmIGEgdGlja2V0IGNhbiBiZSBjbG9zZWQgKGFsbCBtYW5kYXRvcnkgY2hlY2tsaXN0IGl0ZW1zIGNvbXBsZXRlZCkuCgogICAgbXkgJENhbkNsb3NlID0gJENoZWNrbGlzdE9iamVjdC0+VGlja2V0Q2FuQ2xvc2UoCiAgICAgICAgVGlja2V0SUQgPT4gMTIzLAogICAgKTsKClJldHVybnMgMSBpZiB0aWNrZXQgY2FuIGJlIGNsb3NlZCwgMCBvdGhlcndpc2UuCgo9Y3V0CgpzdWIgVGlja2V0Q2FuQ2xvc2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgIGlmICggISRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUaWNrZXRJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7ICAgICMgQWxsb3cgY2xvc2UgaWYgbm8gdGlja2V0IElEIChzYWZldHkpCiAgICB9CgogICAgbXkgQENoZWNrbGlzdHMgPSAkU2VsZi0+Q2hlY2tsaXN0TGlzdCggVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSApOwoKICAgICMgTm8gY2hlY2tsaXN0cyA9IGNhbiBjbG9zZQogICAgcmV0dXJuIDEgaWYgIUBDaGVja2xpc3RzOwoKICAgICMgQ2hlY2sgaWYgYW55IGNoZWNrbGlzdCBpcyBpbmNvbXBsZXRlCiAgICBmb3IgbXkgJENoZWNrbGlzdCAoQENoZWNrbGlzdHMpIHsKICAgICAgICByZXR1cm4gMCBpZiAhJENoZWNrbGlzdC0+e0lzQ29tcGxldGV9OwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgR2V0SW5jb21wbGV0ZUl0ZW1zKCkKCkdldCBsaXN0IG9mIGluY29tcGxldGUgbWFuZGF0b3J5IGl0ZW1zIGZvciBhIHRpY2tldC4KCiAgICBteSBASXRlbXMgPSAkQ2hlY2tsaXN0T2JqZWN0LT5HZXRJbmNvbXBsZXRlSXRlbXMoCiAgICAgICAgVGlja2V0SUQgPT4gMTIzLAogICAgKTsKClJldHVybnMgYXJyYXkgb2YgaGFzaGVzIHdpdGggY2hlY2tsaXN0IG5hbWUgYW5kIGl0ZW0gdGl0bGUuCgo9Y3V0CgpzdWIgR2V0SW5jb21wbGV0ZUl0ZW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJERCT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICEkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVGlja2V0SUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIFNlY3VyaXR5OiBXaGl0ZWxpc3QgYWxsb3dlZCBzdGF0ZXMgdG8gcHJldmVudCBTUUwgaW5qZWN0aW9uCiAgICBteSAlQWxsb3dlZFN0YXRlcyA9ICggZG9uZSA9PiAxLCBub3RfYXBwbGljYWJsZSA9PiAxLCBvcGVuID0+IDEgKTsKICAgIG15ICRDb21wbGV0ZWRTdGF0ZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoZWNrbGlzdDo6Q29tcGxldGVkU3RhdGVzJykgfHwgWyAnZG9uZScsICdub3RfYXBwbGljYWJsZScgXTsKICAgIG15IEBTYWZlU3RhdGVzID0gZ3JlcCB7ICRBbGxvd2VkU3RhdGVzeyRffSB9IEB7JENvbXBsZXRlZFN0YXRlc307CgogICAgIyBGYWxsYmFjayBpZiBubyB2YWxpZCBzdGF0ZXMgY29uZmlndXJlZAogICAgQFNhZmVTdGF0ZXMgPSAoICdkb25lJywgJ25vdF9hcHBsaWNhYmxlJyApIGlmICFAU2FmZVN0YXRlczsKCiAgICBteSAkUGxhY2Vob2xkZXJzID0gam9pbiggJywgJywgKCc/JykgeCBzY2FsYXIgQFNhZmVTdGF0ZXMgKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIgogICAgICAgICAgICBTRUxFQ1QgdGMubmFtZSwgdGNpLnRpdGxlCiAgICAgICAgICAgIEZST00gdGlja2V0X2NoZWNrbGlzdF9pdGVtIHRjaQogICAgICAgICAgICBJTk5FUiBKT0lOIHRpY2tldF9jaGVja2xpc3QgdGMgT04gdGNpLnRpY2tldF9jaGVja2xpc3RfaWQgPSB0Yy5pZAogICAgICAgICAgICBXSEVSRSB0Yy50aWNrZXRfaWQgPSA/CiAgICAgICAgICAgICAgQU5EIHRjaS5pc19tYW5kYXRvcnkgPSAxCiAgICAgICAgICAgICAgQU5EIHRjaS5zdGF0ZSBOT1QgSU4gKCRQbGFjZWhvbGRlcnMpCiAgICAgICAgICAgIE9SREVSIEJZIHRjLm5hbWUsIHRjaS5zb3J0X29yZGVyIiwKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUaWNrZXRJRH0sIG1hcCB7IFwkXyB9IEBTYWZlU3RhdGVzIF0sCiAgICApOwoKICAgIG15IEBJdGVtczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQEl0ZW1zLCB7CiAgICAgICAgICAgIENoZWNrbGlzdE5hbWUgPT4gJFJvd1swXSwKICAgICAgICAgICAgSXRlbVRpdGxlICAgICA9PiAkUm93WzFdLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIEBJdGVtczsKfQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09CiMgSXRlbSBNZXRob2RzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PQoKPWhlYWQyIEl0ZW1BZGQoKQoKQWRkIGFuIGl0ZW0gdG8gYSBjaGVja2xpc3QuCgogICAgbXkgJEl0ZW1JRCA9ICRDaGVja2xpc3RPYmplY3QtPkl0ZW1BZGQoCiAgICAgICAgQ2hlY2tsaXN0SUQgPT4gMTIzLAogICAgICAgIEl0ZW1UeXBlICAgID0+ICdjaGVja2JveCcsICAgICAjIGNoZWNrYm94LCBzdGF0dXMsIHZhbHVlLCByYXRpbmcgKGRlZmF1bHQ6IGNoZWNrYm94KQogICAgICAgIFRpdGxlICAgICAgID0+ICdDaGVjayBsb2dzJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnLi4uJywgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIENvbmZpZyAgICAgID0+IHsgLi4uIH0sICAgICAgICAjIG9wdGlvbmFsLCB0eXBlLXNwZWNpZmljIGNvbmZpZyAoaGFzaHJlZikKICAgICAgICBMaW5rVVJMICAgICA9PiAnLi4uJywgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIExpbmtUZXh0ICAgID0+ICcuLi4nLCAgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgSXNNYW5kYXRvcnkgPT4gMCwKICAgICAgICBTb3J0T3JkZXIgICA9PiAxMCwgICAgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIFN0YXRlICAgICAgID0+ICdvcGVuJywKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICREQk9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRKU09OT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2hlY2tsaXN0SUQgVGl0bGUgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IGRlZmF1bHRzCiAgICAkUGFyYW17SXRlbVR5cGV9ICAgIC8vPSAnY2hlY2tib3gnOwogICAgJFBhcmFte0lzTWFuZGF0b3J5fSA9ICRQYXJhbXtJc01hbmRhdG9yeX0gPyAxIDogMDsKICAgICRQYXJhbXtTdGF0ZX0gICAgICAgPSAkUGFyYW17U3RhdGV9IHx8ICdvcGVuJzsKCiAgICAjIENvbnZlcnQgY29uZmlnIGhhc2hyZWYgdG8gSlNPTgogICAgbXkgJENvbmZpZ0pTT047CiAgICBpZiAoICRQYXJhbXtDb25maWd9ICYmIHJlZiAkUGFyYW17Q29uZmlnfSBlcSAnSEFTSCcgKSB7CiAgICAgICAgJENvbmZpZ0pTT04gPSAkSlNPTk9iamVjdC0+RW5jb2RlKCBEYXRhID0+ICRQYXJhbXtDb25maWd9ICk7CiAgICB9CgogICAgIyBBdXRvLWNhbGN1bGF0ZSBzb3J0IG9yZGVyCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtTb3J0T3JkZXJ9ICkgewogICAgICAgICRQYXJhbXtTb3J0T3JkZXJ9ID0gJFNlbGYtPl9HZXROZXh0U29ydE9yZGVyKCBDaGVja2xpc3RJRCA9PiAkUGFyYW17Q2hlY2tsaXN0SUR9ICk7CiAgICB9CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIElOU0VSVCBJTlRPIHRpY2tldF9jaGVja2xpc3RfaXRlbQogICAgICAgICAgICAgICAgKHRpY2tldF9jaGVja2xpc3RfaWQsIGl0ZW1fdHlwZSwgdGl0bGUsIGRlc2NyaXB0aW9uLCBjb25maWcsCiAgICAgICAgICAgICAgICAgbGlua191cmwsIGxpbmtfdGV4dCwgaXNfbWFuZGF0b3J5LCBzdGF0ZSwgc29ydF9vcmRlciwKICAgICAgICAgICAgICAgICBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KQogICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8sID8sID8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NoZWNrbGlzdElEfSwKICAgICAgICAgICAgXCRQYXJhbXtJdGVtVHlwZX0sCiAgICAgICAgICAgIFwkUGFyYW17VGl0bGV9LAogICAgICAgICAgICBcJFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgXCRDb25maWdKU09OLAogICAgICAgICAgICBcJFBhcmFte0xpbmtVUkx9LAogICAgICAgICAgICBcJFBhcmFte0xpbmtUZXh0fSwKICAgICAgICAgICAgXCRQYXJhbXtJc01hbmRhdG9yeX0sCiAgICAgICAgICAgIFwkUGFyYW17U3RhdGV9LAogICAgICAgICAgICBcJFBhcmFte1NvcnRPcmRlcn0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgR2V0IG5ldyBpdGVtIElECiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQgRlJPTSB0aWNrZXRfY2hlY2tsaXN0X2l0ZW0KICAgICAgICAgICAgV0hFUkUgdGlja2V0X2NoZWNrbGlzdF9pZCA9ID8KICAgICAgICAgICAgT1JERVIgQlkgaWQgREVTQycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NoZWNrbGlzdElEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRJdGVtSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkSXRlbUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIEdldCBjaGVja2xpc3QgZm9yIGNhY2hlIGNsZWFudXAgYW5kIGhpc3RvcnkKICAgIG15ICVDaGVja2xpc3QgPSAkU2VsZi0+Q2hlY2tsaXN0R2V0KCBJRCA9PiAkUGFyYW17Q2hlY2tsaXN0SUR9ICk7CiAgICBpZiAoJUNoZWNrbGlzdCkgewogICAgICAgICRUaWNrZXRPYmplY3QtPkhpc3RvcnlBZGQoCiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkQ2hlY2tsaXN0e1RpY2tldElEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdNaXNjJywKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICJDaGVja2xpc3QgJyRDaGVja2xpc3R7TmFtZX0nOiBJdGVtICckUGFyYW17VGl0bGV9JyBhZGRlZCIsCiAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+X0NhY2hlQ2xlYW51cCggVGlja2V0SUQgPT4gJENoZWNrbGlzdHtUaWNrZXRJRH0gKTsKICAgIH0KCiAgICByZXR1cm4gJEl0ZW1JRDsKfQoKPWhlYWQyIEl0ZW1HZXQoKQoKR2V0IGEgY2hlY2tsaXN0IGl0ZW0gYnkgSUQuCgogICAgbXkgJUl0ZW0gPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtR2V0KAogICAgICAgIElEID0+IDQ1NiwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJERCT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRKU09OT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKCiAgICBpZiAoICEkUGFyYW17SUR9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQsIHRpY2tldF9jaGVja2xpc3RfaWQsIGl0ZW1fdHlwZSwgdGl0bGUsIGRlc2NyaXB0aW9uLCBjb25maWcsCiAgICAgICAgICAgICAgICAgICBsaW5rX3VybCwgbGlua190ZXh0LCBpc19tYW5kYXRvcnksIHN0YXRlLCBpdGVtX3ZhbHVlLCByZW1hcmtzLCBzb3J0X29yZGVyLAogICAgICAgICAgICAgICAgICAgY29tcGxldGVkX3RpbWUsIGNvbXBsZXRlZF9ieSwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieQogICAgICAgICAgICBGUk9NIHRpY2tldF9jaGVja2xpc3RfaXRlbQogICAgICAgICAgICBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAlSXRlbTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICMgRGVjb2RlIGNvbmZpZyBKU09OCiAgICAgICAgbXkgJENvbmZpZyA9IHt9OwogICAgICAgIGlmICggJFJvd1s1XSApIHsKICAgICAgICAgICAgJENvbmZpZyA9ICRKU09OT2JqZWN0LT5EZWNvZGUoIERhdGEgPT4gJFJvd1s1XSApIHx8IHt9OwogICAgICAgIH0KCiAgICAgICAgJUl0ZW0gPSAoCiAgICAgICAgICAgIElEICAgICAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgQ2hlY2tsaXN0SUQgICA9PiAkUm93WzFdLAogICAgICAgICAgICBJdGVtVHlwZSAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAkUm93WzRdLAogICAgICAgICAgICBDb25maWcgICAgICAgID0+ICRDb25maWcsCiAgICAgICAgICAgIExpbmtVUkwgICAgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgTGlua1RleHQgICAgICA9PiAkUm93WzddLAogICAgICAgICAgICBJc01hbmRhdG9yeSAgID0+ICRSb3dbOF0sCiAgICAgICAgICAgIFN0YXRlICAgICAgICAgPT4gJFJvd1s5XSwKICAgICAgICAgICAgSXRlbVZhbHVlICAgICA9PiAkUm93WzEwXSwKICAgICAgICAgICAgUmVtYXJrcyAgICAgICA9PiAkUm93WzExXSwKICAgICAgICAgICAgU29ydE9yZGVyICAgICA9PiAkUm93WzEyXSwKICAgICAgICAgICAgQ29tcGxldGVkVGltZSA9PiAkUm93WzEzXSwKICAgICAgICAgICAgQ29tcGxldGVkQnkgICA9PiAkUm93WzE0XSwKICAgICAgICAgICAgQ3JlYXRlVGltZSAgICA9PiAkUm93WzE1XSwKICAgICAgICAgICAgQ3JlYXRlQnkgICAgICA9PiAkUm93WzE2XSwKICAgICAgICAgICAgQ2hhbmdlVGltZSAgICA9PiAkUm93WzE3XSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgICA9PiAkUm93WzE4XSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlSXRlbTsKfQoKPWhlYWQyIEl0ZW1TZXRTdGF0ZSgpCgpTZXQgdGhlIHN0YXRlIG9mIGEgY2hlY2tsaXN0IGl0ZW0uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtU2V0U3RhdGUoCiAgICAgICAgSUQgICAgID0+IDQ1NiwKICAgICAgICBTdGF0ZSAgPT4gJ2RvbmUnLCAgICMgb3BlbiwgZG9uZSwgbm90X2FwcGxpY2FibGUKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbVNldFN0YXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICREQk9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSUQgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIFZhbGlkYXRlIHN0YXRlCiAgICBteSAkSXRlbVN0YXRlcyA9ICRDb25maWdPYmplY3QtPkdldCgnQ2hlY2tsaXN0OjpJdGVtU3RhdGVzJykgfHwge307CiAgICBpZiAoICFleGlzdHMgJEl0ZW1TdGF0ZXMtPnsgJFBhcmFte1N0YXRlfSB9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgc3RhdGU6ICRQYXJhbXtTdGF0ZX0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgR2V0IGN1cnJlbnQgaXRlbSBmb3IgaGlzdG9yeQogICAgbXkgJUl0ZW0gPSAkU2VsZi0+SXRlbUdldCggSUQgPT4gJFBhcmFte0lEfSApOwogICAgcmV0dXJuIGlmICElSXRlbTsKCiAgICAjIERldGVybWluZSBjb21wbGV0ZWRfdGltZSBhbmQgY29tcGxldGVkX2J5CiAgICBteSAkQ29tcGxldGVkU3RhdGVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdDaGVja2xpc3Q6OkNvbXBsZXRlZFN0YXRlcycpIHx8IFsgJ2RvbmUnLCAnbm90X2FwcGxpY2FibGUnIF07CiAgICBteSAkSXNDb21wbGV0aW5nID0gZ3JlcCB7ICRfIGVxICRQYXJhbXtTdGF0ZX0gfSBAeyRDb21wbGV0ZWRTdGF0ZXN9OwoKICAgIG15ICRDb21wbGV0ZWRUaW1lID0gJElzQ29tcGxldGluZyA/ICdjdXJyZW50X3RpbWVzdGFtcCcgOiAnTlVMTCc7CiAgICBteSAkQ29tcGxldGVkQnkgICA9ICRJc0NvbXBsZXRpbmcgPyAkUGFyYW17VXNlcklEfSA6ICdOVUxMJzsKCiAgICAjIFVzZSBkaWZmZXJlbnQgU1FMIGZvciBjb21wbGV0ZWQgdnMgcmVvcGVuZWQKICAgIG15ICRTUUw7CiAgICBteSBAQmluZDsKICAgIGlmICgkSXNDb21wbGV0aW5nKSB7CiAgICAgICAgJFNRTCA9ICcKICAgICAgICAgICAgVVBEQVRFIHRpY2tldF9jaGVja2xpc3RfaXRlbQogICAgICAgICAgICBTRVQgc3RhdGUgPSA/LCBjb21wbGV0ZWRfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjb21wbGV0ZWRfYnkgPSA/LAogICAgICAgICAgICAgICAgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPwogICAgICAgICAgICBXSEVSRSBpZCA9ID8nOwogICAgICAgIEBCaW5kID0gKCBcJFBhcmFte1N0YXRlfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17SUR9ICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMID0gJwogICAgICAgICAgICBVUERBVEUgdGlja2V0X2NoZWNrbGlzdF9pdGVtCiAgICAgICAgICAgIFNFVCBzdGF0ZSA9ID8sIGNvbXBsZXRlZF90aW1lID0gTlVMTCwgY29tcGxldGVkX2J5ID0gTlVMTCwKICAgICAgICAgICAgICAgIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8KICAgICAgICAgICAgV0hFUkUgaWQgPSA/JzsKICAgICAgICBAQmluZCA9ICggXCRQYXJhbXtTdGF0ZX0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtJRH0gKTsKICAgIH0KCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICAjIEdldCBjaGVja2xpc3QgZm9yIGhpc3RvcnkKICAgIG15ICVDaGVja2xpc3QgPSAkU2VsZi0+Q2hlY2tsaXN0R2V0KCBJRCA9PiAkSXRlbXtDaGVja2xpc3RJRH0gKTsKICAgIGlmICglQ2hlY2tsaXN0KSB7CiAgICAgICAgbXkgJFN0YXRlTmFtZSA9ICRJdGVtU3RhdGVzLT57ICRQYXJhbXtTdGF0ZX0gfTsKICAgICAgICAkVGlja2V0T2JqZWN0LT5IaXN0b3J5QWRkKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJENoZWNrbGlzdHtUaWNrZXRJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAiQ2hlY2tsaXN0ICckQ2hlY2tsaXN0e05hbWV9JzogSXRlbSAnJEl0ZW17VGl0bGV9JyBtYXJrZWQgYXMgJFN0YXRlTmFtZSIsCiAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+X0NhY2hlQ2xlYW51cCggVGlja2V0SUQgPT4gJENoZWNrbGlzdHtUaWNrZXRJRH0gKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEl0ZW1VcGRhdGUoKQoKVXBkYXRlIGEgY2hlY2tsaXN0IGl0ZW0uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtVXBkYXRlKAogICAgICAgIElEICAgICAgICAgID0+IDQ1NiwKICAgICAgICBUaXRsZSAgICAgICA9PiAnVXBkYXRlZCB0aXRsZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1VwZGF0ZWQgZGVzYycsCiAgICAgICAgSXNNYW5kYXRvcnkgPT4gMSwKICAgICAgICBTb3J0T3JkZXIgICA9PiAyMCwKICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICREQk9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSUQgVGl0bGUgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtJc01hbmRhdG9yeX0gPSAkUGFyYW17SXNNYW5kYXRvcnl9ID8gMSA6IDA7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFVQREFURSB0aWNrZXRfY2hlY2tsaXN0X2l0ZW0KICAgICAgICAgICAgU0VUIHRpdGxlID0gPywgZGVzY3JpcHRpb24gPSA/LCBpc19tYW5kYXRvcnkgPSA/LCBzb3J0X29yZGVyID0gPywKICAgICAgICAgICAgICAgIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8KICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgIFwkUGFyYW17RGVzY3JpcHRpb259LAogICAgICAgICAgICBcJFBhcmFte0lzTWFuZGF0b3J5fSwKICAgICAgICAgICAgXCRQYXJhbXtTb3J0T3JkZXJ9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgR2V0IGl0ZW0gZm9yIGNhY2hlIGNsZWFudXAKICAgIG15ICVJdGVtID0gJFNlbGYtPkl0ZW1HZXQoIElEID0+ICRQYXJhbXtJRH0gKTsKICAgIGlmICglSXRlbSkgewogICAgICAgIG15ICVDaGVja2xpc3QgPSAkU2VsZi0+Q2hlY2tsaXN0R2V0KCBJRCA9PiAkSXRlbXtDaGVja2xpc3RJRH0gKTsKICAgICAgICAkU2VsZi0+X0NhY2hlQ2xlYW51cCggVGlja2V0SUQgPT4gJENoZWNrbGlzdHtUaWNrZXRJRH0gKSBpZiAlQ2hlY2tsaXN0OwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgSXRlbURlbGV0ZSgpCgpEZWxldGUgYSBjaGVja2xpc3QgaXRlbSAob25seSBvcHRpb25hbCBpdGVtcyBjYW4gYmUgZGVsZXRlZCkuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtRGVsZXRlKAogICAgICAgIElEICAgICA9PiA0NTYsCiAgICAgICAgRm9yY2UgID0+IDAsICAgICAjIDEgdG8gZGVsZXRlIG1hbmRhdG9yeSBpdGVtcyB0b28KICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IGl0ZW0gZGF0YQogICAgbXkgJUl0ZW0gPSAkU2VsZi0+SXRlbUdldCggSUQgPT4gJFBhcmFte0lEfSApOwogICAgcmV0dXJuIGlmICElSXRlbTsKCiAgICAjIENoZWNrIGlmIG1hbmRhdG9yeQogICAgaWYgKCAkSXRlbXtJc01hbmRhdG9yeX0gJiYgISRQYXJhbXtGb3JjZX0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ2Fubm90IGRlbGV0ZSBtYW5kYXRvcnkgaXRlbXMhIFVzZSBGb3JjZSA9PiAxIHRvIG92ZXJyaWRlLicsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHRpY2tldF9jaGVja2xpc3RfaXRlbSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0lEfSBdLAogICAgKTsKCiAgICAjIEdldCBjaGVja2xpc3QgZm9yIGhpc3RvcnkKICAgIG15ICVDaGVja2xpc3QgPSAkU2VsZi0+Q2hlY2tsaXN0R2V0KCBJRCA9PiAkSXRlbXtDaGVja2xpc3RJRH0gKTsKICAgIGlmICglQ2hlY2tsaXN0KSB7CiAgICAgICAgJFRpY2tldE9iamVjdC0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRDaGVja2xpc3R7VGlja2V0SUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgPT4gJ01pc2MnLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gIkNoZWNrbGlzdCAnJENoZWNrbGlzdHtOYW1lfSc6IEl0ZW0gJyRJdGVte1RpdGxlfScgZGVsZXRlZCIsCiAgICAgICAgICAgIENyZWF0ZVVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+X0NhY2hlQ2xlYW51cCggVGlja2V0SUQgPT4gJENoZWNrbGlzdHtUaWNrZXRJRH0gKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEl0ZW1MaXN0KCkKCkdldCBhbGwgaXRlbXMgZm9yIGEgY2hlY2tsaXN0LgoKICAgIG15IEBJdGVtcyA9ICRDaGVja2xpc3RPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENoZWNrbGlzdElEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICREQk9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICBteSAkSlNPTk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyk7CgogICAgaWYgKCAhJFBhcmFte0NoZWNrbGlzdElEfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENoZWNrbGlzdElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIGlkLCBpdGVtX3R5cGUsIHRpdGxlLCBkZXNjcmlwdGlvbiwgY29uZmlnLCBsaW5rX3VybCwgbGlua190ZXh0LAogICAgICAgICAgICAgICAgICAgaXNfbWFuZGF0b3J5LCBzdGF0ZSwgaXRlbV92YWx1ZSwgcmVtYXJrcywgc29ydF9vcmRlciwKICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZF90aW1lLCBjb21wbGV0ZWRfYnkKICAgICAgICAgICAgRlJPTSB0aWNrZXRfY2hlY2tsaXN0X2l0ZW0KICAgICAgICAgICAgV0hFUkUgdGlja2V0X2NoZWNrbGlzdF9pZCA9ID8KICAgICAgICAgICAgT1JERVIgQlkgc29ydF9vcmRlciBBU0MsIGlkIEFTQycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2hlY2tsaXN0SUR9IF0sCiAgICApOwoKICAgIG15IEBJdGVtczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICMgRGVjb2RlIGNvbmZpZyBKU09OCiAgICAgICAgbXkgJENvbmZpZyA9IHt9OwogICAgICAgIGlmICggJFJvd1s0XSApIHsKICAgICAgICAgICAgJENvbmZpZyA9ICRKU09OT2JqZWN0LT5EZWNvZGUoIERhdGEgPT4gJFJvd1s0XSApIHx8IHt9OwogICAgICAgIH0KCiAgICAgICAgcHVzaCBASXRlbXMsIHsKICAgICAgICAgICAgSUQgICAgICAgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBJdGVtVHlwZSAgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAkUm93WzNdLAogICAgICAgICAgICBDb25maWcgICAgICAgID0+ICRDb25maWcsCiAgICAgICAgICAgIExpbmtVUkwgICAgICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgTGlua1RleHQgICAgICA9PiAkUm93WzZdLAogICAgICAgICAgICBJc01hbmRhdG9yeSAgID0+ICRSb3dbN10sCiAgICAgICAgICAgIFN0YXRlICAgICAgICAgPT4gJFJvd1s4XSwKICAgICAgICAgICAgSXRlbVZhbHVlICAgICA9PiAkUm93WzldLAogICAgICAgICAgICBSZW1hcmtzICAgICAgID0+ICRSb3dbMTBdLAogICAgICAgICAgICBTb3J0T3JkZXIgICAgID0+ICRSb3dbMTFdLAogICAgICAgICAgICBDb21wbGV0ZWRUaW1lID0+ICRSb3dbMTJdLAogICAgICAgICAgICBDb21wbGV0ZWRCeSAgID0+ICRSb3dbMTNdLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIEBJdGVtczsKfQoKPWhlYWQyIEl0ZW1TZXRWYWx1ZSgpCgpTZXQgdGhlIHZhbHVlIG9mIGEgY2hlY2tsaXN0IGl0ZW0gKGZvciBzdGF0dXMsIHZhbHVlLCByYXRpbmcgdHlwZXMpLgoKICAgIG15ICRTdWNjZXNzID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbVNldFZhbHVlKAogICAgICAgIElEICAgICAgICA9PiA0NTYsCiAgICAgICAgSXRlbVZhbHVlID0+ICcyLjUnLCAgICAgICMgVGhlIHZhbHVlIChzdGF0dXMgb3B0aW9uLCBudW1lcmljIHZhbHVlLCBvciByYXRpbmcpCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1TZXRWYWx1ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBTdXBwb3J0IGJvdGggJ1ZhbHVlJyBhbmQgJ0l0ZW1WYWx1ZScgcGFyYW1ldGVyIG5hbWVzCiAgICBteSAkVmFsdWUgPSAkUGFyYW17SXRlbVZhbHVlfSAvLyAkUGFyYW17VmFsdWV9OwoKICAgICMgR2V0IGN1cnJlbnQgaXRlbQogICAgbXkgJUl0ZW0gPSAkU2VsZi0+SXRlbUdldCggSUQgPT4gJFBhcmFte0lEfSApOwogICAgcmV0dXJuIGlmICElSXRlbTsKCiAgICAjIFVwZGF0ZSBpdGVtIHZhbHVlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgVVBEQVRFIHRpY2tldF9jaGVja2xpc3RfaXRlbQogICAgICAgICAgICBTRVQgaXRlbV92YWx1ZSA9ID8sIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8KICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRWYWx1ZSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBcJFBhcmFte0lEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIEF1dG8tY29tcGxldGUvcmVzZXQgbG9naWMgZm9yIG5vbi1jaGVja2JveCB0eXBlcwogICAgaWYgKCAkSXRlbXtJdGVtVHlwZX0gbmUgJ2NoZWNrYm94JyApIHsKICAgICAgICBteSAkU2hvdWxkQ29tcGxldGUgPSAwOwogICAgICAgIG15ICRTaG91bGRSZXNldCAgICA9IDA7CgogICAgICAgIGlmICggJEl0ZW17SXRlbVR5cGV9IGVxICdzdGF0dXMnICkgewogICAgICAgICAgICAjIFN0YXR1czogY29tcGxldGUgaWYgdmFsdWUgc2V0IGFuZCBub3QgZW1wdHkvZGVmYXVsdCwgcmVzZXQgaWYgZW1wdHkvZGVmYXVsdAogICAgICAgICAgICBteSAkRGVmYXVsdE9wdGlvbiA9ICRJdGVte0NvbmZpZ317ZGVmYXVsdE9wdGlvbn0gfHwgJyc7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkVmFsdWUgJiYgJFZhbHVlIG5lICcnICYmICRWYWx1ZSBuZSAkRGVmYXVsdE9wdGlvbiApIHsKICAgICAgICAgICAgICAgICRTaG91bGRDb21wbGV0ZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2hvdWxkUmVzZXQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEl0ZW17SXRlbVR5cGV9IGVxICd2YWx1ZScgKSB7CiAgICAgICAgICAgICMgVmFsdWU6IGNvbXBsZXRlIGlmIG51bWVyaWMgdmFsdWUgZW50ZXJlZCwgcmVzZXQgaWYgZW1wdHkKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRWYWx1ZSAmJiAkVmFsdWUgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAkU2hvdWxkQ29tcGxldGUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNob3VsZFJlc2V0ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRJdGVte0l0ZW1UeXBlfSBlcSAncmF0aW5nJyApIHsKICAgICAgICAgICAgIyBSYXRpbmc6IGNvbXBsZXRlIGlmIHJhdGluZyA+IDAsIHJlc2V0IGlmIDAKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRWYWx1ZSAmJiAkVmFsdWUgPiAwICkgewogICAgICAgICAgICAgICAgJFNob3VsZENvbXBsZXRlID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTaG91bGRSZXNldCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgTWFyayBhcyBkb25lIGlmIHZhbHVlIGlzIHNldCBhbmQgaXRlbSB3YXMgb3BlbgogICAgICAgIGlmICggJFNob3VsZENvbXBsZXRlICYmICRJdGVte1N0YXRlfSBlcSAnb3BlbicgKSB7CiAgICAgICAgICAgICRTZWxmLT5JdGVtU2V0U3RhdGUoCiAgICAgICAgICAgICAgICBJRCAgICAgPT4gJFBhcmFte0lEfSwKICAgICAgICAgICAgICAgIFN0YXRlICA9PiAnZG9uZScsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgUmVzZXQgdG8gb3BlbiBpZiB2YWx1ZSBpcyBjbGVhcmVkIGFuZCBpdGVtIHdhcyBkb25lIChub3Qgbm90X2FwcGxpY2FibGUpCiAgICAgICAgZWxzaWYgKCAkU2hvdWxkUmVzZXQgJiYgJEl0ZW17U3RhdGV9IGVxICdkb25lJyApIHsKICAgICAgICAgICAgJFNlbGYtPkl0ZW1TZXRTdGF0ZSgKICAgICAgICAgICAgICAgIElEICAgICA9PiAkUGFyYW17SUR9LAogICAgICAgICAgICAgICAgU3RhdGUgID0+ICdvcGVuJywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBDYWNoZSBjbGVhbnVwCiAgICBteSAlQ2hlY2tsaXN0ID0gJFNlbGYtPkNoZWNrbGlzdEdldCggSUQgPT4gJEl0ZW17Q2hlY2tsaXN0SUR9ICk7CiAgICAkU2VsZi0+X0NhY2hlQ2xlYW51cCggVGlja2V0SUQgPT4gJENoZWNrbGlzdHtUaWNrZXRJRH0gKSBpZiAlQ2hlY2tsaXN0OwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgSXRlbVNldFJlbWFya3MoKQoKU2V0IHRoZSByZW1hcmtzIG9mIGEgY2hlY2tsaXN0IGl0ZW0uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtU2V0UmVtYXJrcygKICAgICAgICBJRCAgICAgID0+IDQ1NiwKICAgICAgICBSZW1hcmtzID0+ICdBZGRpdGlvbmFsIG5vdGVzLi4uJywKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1TZXRSZW1hcmtzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICREQk9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgVVBEQVRFIHRpY2tldF9jaGVja2xpc3RfaXRlbQogICAgICAgICAgICBTRVQgcmVtYXJrcyA9ID8sIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8KICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtSZW1hcmtzfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBcJFBhcmFte0lEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIEdldCBpdGVtIGZvciBjYWNoZSBjbGVhbnVwCiAgICBteSAlSXRlbSA9ICRTZWxmLT5JdGVtR2V0KCBJRCA9PiAkUGFyYW17SUR9ICk7CiAgICBpZiAoJUl0ZW0pIHsKICAgICAgICBteSAlQ2hlY2tsaXN0ID0gJFNlbGYtPkNoZWNrbGlzdEdldCggSUQgPT4gJEl0ZW17Q2hlY2tsaXN0SUR9ICk7CiAgICAgICAgJFNlbGYtPl9DYWNoZUNsZWFudXAoIFRpY2tldElEID0+ICRDaGVja2xpc3R7VGlja2V0SUR9ICkgaWYgJUNoZWNrbGlzdDsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHJpdmF0ZSBIZWxwZXIgTWV0aG9kcwojID09PT09PT09PT09PT09PT09PT09PT09PT0KCnN1YiBfR2V0TmV4dFNvcnRPcmRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBNQVgoc29ydF9vcmRlcikgRlJPTSB0aWNrZXRfY2hlY2tsaXN0X2l0ZW0KICAgICAgICAgICAgV0hFUkUgdGlja2V0X2NoZWNrbGlzdF9pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDaGVja2xpc3RJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkTWF4T3JkZXIgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1heE9yZGVyID0gJFJvd1swXSAvLyAwOwogICAgfQoKICAgIHJldHVybiAkTWF4T3JkZXIgKyAxMDsKfQoKc3ViIF9DYWNoZUNsZWFudXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Permission="660" Location="Kernel/System/ChecklistTemplate.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0VGVtcGxhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkpTT04nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0VGVtcGxhdGUgLSBDaGVja2xpc3QgdGVtcGxhdGUgbWFuYWdlbWVudAoKPWhlYWQxIERFU0NSSVBUSU9OCgpGdW5jdGlvbnMgdG8gbWFuYWdlIGNoZWNrbGlzdCB0ZW1wbGF0ZXMgYW5kIHRoZWlyIGl0ZW1zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgbXkgJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdFRlbXBsYXRlJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQ2hlY2tsaXN0VGVtcGxhdGUnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gNjAgKiA2MCAqIDI0ICogNzsgICAgIyAxIHdlZWsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBUZW1wbGF0ZUFkZCgpCgpBZGQgYSBuZXcgY2hlY2tsaXN0IHRlbXBsYXRlLgoKICAgIG15ICRUZW1wbGF0ZUlEID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAnU2VydmVyIE1haW50ZW5hbmNlJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2tsaXN0IGZvciBzZXJ2ZXIgbWFpbnRlbmFuY2UgdGFza3MnLCAgICMgb3B0aW9uYWwKICAgICAgICBMaW5rVVJMICAgICA9PiAnaHR0cHM6Ly9kb2NzLmV4YW1wbGUuY29tL21haW50ZW5hbmNlJywgICAgICMgb3B0aW9uYWwKICAgICAgICBMaW5rVGV4dCAgICA9PiAnRG9jdW1lbnRhdGlvbicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICAgICBWYWxpZElEICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEyMywKICAgICk7CgpSZXR1cm5zIHRoZSBuZXcgdGVtcGxhdGUgSUQgb3IgdW5kZWYgb24gZmFpbHVyZS4KCj1jdXQKCnN1YiBUZW1wbGF0ZUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBDaGVjayByZXF1aXJlZCBwYXJhbWV0ZXJzCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBDaGVjayBpZiB0ZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgbXkgJEV4aXN0aW5nSUQgPSAkU2VsZi0+VGVtcGxhdGVMb29rdXAoIE5hbWUgPT4gJFBhcmFte05hbWV9ICk7CiAgICBpZiAoJEV4aXN0aW5nSUQpIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJBIHRlbXBsYXRlIHdpdGggbmFtZSAnJFBhcmFte05hbWV9JyBhbHJlYWR5IGV4aXN0cyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgSW5zZXJ0IHRlbXBsYXRlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgSU5TRVJUIElOVE8gY2hlY2tsaXN0X3RlbXBsYXRlCiAgICAgICAgICAgICAgICAobmFtZSwgZGVzY3JpcHRpb24sIGxpbmtfdXJsLCBsaW5rX3RleHQsIHZhbGlkX2lkLAogICAgICAgICAgICAgICAgIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpCiAgICAgICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFwkUGFyYW17RGVzY3JpcHRpb259LAogICAgICAgICAgICBcJFBhcmFte0xpbmtVUkx9LAogICAgICAgICAgICBcJFBhcmFte0xpbmtUZXh0fSwKICAgICAgICAgICAgXCRQYXJhbXtWYWxpZElEfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBHZXQgbmV3IHRlbXBsYXRlIElECiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gY2hlY2tsaXN0X3RlbXBsYXRlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkVGVtcGxhdGVJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUZW1wbGF0ZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIENsZWFyIGNhY2hlCiAgICAkU2VsZi0+X0NhY2hlQ2xlYW51cCgpOwoKICAgIHJldHVybiAkVGVtcGxhdGVJRDsKfQoKPWhlYWQyIFRlbXBsYXRlR2V0KCkKCkdldCBhIGNoZWNrbGlzdCB0ZW1wbGF0ZSBieSBJRC4KCiAgICBteSAlVGVtcGxhdGUgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgIElEID0+IDEyMywKICAgICk7CgpSZXR1cm5zOgoKICAgICVUZW1wbGF0ZSA9ICgKICAgICAgICBJRCAgICAgICAgICA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ1NlcnZlciBNYWludGVuYW5jZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0NoZWNrbGlzdCBmb3Igc2VydmVyIG1haW50ZW5hbmNlIHRhc2tzJywKICAgICAgICBMaW5rVVJMICAgICA9PiAnaHR0cHM6Ly9kb2NzLmV4YW1wbGUuY29tL21haW50ZW5hbmNlJywKICAgICAgICBMaW5rVGV4dCAgICA9PiAnRG9jdW1lbnRhdGlvbicsCiAgICAgICAgVmFsaWRJRCAgICAgPT4gMSwKICAgICAgICBDcmVhdGVUaW1lICA9PiAnMjAyNS0wMS0wMSAxMjowMDowMCcsCiAgICAgICAgQ3JlYXRlQnkgICAgPT4gMSwKICAgICAgICBDaGFuZ2VUaW1lICA9PiAnMjAyNS0wMS0wMSAxMjowMDowMCcsCiAgICAgICAgQ2hhbmdlQnkgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgIGlmICggISRQYXJhbXtJRH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQ2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdUZW1wbGF0ZUdldDo6JyAuICRQYXJhbXtJRH07CiAgICBteSAkQ2FjaGUgICAgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJXskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICAjIEdldCB0ZW1wbGF0ZSBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQsIG5hbWUsIGRlc2NyaXB0aW9uLCBsaW5rX3VybCwgbGlua190ZXh0LCB2YWxpZF9pZCwKICAgICAgICAgICAgICAgICAgIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkKICAgICAgICAgICAgRlJPTSBjaGVja2xpc3RfdGVtcGxhdGUKICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17SUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJVRlbXBsYXRlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJVRlbXBsYXRlID0gKAogICAgICAgICAgICBJRCAgICAgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkUm93WzJdLAogICAgICAgICAgICBMaW5rVVJMICAgICA9PiAkUm93WzNdLAogICAgICAgICAgICBMaW5rVGV4dCAgICA9PiAkUm93WzRdLAogICAgICAgICAgICBWYWxpZElEICAgICA9PiAkUm93WzVdLAogICAgICAgICAgICBDcmVhdGVUaW1lICA9PiAkUm93WzZdLAogICAgICAgICAgICBDcmVhdGVCeSAgICA9PiAkUm93WzddLAogICAgICAgICAgICBDaGFuZ2VUaW1lICA9PiAkUm93WzhdLAogICAgICAgICAgICBDaGFuZ2VCeSAgICA9PiAkUm93WzldLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIGlmICElVGVtcGxhdGU7CgogICAgIyBDYWNoZSByZXN1bHQKICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVUZW1wbGF0ZSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuICVUZW1wbGF0ZTsKfQoKPWhlYWQyIFRlbXBsYXRlVXBkYXRlKCkKClVwZGF0ZSBhIGNoZWNrbGlzdCB0ZW1wbGF0ZS4KCiAgICBteSAkU3VjY2VzcyA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVVcGRhdGUoCiAgICAgICAgSUQgICAgICAgICAgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgID0+ICdTZXJ2ZXIgTWFpbnRlbmFuY2UgVXBkYXRlZCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1VwZGF0ZWQgZGVzY3JpcHRpb24nLCAgICAgIyBvcHRpb25hbAogICAgICAgIExpbmtVUkwgICAgID0+ICdodHRwczovL2RvY3MuZXhhbXBsZS5jb20vbWFpbnRlbmFuY2UnLCAgIyBvcHRpb25hbAogICAgICAgIExpbmtUZXh0ICAgID0+ICdEb2N1bWVudGF0aW9uJywgICAgICAgICAgICMgb3B0aW9uYWwKICAgICAgICBWYWxpZElEICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJERCT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgQ2hlY2sgcmVxdWlyZWQgcGFyYW1ldGVycwogICAgZm9yIG15ICROZWVkZWQgKHF3KElEIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgaWYgYW5vdGhlciB0ZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZSBleGlzdHMKICAgIG15ICRFeGlzdGluZ0lEID0gJFNlbGYtPlRlbXBsYXRlTG9va3VwKCBOYW1lID0+ICRQYXJhbXtOYW1lfSApOwogICAgaWYgKCAkRXhpc3RpbmdJRCAmJiAkRXhpc3RpbmdJRCAhPSAkUGFyYW17SUR9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkFub3RoZXIgdGVtcGxhdGUgd2l0aCBuYW1lICckUGFyYW17TmFtZX0nIGFscmVhZHkgZXhpc3RzISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBVcGRhdGUgdGVtcGxhdGUKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBVUERBVEUgY2hlY2tsaXN0X3RlbXBsYXRlCiAgICAgICAgICAgIFNFVCBuYW1lID0gPywgZGVzY3JpcHRpb24gPSA/LCBsaW5rX3VybCA9ID8sIGxpbmtfdGV4dCA9ID8sIHZhbGlkX2lkID0gPywKICAgICAgICAgICAgICAgIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8KICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgIFwkUGFyYW17TGlua1VSTH0sCiAgICAgICAgICAgIFwkUGFyYW17TGlua1RleHR9LAogICAgICAgICAgICBcJFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgQ2xlYXIgY2FjaGUKICAgICRTZWxmLT5fQ2FjaGVDbGVhbnVwKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBUZW1wbGF0ZVVzYWdlQ291bnQoKQoKQ291bnQgaG93IG1hbnkgdGlja2V0cyBjdXJyZW50bHkgaGF2ZSBhIGNoZWNrbGlzdCBhdHRhY2hlZCB0aGF0IHdhcwpjcmVhdGVkIGZyb20gdGhpcyB0ZW1wbGF0ZSAodGlja2V0X2NoZWNrbGlzdC5jaGVja2xpc3RfdGVtcGxhdGVfaWQpLgpVc2VkIHRvIGJsb2NrIGRlbGV0aW9uIG9mIGluLXVzZSB0ZW1wbGF0ZXMgLSBzZWUgVGVtcGxhdGVEZWxldGUoKS4KCiAgICBteSAkQ291bnQgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlVXNhZ2VDb3VudCgKICAgICAgICBJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlVXNhZ2VDb3VudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgaWYgKCAhJFBhcmFte0lEfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIENPVU5UKCopIEZST00gdGlja2V0X2NoZWNrbGlzdCBXSEVSRSBjaGVja2xpc3RfdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJRH0gXSwKICAgICk7CgogICAgbXkgJENvdW50ID0gMDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDb3VudCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRDb3VudDsKfQoKPWhlYWQyIFRlbXBsYXRlRGVsZXRlKCkKCkRlbGV0ZSBhIGNoZWNrbGlzdCB0ZW1wbGF0ZSAoYW5kIGFsbCBpdHMgaXRlbXMgYW5kIHF1ZXVlIGFzc2lnbm1lbnRzKS4KUmVmdXNlcyB0byBkZWxldGUgKHJldHVybnMgdW5kZWYsIG5vdGhpbmcgaXMgdG91Y2hlZCkgaWYgdGhlIHRlbXBsYXRlIGlzCnN0aWxsIGF0dGFjaGVkIHRvIGFueSB0aWNrZXQgLSBzZWUgVGVtcGxhdGVVc2FnZUNvdW50KCkuIFRoZSBEQiBzY2hlbWEgaGFzCmEgcmVhbCBmb3JlaWduIGtleSAoUkVTVFJJQ1QsIG5vIENBU0NBREUpIGZyb20KdGlja2V0X2NoZWNrbGlzdC5jaGVja2xpc3RfdGVtcGxhdGVfaWQgdG8gdGhpcyB0YWJsZSwgc28gYW4gaW4tdXNlCnRlbXBsYXRlIGNvdWxkIG5ldmVyIGFjdHVhbGx5IGJlIGRlbGV0ZWQgYW55d2F5OyBjaGVja2luZyBmaXJzdCBhdm9pZHMKcGFydGlhbGx5IGRlbGV0aW5nIGl0cyBpdGVtcy9xdWV1ZS1hc3NpZ25tZW50cyBiZWZvcmUgaGl0dGluZyB0aGF0IHdhbGwuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlRGVsZXRlKAogICAgICAgIElEICAgICA9PiAxMjMsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICREQk9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBpZiAoICEkUGFyYW17SUR9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIFJlZnVzZSB0byB0b3VjaCBhbnl0aGluZyBpZiB0aGUgdGVtcGxhdGUgaXMgc3RpbGwgaW4gdXNlIC0gc2VlIHRoZQogICAgIyBmb3JlaWduIGtleSBub3RlIGFib3ZlLgogICAgbXkgJFVzYWdlQ291bnQgPSAkU2VsZi0+VGVtcGxhdGVVc2FnZUNvdW50KCBJRCA9PiAkUGFyYW17SUR9ICk7CiAgICBpZiAoJFVzYWdlQ291bnQpIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW5ub3QgZGVsZXRlIHRlbXBsYXRlICRQYXJhbXtJRH06IHN0aWxsIGF0dGFjaGVkIHRvICRVc2FnZUNvdW50IHRpY2tldChzKS4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgRGVsZXRlIGFsbCBpdGVtcyBmaXJzdAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNoZWNrbGlzdF90ZW1wbGF0ZV9pdGVtIFdIRVJFIGNoZWNrbGlzdF90ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0lEfSBdLAogICAgKTsKCiAgICAjIERlbGV0ZSBxdWV1ZSBhc3NpZ25tZW50cwogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNoZWNrbGlzdF90ZW1wbGF0ZV9xdWV1ZSBXSEVSRSBjaGVja2xpc3RfdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJRH0gXSwKICAgICk7CgogICAgIyBEZWxldGUgdGVtcGxhdGUKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjaGVja2xpc3RfdGVtcGxhdGUgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtJRH0gXSwKICAgICk7CgogICAgIyBDbGVhciBjYWNoZQogICAgJFNlbGYtPl9DYWNoZUNsZWFudXAoKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIFRlbXBsYXRlTGlzdCgpCgpHZXQgYSBsaXN0IG9mIGFsbCB0ZW1wbGF0ZXMuCgogICAgbXkgJVRlbXBsYXRlcyA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgICAgIFZhbGlkSUQgPT4gMSwgICAgICAgICAgIyBvcHRpb25hbCwgZmlsdGVyIGJ5IHZhbGlkCiAgICAgICAgUXVldWVJRCA9PiA1LCAgICAgICAgICAjIG9wdGlvbmFsLCBmaWx0ZXIgYnkgcXVldWUgKGluY2x1ZGluZyBwYXJlbnQgcXVldWVzKQogICAgKTsKClJldHVybnM6CgogICAgJVRlbXBsYXRlcyA9ICgKICAgICAgICAxID0+ICdTZXJ2ZXIgTWFpbnRlbmFuY2UnLAogICAgICAgIDIgPT4gJ05ldHdvcmsgQ2hlY2snLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkREJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgQnVpbGQgY2FjaGUga2V5CiAgICBteSAkQ2FjaGVLZXkgPSAnVGVtcGxhdGVMaXN0JzsKICAgICRDYWNoZUtleSAuPSAnOjpWYWxpZElEOjonIC4gKCAkUGFyYW17VmFsaWRJRH0gLy8gJ0FMTCcgKTsKICAgICRDYWNoZUtleSAuPSAnOjpRdWV1ZUlEOjonIC4gKCAkUGFyYW17UXVldWVJRH0gLy8gJ0FMTCcgKTsKCiAgICAjIENoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGUgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJXskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICBteSAkU1FMID0gJ1NFTEVDVCBESVNUSU5DVCBjdC5pZCwgY3QubmFtZSBGUk9NIGNoZWNrbGlzdF90ZW1wbGF0ZSBjdCc7CiAgICBteSBAQmluZDsKCiAgICAjIEZpbHRlciBieSBxdWV1ZSBpZiBzcGVjaWZpZWQKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15IEBRdWV1ZUlEcyA9ICRTZWxmLT5fR2V0UXVldWVXaXRoUGFyZW50cyggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgICAgICBpZiAoQFF1ZXVlSURzKSB7CiAgICAgICAgICAgIG15ICRQbGFjZWhvbGRlcnMgPSBqb2luKCAnLCAnLCBtYXAgeyc/J30gQFF1ZXVlSURzICk7CiAgICAgICAgICAgICRTUUwgLj0gIiBJTk5FUiBKT0lOIGNoZWNrbGlzdF90ZW1wbGF0ZV9xdWV1ZSBjdHEgT04gY3QuaWQgPSBjdHEuY2hlY2tsaXN0X3RlbXBsYXRlX2lkCiAgICAgICAgICAgICAgICAgICAgICBXSEVSRSBjdHEucXVldWVfaWQgSU4gKCRQbGFjZWhvbGRlcnMpIjsKICAgICAgICAgICAgcHVzaCBAQmluZCwgbWFwIHsgXCRfIH0gQFF1ZXVlSURzOwogICAgICAgIH0KICAgIH0KCiAgICAjIEZpbHRlciBieSB2YWxpZAogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtWYWxpZElEfSApIHsKICAgICAgICAkU1FMIC49ICRQYXJhbXtRdWV1ZUlEfSA/ICcgQU5EICcgOiAnIFdIRVJFICc7CiAgICAgICAgJFNRTCAuPSAnY3QudmFsaWRfaWQgPSA/JzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1ZhbGlkSUR9OwogICAgfQoKICAgICRTUUwgLj0gJyBPUkRFUiBCWSBjdC5uYW1lJzsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICVUZW1wbGF0ZXM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGVtcGxhdGVzeyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgICMgQ2FjaGUgcmVzdWx0CiAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFwlVGVtcGxhdGVzLAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gJVRlbXBsYXRlczsKfQoKPWhlYWQyIFRlbXBsYXRlTG9va3VwKCkKCkxvb2t1cCB0ZW1wbGF0ZSBJRCBieSBuYW1lIG9yIG5hbWUgYnkgSUQuCgogICAgbXkgJFRlbXBsYXRlSUQgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlTG9va3VwKAogICAgICAgIE5hbWUgPT4gJ1NlcnZlciBNYWludGVuYW5jZScsCiAgICApOwoKICAgIG15ICRUZW1wbGF0ZU5hbWUgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlTG9va3VwKAogICAgICAgIElEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJERCT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIGlmICggISRQYXJhbXtJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIElEIG9yIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtJRH0gKSB7CiAgICAgICAgbXkgJVRlbXBsYXRlID0gJFNlbGYtPlRlbXBsYXRlR2V0KCBJRCA9PiAkUGFyYW17SUR9ICk7CiAgICAgICAgcmV0dXJuICRUZW1wbGF0ZXtOYW1lfTsKICAgIH0KCiAgICAjIExvb2t1cCBieSBuYW1lCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gY2hlY2tsaXN0X3RlbXBsYXRlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkSUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkSUQ7Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PQojIFRlbXBsYXRlIEl0ZW0gTWV0aG9kcwojID09PT09PT09PT09PT09PT09PT09PT09PT0KCj1oZWFkMiBUZW1wbGF0ZUl0ZW1BZGQoKQoKQWRkIGFuIGl0ZW0gdG8gYSB0ZW1wbGF0ZS4KCiAgICBteSAkSXRlbUlEID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1BZGQoCiAgICAgICAgVGVtcGxhdGVJRCAgPT4gMTIzLAogICAgICAgIEl0ZW1UeXBlICAgID0+ICdjaGVja2JveCcsICAgICAgICAgICAgICAgICAjIGNoZWNrYm94LCBzdGF0dXMsIHZhbHVlLCByYXRpbmcgKGRlZmF1bHQ6IGNoZWNrYm94KQogICAgICAgIFRpdGxlICAgICAgID0+ICdDaGVjayBzZXJ2ZXIgbG9ncycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1JldmlldyBsb2dzIGZvciBlcnJvcnMnLCAgICMgb3B0aW9uYWwKICAgICAgICBDb25maWcgICAgICA9PiB7IG9wdGlvbnMgPT4gWy4uLl0gfSwgICAgICAgIyBvcHRpb25hbCwgdHlwZS1zcGVjaWZpYyBjb25maWcgKGhhc2hyZWYpCiAgICAgICAgTGlua1VSTCAgICAgPT4gJ2h0dHBzOi8vZG9jcy5leGFtcGxlLmNvbScsICMgb3B0aW9uYWwKICAgICAgICBMaW5rVGV4dCAgICA9PiAnRG9jdW1lbnRhdGlvbicsICAgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIElzTWFuZGF0b3J5ID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAjIDAgb3IgMQogICAgICAgIFNvcnRPcmRlciAgID0+IDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCBhdXRvLWNhbGN1bGF0ZWQgaWYgbm90IGdpdmVuCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVJdGVtQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwoKICAgICMgQ2hlY2sgcmVxdWlyZWQgcGFyYW1ldGVycwogICAgZm9yIG15ICROZWVkZWQgKHF3KFRlbXBsYXRlSUQgVGl0bGUgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IGRlZmF1bHRzCiAgICAkUGFyYW17SXRlbVR5cGV9ICAgIC8vPSAnY2hlY2tib3gnOwogICAgJFBhcmFte0lzTWFuZGF0b3J5fSA9ICRQYXJhbXtJc01hbmRhdG9yeX0gPyAxIDogMDsKCiAgICAjIFZhbGlkYXRlIGl0ZW0gdHlwZQogICAgbXkgJVZhbGlkVHlwZXMgPSAoCiAgICAgICAgY2hlY2tib3ggPT4gMSwKICAgICAgICBzdGF0dXMgICA9PiAxLAogICAgICAgIHZhbHVlICAgID0+IDEsCiAgICAgICAgcmF0aW5nICAgPT4gMSwKICAgICk7CiAgICBpZiAoICEkVmFsaWRUeXBlc3sgJFBhcmFte0l0ZW1UeXBlfSB9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgSXRlbVR5cGUgJyRQYXJhbXtJdGVtVHlwZX0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBDb252ZXJ0IGNvbmZpZyBoYXNocmVmIHRvIEpTT04KICAgIG15ICRDb25maWdKU09OOwogICAgaWYgKCAkUGFyYW17Q29uZmlnfSAmJiByZWYgJFBhcmFte0NvbmZpZ30gZXEgJ0hBU0gnICkgewogICAgICAgICRDb25maWdKU09OID0gJEpTT05PYmplY3QtPkVuY29kZSggRGF0YSA9PiAkUGFyYW17Q29uZmlnfSApOwogICAgfQoKICAgICMgQXV0by1jYWxjdWxhdGUgc29ydCBvcmRlciBpZiBub3QgZ2l2ZW4KICAgIGlmICggIWRlZmluZWQgJFBhcmFte1NvcnRPcmRlcn0gKSB7CiAgICAgICAgJFBhcmFte1NvcnRPcmRlcn0gPSAkU2VsZi0+X0dldE5leHRTb3J0T3JkZXIoCiAgICAgICAgICAgIFRhYmxlICAgID0+ICdjaGVja2xpc3RfdGVtcGxhdGVfaXRlbScsCiAgICAgICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgQ29sdW1uICAgPT4gJ2NoZWNrbGlzdF90ZW1wbGF0ZV9pZCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEluc2VydCBpdGVtCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgSU5TRVJUIElOVE8gY2hlY2tsaXN0X3RlbXBsYXRlX2l0ZW0KICAgICAgICAgICAgICAgIChjaGVja2xpc3RfdGVtcGxhdGVfaWQsIGl0ZW1fdHlwZSwgdGl0bGUsIGRlc2NyaXB0aW9uLCBjb25maWcsCiAgICAgICAgICAgICAgICAgbGlua191cmwsIGxpbmtfdGV4dCwgaXNfbWFuZGF0b3J5LCBzb3J0X29yZGVyLAogICAgICAgICAgICAgICAgIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpCiAgICAgICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17SXRlbVR5cGV9LAogICAgICAgICAgICBcJFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgXCRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgIFwkQ29uZmlnSlNPTiwKICAgICAgICAgICAgXCRQYXJhbXtMaW5rVVJMfSwKICAgICAgICAgICAgXCRQYXJhbXtMaW5rVGV4dH0sCiAgICAgICAgICAgIFwkUGFyYW17SXNNYW5kYXRvcnl9LAogICAgICAgICAgICBcJFBhcmFte1NvcnRPcmRlcn0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgR2V0IG5ldyBpdGVtIElECiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQgRlJPTSBjaGVja2xpc3RfdGVtcGxhdGVfaXRlbQogICAgICAgICAgICBXSEVSRSBjaGVja2xpc3RfdGVtcGxhdGVfaWQgPSA/IEFORCB0aXRsZSA9ID8KICAgICAgICAgICAgT1JERVIgQlkgaWQgREVTQycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJFBhcmFte1RpdGxlfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRJdGVtSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkSXRlbUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIENsZWFyIGNhY2hlCiAgICAkU2VsZi0+X0NhY2hlQ2xlYW51cCgpOwoKICAgIHJldHVybiAkSXRlbUlEOwp9Cgo9aGVhZDIgVGVtcGxhdGVJdGVtR2V0KCkKCkdldCBhIHRlbXBsYXRlIGl0ZW0gYnkgSUQuCgogICAgbXkgJUl0ZW0gPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlSXRlbUdldCgKICAgICAgICBJRCA9PiA0NTYsCiAgICApOwoKUmV0dXJuczoKCiAgICAlSXRlbSA9ICgKICAgICAgICBJRCAgICAgICAgICA9PiA0NTYsCiAgICAgICAgVGVtcGxhdGVJRCAgPT4gMTIzLAogICAgICAgIEl0ZW1UeXBlICAgID0+ICdjaGVja2JveCcsCiAgICAgICAgVGl0bGUgICAgICAgPT4gJ0NoZWNrIHNlcnZlciBsb2dzJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUmV2aWV3IGxvZ3MgZm9yIGVycm9ycycsCiAgICAgICAgQ29uZmlnICAgICAgPT4geyBvcHRpb25zID0+IFsuLi5dIH0sICAgICMgaGFzaHJlZiwgZGVjb2RlZCBmcm9tIEpTT04KICAgICAgICBMaW5rVVJMICAgICA9PiAnaHR0cHM6Ly9kb2NzLmV4YW1wbGUuY29tJywKICAgICAgICBMaW5rVGV4dCAgICA9PiAnRG9jdW1lbnRhdGlvbicsCiAgICAgICAgSXNNYW5kYXRvcnkgPT4gMSwKICAgICAgICBTb3J0T3JkZXIgICA9PiAxMCwKICAgICAgICBDcmVhdGVUaW1lICA9PiAnMjAyNS0wMS0wMSAxMjowMDowMCcsCiAgICAgICAgQ3JlYXRlQnkgICAgPT4gMSwKICAgICAgICBDaGFuZ2VUaW1lICA9PiAnMjAyNS0wMS0wMSAxMjowMDowMCcsCiAgICAgICAgQ2hhbmdlQnkgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVJdGVtR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwoKICAgIGlmICggISRQYXJhbXtJRH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBpZCwgY2hlY2tsaXN0X3RlbXBsYXRlX2lkLCBpdGVtX3R5cGUsIHRpdGxlLCBkZXNjcmlwdGlvbiwgY29uZmlnLAogICAgICAgICAgICAgICAgICAgbGlua191cmwsIGxpbmtfdGV4dCwgaXNfbWFuZGF0b3J5LCBzb3J0X29yZGVyLAogICAgICAgICAgICAgICAgICAgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieQogICAgICAgICAgICBGUk9NIGNoZWNrbGlzdF90ZW1wbGF0ZV9pdGVtCiAgICAgICAgICAgIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0lEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICVJdGVtOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgIyBEZWNvZGUgY29uZmlnIEpTT04KICAgICAgICBteSAkQ29uZmlnID0ge307CiAgICAgICAgaWYgKCAkUm93WzVdICkgewogICAgICAgICAgICAkQ29uZmlnID0gJEpTT05PYmplY3QtPkRlY29kZSggRGF0YSA9PiAkUm93WzVdICkgfHwge307CiAgICAgICAgfQoKICAgICAgICAlSXRlbSA9ICgKICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgVGVtcGxhdGVJRCAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgSXRlbVR5cGUgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFJvd1s0XSwKICAgICAgICAgICAgQ29uZmlnICAgICAgPT4gJENvbmZpZywKICAgICAgICAgICAgTGlua1VSTCAgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgTGlua1RleHQgICAgPT4gJFJvd1s3XSwKICAgICAgICAgICAgSXNNYW5kYXRvcnkgPT4gJFJvd1s4XSwKICAgICAgICAgICAgU29ydE9yZGVyICAgPT4gJFJvd1s5XSwKICAgICAgICAgICAgQ3JlYXRlVGltZSAgPT4gJFJvd1sxMF0sCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgID0+ICRSb3dbMTFdLAogICAgICAgICAgICBDaGFuZ2VUaW1lICA9PiAkUm93WzEyXSwKICAgICAgICAgICAgQ2hhbmdlQnkgICAgPT4gJFJvd1sxM10sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJUl0ZW07Cn0KCj1oZWFkMiBUZW1wbGF0ZUl0ZW1VcGRhdGUoKQoKVXBkYXRlIGEgdGVtcGxhdGUgaXRlbS4KCiAgICBteSAkU3VjY2VzcyA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtVXBkYXRlKAogICAgICAgIElEICAgICAgICAgID0+IDQ1NiwKICAgICAgICBJdGVtVHlwZSAgICA9PiAnc3RhdHVzJywgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgY2hlY2tib3gsIHN0YXR1cywgdmFsdWUsIHJhdGluZwogICAgICAgIFRpdGxlICAgICAgID0+ICdVcGRhdGVkIHRpdGxlJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVXBkYXRlZCBkZXNjcmlwdGlvbicsCiAgICAgICAgQ29uZmlnICAgICAgPT4geyBvcHRpb25zID0+IFsuLi5dIH0sICAgICAgICMgb3B0aW9uYWwsIHR5cGUtc3BlY2lmaWMgY29uZmlnIChoYXNocmVmKQogICAgICAgIExpbmtVUkwgICAgID0+ICdodHRwczovL2RvY3MuZXhhbXBsZS5jb20nLCAjIG9wdGlvbmFsCiAgICAgICAgTGlua1RleHQgICAgPT4gJ0RvY3VtZW50YXRpb24nLCAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICAgICBJc01hbmRhdG9yeSA9PiAxLAogICAgICAgIFNvcnRPcmRlciAgID0+IDIwLAogICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlSXRlbVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJERCT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRKU09OT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSUQgVGl0bGUgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IGRlZmF1bHRzCiAgICAkUGFyYW17SXRlbVR5cGV9ICAgIC8vPSAnY2hlY2tib3gnOwogICAgJFBhcmFte0lzTWFuZGF0b3J5fSA9ICRQYXJhbXtJc01hbmRhdG9yeX0gPyAxIDogMDsKCiAgICAjIFZhbGlkYXRlIGl0ZW0gdHlwZQogICAgbXkgJVZhbGlkVHlwZXMgPSAoCiAgICAgICAgY2hlY2tib3ggPT4gMSwKICAgICAgICBzdGF0dXMgICA9PiAxLAogICAgICAgIHZhbHVlICAgID0+IDEsCiAgICAgICAgcmF0aW5nICAgPT4gMSwKICAgICk7CiAgICBpZiAoICEkVmFsaWRUeXBlc3sgJFBhcmFte0l0ZW1UeXBlfSB9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgSXRlbVR5cGUgJyRQYXJhbXtJdGVtVHlwZX0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBDb252ZXJ0IGNvbmZpZyBoYXNocmVmIHRvIEpTT04KICAgIG15ICRDb25maWdKU09OOwogICAgaWYgKCAkUGFyYW17Q29uZmlnfSAmJiByZWYgJFBhcmFte0NvbmZpZ30gZXEgJ0hBU0gnICkgewogICAgICAgICRDb25maWdKU09OID0gJEpTT05PYmplY3QtPkVuY29kZSggRGF0YSA9PiAkUGFyYW17Q29uZmlnfSApOwogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBVUERBVEUgY2hlY2tsaXN0X3RlbXBsYXRlX2l0ZW0KICAgICAgICAgICAgU0VUIGl0ZW1fdHlwZSA9ID8sIHRpdGxlID0gPywgZGVzY3JpcHRpb24gPSA/LCBjb25maWcgPSA/LAogICAgICAgICAgICAgICAgbGlua191cmwgPSA/LCBsaW5rX3RleHQgPSA/LCBpc19tYW5kYXRvcnkgPSA/LCBzb3J0X29yZGVyID0gPywKICAgICAgICAgICAgICAgIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8KICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtJdGVtVHlwZX0sCiAgICAgICAgICAgIFwkUGFyYW17VGl0bGV9LAogICAgICAgICAgICBcJFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgXCRDb25maWdKU09OLAogICAgICAgICAgICBcJFBhcmFte0xpbmtVUkx9LAogICAgICAgICAgICBcJFBhcmFte0xpbmtUZXh0fSwKICAgICAgICAgICAgXCRQYXJhbXtJc01hbmRhdG9yeX0sCiAgICAgICAgICAgIFwkUGFyYW17U29ydE9yZGVyfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBcJFBhcmFte0lEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAkU2VsZi0+X0NhY2hlQ2xlYW51cCgpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgVGVtcGxhdGVJdGVtUmVvcmRlcigpCgpVcGRhdGUgb25seSB0aGUgc29ydCBvcmRlciBvZiBhIHRlbXBsYXRlIGl0ZW0uCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlSXRlbVJlb3JkZXIoCiAgICAgICAgSUQgICAgICAgID0+IDQ1NiwKICAgICAgICBTb3J0T3JkZXIgPT4gMiwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVJdGVtUmVvcmRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KElEIFNvcnRPcmRlciBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFVQREFURSBjaGVja2xpc3RfdGVtcGxhdGVfaXRlbQogICAgICAgICAgICBTRVQgc29ydF9vcmRlciA9ID8sIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8KICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTb3J0T3JkZXJ9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIFwkUGFyYW17SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICRTZWxmLT5fQ2FjaGVDbGVhbnVwKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBUZW1wbGF0ZUl0ZW1EZWxldGUoKQoKRGVsZXRlIGEgdGVtcGxhdGUgaXRlbS4KCiAgICBteSAkU3VjY2VzcyA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtRGVsZXRlKAogICAgICAgIElEICAgICA9PiA0NTYsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlSXRlbURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgaWYgKCAhJFBhcmFte0lEfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNoZWNrbGlzdF90ZW1wbGF0ZV9pdGVtIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SUR9IF0sCiAgICApOwoKICAgICRTZWxmLT5fQ2FjaGVDbGVhbnVwKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBUZW1wbGF0ZUl0ZW1MaXN0KCkKCkdldCBhbGwgaXRlbXMgZm9yIGEgdGVtcGxhdGUuCgogICAgbXkgQEl0ZW1zID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1MaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgKTsKClJldHVybnMgYXJyYXkgb2YgaGFzaGVzIHdpdGggaXRlbSBkYXRhLCBzb3J0ZWQgYnkgU29ydE9yZGVyLgoKPWN1dAoKc3ViIFRlbXBsYXRlSXRlbUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgbXkgJEpTT05PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKCiAgICBpZiAoICEkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUZW1wbGF0ZUlEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBDaGVjayBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ1RlbXBsYXRlSXRlbUxpc3Q6OicgLiAkUGFyYW17VGVtcGxhdGVJRH07CiAgICBteSAkQ2FjaGUgICAgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gQHskQ2FjaGV9IGlmICRDYWNoZTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQsIGl0ZW1fdHlwZSwgdGl0bGUsIGRlc2NyaXB0aW9uLCBjb25maWcsIGxpbmtfdXJsLCBsaW5rX3RleHQsCiAgICAgICAgICAgICAgICAgICBpc19tYW5kYXRvcnksIHNvcnRfb3JkZXIKICAgICAgICAgICAgRlJPTSBjaGVja2xpc3RfdGVtcGxhdGVfaXRlbQogICAgICAgICAgICBXSEVSRSBjaGVja2xpc3RfdGVtcGxhdGVfaWQgPSA/CiAgICAgICAgICAgIE9SREVSIEJZIHNvcnRfb3JkZXIgQVNDLCBpZCBBU0MnLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgIG15IEBJdGVtczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICMgRGVjb2RlIGNvbmZpZyBKU09OCiAgICAgICAgbXkgJENvbmZpZyA9IHt9OwogICAgICAgIGlmICggJFJvd1s0XSApIHsKICAgICAgICAgICAgJENvbmZpZyA9ICRKU09OT2JqZWN0LT5EZWNvZGUoIERhdGEgPT4gJFJvd1s0XSApIHx8IHt9OwogICAgICAgIH0KCiAgICAgICAgcHVzaCBASXRlbXMsIHsKICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgSXRlbVR5cGUgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJFJvd1szXSwKICAgICAgICAgICAgQ29uZmlnICAgICAgPT4gJENvbmZpZywKICAgICAgICAgICAgTGlua1VSTCAgICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgTGlua1RleHQgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgSXNNYW5kYXRvcnkgPT4gJFJvd1s3XSwKICAgICAgICAgICAgU29ydE9yZGVyICAgPT4gJFJvd1s4XSwKICAgICAgICB9OwogICAgfQoKICAgICMgQ2FjaGUgcmVzdWx0CiAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxASXRlbXMsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiBASXRlbXM7Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PQojIFF1ZXVlIEFzc2lnbm1lbnQgTWV0aG9kcwojID09PT09PT09PT09PT09PT09PT09PT09PT0KCj1oZWFkMiBUZW1wbGF0ZVF1ZXVlQWRkKCkKCkFzc2lnbiBhIHRlbXBsYXRlIHRvIGEgcXVldWUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlUXVldWVBZGQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgUXVldWVJRCAgICA9PiA1LAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVGVtcGxhdGVRdWV1ZUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRlbXBsYXRlSUQgUXVldWVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgaWYgYXNzaWdubWVudCBhbHJlYWR5IGV4aXN0cwogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIGlkIEZST00gY2hlY2tsaXN0X3RlbXBsYXRlX3F1ZXVlCiAgICAgICAgICAgIFdIRVJFIGNoZWNrbGlzdF90ZW1wbGF0ZV9pZCA9ID8gQU5EIHF1ZXVlX2lkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJFBhcmFte1F1ZXVlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJEV4aXN0czsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRFeGlzdHMgPSAxOwogICAgfQoKICAgIHJldHVybiAxIGlmICRFeGlzdHM7ICAgICMgQWxyZWFkeSBhc3NpZ25lZAoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBJTlNFUlQgSU5UTyBjaGVja2xpc3RfdGVtcGxhdGVfcXVldWUKICAgICAgICAgICAgICAgIChjaGVja2xpc3RfdGVtcGxhdGVfaWQsIHF1ZXVlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5KQogICAgICAgICAgICBWQUxVRVMgKD8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAkU2VsZi0+X0NhY2hlQ2xlYW51cCgpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgVGVtcGxhdGVRdWV1ZVJlbW92ZSgpCgpSZW1vdmUgYSBxdWV1ZSBhc3NpZ25tZW50IGZyb20gYSB0ZW1wbGF0ZS4KCiAgICBteSAkU3VjY2VzcyA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVRdWV1ZVJlbW92ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBRdWV1ZUlEICAgID0+IDUsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlUXVldWVSZW1vdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJERCT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhUZW1wbGF0ZUlEIFF1ZXVlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBERUxFVEUgRlJPTSBjaGVja2xpc3RfdGVtcGxhdGVfcXVldWUKICAgICAgICAgICAgV0hFUkUgY2hlY2tsaXN0X3RlbXBsYXRlX2lkID0gPyBBTkQgcXVldWVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCRQYXJhbXtRdWV1ZUlEfSBdLAogICAgKTsKCiAgICAkU2VsZi0+X0NhY2hlQ2xlYW51cCgpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgVGVtcGxhdGVRdWV1ZUxpc3QoKQoKR2V0IGFsbCBxdWV1ZSBJRHMgYXNzaWduZWQgdG8gYSB0ZW1wbGF0ZS4KCiAgICBteSBAUXVldWVJRHMgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlUXVldWVMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZVF1ZXVlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkREJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgaWYgKCAhJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVGVtcGxhdGVJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBxdWV1ZV9pZCBGUk9NIGNoZWNrbGlzdF90ZW1wbGF0ZV9xdWV1ZSBXSEVSRSBjaGVja2xpc3RfdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICBteSBAUXVldWVJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBRdWV1ZUlEcywgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gQFF1ZXVlSURzOwp9Cgo9aGVhZDIgVGVtcGxhdGVRdWV1ZVNldCgpCgpTZXQgYWxsIHF1ZXVlIGFzc2lnbm1lbnRzIGZvciBhIHRlbXBsYXRlIChyZXBsYWNlcyBleGlzdGluZykuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlUXVldWVTZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgUXVldWVJRHMgICA9PiBbIDEsIDIsIDMgXSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlUXVldWVTZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJERCT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBEZWxldGUgYWxsIGV4aXN0aW5nIGFzc2lnbm1lbnRzCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY2hlY2tsaXN0X3RlbXBsYXRlX3F1ZXVlIFdIRVJFIGNoZWNrbGlzdF90ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgQWRkIG5ldyBhc3NpZ25tZW50cwogICAgbXkgQFF1ZXVlSURzID0gQHsgJFBhcmFte1F1ZXVlSURzfSB8fCBbXSB9OwogICAgZm9yIG15ICRRdWV1ZUlEIChAUXVldWVJRHMpIHsKICAgICAgICAkU2VsZi0+VGVtcGxhdGVRdWV1ZUFkZCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VsZi0+X0NhY2hlQ2xlYW51cCgpOwoKICAgIHJldHVybiAxOwp9CgojID09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQcml2YXRlIEhlbHBlciBNZXRob2RzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PQoKc3ViIF9HZXRRdWV1ZVdpdGhQYXJlbnRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgcmV0dXJuICgpIGlmICEkUGFyYW17UXVldWVJRH07CgogICAgbXkgQFF1ZXVlSURzID0gKCAkUGFyYW17UXVldWVJRH0gKTsKCiAgICAjIEdldCBxdWV1ZSBkYXRhCiAgICBteSAlUXVldWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KCBJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgIHJldHVybiBAUXVldWVJRHMgaWYgISVRdWV1ZTsKCiAgICAjIFBhcnNlIHF1ZXVlIG5hbWUgdG8gZmluZCBwYXJlbnRzIChlLmcuLCAiSVQ6OkhhcmR3YXJlOjpTZXJ2ZXIiKQogICAgaWYgKCAkUXVldWV7TmFtZX0gJiYgJFF1ZXVle05hbWV9ID1+IC86Oi8gKSB7CiAgICAgICAgbXkgQFBhcnRzICAgICAgPSBzcGxpdCAvOjovLCAkUXVldWV7TmFtZX07CiAgICAgICAgbXkgJFBhcmVudE5hbWUgPSAnJzsKCiAgICAgICAgZm9yIG15ICRpICggMCAuLiAkI1BhcnRzIC0gMSApIHsKICAgICAgICAgICAgJFBhcmVudE5hbWUgLj0gJzo6JyBpZiAkUGFyZW50TmFtZTsKICAgICAgICAgICAgJFBhcmVudE5hbWUgLj0gJFBhcnRzWyRpXTsKCiAgICAgICAgICAgIG15ICRQYXJlbnRJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRQYXJlbnROYW1lICk7CiAgICAgICAgICAgIHB1c2ggQFF1ZXVlSURzLCAkUGFyZW50SUQgaWYgJFBhcmVudElEOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQFF1ZXVlSURzOwp9CgpzdWIgX0dldE5leHRTb3J0T3JkZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIgogICAgICAgICAgICBTRUxFQ1QgTUFYKHNvcnRfb3JkZXIpIEZST00gJFBhcmFte1RhYmxlfQogICAgICAgICAgICBXSEVSRSAkUGFyYW17Q29sdW1ufSA9ID8iLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtQYXJlbnRJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkTWF4T3JkZXIgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1heE9yZGVyID0gJFJvd1swXSAvLyAwOwogICAgfQoKICAgIHJldHVybiAkTWF4T3JkZXIgKyAxMDsKfQoKc3ViIF9DYWNoZUNsZWFudXAgewogICAgbXkgKCRTZWxmKSA9IEBfOwoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Permission="660" Location="Kernel/System/Ticket/Acl/ChecklistACL.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBY2w6OkNoZWNrbGlzdEFDTDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFjbDo6Q2hlY2tsaXN0QUNMIC0gQUNMIG1vZHVsZSB0byBibG9jayB0aWNrZXQgY2xvc2luZwoKPWhlYWQxIERFU0NSSVBUSU9OCgpUaGlzIEFDTCBtb2R1bGUgYmxvY2tzIHRpY2tldCBjbG9zZSBzdGF0ZXMsIGFuZCBoaWRlcyB0aGUgIkNsb3NlIiB0aWNrZXQKbWVudSBpdGVtLCB3aGVuIHRoZSB0aWNrZXQgaGFzIGNoZWNrbGlzdHMgd2l0aCBpbmNvbXBsZXRlIG1hbmRhdG9yeQppdGVtcy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkNyZWF0ZSBhbiBvYmplY3QuCgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKUnVuIHRoZSBBQ0wgY2hlY2suIENhbGxlZCBieSB0aGUgWm51bnkgQUNMIGZyYW1ld29yay4KCk5vdGU6IHVubGlrZSBhIGRlY2xhcmF0aXZlIFRpY2tldEFjbCMjIyBTeXNDb25maWcgZW50cnksIGEgbW9kdWxlLXN0eWxlClRpY2tldDo6QWNsOjpNb2R1bGUncyByZXR1cm4gdmFsdWUgaXMgbm90IHVzZWQgYnkgdGhlIGZyYW1ld29yayAtCktlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OlRpY2tldEFDTDo6VGlja2V0QWNsKCkgY2FsbHMgJE1vZHVsZS0+UnVuKC4uLikKYW5kIGRpc2NhcmRzIHdoYXRldmVyIGl0IHJldHVybnMuIFRvIGFjdHVhbGx5IHJlc3RyaWN0IGFueXRoaW5nLCB0aGUKbW9kdWxlIG11c3QgYWRkIGEgc3ludGhldGljIEFDTCBlbnRyeSB0byB0aGUgJFBhcmFte0FjbH0gaGFzaHJlZiBpdCBpcwpnaXZlbiAoc2FtZSBmb3JtYXQgYXMgYSBkZWNsYXJhdGl2ZSBBQ0wpLCB3aGljaCB0aGUgZnJhbWV3b3JrIHRoZW4KZXZhbHVhdGVzIGluIGl0cyBub3JtYWwgQUNMUlVMRVMgbG9vcC4gVGhpcyBtaXJyb3JzIFpudW55IGNvcmUncyBvd24KbW9kdWxlLXN0eWxlIEFDTHMsIGUuZy4KS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QWNsOjpDbG9zZVBhcmVudEFmdGVyQ2xvc2VkQ2hpbGRzLgoKICAgICRDaGVja2xpc3RBQ0xPYmplY3QtPlJ1bigKICAgICAgICBUaWNrZXRJRCA9PiAxMjMsCiAgICAgICAgQWNsICAgICAgPT4gXCVBY2xzLCAgICAgICMgbXV0YXRlZCBpbiBwbGFjZQogICAgICAgIENvbmZpZyAgID0+IFwlQ29uZmlnLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgLi4uCiAgICApOwoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMb2dPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRDaGVja2xpc3RPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0Jyk7CiAgICBteSAkU3RhdGVPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWcgQWNsKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIE9ubHkgcHJvY2VzcyBpZiB3ZSBoYXZlIGEgdGlja2V0IElECiAgICByZXR1cm4gMSBpZiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIENoZWNrIGlmIHRpY2tldCBjYW4gYmUgY2xvc2VkCiAgICBteSAkQ2FuQ2xvc2UgPSAkQ2hlY2tsaXN0T2JqZWN0LT5UaWNrZXRDYW5DbG9zZSgKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgKTsKCiAgICAjIElmIGFsbCBjaGVja2xpc3RzIGFyZSBjb21wbGV0ZSwgbm8gcmVzdHJpY3Rpb25zIG5lZWRlZAogICAgcmV0dXJuIDEgaWYgJENhbkNsb3NlOwoKICAgICMgR2V0IGJsb2NrZWQgc3RhdGUgdHlwZXMgZnJvbSBjb25maWcKICAgIG15ICRCbG9ja2VkU3RhdGVUeXBlcyA9ICRDb25maWdPYmplY3QtPkdldCgnQ2hlY2tsaXN0OjpCbG9ja0Nsb3NlU3RhdGVzJykgfHwgWyAnY2xvc2VkJyBdOwoKICAgICMgR2V0IGFsbCBzdGF0ZXMgb2YgYmxvY2tlZCB0eXBlcwogICAgbXkgQEJsb2NrZWRTdGF0ZXM7CiAgICBmb3IgbXkgJFN0YXRlVHlwZSAoIEB7JEJsb2NrZWRTdGF0ZVR5cGVzfSApIHsKICAgICAgICBteSBAVHlwZVN0YXRlcyA9ICRTdGF0ZU9iamVjdC0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgICAgIFN0YXRlVHlwZSA9PiBbJFN0YXRlVHlwZV0sCiAgICAgICAgICAgIFJlc3VsdCAgICA9PiAnTmFtZScsCiAgICAgICAgKTsKICAgICAgICBwdXNoIEBCbG9ja2VkU3RhdGVzLCBAVHlwZVN0YXRlczsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAhQEJsb2NrZWRTdGF0ZXM7CgogICAgIyBBZGQgYSBzeW50aGV0aWMgQUNMIGVudHJ5IGJsb2NraW5nIHRoZSBjbG9zZSBzdGF0ZXMgZm9yIHRoaXMKICAgICMgdGlja2V0LCBhbmQgaGlkaW5nIHRoZSAiQ2xvc2UiIHRpY2tldCBtZW51IGl0ZW0gb3V0cmlnaHQgLSB0aGlzIGlzCiAgICAjIHdoYXQgYWN0dWFsbHkgdGFrZXMgZWZmZWN0LCBub3QgdGhlIHJldHVybiB2YWx1ZS4gV2l0aG91dCB0aGUKICAgICMgQWN0aW9uIHJlc3RyaWN0aW9uLCB0aGUgU3RhdGUgcmVzdHJpY3Rpb24gYWxvbmUgc3RpbGwgd29ya2VkICh0aGUKICAgICMgdGlja2V0IGNhbid0IGFjdHVhbGx5IGJlIHNldCB0byBhIGJsb2NrZWQgc3RhdGUpLCBidXQgdGhlIENsb3NlCiAgICAjIHNjcmVlbiB3YXMgc3RpbGwgcmVhY2hhYmxlIGFuZCwgZGVwZW5kaW5nIG9uCiAgICAjIEFnZW50VGlja2V0Q2xvc2UjIyNTdGF0ZU1hbmRhdG9yeSwgY291bGQgc2lsZW50bHkgYWRkIGEgbm90ZQogICAgIyB3aXRob3V0IGNoYW5naW5nIHRoZSBzdGF0ZSAtIGNvbmZ1c2luZyB3aXRoIG5vIHZpc2libGUgZXJyb3IuCiAgICAkUGFyYW17QWNsfS0+e0NoZWNrbGlzdEFDTH0gPSB7CiAgICAgICAgUHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiBbICRQYXJhbXtUaWNrZXRJRH0gXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFBvc3NpYmxlTm90ID0+IHsKICAgICAgICAgICAgVGlja2V0ID0+IHsKICAgICAgICAgICAgICAgIFN0YXRlID0+IFxAQmxvY2tlZFN0YXRlcywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgQWN0aW9uID0+IFsnQWdlbnRUaWNrZXRDbG9zZSddLAogICAgICAgIH0sCiAgICB9OwoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>

        <!-- Process Management TransitionAction -->
        <File Permission="660" Location="Kernel/System/ProcessManagement/TransitionAction/ChecklistAssign.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb25BY3Rpb246OkNoZWNrbGlzdEFzc2lnbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCnVzZSBwYXJlbnQgcXcoS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uOjpCYXNlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDaGVja2xpc3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDaGVja2xpc3RUZW1wbGF0ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uOjpDaGVja2xpc3RBc3NpZ24gLSBBc3NpZ24gY2hlY2tsaXN0IHRvIHRpY2tldAoKPWhlYWQxIERFU0NSSVBUSU9OCgpUcmFuc2l0aW9uIGFjdGlvbiB0byBhdXRvbWF0aWNhbGx5IGFzc2lnbiBhIGNoZWNrbGlzdCB0ZW1wbGF0ZSB0byBhIHByb2Nlc3MgdGlja2V0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgbXkgJENoZWNrbGlzdEFzc2lnbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbkFjdGlvbjo6Q2hlY2tsaXN0QXNzaWduJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKUnVucyBUcmFuc2l0aW9uQWN0aW9uIENoZWNrbGlzdEFzc2lnbi4KCiAgICBteSAkU3VjY2VzcyA9ICRDaGVja2xpc3RBc3NpZ25PYmplY3QtPlJ1bigKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgPT4gMTIzLAogICAgICAgIFRpY2tldCAgICAgICAgICAgICAgICAgICA9PiBcJVRpY2tldCwgICAgICAgIyByZXF1aXJlZAogICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgICAgICAgICA9PiAnUDEyMycsCiAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCAgICAgICAgID0+ICdBMTIzJywKICAgICAgICBUcmFuc2l0aW9uRW50aXR5SUQgICAgICAgPT4gJ1QxMjMnLAogICAgICAgIFRyYW5zaXRpb25BY3Rpb25FbnRpdHlJRCA9PiAnVEExMjMnLAogICAgICAgIENvbmZpZyAgICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgIFRlbXBsYXRlSUQgICA9PiA1LCAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIChlaXRoZXIgVGVtcGxhdGVJRCBvciBUZW1wbGF0ZU5hbWUpCiAgICAgICAgICAgIFRlbXBsYXRlTmFtZSA9PiAnU2VydmVyIE1haW50ZW5hbmNlJywgICMgb3B0aW9uYWwgKGVpdGhlciBUZW1wbGF0ZUlEIG9yIFRlbXBsYXRlTmFtZSkKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEyMywgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gcHJvY2VzcyBVc2VySUQKICAgICAgICB9LAogICAgKTsKClJldHVybnM6CgogICAgJFN1Y2Nlc3MgPSAxOyAgICMgMCBvbiBmYWlsdXJlCgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExvZ09iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJENoZWNrbGlzdE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja2xpc3QnKTsKICAgIG15ICRUZW1wbGF0ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0VGVtcGxhdGUnKTsKCiAgICAjIERlZmluZSBjb25maWcgcGFyYW1ldGVyIG5hbWVzIGZvciBsb2dnaW5nCiAgICAkU2VsZi0+e1RyYW5zaXRpb25BY3Rpb25UeXBlfSA9ICdDaGVja2xpc3RBc3NpZ24nOwoKICAgICMgQ2hlY2sgZm9yIG1hbmRhdG9yeSBwYXJhbWV0ZXJzCiAgICBORUVERUQ6CiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlcklEIFRpY2tldCBDb25maWcpKSB7CiAgICAgICAgbmV4dCBORUVERUQgaWYgZGVmaW5lZCAkUGFyYW17JE5lZWRlZH07CgogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlBhcmFtZXRlciAnJE5lZWRlZCcgaXMgbmVlZGVkIGluICRTZWxmLT57VHJhbnNpdGlvbkFjdGlvblR5cGV9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBDaGVjayBDb25maWcgdHlwZQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtDb25maWd9ICkgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ29uZmlnIGhhcyBubyB2YWx1ZXMgaW4gJFNlbGYtPntUcmFuc2l0aW9uQWN0aW9uVHlwZX0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIENoZWNrIGZvciByZXF1aXJlZCB0aWNrZXQgZGF0YQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGlja2V0IGhhcyBubyB2YWx1ZXMgaW4gJFNlbGYtPntUcmFuc2l0aW9uQWN0aW9uVHlwZX0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIENoZWNrIHRoYXQgd2UgaGF2ZSBlaXRoZXIgVGVtcGxhdGVJRCBvciBUZW1wbGF0ZU5hbWUKICAgIGlmICggISRQYXJhbXtDb25maWd9e1RlbXBsYXRlSUR9ICYmICEkUGFyYW17Q29uZmlnfXtUZW1wbGF0ZU5hbWV9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgZWl0aGVyIFRlbXBsYXRlSUQgb3IgVGVtcGxhdGVOYW1lIGluIENvbmZpZyBmb3IgJFNlbGYtPntUcmFuc2l0aW9uQWN0aW9uVHlwZX0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIE92ZXJyaWRlIFVzZXJJRCBpZiBzcGVjaWZpZWQgaW4gY29uZmlnCiAgICBpZiAoICRQYXJhbXtDb25maWd9e1VzZXJJRH0gKSB7CiAgICAgICAgJFBhcmFte1VzZXJJRH0gPSAkUGFyYW17Q29uZmlnfXtVc2VySUR9OwogICAgfQoKICAgIG15ICRUZW1wbGF0ZUlEID0gJFBhcmFte0NvbmZpZ317VGVtcGxhdGVJRH07CgogICAgIyBJZiBUZW1wbGF0ZU5hbWUgaXMgZ2l2ZW4sIGxvb2sgdXAgdGhlIFRlbXBsYXRlSUQKICAgIGlmICggISRUZW1wbGF0ZUlEICYmICRQYXJhbXtDb25maWd9e1RlbXBsYXRlTmFtZX0gKSB7CiAgICAgICAgbXkgJFRlbXBsYXRlTmFtZSA9ICRQYXJhbXtDb25maWd9e1RlbXBsYXRlTmFtZX07CgogICAgICAgICMgUmVwbGFjZSB0aWNrZXQgcGxhY2Vob2xkZXJzIGluIHRlbXBsYXRlIG5hbWUgaWYgcHJlc2VudAogICAgICAgICRUZW1wbGF0ZU5hbWUgPSAkU2VsZi0+X1JlcGxhY2VUaWNrZXRBdHRyaWJ1dGVzKAogICAgICAgICAgICBUaWNrZXQgPT4gJFBhcmFte1RpY2tldH0sCiAgICAgICAgICAgIERhdGEgICA9PiAkVGVtcGxhdGVOYW1lLAogICAgICAgICk7CgogICAgICAgICRUZW1wbGF0ZUlEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxvb2t1cCggTmFtZSA9PiAkVGVtcGxhdGVOYW1lICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggbmFtZSAnJFRlbXBsYXRlTmFtZScgbm90IGZvdW5kIGluICRTZWxmLT57VHJhbnNpdGlvbkFjdGlvblR5cGV9ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBWZXJpZnkgdGVtcGxhdGUgZXhpc3RzIGFuZCBpcyB2YWxpZAogICAgbXkgJVRlbXBsYXRlID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUdldCggSUQgPT4gJFRlbXBsYXRlSUQgKTsKICAgIGlmICggISVUZW1wbGF0ZSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICckVGVtcGxhdGVJRCcgbm90IGZvdW5kIGluICRTZWxmLT57VHJhbnNpdGlvbkFjdGlvblR5cGV9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkVGVtcGxhdGV7VmFsaWRJRH0gIT0gMSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgJyRUZW1wbGF0ZXtOYW1lfScgKElEOiAkVGVtcGxhdGVJRCkgaXMgbm90IHZhbGlkLCBza2lwcGluZyBhc3NpZ25tZW50IGluICRTZWxmLT57VHJhbnNpdGlvbkFjdGlvblR5cGV9LiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMTsgICAgIyBSZXR1cm4gc3VjY2VzcyBidXQgZG9uJ3QgYXNzaWduICh0ZW1wbGF0ZSBkaXNhYmxlZCkKICAgIH0KCiAgICAjIENoZWNrIGlmIGNoZWNrbGlzdCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyB0aWNrZXQgYW5kIHRlbXBsYXRlIChhdm9pZCBkdXBsaWNhdGVzKQogICAgbXkgQEV4aXN0aW5nQ2hlY2tsaXN0cyA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdExpc3QoIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXR9e1RpY2tldElEfSApOwogICAgZm9yIG15ICRDaGVja2xpc3QgKEBFeGlzdGluZ0NoZWNrbGlzdHMpIHsKICAgICAgICBpZiAoICRDaGVja2xpc3QtPntUZW1wbGF0ZUlEfSAmJiAkQ2hlY2tsaXN0LT57VGVtcGxhdGVJRH0gPT0gJFRlbXBsYXRlSUQgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNoZWNrbGlzdCBmcm9tIHRlbXBsYXRlICckVGVtcGxhdGV7TmFtZX0nIGFscmVhZHkgZXhpc3RzIGZvciB0aWNrZXQgJFBhcmFte1RpY2tldH17VGlja2V0SUR9LCBza2lwcGluZyBpbiAkU2VsZi0+e1RyYW5zaXRpb25BY3Rpb25UeXBlfS4iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gMTsgICAgIyBSZXR1cm4gc3VjY2VzcywgY2hlY2tsaXN0IGFscmVhZHkgZXhpc3RzCiAgICAgICAgfQogICAgfQoKICAgICMgQXNzaWduIHRoZSBjaGVja2xpc3QKICAgIG15ICRDaGVja2xpc3RJRCA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdEFkZCgKICAgICAgICBUaWNrZXRJRCAgID0+ICRQYXJhbXtUaWNrZXR9e1RpY2tldElEfSwKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRDaGVja2xpc3RJRCApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGYWlsZWQgdG8gYXNzaWduIGNoZWNrbGlzdCAnJFRlbXBsYXRle05hbWV9JyB0byB0aWNrZXQgJFBhcmFte1RpY2tldH17VGlja2V0SUR9IGluICRTZWxmLT57VHJhbnNpdGlvbkFjdGlvblR5cGV9ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICBNZXNzYWdlICA9PiAiU3VjY2Vzc2Z1bGx5IGFzc2lnbmVkIGNoZWNrbGlzdCAnJFRlbXBsYXRle05hbWV9JyAoSUQ6ICRDaGVja2xpc3RJRCkgdG8gdGlja2V0ICRQYXJhbXtUaWNrZXR9e1RpY2tldElEfSB2aWEgJFNlbGYtPntUcmFuc2l0aW9uQWN0aW9uVHlwZX0uIiwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfUmVwbGFjZVRpY2tldEF0dHJpYnV0ZXMoKQoKUmVwbGFjZSB0aWNrZXQgYXR0cmlidXRlIHBsYWNlaG9sZGVycyBpbiBzdHJpbmcuCgogICAgbXkgJFN0cmluZyA9ICRTZWxmLT5fUmVwbGFjZVRpY2tldEF0dHJpYnV0ZXMoCiAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgIERhdGEgICA9PiAnPE9UUlNfVElDS0VUX1F1ZXVlPi1DaGVja2xpc3QnLAogICAgKTsKCj1jdXQKCnN1YiBfUmVwbGFjZVRpY2tldEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFBhcmFte0RhdGF9IGlmICEkUGFyYW17RGF0YX07CiAgICByZXR1cm4gJFBhcmFte0RhdGF9IGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKTsKCiAgICBteSAkRGF0YSA9ICRQYXJhbXtEYXRhfTsKCiAgICAjIFJlcGxhY2UgPE9UUlNfVElDS0VUXyo+IHBsYWNlaG9sZGVycwogICAgQVRUUklCVVRFOgogICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXsgJFBhcmFte1RpY2tldH0gfSApIHsKICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhZGVmaW5lZCAkUGFyYW17VGlja2V0fXskQXR0cmlidXRlfTsKCiAgICAgICAgJERhdGEgPX4gcy88T1RSU19USUNLRVRfJEF0dHJpYnV0ZT4vJFBhcmFte1RpY2tldH17JEF0dHJpYnV0ZX0vZ2k7CiAgICAgICAgJERhdGEgPX4gcy88Wk5VTllfVElDS0VUXyRBdHRyaWJ1dGU+LyRQYXJhbXtUaWNrZXR9eyRBdHRyaWJ1dGV9L2dpOwogICAgfQoKICAgIHJldHVybiAkRGF0YTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBabnVueSBDaGVja2xpc3QgcHJvamVjdC4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuCgo9Y3V0Cg==</File>

        <!-- Console Commands -->
        <File Permission="660" Location="Kernel/System/Console/Command/Admin/Checklist/TemplateImport.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6QWRtaW46OkNoZWNrbGlzdDo6VGVtcGxhdGVJbXBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgcGFyZW50IHF3KEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpCYXNlQ29tbWFuZCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0VGVtcGxhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpKU09OJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKc3ViIENvbmZpZ3VyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5EZXNjcmlwdGlvbignSW1wb3J0IGEgY2hlY2tsaXN0IHRlbXBsYXRlIGZyb20gYW4gWE1MIGZpbGUuJyk7CgogICAgJFNlbGYtPkFkZEFyZ3VtZW50KAogICAgICAgIE5hbWUgICAgICAgID0+ICdzb3VyY2UtZmlsZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BhdGggdG8gdGhlIFhNTCBmaWxlIHRvIGltcG9ydC4nLAogICAgICAgIFJlcXVpcmVkICAgID0+IDEsCiAgICAgICAgVmFsdWVSZWdleCAgPT4gcXIvLisvc214LAogICAgKTsKCiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdmb3JjZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ092ZXJ3cml0ZSBleGlzdGluZyB0ZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgY29weS4nLAogICAgICAgIFJlcXVpcmVkICAgID0+IDAsCiAgICAgICAgSGFzVmFsdWUgICAgPT4gMCwKICAgICk7CgogICAgcmV0dXJuOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE1haW5PYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja2xpc3RUZW1wbGF0ZScpOwogICAgbXkgJFF1ZXVlT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICBteSAkVmFsaWRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKICAgIG15ICRKU09OT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyk7CgogICAgbXkgJFNvdXJjZUZpbGUgPSAkU2VsZi0+R2V0QXJndW1lbnQoJ3NvdXJjZS1maWxlJyk7CiAgICBteSAkRm9yY2UgICAgICA9ICRTZWxmLT5HZXRPcHRpb24oJ2ZvcmNlJyk7CgogICAgIyBDaGVjayBpZiBmaWxlIGV4aXN0cwogICAgaWYgKCAhLWYgJFNvdXJjZUZpbGUgKSB7CiAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIkZpbGUgbm90IGZvdW5kOiAkU291cmNlRmlsZVxuIik7CiAgICAgICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZUVycm9yKCk7CiAgICB9CgogICAgIyBSZWFkIGZpbGUgY29udGVudAogICAgbXkgJFhNTENvbnRlbnQgPSAkTWFpbk9iamVjdC0+RmlsZVJlYWQoCiAgICAgICAgTG9jYXRpb24gPT4gJFNvdXJjZUZpbGUsCiAgICAgICAgTW9kZSAgICAgPT4gJ3V0ZjgnLAogICAgICAgIFJlc3VsdCAgID0+ICdTQ0FMQVInLAogICAgKTsKCiAgICBpZiAoICEkWE1MQ29udGVudCB8fCAhJHskWE1MQ29udGVudH0gKSB7CiAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIkNvdWxkIG5vdCByZWFkIGZpbGU6ICRTb3VyY2VGaWxlXG4iKTsKICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+SW1wb3J0aW5nIHRlbXBsYXRlIGZyb206ICRTb3VyY2VGaWxlPC95ZWxsb3c+XG4iKTsKCiAgICAjIFBhcnNlIFhNTAogICAgbXkgJVRlbXBsYXRlRGF0YTsKICAgIG15IEBJdGVtczsKICAgIG15IEBRdWV1ZU5hbWVzOwoKICAgIG15ICRDb250ZW50ID0gJHskWE1MQ29udGVudH07CgogICAgIyBFeHRyYWN0IHRlbXBsYXRlIG5hbWUKICAgIGlmICggJENvbnRlbnQgPX4gbXs8TmFtZT4oLis/KTwvTmFtZT59cyApIHsKICAgICAgICAkVGVtcGxhdGVEYXRhe05hbWV9ID0gJFNlbGYtPl9YTUxEZWNvZGUoJDEpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIk5vIHRlbXBsYXRlIG5hbWUgZm91bmQgaW4gWE1MXG4iKTsKICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgIH0KCiAgICAjIEV4dHJhY3QgZGVzY3JpcHRpb24KICAgIGlmICggJENvbnRlbnQgPX4gbXs8RGVzY3JpcHRpb24+KC4rPyk8L0Rlc2NyaXB0aW9uPn1zICkgewogICAgICAgICRUZW1wbGF0ZURhdGF7RGVzY3JpcHRpb259ID0gJFNlbGYtPl9YTUxEZWNvZGUoJDEpOwogICAgfQoKICAgICMgRXh0cmFjdCBsaW5rIFVSTAogICAgaWYgKCAkQ29udGVudCA9fiBtezxMaW5rVVJMPiguKz8pPC9MaW5rVVJMPn1zICkgewogICAgICAgICRUZW1wbGF0ZURhdGF7TGlua1VSTH0gPSAkU2VsZi0+X1hNTERlY29kZSgkMSk7CiAgICB9CgogICAgIyBFeHRyYWN0IGxpbmsgdGV4dAogICAgaWYgKCAkQ29udGVudCA9fiBtezxMaW5rVGV4dD4oLis/KTwvTGlua1RleHQ+fXMgKSB7CiAgICAgICAgJFRlbXBsYXRlRGF0YXtMaW5rVGV4dH0gPSAkU2VsZi0+X1hNTERlY29kZSgkMSk7CiAgICB9CgogICAgIyBFeHRyYWN0IHZhbGlkIHN0YXRlCiAgICBpZiAoICRDb250ZW50ID1+IG17PFZhbGlkPiguKz8pPC9WYWxpZD59cyApIHsKICAgICAgICBteSAkVmFsaWROYW1lID0gJFNlbGYtPl9YTUxEZWNvZGUoJDEpOwogICAgICAgIG15ICVWYWxpZExpc3QgPSAkVmFsaWRPYmplY3QtPlZhbGlkTGlzdCgpOwogICAgICAgIG15ICVWYWxpZFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICAgICAgJFRlbXBsYXRlRGF0YXtWYWxpZElEfSA9ICRWYWxpZFJldmVyc2V7JFZhbGlkTmFtZX0gfHwgMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRUZW1wbGF0ZURhdGF7VmFsaWRJRH0gPSAxOwogICAgfQoKICAgICMgRXh0cmFjdCBxdWV1ZXMKICAgIGlmICggJENvbnRlbnQgPX4gbXs8UXVldWVzPiguKz8pPC9RdWV1ZXM+fXMgKSB7CiAgICAgICAgbXkgJFF1ZXVlc0Jsb2NrID0gJDE7CiAgICAgICAgd2hpbGUgKCAkUXVldWVzQmxvY2sgPX4gbXs8UXVldWU+KC4rPyk8L1F1ZXVlPn1zZyApIHsKICAgICAgICAgICAgcHVzaCBAUXVldWVOYW1lcywgJFNlbGYtPl9YTUxEZWNvZGUoJDEpOwogICAgICAgIH0KICAgIH0KCiAgICAjIEV4dHJhY3QgaXRlbXMKICAgIGlmICggJENvbnRlbnQgPX4gbXs8SXRlbXM+KC4rPyk8L0l0ZW1zPn1zICkgewogICAgICAgIG15ICRJdGVtc0Jsb2NrID0gJDE7CiAgICAgICAgd2hpbGUgKCAkSXRlbXNCbG9jayA9fiBtezxJdGVtPiguKz8pPC9JdGVtPn1zZyApIHsKICAgICAgICAgICAgbXkgJEl0ZW1YTUwgPSAkMTsKICAgICAgICAgICAgbXkgJUl0ZW07CgogICAgICAgICAgICBpZiAoICRJdGVtWE1MID1+IG17PFRpdGxlPiguKz8pPC9UaXRsZT59cyApIHsKICAgICAgICAgICAgICAgICRJdGVte1RpdGxlfSA9ICRTZWxmLT5fWE1MRGVjb2RlKCQxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRJdGVtWE1MID1+IG17PERlc2NyaXB0aW9uPiguKz8pPC9EZXNjcmlwdGlvbj59cyApIHsKICAgICAgICAgICAgICAgICRJdGVte0Rlc2NyaXB0aW9ufSA9ICRTZWxmLT5fWE1MRGVjb2RlKCQxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRJdGVtWE1MID1+IG17PEl0ZW1UeXBlPiguKz8pPC9JdGVtVHlwZT59cyApIHsKICAgICAgICAgICAgICAgICRJdGVte0l0ZW1UeXBlfSA9ICRTZWxmLT5fWE1MRGVjb2RlKCQxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRJdGVtWE1MID1+IG17PElzTWFuZGF0b3J5PiguKz8pPC9Jc01hbmRhdG9yeT59cyApIHsKICAgICAgICAgICAgICAgICRJdGVte0lzTWFuZGF0b3J5fSA9ICQxIGVxICcxJyA/IDEgOiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEl0ZW1YTUwgPX4gbXs8U29ydE9yZGVyPiguKz8pPC9Tb3J0T3JkZXI+fXMgKSB7CiAgICAgICAgICAgICAgICAkSXRlbXtTb3J0T3JkZXJ9ID0gaW50KCQxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRJdGVtWE1MID1+IG17PExpbmtVUkw+KC4rPyk8L0xpbmtVUkw+fXMgKSB7CiAgICAgICAgICAgICAgICAkSXRlbXtMaW5rVVJMfSA9ICRTZWxmLT5fWE1MRGVjb2RlKCQxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRJdGVtWE1MID1+IG17PExpbmtUZXh0PiguKz8pPC9MaW5rVGV4dD59cyApIHsKICAgICAgICAgICAgICAgICRJdGVte0xpbmtUZXh0fSA9ICRTZWxmLT5fWE1MRGVjb2RlKCQxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRJdGVtWE1MID1+IG17PENvbmZpZz4oLis/KTwvQ29uZmlnPn1zICkgewogICAgICAgICAgICAgICAgbXkgJENvbmZpZ0pTT04gPSAkU2VsZi0+X1hNTERlY29kZSgkMSk7CiAgICAgICAgICAgICAgICBpZiAoJENvbmZpZ0pTT04pIHsKICAgICAgICAgICAgICAgICAgICAkSXRlbXtDb25maWd9ID0gJEpTT05PYmplY3QtPkRlY29kZSggRGF0YSA9PiAkQ29uZmlnSlNPTiApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBJdGVtcywgXCVJdGVtIGlmICRJdGVte1RpdGxlfTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPlByaW50KCIgIFRlbXBsYXRlIG5hbWU6IDxncmVlbj4kVGVtcGxhdGVEYXRhe05hbWV9PC9ncmVlbj5cbiIpOwogICAgJFNlbGYtPlByaW50KCIgIEl0ZW1zOiA8Z3JlZW4+IiAuIHNjYWxhcihASXRlbXMpIC4gIjwvZ3JlZW4+XG4iKTsKICAgICRTZWxmLT5QcmludCgiICBRdWV1ZXM6IDxncmVlbj4iIC4gc2NhbGFyKEBRdWV1ZU5hbWVzKSAuICI8L2dyZWVuPlxuIikgaWYgQFF1ZXVlTmFtZXM7CgogICAgIyBDaGVjayBpZiB0ZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgbXkgJUV4aXN0aW5nVGVtcGxhdGVzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxpc3QoIFZhbGlkID0+IDAgKTsKICAgIG15ICVOYW1lVG9JRCA9IHJldmVyc2UgJUV4aXN0aW5nVGVtcGxhdGVzOwoKICAgIG15ICRFeGlzdGluZ0lEID0gJE5hbWVUb0lEeyAkVGVtcGxhdGVEYXRhe05hbWV9IH07CgogICAgaWYgKCRFeGlzdGluZ0lEKSB7CiAgICAgICAgaWYgKCRGb3JjZSkgewogICAgICAgICAgICAjIFVwZGF0ZSBleGlzdGluZyB0ZW1wbGF0ZSBpbnN0ZWFkIG9mIGRlbGV0ZSAodG8gcHJlc2VydmUgcmVmZXJlbmNlcykKICAgICAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PlVwZGF0aW5nIGV4aXN0aW5nIHRlbXBsYXRlIChJRDogJEV4aXN0aW5nSUQpLi4uPC95ZWxsb3c+XG4iKTsKCiAgICAgICAgICAgICMgVXBkYXRlIHRlbXBsYXRlIG1ldGFkYXRhCiAgICAgICAgICAgICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVVcGRhdGUoCiAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkRXhpc3RpbmdJRCwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRUZW1wbGF0ZURhdGF7TmFtZX0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkVGVtcGxhdGVEYXRhe0Rlc2NyaXB0aW9ufSB8fCAnJywKICAgICAgICAgICAgICAgIExpbmtVUkwgICAgID0+ICRUZW1wbGF0ZURhdGF7TGlua1VSTH0gfHwgJycsCiAgICAgICAgICAgICAgICBMaW5rVGV4dCAgICA9PiAkVGVtcGxhdGVEYXRhe0xpbmtUZXh0fSB8fCAnJywKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgID0+ICRUZW1wbGF0ZURhdGF7VmFsaWRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBEZWxldGUgZXhpc3RpbmcgaXRlbXMgKHNhZmUsIG5vIGZvcmVpZ24ga2V5IGlzc3VlcykKICAgICAgICAgICAgbXkgQEV4aXN0aW5nSXRlbXMgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlSXRlbUxpc3QoIFRlbXBsYXRlSUQgPT4gJEV4aXN0aW5nSUQgKTsKICAgICAgICAgICAgZm9yIG15ICRJdGVtIChARXhpc3RpbmdJdGVtcykgewogICAgICAgICAgICAgICAgJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1EZWxldGUoCiAgICAgICAgICAgICAgICAgICAgSUQgICAgID0+ICRJdGVtLT57SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBBZGQgbmV3IGl0ZW1zCiAgICAgICAgICAgIG15ICRJdGVtQ291bnQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKEBJdGVtcykgewogICAgICAgICAgICAgICAgbXkgJEl0ZW1JRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtQWRkKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgID0+ICRFeGlzdGluZ0lELAogICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlICAgID0+ICRJdGVtLT57SXRlbVR5cGV9IHx8ICdjaGVja2JveCcsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJEl0ZW0tPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICAgPT4gJEl0ZW0tPntDb25maWd9LAogICAgICAgICAgICAgICAgICAgIExpbmtVUkwgICAgID0+ICRJdGVtLT57TGlua1VSTH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgTGlua1RleHQgICAgPT4gJEl0ZW0tPntMaW5rVGV4dH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgSXNNYW5kYXRvcnkgPT4gJEl0ZW0tPntJc01hbmRhdG9yeX0gfHwgMCwKICAgICAgICAgICAgICAgICAgICBTb3J0T3JkZXIgICA9PiAkSXRlbS0+e1NvcnRPcmRlcn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkSXRlbUNvdW50KysgaWYgJEl0ZW1JRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDb2xsZWN0IHF1ZXVlIElEcyBhbmQgc2V0IHRoZW0gKHJlcGxhY2VzIGFsbCBleGlzdGluZyBhc3NpZ25tZW50cykKICAgICAgICAgICAgbXkgQFF1ZXVlSURzOwogICAgICAgICAgICBteSAkUXVldWVDb3VudCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkUXVldWVOYW1lIChAUXVldWVOYW1lcykgewogICAgICAgICAgICAgICAgbXkgJFF1ZXVlSUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUXVldWVOYW1lICk7CiAgICAgICAgICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBRdWV1ZUlEcywgJFF1ZXVlSUQ7CiAgICAgICAgICAgICAgICAgICAgJFF1ZXVlQ291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz4gIFdhcm5pbmc6IFF1ZXVlICckUXVldWVOYW1lJyBub3QgZm91bmQsIHNraXBwaW5nPC95ZWxsb3c+XG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBVc2UgVGVtcGxhdGVRdWV1ZVNldCB0byByZXBsYWNlIGFsbCBxdWV1ZSBhc3NpZ25tZW50cyBhdCBvbmNlCiAgICAgICAgICAgICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVRdWV1ZVNldCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEV4aXN0aW5nSUQsCiAgICAgICAgICAgICAgICBRdWV1ZUlEcyAgID0+IFxAUXVldWVJRHMsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIlxuPGdyZWVuPlRlbXBsYXRlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ITwvZ3JlZW4+XG4iKTsKICAgICAgICAgICAgJFNlbGYtPlByaW50KCIgIElEOiAkRXhpc3RpbmdJRFxuIik7CiAgICAgICAgICAgICRTZWxmLT5QcmludCgiICBOYW1lOiAkVGVtcGxhdGVEYXRhe05hbWV9XG4iKTsKICAgICAgICAgICAgJFNlbGYtPlByaW50KCIgIEl0ZW1zIHVwZGF0ZWQ6ICRJdGVtQ291bnRcbiIpOwogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIiAgUXVldWVzIGFzc2lnbmVkOiAkUXVldWVDb3VudFxuIikgaWYgQFF1ZXVlTmFtZXM7CgogICAgICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlT2soKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICMgQWRkIHN1ZmZpeCB0byBuYW1lCiAgICAgICAgICAgIG15ICRPcmlnaW5hbE5hbWUgPSAkVGVtcGxhdGVEYXRhe05hbWV9OwogICAgICAgICAgICBteSAkQ291bnRlciA9IDE7CiAgICAgICAgICAgIHdoaWxlICggJE5hbWVUb0lEeyAkVGVtcGxhdGVEYXRhe05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAkVGVtcGxhdGVEYXRhe05hbWV9ID0gJE9yaWdpbmFsTmFtZSAuICcgKEltcG9ydCAnIC4gJENvdW50ZXIgLiAnKSc7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5UZW1wbGF0ZSBleGlzdHMsIGltcG9ydGluZyBhczogJFRlbXBsYXRlRGF0YXtOYW1lfTwveWVsbG93PlxuIik7CiAgICAgICAgfQogICAgfQoKICAgICMgQ3JlYXRlIHRlbXBsYXRlCiAgICBteSAkVGVtcGxhdGVJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgTmFtZSAgICAgICAgPT4gJFRlbXBsYXRlRGF0YXtOYW1lfSwKICAgICAgICBEZXNjcmlwdGlvbiA9PiAkVGVtcGxhdGVEYXRhe0Rlc2NyaXB0aW9ufSB8fCAnJywKICAgICAgICBMaW5rVVJMICAgICA9PiAkVGVtcGxhdGVEYXRhe0xpbmtVUkx9IHx8ICcnLAogICAgICAgIExpbmtUZXh0ICAgID0+ICRUZW1wbGF0ZURhdGF7TGlua1RleHR9IHx8ICcnLAogICAgICAgIFZhbGlkSUQgICAgID0+ICRUZW1wbGF0ZURhdGF7VmFsaWRJRH0sCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgogICAgaWYgKCAhJFRlbXBsYXRlSUQgKSB7CiAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIkNvdWxkIG5vdCBjcmVhdGUgdGVtcGxhdGVcbiIpOwogICAgICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVFcnJvcigpOwogICAgfQoKICAgICMgQWRkIGl0ZW1zCiAgICBteSAkSXRlbUNvdW50ID0gMDsKICAgIGZvciBteSAkSXRlbSAoQEl0ZW1zKSB7CiAgICAgICAgbXkgJEl0ZW1JRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtQWRkKAogICAgICAgICAgICBUZW1wbGF0ZUlEICA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgSXRlbVR5cGUgICAgPT4gJEl0ZW0tPntJdGVtVHlwZX0gfHwgJ2NoZWNrYm94JywKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJEl0ZW0tPntUaXRsZX0sCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259IHx8ICcnLAogICAgICAgICAgICBDb25maWcgICAgICA9PiAkSXRlbS0+e0NvbmZpZ30sCiAgICAgICAgICAgIExpbmtVUkwgICAgID0+ICRJdGVtLT57TGlua1VSTH0gfHwgJycsCiAgICAgICAgICAgIExpbmtUZXh0ICAgID0+ICRJdGVtLT57TGlua1RleHR9IHx8ICcnLAogICAgICAgICAgICBJc01hbmRhdG9yeSA9PiAkSXRlbS0+e0lzTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICBTb3J0T3JkZXIgICA9PiAkSXRlbS0+e1NvcnRPcmRlcn0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkSXRlbUNvdW50KysgaWYgJEl0ZW1JRDsKICAgIH0KCiAgICAjIEFzc2lnbiBxdWV1ZXMKICAgIG15ICRRdWV1ZUNvdW50ID0gMDsKICAgIGZvciBteSAkUXVldWVOYW1lIChAUXVldWVOYW1lcykgewogICAgICAgIG15ICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFF1ZXVlTmFtZSApOwogICAgICAgIGlmICgkUXVldWVJRCkgewogICAgICAgICAgICAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlUXVldWVBZGQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgUXVldWVJRCAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFF1ZXVlQ291bnQrKzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz4gIFdhcm5pbmc6IFF1ZXVlICckUXVldWVOYW1lJyBub3QgZm91bmQsIHNraXBwaW5nPC95ZWxsb3c+XG4iKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPlByaW50KCJcbjxncmVlbj5UZW1wbGF0ZSBpbXBvcnRlZCBzdWNjZXNzZnVsbHkhPC9ncmVlbj5cbiIpOwogICAgJFNlbGYtPlByaW50KCIgIElEOiAkVGVtcGxhdGVJRFxuIik7CiAgICAkU2VsZi0+UHJpbnQoIiAgTmFtZTogJFRlbXBsYXRlRGF0YXtOYW1lfVxuIik7CiAgICAkU2VsZi0+UHJpbnQoIiAgSXRlbXMgaW1wb3J0ZWQ6ICRJdGVtQ291bnRcbiIpOwogICAgJFNlbGYtPlByaW50KCIgIFF1ZXVlcyBhc3NpZ25lZDogJFF1ZXVlQ291bnRcbiIpIGlmIEBRdWV1ZU5hbWVzOwoKICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVPaygpOwp9CgpzdWIgX1hNTERlY29kZSB7CiAgICBteSAoICRTZWxmLCAkU3RyaW5nICkgPSBAXzsKCiAgICByZXR1cm4gJycgaWYgIWRlZmluZWQgJFN0cmluZzsKCiAgICAkU3RyaW5nID1+IHMvJmx0Oy88L2c7CiAgICAkU3RyaW5nID1+IHMvJmd0Oy8+L2c7CiAgICAkU3RyaW5nID1+IHMvJnF1b3Q7LyIvZzsKICAgICRTdHJpbmcgPX4gcy8mYXBvczsvJy9nOwogICAgJFN0cmluZyA9fiBzLyZhbXA7LyYvZzsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsK</File>
        <File Permission="660" Location="Kernel/System/Console/Command/Admin/Checklist/TemplateExport.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6QWRtaW46OkNoZWNrbGlzdDo6VGVtcGxhdGVFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgcGFyZW50IHF3KEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpCYXNlQ29tbWFuZCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0VGVtcGxhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpKU09OJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKc3ViIENvbmZpZ3VyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5EZXNjcmlwdGlvbignRXhwb3J0IGEgY2hlY2tsaXN0IHRlbXBsYXRlIHRvIGFuIFhNTCBmaWxlLicpOwoKICAgICRTZWxmLT5BZGRPcHRpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ2lkJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnVGVtcGxhdGUgSUQgdG8gZXhwb3J0LicsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMCwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyL15cZCskL3NteCwKICAgICk7CgogICAgJFNlbGYtPkFkZE9wdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAnbmFtZScsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1RlbXBsYXRlIG5hbWUgdG8gZXhwb3J0IChhbHRlcm5hdGl2ZSB0byAtLWlkKS4nLAogICAgICAgIFJlcXVpcmVkICAgID0+IDAsCiAgICAgICAgSGFzVmFsdWUgICAgPT4gMSwKICAgICAgICBWYWx1ZVJlZ2V4ICA9PiBxci8uKy9zbXgsCiAgICApOwoKICAgICRTZWxmLT5BZGRPcHRpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ3RhcmdldC1kaXJlY3RvcnknLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdEaXJlY3RvcnkgdG8gc2F2ZSB0aGUgZXhwb3J0ZWQgZmlsZSAoZGVmYXVsdDogY3VycmVudCBkaXJlY3RvcnkpLicsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMCwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyLy4rL3NteCwKICAgICk7CgogICAgJFNlbGYtPkFkZE9wdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAnc3Rkb3V0JywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAnT3V0cHV0IFhNTCB0byBzdGRvdXQgaW5zdGVhZCBvZiBmaWxlLicsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMCwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAwLAogICAgKTsKCiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICdhbGwnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICdFeHBvcnQgYWxsIHRlbXBsYXRlcy4nLAogICAgICAgIFJlcXVpcmVkICAgID0+IDAsCiAgICAgICAgSGFzVmFsdWUgICAgPT4gMCwKICAgICk7CgogICAgcmV0dXJuOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdFRlbXBsYXRlJyk7CgogICAgbXkgJFRlbXBsYXRlSUQgID0gJFNlbGYtPkdldE9wdGlvbignaWQnKTsKICAgIG15ICROYW1lICAgICAgICA9ICRTZWxmLT5HZXRPcHRpb24oJ25hbWUnKTsKICAgIG15ICRUYXJnZXREaXIgICA9ICRTZWxmLT5HZXRPcHRpb24oJ3RhcmdldC1kaXJlY3RvcnknKSB8fCAnLic7CiAgICBteSAkVG9TdGRvdXQgICAgPSAkU2VsZi0+R2V0T3B0aW9uKCdzdGRvdXQnKTsKICAgIG15ICRFeHBvcnRBbGwgICA9ICRTZWxmLT5HZXRPcHRpb24oJ2FsbCcpOwoKICAgICMgVmFsaWRhdGUgb3B0aW9ucwogICAgaWYgKCAhJFRlbXBsYXRlSUQgJiYgISROYW1lICYmICEkRXhwb3J0QWxsICkgewogICAgICAgICRTZWxmLT5QcmludEVycm9yKCJQbGVhc2UgcHJvdmlkZSAtLWlkLCAtLW5hbWUsIG9yIC0tYWxsXG4iKTsKICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgIH0KCiAgICBteSBAVGVtcGxhdGVJRHM7CgogICAgaWYgKCRFeHBvcnRBbGwpIHsKICAgICAgICBteSAlVGVtcGxhdGVzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxpc3QoIFZhbGlkID0+IDAgKTsKICAgICAgICBAVGVtcGxhdGVJRHMgPSBrZXlzICVUZW1wbGF0ZXM7CiAgICAgICAgaWYgKCAhQFRlbXBsYXRlSURzICkgewogICAgICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+Tm8gdGVtcGxhdGVzIGZvdW5kIHRvIGV4cG9ydC48L3llbGxvdz5cbiIpOwogICAgICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlT2soKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PkV4cG9ydGluZyAiIC4gc2NhbGFyKEBUZW1wbGF0ZUlEcykgLiAiIHRlbXBsYXRlcy4uLjwveWVsbG93PlxuXG4iKTsKICAgIH0KICAgIGVsc2lmICgkTmFtZSkgewogICAgICAgICRUZW1wbGF0ZUlEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxvb2t1cCggTmFtZSA9PiAkTmFtZSApOwogICAgICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICAgICAkU2VsZi0+UHJpbnRFcnJvcigiVGVtcGxhdGUgJyROYW1lJyBub3QgZm91bmRcbiIpOwogICAgICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgQFRlbXBsYXRlSURzID0gKCRUZW1wbGF0ZUlEKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEBUZW1wbGF0ZUlEcyA9ICgkVGVtcGxhdGVJRCk7CiAgICB9CgogICAgIyBWYWxpZGF0ZSB0YXJnZXQgZGlyZWN0b3J5CiAgICBpZiAoICEkVG9TdGRvdXQgJiYgIS1kICRUYXJnZXREaXIgKSB7CiAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIlRhcmdldCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6ICRUYXJnZXREaXJcbiIpOwogICAgICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVFcnJvcigpOwogICAgfQoKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKICAgIG15ICRFeHBvcnRDb3VudCA9IDA7CgogICAgZm9yIG15ICRJRCAoQFRlbXBsYXRlSURzKSB7CiAgICAgICAgbXkgJFhNTCA9ICRTZWxmLT5fRXhwb3J0VGVtcGxhdGUoIFRlbXBsYXRlSUQgPT4gJElEICk7CgogICAgICAgIGlmICggISRYTUwgKSB7CiAgICAgICAgICAgICRTZWxmLT5QcmludEVycm9yKCJDb3VsZCBub3QgZXhwb3J0IHRlbXBsYXRlIElEICRJRFxuIik7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQoKICAgICAgICBteSAlVGVtcGxhdGUgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlR2V0KCBJRCA9PiAkSUQgKTsKCiAgICAgICAgaWYgKCRUb1N0ZG91dCkgewogICAgICAgICAgICBwcmludCAkWE1MOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBDcmVhdGUgc2FmZSBmaWxlbmFtZQogICAgICAgICAgICBteSAkRmlsZW5hbWUgPSAkVGVtcGxhdGV7TmFtZX07CiAgICAgICAgICAgICRGaWxlbmFtZSA9fiBzL1teYS16QS1aMC05Xy1dL18vZzsKICAgICAgICAgICAgJEZpbGVuYW1lID0gJ0NoZWNrbGlzdFRlbXBsYXRlXycgLiAkRmlsZW5hbWUgLiAnLnhtbCc7CiAgICAgICAgICAgIG15ICRGaWxlUGF0aCA9ICRUYXJnZXREaXIgLiAnLycgLiAkRmlsZW5hbWU7CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRNYWluT2JqZWN0LT5GaWxlV3JpdGUoCiAgICAgICAgICAgICAgICBMb2NhdGlvbiA9PiAkRmlsZVBhdGgsCiAgICAgICAgICAgICAgICBDb250ZW50ICA9PiBcJFhNTCwKICAgICAgICAgICAgICAgIE1vZGUgICAgID0+ICd1dGY4JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+RXhwb3J0ZWQ6PC9ncmVlbj4gJFRlbXBsYXRle05hbWV9IC0+ICRGaWxlUGF0aFxuIik7CiAgICAgICAgICAgICAgICAkRXhwb3J0Q291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT5QcmludEVycm9yKCJDb3VsZCBub3Qgd3JpdGUgZmlsZTogJEZpbGVQYXRoXG4iKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkVG9TdGRvdXQgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCJcbjxncmVlbj5FeHBvcnQgY29tcGxldGUuICRFeHBvcnRDb3VudCB0ZW1wbGF0ZShzKSBleHBvcnRlZC48L2dyZWVuPlxuIik7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZU9rKCk7Cn0KCnN1YiBfRXhwb3J0VGVtcGxhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGVtcGxhdGVJRCA9ICRQYXJhbXtUZW1wbGF0ZUlEfTsKICAgIHJldHVybiBpZiAhJFRlbXBsYXRlSUQ7CgogICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdFRlbXBsYXRlJyk7CiAgICBteSAkUXVldWVPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRWYWxpZE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwogICAgbXkgJEpTT05PYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKCiAgICBteSAlVGVtcGxhdGUgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlR2V0KCBJRCA9PiAkVGVtcGxhdGVJRCApOwogICAgcmV0dXJuIGlmICElVGVtcGxhdGU7CgogICAgbXkgQFF1ZXVlSURzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVF1ZXVlTGlzdCggVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCApOwogICAgbXkgQEl0ZW1zICAgID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1MaXN0KCBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEICk7CgogICAgIyBHZXQgcXVldWUgbmFtZXMgZm9yIGV4cG9ydAogICAgbXkgQFF1ZXVlTmFtZXM7CiAgICBmb3IgbXkgJFF1ZXVlSUQgKEBRdWV1ZUlEcykgewogICAgICAgIG15ICRRdWV1ZU5hbWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CiAgICAgICAgcHVzaCBAUXVldWVOYW1lcywgJFF1ZXVlTmFtZSBpZiAkUXVldWVOYW1lOwogICAgfQoKICAgICMgR2V0IHZhbGlkIG5hbWUKICAgIG15ICRWYWxpZE5hbWUgPSAkVmFsaWRPYmplY3QtPlZhbGlkTG9va3VwKCBWYWxpZElEID0+ICRUZW1wbGF0ZXtWYWxpZElEfSApOwoKICAgICMgQnVpbGQgWE1MCiAgICBteSAkWE1MID0gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+JyAuICJcbiI7CiAgICAkWE1MIC49ICc8Q2hlY2tsaXN0VGVtcGxhdGUgdmVyc2lvbj0iMS4wIj4nIC4gIlxuIjsKICAgICRYTUwgLj0gJyAgPE5hbWU+JyAuICRTZWxmLT5fWE1MRW5jb2RlKCAkVGVtcGxhdGV7TmFtZX0gKSAuICc8L05hbWU+JyAuICJcbiI7CiAgICAkWE1MIC49ICcgIDxEZXNjcmlwdGlvbj4nIC4gJFNlbGYtPl9YTUxFbmNvZGUoICRUZW1wbGF0ZXtEZXNjcmlwdGlvbn0gfHwgJycgKSAuICc8L0Rlc2NyaXB0aW9uPicgLiAiXG4iOwogICAgJFhNTCAuPSAnICA8TGlua1VSTD4nIC4gJFNlbGYtPl9YTUxFbmNvZGUoICRUZW1wbGF0ZXtMaW5rVVJMfSB8fCAnJyApIC4gJzwvTGlua1VSTD4nIC4gIlxuIjsKICAgICRYTUwgLj0gJyAgPExpbmtUZXh0PicgLiAkU2VsZi0+X1hNTEVuY29kZSggJFRlbXBsYXRle0xpbmtUZXh0fSB8fCAnJyApIC4gJzwvTGlua1RleHQ+JyAuICJcbiI7CiAgICAkWE1MIC49ICcgIDxWYWxpZD4nIC4gJFNlbGYtPl9YTUxFbmNvZGUoJFZhbGlkTmFtZSkgLiAnPC9WYWxpZD4nIC4gIlxuIjsKCiAgICAjIFF1ZXVlcwogICAgJFhNTCAuPSAnICA8UXVldWVzPicgLiAiXG4iOwogICAgZm9yIG15ICRRdWV1ZU5hbWUgKEBRdWV1ZU5hbWVzKSB7CiAgICAgICAgJFhNTCAuPSAnICAgIDxRdWV1ZT4nIC4gJFNlbGYtPl9YTUxFbmNvZGUoJFF1ZXVlTmFtZSkgLiAnPC9RdWV1ZT4nIC4gIlxuIjsKICAgIH0KICAgICRYTUwgLj0gJyAgPC9RdWV1ZXM+JyAuICJcbiI7CgogICAgIyBJdGVtcwogICAgJFhNTCAuPSAnICA8SXRlbXM+JyAuICJcbiI7CiAgICBmb3IgbXkgJEl0ZW0gKEBJdGVtcykgewogICAgICAgICRYTUwgLj0gJyAgICA8SXRlbT4nIC4gIlxuIjsKICAgICAgICAkWE1MIC49ICcgICAgICA8VGl0bGU+JyAuICRTZWxmLT5fWE1MRW5jb2RlKCAkSXRlbS0+e1RpdGxlfSApIC4gJzwvVGl0bGU+JyAuICJcbiI7CiAgICAgICAgJFhNTCAuPSAnICAgICAgPERlc2NyaXB0aW9uPicgLiAkU2VsZi0+X1hNTEVuY29kZSggJEl0ZW0tPntEZXNjcmlwdGlvbn0gfHwgJycgKSAuICc8L0Rlc2NyaXB0aW9uPicgLiAiXG4iOwogICAgICAgICRYTUwgLj0gJyAgICAgIDxJdGVtVHlwZT4nIC4gJFNlbGYtPl9YTUxFbmNvZGUoICRJdGVtLT57SXRlbVR5cGV9IHx8ICdjaGVja2JveCcgKSAuICc8L0l0ZW1UeXBlPicgLiAiXG4iOwogICAgICAgICRYTUwgLj0gJyAgICAgIDxJc01hbmRhdG9yeT4nIC4gKCAkSXRlbS0+e0lzTWFuZGF0b3J5fSA/ICcxJyA6ICcwJyApIC4gJzwvSXNNYW5kYXRvcnk+JyAuICJcbiI7CiAgICAgICAgJFhNTCAuPSAnICAgICAgPFNvcnRPcmRlcj4nIC4gKCAkSXRlbS0+e1NvcnRPcmRlcn0gfHwgMCApIC4gJzwvU29ydE9yZGVyPicgLiAiXG4iOwogICAgICAgICRYTUwgLj0gJyAgICAgIDxMaW5rVVJMPicgLiAkU2VsZi0+X1hNTEVuY29kZSggJEl0ZW0tPntMaW5rVVJMfSB8fCAnJyApIC4gJzwvTGlua1VSTD4nIC4gIlxuIjsKICAgICAgICAkWE1MIC49ICcgICAgICA8TGlua1RleHQ+JyAuICRTZWxmLT5fWE1MRW5jb2RlKCAkSXRlbS0+e0xpbmtUZXh0fSB8fCAnJyApIC4gJzwvTGlua1RleHQ+JyAuICJcbiI7CgogICAgICAgICMgQ29uZmlnIGFzIEpTT04KICAgICAgICBpZiAoICRJdGVtLT57Q29uZmlnfSAmJiByZWYgJEl0ZW0tPntDb25maWd9IGVxICdIQVNIJyAmJiAleyAkSXRlbS0+e0NvbmZpZ30gfSApIHsKICAgICAgICAgICAgbXkgJENvbmZpZ0pTT04gPSAkSlNPTk9iamVjdC0+RW5jb2RlKCBEYXRhID0+ICRJdGVtLT57Q29uZmlnfSApOwogICAgICAgICAgICAkWE1MIC49ICcgICAgICA8Q29uZmlnPicgLiAkU2VsZi0+X1hNTEVuY29kZSgkQ29uZmlnSlNPTikgLiAnPC9Db25maWc+JyAuICJcbiI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkWE1MIC49ICcgICAgICA8Q29uZmlnPjwvQ29uZmlnPicgLiAiXG4iOwogICAgICAgIH0KCiAgICAgICAgJFhNTCAuPSAnICAgIDwvSXRlbT4nIC4gIlxuIjsKICAgIH0KICAgICRYTUwgLj0gJyAgPC9JdGVtcz4nIC4gIlxuIjsKICAgICRYTUwgLj0gJzwvQ2hlY2tsaXN0VGVtcGxhdGU+JyAuICJcbiI7CgogICAgcmV0dXJuICRYTUw7Cn0KCnN1YiBfWE1MRW5jb2RlIHsKICAgIG15ICggJFNlbGYsICRTdHJpbmcgKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhZGVmaW5lZCAkU3RyaW5nOwoKICAgICRTdHJpbmcgPX4gcy8mLyZhbXA7L2c7CiAgICAkU3RyaW5nID1+IHMvPC8mbHQ7L2c7CiAgICAkU3RyaW5nID1+IHMvPi8mZ3Q7L2c7CiAgICAkU3RyaW5nID1+IHMvIi8mcXVvdDsvZzsKICAgICRTdHJpbmcgPX4gcy8nLyZhcG9zOy9nOwoKICAgIHJldHVybiAkU3RyaW5nOwp9CgoxOwo=</File>

        <!-- Frontend modules -->
        <File Permission="660" Location="Kernel/Modules/AgentChecklistTemplate.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50Q2hlY2tsaXN0VGVtcGxhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpNb2R1bGVzOjpBZ2VudENoZWNrbGlzdFRlbXBsYXRlIC0gQWdlbnQgbW9kdWxlIGZvciBjaGVja2xpc3QgdGVtcGxhdGVzCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFnZW50IGludGVyZmFjZSBmb3IgbWFuYWdpbmcgY2hlY2tsaXN0IHRlbXBsYXRlcy4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja2xpc3RUZW1wbGF0ZScpOwoKICAgIG15ICRTdWJhY3Rpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3ViYWN0aW9uJyApIHx8ICcnOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgQ2hlY2sgUk8vUlcgcGVybWlzc2lvbnMgZm9yIENoZWNrbGlzdE1hbmFnZXIgZ3JvdXAKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgbXkgJEhhc1JXQWNjZXNzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uQ2hlY2soCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBHcm91cE5hbWUgPT4gJ0NoZWNrbGlzdE1hbmFnZXInLAogICAgICAgIFR5cGUgICAgICA9PiAncncnLAogICAgKTsKICAgICRTZWxmLT57UmVhZE9ubHl9ID0gJEhhc1JXQWNjZXNzID8gMCA6IDE7CgogICAgIyBCbG9jayB3cml0ZSBhY3Rpb25zIGZvciByZWFkLW9ubHkgdXNlcnMKICAgICMgTm90ZTogRWRpdCBpcyBhbGxvd2VkICh2aWV3IG9ubHkgbW9kZSksIGJ1dCBhbGwgbW9kaWZ5aW5nIGFjdGlvbnMgYXJlIGJsb2NrZWQKICAgICMKICAgICMgQlVHRklYOiB0aGlzIGxpc3QgcHJldmlvdXNseSByZWZlcmVuY2VkIHN1YmFjdGlvbiBuYW1lcwogICAgIyAoQWRkSXRlbUFjdGlvbiwgVXBkYXRlSXRlbSwgVXBkYXRlSXRlbU9yZGVyLCBTYXZlUXVldWVBc3NpZ25tZW50cykKICAgICMgdGhhdCBkb24ndCBtYXRjaCBhbnkgc3ViYWN0aW9uIGFjdHVhbGx5IGRpc3BhdGNoZWQgYmVsb3cgKHRoZSByZWFsCiAgICAjIG5hbWVzIGFyZSBJdGVtQWRkLCBJdGVtVXBkYXRlLCBJdGVtUmVvcmRlciwgSXRlbURlbGV0ZSwgYW5kIHF1ZXVlCiAgICAjIGFzc2lnbm1lbnQgaXNuJ3QgYSBzZXBhcmF0ZSBzdWJhY3Rpb24gYXQgYWxsKSAtIG1lYW5pbmcgcmVhZC1vbmx5CiAgICAjIHVzZXJzIHdlcmUgbmV2ZXIgYWN0dWFsbHkgYmxvY2tlZCBmcm9tIHRob3NlIEFKQVggYWN0aW9ucy4gQ29ycmVjdGVkCiAgICAjIHRvIHRoZSByZWFsIGRpc3BhdGNoIG5hbWVzLgogICAgbXkgQFdyaXRlU3ViYWN0aW9ucyA9IHF3KEFkZCBBZGRBY3Rpb24gRWRpdEFjdGlvbiBEZWxldGUgSXRlbURlbGV0ZSBBZGRJdGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdEl0ZW0gSXRlbUFkZCBJdGVtVXBkYXRlIEl0ZW1SZW9yZGVyIEltcG9ydCBEdXBsaWNhdGUpOwoKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gJiYgZ3JlcCB7ICRfIGVxICRTdWJhY3Rpb24gfSBAV3JpdGVTdWJhY3Rpb25zICkgewogICAgICAgICMgQUpBWCByZXF1ZXN0cyByZXR1cm4gSlNPTiBlcnJvcgogICAgICAgIGlmICggJFN1YmFjdGlvbiA9fiAvXihEZWxldGV8SXRlbURlbGV0ZXxJdGVtQWRkfEl0ZW1VcGRhdGV8SXRlbVJlb3JkZXJ8SW1wb3J0fER1cGxpY2F0ZSkkLyApIHsKICAgICAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFN1Y2Nlc3MgPT4gMCwgRXJyb3IgPT4gJ05vIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRlbXBsYXRlcycgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgUmVndWxhciByZXF1ZXN0cyBzaG93IG5vIHBlcm1pc3Npb24gcGFnZQogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEFkZCBuZXcgdGVtcGxhdGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFN1YmFjdGlvbiBlcSAnQWRkJyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9TaG93RWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdBZGQnLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBBZGQgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0FkZEFjdGlvbicgKSB7CgogICAgICAgICMgU0VDVVJJVFk6IENTUkYgcHJvdGVjdGlvbiBmb3IgdGhpcyBzdGF0ZS1jaGFuZ2luZyBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJFBhcmFtIChxdyhOYW1lIERlc2NyaXB0aW9uIExpbmtVUkwgTGlua1RleHQgVmFsaWRJRCkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgbXkgQFF1ZXVlSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1F1ZXVlSURzJyApOwoKICAgICAgICAjIENoZWNrIHJlcXVpcmVkIGZpZWxkcwogICAgICAgIG15ICVFcnJvcnM7CiAgICAgICAgaWYgKCAhJEdldFBhcmFte05hbWV9ICkgewogICAgICAgICAgICAkRXJyb3Jze05hbWVJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIFF1ZXVlIGFzc2lnbm1lbnQgaXMgbWFuZGF0b3J5CiAgICAgICAgaWYgKCAhQFF1ZXVlSURzICkgewogICAgICAgICAgICAkRXJyb3Jze1F1ZXVlSURzSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcnMpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd0VkaXQoCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAnQWRkJywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFF1ZXVlSURzID0+IFxAUXVldWVJRHMsCiAgICAgICAgICAgICAgICAlRXJyb3JzLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBBZGQgdGVtcGxhdGUKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRHZXRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEdldFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgTGlua1VSTCAgICAgPT4gJEdldFBhcmFte0xpbmtVUkx9LAogICAgICAgICAgICBMaW5rVGV4dCAgICA9PiAkR2V0UGFyYW17TGlua1RleHR9LAogICAgICAgICAgICBWYWxpZElEICAgICA9PiAkR2V0UGFyYW17VmFsaWRJRH0gfHwgMSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZUlEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU2V0IHF1ZXVlIGFzc2lnbm1lbnRzCiAgICAgICAgJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVF1ZXVlU2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBRdWV1ZUlEcyAgID0+IFxAUXVldWVJRHMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgaWYgdXNlciB3YW50cyB0byBjbG9zZSBhZnRlciBzYXZlCiAgICAgICAgbXkgJFN1Ym1pdEFuZENsb3NlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1Ym1pdEFuZENsb3NlJyApOwogICAgICAgIGlmICgkU3VibWl0QW5kQ2xvc2UpIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudENoZWNrbGlzdFRlbXBsYXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudENoZWNrbGlzdFRlbXBsYXRlO1N1YmFjdGlvbj1FZGl0O0lEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgRWRpdCB0ZW1wbGF0ZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU3ViYWN0aW9uIGVxICdFZGl0JyApIHsKICAgICAgICBteSAkSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICk7CgogICAgICAgICMgU2VjdXJpdHk6IFZhbGlkYXRlIElEIGlzIG51bWVyaWMKICAgICAgICBpZiAoICEkSUQgfHwgJElEICF+IC9eXGQrJC8gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdJbnZhbGlkIElEIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVRlbXBsYXRlID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUdldCggSUQgPT4gJElEICk7CiAgICAgICAgaWYgKCAhJVRlbXBsYXRlICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgbm90IGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBxdWV1ZS1iYXNlZCBwZXJtaXNzaW9uCiAgICAgICAgaWYgKCAhJFNlbGYtPl9Vc2VyQ2FuRWRpdFRlbXBsYXRlKCBUZW1wbGF0ZUlEID0+ICRJRCApICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQoKICAgICAgICBteSBAUXVldWVJRHMgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlUXVldWVMaXN0KCBUZW1wbGF0ZUlEID0+ICRJRCApOwogICAgICAgIG15IEBJdGVtcyAgICA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtTGlzdCggVGVtcGxhdGVJRCA9PiAkSUQgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICdFZGl0JywKICAgICAgICAgICAgJVRlbXBsYXRlLAogICAgICAgICAgICBRdWV1ZUlEcyA9PiBcQFF1ZXVlSURzLAogICAgICAgICAgICBJdGVtcyAgICA9PiBcQEl0ZW1zLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBBZGQgSXRlbSBwYWdlIChzZXBhcmF0ZSBwYWdlIGluc3RlYWQgb2YgbW9kYWwpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0FkZEl0ZW0nICkgewogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CiAgICAgICAgaWYgKCAhJFRlbXBsYXRlSUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkIFRlbXBsYXRlSUQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlVGVtcGxhdGUgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlR2V0KCBJRCA9PiAkVGVtcGxhdGVJRCApOwogICAgICAgIGlmICggISVUZW1wbGF0ZSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1RlbXBsYXRlIG5vdCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgcXVldWUtYmFzZWQgcGVybWlzc2lvbgogICAgICAgIGlmICggISRTZWxmLT5fVXNlckNhbkVkaXRUZW1wbGF0ZSggVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCApICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPl9TaG93QWRkSXRlbSgKICAgICAgICAgICAgVGVtcGxhdGVJRCAgID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBUZW1wbGF0ZU5hbWUgPT4gJFRlbXBsYXRle05hbWV9LAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBFZGl0IEl0ZW0gcGFnZSAoc2VwYXJhdGUgcGFnZSBpbnN0ZWFkIG9mIG1vZGFsKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU3ViYWN0aW9uIGVxICdFZGl0SXRlbScgKSB7CiAgICAgICAgbXkgJEl0ZW1JRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJdGVtSUQnICk7CiAgICAgICAgaWYgKCAhJEl0ZW1JRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05lZWQgSXRlbUlEIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgaXRlbSB0byBmaW5kIFRlbXBsYXRlSUQKICAgICAgICBteSAlSXRlbSA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtR2V0KCBJRCA9PiAkSXRlbUlEICk7CiAgICAgICAgaWYgKCAhJUl0ZW0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdJdGVtIG5vdCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVUZW1wbGF0ZSA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVHZXQoIElEID0+ICRJdGVte1RlbXBsYXRlSUR9ICk7CiAgICAgICAgaWYgKCAhJVRlbXBsYXRlICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgbm90IGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBxdWV1ZS1iYXNlZCBwZXJtaXNzaW9uCiAgICAgICAgaWYgKCAhJFNlbGYtPl9Vc2VyQ2FuRWRpdFRlbXBsYXRlKCBUZW1wbGF0ZUlEID0+ICRJdGVte1RlbXBsYXRlSUR9ICkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+X1Nob3dFZGl0SXRlbSgKICAgICAgICAgICAgSXRlbUlEICAgICAgID0+ICRJdGVtSUQsCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICA9PiAkSXRlbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVGVtcGxhdGVOYW1lID0+ICRUZW1wbGF0ZXtOYW1lfSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgRWRpdCBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFN1YmFjdGlvbiBlcSAnRWRpdEFjdGlvbicgKSB7CgogICAgICAgICMgU0VDVVJJVFk6IENTUkYgcHJvdGVjdGlvbiBmb3IgdGhpcyBzdGF0ZS1jaGFuZ2luZyBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICBmb3IgbXkgJFBhcmFtIChxdyhJRCBOYW1lIERlc2NyaXB0aW9uIExpbmtVUkwgTGlua1RleHQgVmFsaWRJRCkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgbXkgQFF1ZXVlSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1F1ZXVlSURzJyApOwoKICAgICAgICAjIENoZWNrIHF1ZXVlLWJhc2VkIHBlcm1pc3Npb24KICAgICAgICBpZiAoICEkU2VsZi0+X1VzZXJDYW5FZGl0VGVtcGxhdGUoIFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte0lEfSApICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIHJlcXVpcmVkIGZpZWxkcwogICAgICAgIG15ICVFcnJvcnM7CiAgICAgICAgaWYgKCAhJEdldFBhcmFte05hbWV9ICkgewogICAgICAgICAgICAkRXJyb3Jze05hbWVJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIFF1ZXVlIGFzc2lnbm1lbnQgaXMgbWFuZGF0b3J5CiAgICAgICAgaWYgKCAhQFF1ZXVlSURzICkgewogICAgICAgICAgICAkRXJyb3Jze1F1ZXVlSURzSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcnMpIHsKICAgICAgICAgICAgbXkgQEl0ZW1zID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1MaXN0KCBUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtJRH0gKTsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd0VkaXQoCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAnRWRpdCcsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEcyA9PiBcQFF1ZXVlSURzLAogICAgICAgICAgICAgICAgSXRlbXMgICAgPT4gXEBJdGVtcywKICAgICAgICAgICAgICAgICVFcnJvcnMsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFVwZGF0ZSB0ZW1wbGF0ZQogICAgICAgIG15ICRTdWNjZXNzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVVwZGF0ZSgKICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJEdldFBhcmFte0lEfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEdldFBhcmFte05hbWV9LAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkR2V0UGFyYW17RGVzY3JpcHRpb259LAogICAgICAgICAgICBMaW5rVVJMICAgICA9PiAkR2V0UGFyYW17TGlua1VSTH0sCiAgICAgICAgICAgIExpbmtUZXh0ICAgID0+ICRHZXRQYXJhbXtMaW5rVGV4dH0sCiAgICAgICAgICAgIFZhbGlkSUQgICAgID0+ICRHZXRQYXJhbXtWYWxpZElEfSB8fCAxLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgdXBkYXRlIHRlbXBsYXRlIScpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBVcGRhdGUgcXVldWUgYXNzaWdubWVudHMKICAgICAgICAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlUXVldWVTZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte0lEfSwKICAgICAgICAgICAgUXVldWVJRHMgICA9PiBcQFF1ZXVlSURzLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGlmIHVzZXIgd2FudHMgdG8gY2xvc2UgYWZ0ZXIgc2F2ZQogICAgICAgIG15ICRTdWJtaXRBbmRDbG9zZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJtaXRBbmRDbG9zZScgKTsKICAgICAgICBpZiAoJFN1Ym1pdEFuZENsb3NlKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRDaGVja2xpc3RUZW1wbGF0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249QWdlbnRDaGVja2xpc3RUZW1wbGF0ZTtTdWJhY3Rpb249RWRpdDtJRD0kR2V0UGFyYW17SUR9IiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgRGVsZXRlIHRlbXBsYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0RlbGV0ZScgKSB7CgogICAgICAgICMgU0VDVVJJVFk6IENTUkYgcHJvdGVjdGlvbiBmb3IgdGhpcyBzdGF0ZS1jaGFuZ2luZyBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKCiAgICAgICAgIyBTZWN1cml0eTogVmFsaWRhdGUgSUQgaXMgbnVtZXJpYwogICAgICAgIGlmICggISRJRCB8fCAkSUQgIX4gL15cZCskLyApIHsKICAgICAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFN1Y2Nlc3MgPT4gMCwgRXJyb3IgPT4gJ0ludmFsaWRJRCcgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+IDAgfSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIHF1ZXVlLWJhc2VkIHBlcm1pc3Npb24KICAgICAgICBpZiAoICEkU2VsZi0+X1VzZXJDYW5FZGl0VGVtcGxhdGUoIFRlbXBsYXRlSUQgPT4gJElEICkgKSB7CiAgICAgICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+IDAsIEVycm9yID0+ICdObyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGlzIHRlbXBsYXRlJyB9LAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgR2l2ZSBhIHNwZWNpZmljIHJlYXNvbiB3aGVuIGJsb2NrZWQgYmVjYXVzZSB0aGUgdGVtcGxhdGUgaXMKICAgICAgICAjIHN0aWxsIGF0dGFjaGVkIHRvIHRpY2tldHMsIHJhdGhlciB0aGFuIGEgZ2VuZXJpYyBmYWlsdXJlIC0KICAgICAgICAjIFRlbXBsYXRlRGVsZXRlKCkgaXRzZWxmIGFsc28gcmVmdXNlcyBpbiB0aGlzIGNhc2UsIGJ1dCBkb2Vzbid0CiAgICAgICAgIyBoYXZlIGFuIGVycm9yIHN0cmluZyB0byBoYW5kIGJhY2suCiAgICAgICAgbXkgJFVzYWdlQ291bnQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlVXNhZ2VDb3VudCggSUQgPT4gJElEICk7CiAgICAgICAgaWYgKCRVc2FnZUNvdW50KSB7CiAgICAgICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgICAgICBFcnJvciAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0Nhbm5vdCBkZWxldGU6IHRoaXMgdGVtcGxhdGUgaXMgc3RpbGwgYXR0YWNoZWQgdG8gJXMgdGlja2V0KHMpLicsICRVc2FnZUNvdW50CiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlRGVsZXRlKAogICAgICAgICAgICBJRCAgICAgPT4gJElELAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+IDEgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIER1cGxpY2F0ZSB0ZW1wbGF0ZSAoQUpBWCkKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFN1YmFjdGlvbiBlcSAnRHVwbGljYXRlJyApIHsKCiAgICAgICAgIyBTRUNVUklUWTogQ1NSRiBwcm90ZWN0aW9uIGZvciB0aGlzIHN0YXRlLWNoYW5naW5nIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJElEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApOwoKICAgICAgICAjIFNlY3VyaXR5OiBWYWxpZGF0ZSBJRCBpcyBudW1lcmljCiAgICAgICAgaWYgKCAhJElEIHx8ICRJRCAhfiAvXlxkKyQvICkgewogICAgICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgU3VjY2VzcyA9PiAwLCBFcnJvciA9PiAnSW52YWxpZElEJyB9LAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiB7IFN1Y2Nlc3MgPT4gMCB9LAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgcXVldWUtYmFzZWQgcGVybWlzc2lvbgogICAgICAgIGlmICggISRTZWxmLT5fVXNlckNhbkVkaXRUZW1wbGF0ZSggVGVtcGxhdGVJRCA9PiAkSUQgKSApIHsKICAgICAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFN1Y2Nlc3MgPT4gMCwgRXJyb3IgPT4gJ05vIHBlcm1pc3Npb24gdG8gZHVwbGljYXRlIHRoaXMgdGVtcGxhdGUnIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgc291cmNlIHRlbXBsYXRlCiAgICAgICAgbXkgJVRlbXBsYXRlID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUdldCggSUQgPT4gJElEICk7CgogICAgICAgIGlmICglVGVtcGxhdGUpIHsKICAgICAgICAgICAgIyBDcmVhdGUgbmV3IHRlbXBsYXRlIHdpdGggIkNvcHkgb2YiIHByZWZpeAogICAgICAgICAgICBteSAkTmV3TmFtZSA9ICdDb3B5IG9mICcgLiAkVGVtcGxhdGV7TmFtZX07CgogICAgICAgICAgICBteSAkTmV3VGVtcGxhdGVJRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkTmV3TmFtZSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRUZW1wbGF0ZXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICBMaW5rVVJMICAgICA9PiAkVGVtcGxhdGV7TGlua1VSTH0sCiAgICAgICAgICAgICAgICBMaW5rVGV4dCAgICA9PiAkVGVtcGxhdGV7TGlua1RleHR9LAogICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgPT4gJFRlbXBsYXRle1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCROZXdUZW1wbGF0ZUlEKSB7CiAgICAgICAgICAgICAgICAjIENvcHkgcXVldWUgYXNzaWdubWVudHMKICAgICAgICAgICAgICAgIG15IEBRdWV1ZUlEcyA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVRdWV1ZUxpc3QoIFRlbXBsYXRlSUQgPT4gJElEICk7CiAgICAgICAgICAgICAgICBpZiAoQFF1ZXVlSURzKSB7CiAgICAgICAgICAgICAgICAgICAgJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVF1ZXVlU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICROZXdUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEcyAgID0+IFxAUXVldWVJRHMsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBDb3B5IGl0ZW1zIHdpdGggYWxsIG5ldyBmaWVsZHMKICAgICAgICAgICAgICAgIG15IEBJdGVtcyA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtTGlzdCggVGVtcGxhdGVJRCA9PiAkSUQgKTsKICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoQEl0ZW1zKSB7CiAgICAgICAgICAgICAgICAgICAgJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1BZGQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgID0+ICROZXdUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgICAgICBJdGVtVHlwZSAgICA9PiAkSXRlbS0+e0l0ZW1UeXBlfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJEl0ZW0tPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBDb25maWcgICAgICA9PiAkSXRlbS0+e0NvbmZpZ30sCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtVUkwgICAgID0+ICRJdGVtLT57TGlua1VSTH0sCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtUZXh0ICAgID0+ICRJdGVtLT57TGlua1RleHR9LAogICAgICAgICAgICAgICAgICAgICAgICBJc01hbmRhdG9yeSA9PiAkSXRlbS0+e0lzTWFuZGF0b3J5fSwKICAgICAgICAgICAgICAgICAgICAgICAgU29ydE9yZGVyICAgPT4gJEl0ZW0tPntTb3J0T3JkZXJ9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTmV3VGVtcGxhdGVJRCA9PiAkTmV3VGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgRXhwb3J0IHRlbXBsYXRlIGFzIFhNTAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU3ViYWN0aW9uIGVxICdFeHBvcnQnICkgewogICAgICAgIG15ICRJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKCiAgICAgICAgIyBTZWN1cml0eTogVmFsaWRhdGUgSUQgaXMgbnVtZXJpYwogICAgICAgIGlmICggISRJRCB8fCAkSUQgIX4gL15cZCskLyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0ludmFsaWQgSUQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlVGVtcGxhdGUgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlR2V0KCBJRCA9PiAkSUQgKTsKICAgICAgICBpZiAoICElVGVtcGxhdGUgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdUZW1wbGF0ZSBub3QgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSBAUXVldWVJRHMgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlUXVldWVMaXN0KCBUZW1wbGF0ZUlEID0+ICRJRCApOwogICAgICAgIG15IEBJdGVtcyAgICA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtTGlzdCggVGVtcGxhdGVJRCA9PiAkSUQgKTsKCiAgICAgICAgIyBHZXQgcXVldWUgbmFtZXMgZm9yIGV4cG9ydAogICAgICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgICAgIG15IEBRdWV1ZU5hbWVzOwogICAgICAgIGZvciBteSAkUXVldWVJRCAoQFF1ZXVlSURzKSB7CiAgICAgICAgICAgIG15ICRRdWV1ZU5hbWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CiAgICAgICAgICAgIHB1c2ggQFF1ZXVlTmFtZXMsICRRdWV1ZU5hbWUgaWYgJFF1ZXVlTmFtZTsKICAgICAgICB9CgogICAgICAgICMgR2V0IHZhbGlkIG5hbWUKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKICAgICAgICBteSAkVmFsaWROYW1lICAgPSAkVmFsaWRPYmplY3QtPlZhbGlkTG9va3VwKCBWYWxpZElEID0+ICRUZW1wbGF0ZXtWYWxpZElEfSApOwoKICAgICAgICAjIEJ1aWxkIFhNTAogICAgICAgIG15ICRKU09OT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKCiAgICAgICAgbXkgJFhNTCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PicgLiAiXG4iOwogICAgICAgICRYTUwgLj0gJzxDaGVja2xpc3RUZW1wbGF0ZSB2ZXJzaW9uPSIxLjAiPicgLiAiXG4iOwogICAgICAgICRYTUwgLj0gJyAgPE5hbWU+JyAuICRTZWxmLT5fWE1MRW5jb2RlKCAkVGVtcGxhdGV7TmFtZX0gKSAuICc8L05hbWU+JyAuICJcbiI7CiAgICAgICAgJFhNTCAuPSAnICA8RGVzY3JpcHRpb24+JyAuICRTZWxmLT5fWE1MRW5jb2RlKCAkVGVtcGxhdGV7RGVzY3JpcHRpb259IHx8ICcnICkgLiAnPC9EZXNjcmlwdGlvbj4nIC4gIlxuIjsKICAgICAgICAkWE1MIC49ICcgIDxMaW5rVVJMPicgLiAkU2VsZi0+X1hNTEVuY29kZSggJFRlbXBsYXRle0xpbmtVUkx9IHx8ICcnICkgLiAnPC9MaW5rVVJMPicgLiAiXG4iOwogICAgICAgICRYTUwgLj0gJyAgPExpbmtUZXh0PicgLiAkU2VsZi0+X1hNTEVuY29kZSggJFRlbXBsYXRle0xpbmtUZXh0fSB8fCAnJyApIC4gJzwvTGlua1RleHQ+JyAuICJcbiI7CiAgICAgICAgJFhNTCAuPSAnICA8VmFsaWQ+JyAuICRTZWxmLT5fWE1MRW5jb2RlKCRWYWxpZE5hbWUpIC4gJzwvVmFsaWQ+JyAuICJcbiI7CgogICAgICAgICMgUXVldWVzCiAgICAgICAgJFhNTCAuPSAnICA8UXVldWVzPicgLiAiXG4iOwogICAgICAgIGZvciBteSAkUXVldWVOYW1lIChAUXVldWVOYW1lcykgewogICAgICAgICAgICAkWE1MIC49ICcgICAgPFF1ZXVlPicgLiAkU2VsZi0+X1hNTEVuY29kZSgkUXVldWVOYW1lKSAuICc8L1F1ZXVlPicgLiAiXG4iOwogICAgICAgIH0KICAgICAgICAkWE1MIC49ICcgIDwvUXVldWVzPicgLiAiXG4iOwoKICAgICAgICAjIEl0ZW1zCiAgICAgICAgJFhNTCAuPSAnICA8SXRlbXM+JyAuICJcbiI7CiAgICAgICAgZm9yIG15ICRJdGVtIChASXRlbXMpIHsKICAgICAgICAgICAgJFhNTCAuPSAnICAgIDxJdGVtPicgLiAiXG4iOwogICAgICAgICAgICAkWE1MIC49ICcgICAgICA8VGl0bGU+JyAuICRTZWxmLT5fWE1MRW5jb2RlKCAkSXRlbS0+e1RpdGxlfSApIC4gJzwvVGl0bGU+JyAuICJcbiI7CiAgICAgICAgICAgICRYTUwgLj0gJyAgICAgIDxEZXNjcmlwdGlvbj4nIC4gJFNlbGYtPl9YTUxFbmNvZGUoICRJdGVtLT57RGVzY3JpcHRpb259IHx8ICcnICkgLiAnPC9EZXNjcmlwdGlvbj4nIC4gIlxuIjsKICAgICAgICAgICAgJFhNTCAuPSAnICAgICAgPEl0ZW1UeXBlPicgLiAkU2VsZi0+X1hNTEVuY29kZSggJEl0ZW0tPntJdGVtVHlwZX0gfHwgJ2NoZWNrYm94JyApIC4gJzwvSXRlbVR5cGU+JyAuICJcbiI7CiAgICAgICAgICAgICRYTUwgLj0gJyAgICAgIDxJc01hbmRhdG9yeT4nIC4gKCAkSXRlbS0+e0lzTWFuZGF0b3J5fSA/ICcxJyA6ICcwJyApIC4gJzwvSXNNYW5kYXRvcnk+JyAuICJcbiI7CiAgICAgICAgICAgICRYTUwgLj0gJyAgICAgIDxTb3J0T3JkZXI+JyAuICggJEl0ZW0tPntTb3J0T3JkZXJ9IHx8IDAgKSAuICc8L1NvcnRPcmRlcj4nIC4gIlxuIjsKICAgICAgICAgICAgJFhNTCAuPSAnICAgICAgPExpbmtVUkw+JyAuICRTZWxmLT5fWE1MRW5jb2RlKCAkSXRlbS0+e0xpbmtVUkx9IHx8ICcnICkgLiAnPC9MaW5rVVJMPicgLiAiXG4iOwogICAgICAgICAgICAkWE1MIC49ICcgICAgICA8TGlua1RleHQ+JyAuICRTZWxmLT5fWE1MRW5jb2RlKCAkSXRlbS0+e0xpbmtUZXh0fSB8fCAnJyApIC4gJzwvTGlua1RleHQ+JyAuICJcbiI7CgogICAgICAgICAgICAjIENvbmZpZyBhcyBKU09OCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDb25maWd9ICYmIHJlZiAkSXRlbS0+e0NvbmZpZ30gZXEgJ0hBU0gnICYmICV7ICRJdGVtLT57Q29uZmlnfSB9ICkgewogICAgICAgICAgICAgICAgbXkgJENvbmZpZ0pTT04gPSAkSlNPTk9iamVjdC0+RW5jb2RlKCBEYXRhID0+ICRJdGVtLT57Q29uZmlnfSApOwogICAgICAgICAgICAgICAgJFhNTCAuPSAnICAgICAgPENvbmZpZz4nIC4gJFNlbGYtPl9YTUxFbmNvZGUoJENvbmZpZ0pTT04pIC4gJzwvQ29uZmlnPicgLiAiXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFhNTCAuPSAnICAgICAgPENvbmZpZz48L0NvbmZpZz4nIC4gIlxuIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFhNTCAuPSAnICAgIDwvSXRlbT4nIC4gIlxuIjsKICAgICAgICB9CiAgICAgICAgJFhNTCAuPSAnICA8L0l0ZW1zPicgLiAiXG4iOwogICAgICAgICRYTUwgLj0gJzwvQ2hlY2tsaXN0VGVtcGxhdGU+JyAuICJcbiI7CgogICAgICAgICMgQ3JlYXRlIHNhZmUgZmlsZW5hbWUKICAgICAgICBteSAkRmlsZW5hbWUgPSAkVGVtcGxhdGV7TmFtZX07CiAgICAgICAgJEZpbGVuYW1lID1+IHMvW15hLXpBLVowLTlfLV0vXy9nOwogICAgICAgICRGaWxlbmFtZSA9ICdDaGVja2xpc3RUZW1wbGF0ZV8nIC4gJEZpbGVuYW1lIC4gJy54bWwnOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL3htbDsgY2hhcnNldD1VVEYtOCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRYTUwsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBJbXBvcnQgdGVtcGxhdGUgZnJvbSBYTUwgKEFKQVgpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0ltcG9ydCcgKSB7CgogICAgICAgICMgU0VDVVJJVFk6IENTUkYgcHJvdGVjdGlvbiBmb3IgdGhpcyBzdGF0ZS1jaGFuZ2luZyBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRYTUxDb250ZW50ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1hNTENvbnRlbnQnICk7CgogICAgICAgICMgU2VjdXJpdHk6IENoZWNrIGZpbGUgc2l6ZSBsaW1pdCAoMSBNQikKICAgICAgICBpZiAoICRYTUxDb250ZW50ICYmIGxlbmd0aCgkWE1MQ29udGVudCkgPiAxXzAwMF8wMDAgKSB7CiAgICAgICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+IDAsIE1lc3NhZ2UgPT4gJ0ZpbGUgdG9vIGxhcmdlLiBNYXhpbXVtIHNpemUgaXMgMSBNQi4nIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsgU3VjY2VzcyA9PiAwLCBNZXNzYWdlID0+ICdJbnZhbGlkIFhNTCBjb250ZW50JyB9LAogICAgICAgICk7CgogICAgICAgIGlmICgkWE1MQ29udGVudCkgewogICAgICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPl9JbXBvcnRUZW1wbGF0ZUZyb21YTUwoCiAgICAgICAgICAgICAgICBYTUxDb250ZW50ID0+ICRYTUxDb250ZW50LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRSZXN1bHQtPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBOZXdUZW1wbGF0ZUlEID0+ICRSZXN1bHQtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVOYW1lICA9PiAkUmVzdWx0LT57VGVtcGxhdGVOYW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXN1bHQtPntNZXNzYWdlfSB8fCAnSW1wb3J0IGZhaWxlZCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEl0ZW0gQWRkIChBSkFYKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU3ViYWN0aW9uIGVxICdJdGVtQWRkJyApIHsKCiAgICAgICAgIyBTRUNVUklUWTogQ1NSRiBwcm90ZWN0aW9uIGZvciB0aGlzIHN0YXRlLWNoYW5naW5nIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIGZvciBteSAkUGFyYW0gKHF3KFRlbXBsYXRlSUQgSXRlbVR5cGUgVGl0bGUgRGVzY3JpcHRpb24gTGlua1VSTCBMaW5rVGV4dCBJc01hbmRhdG9yeSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW0gKSAvLyAnJzsKICAgICAgICB9CgogICAgICAgICMgU2VjdXJpdHk6IFZhbGlkYXRlIFRlbXBsYXRlSUQgaXMgbnVtZXJpYwogICAgICAgIGlmICggISRHZXRQYXJhbXtUZW1wbGF0ZUlEfSB8fCAkR2V0UGFyYW17VGVtcGxhdGVJRH0gIX4gL15cZCskLyApIHsKICAgICAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFN1Y2Nlc3MgPT4gMCwgRXJyb3IgPT4gJ0ludmFsaWRJRCcgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFNlY3VyaXR5OiBBQ0wgY2hlY2sgLSB1c2VyIG11c3QgaGF2ZSBwZXJtaXNzaW9uIGZvciB0aGlzIHRlbXBsYXRlCiAgICAgICAgaWYgKCAhJFNlbGYtPl9Vc2VyQ2FuRWRpdFRlbXBsYXRlKCBUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtUZW1wbGF0ZUlEfSApICkgewogICAgICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgU3VjY2VzcyA9PiAwLCBFcnJvciA9PiAnTm9QZXJtaXNzaW9uJyB9LAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgR2V0IGNvbmZpZyBKU09OIGFuZCBkZWNvZGUgaXQKICAgICAgICBteSAkQ29uZmlnSlNPTiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb25maWcnICkgfHwgJyc7CiAgICAgICAgbXkgJENvbmZpZzsKICAgICAgICBpZiAoJENvbmZpZ0pTT04pIHsKICAgICAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgICAgICAgICAkQ29uZmlnID0gJEpTT05PYmplY3QtPkRlY29kZSggRGF0YSA9PiAkQ29uZmlnSlNPTiApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEl0ZW1JRCA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtQWRkKAogICAgICAgICAgICBUZW1wbGF0ZUlEICA9PiAkR2V0UGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIEl0ZW1UeXBlICAgID0+ICRHZXRQYXJhbXtJdGVtVHlwZX0gfHwgJ2NoZWNrYm94JywKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJEdldFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEdldFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgQ29uZmlnICAgICAgPT4gJENvbmZpZywKICAgICAgICAgICAgTGlua1VSTCAgICAgPT4gJEdldFBhcmFte0xpbmtVUkx9LAogICAgICAgICAgICBMaW5rVGV4dCAgICA9PiAkR2V0UGFyYW17TGlua1RleHR9LAogICAgICAgICAgICBJc01hbmRhdG9yeSA9PiAkR2V0UGFyYW17SXNNYW5kYXRvcnl9ID8gMSA6IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAkSXRlbUlEID8gMSA6IDAsCiAgICAgICAgICAgICAgICBJdGVtSUQgID0+ICRJdGVtSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgSXRlbSBVcGRhdGUgKEFKQVgpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0l0ZW1VcGRhdGUnICkgewoKICAgICAgICAjIFNFQ1VSSVRZOiBDU1JGIHByb3RlY3Rpb24gZm9yIHRoaXMgc3RhdGUtY2hhbmdpbmcgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoSUQgSXRlbVR5cGUgVGl0bGUgRGVzY3JpcHRpb24gTGlua1VSTCBMaW5rVGV4dCBJc01hbmRhdG9yeSBTb3J0T3JkZXIpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW19ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtICkgLy8gJyc7CiAgICAgICAgfQoKICAgICAgICAjIFNlY3VyaXR5OiBWYWxpZGF0ZSBJRCBpcyBudW1lcmljCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0lEfSB8fCAkR2V0UGFyYW17SUR9ICF+IC9eXGQrJC8gKSB7CiAgICAgICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+IDAsIEVycm9yID0+ICdJbnZhbGlkSUQnIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBTZWN1cml0eTogQUNMIGNoZWNrIC0gZ2V0IGl0ZW0gdG8gZmluZCB0ZW1wbGF0ZSwgdGhlbiBjaGVjayBwZXJtaXNzaW9uCiAgICAgICAgbXkgJUl0ZW0gPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlSXRlbUdldCggSUQgPT4gJEdldFBhcmFte0lEfSApOwogICAgICAgIGlmICggISVJdGVtIHx8ICEkU2VsZi0+X1VzZXJDYW5FZGl0VGVtcGxhdGUoIFRlbXBsYXRlSUQgPT4gJEl0ZW17VGVtcGxhdGVJRH0gKSApIHsKICAgICAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFN1Y2Nlc3MgPT4gMCwgRXJyb3IgPT4gJ05vUGVybWlzc2lvbicgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEdldCBjb25maWcgSlNPTiBhbmQgZGVjb2RlIGl0CiAgICAgICAgbXkgJENvbmZpZ0pTT04gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29uZmlnJyApIHx8ICcnOwogICAgICAgIG15ICRDb25maWc7CiAgICAgICAgaWYgKCRDb25maWdKU09OKSB7CiAgICAgICAgICAgIG15ICRKU09OT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKICAgICAgICAgICAgJENvbmZpZyA9ICRKU09OT2JqZWN0LT5EZWNvZGUoIERhdGEgPT4gJENvbmZpZ0pTT04gKTsKICAgICAgICB9CgogICAgICAgIG15ICRTdWNjZXNzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1VcGRhdGUoCiAgICAgICAgICAgIElEICAgICAgICAgID0+ICRHZXRQYXJhbXtJRH0sCiAgICAgICAgICAgIEl0ZW1UeXBlICAgID0+ICRHZXRQYXJhbXtJdGVtVHlwZX0gfHwgJ2NoZWNrYm94JywKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJEdldFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEdldFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgQ29uZmlnICAgICAgPT4gJENvbmZpZywKICAgICAgICAgICAgTGlua1VSTCAgICAgPT4gJEdldFBhcmFte0xpbmtVUkx9LAogICAgICAgICAgICBMaW5rVGV4dCAgICA9PiAkR2V0UGFyYW17TGlua1RleHR9LAogICAgICAgICAgICBJc01hbmRhdG9yeSA9PiAkR2V0UGFyYW17SXNNYW5kYXRvcnl9ID8gMSA6IDAsCiAgICAgICAgICAgIFNvcnRPcmRlciAgID0+ICRHZXRQYXJhbXtTb3J0T3JkZXJ9LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsgU3VjY2VzcyA9PiAkU3VjY2VzcyA/IDEgOiAwIH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgSXRlbSBEZWxldGUgKEFKQVgpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0l0ZW1EZWxldGUnICkgewoKICAgICAgICAjIFNFQ1VSSVRZOiBDU1JGIHByb3RlY3Rpb24gZm9yIHRoaXMgc3RhdGUtY2hhbmdpbmcgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAkSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICk7CgogICAgICAgICMgU2VjdXJpdHk6IFZhbGlkYXRlIElEIGlzIG51bWVyaWMKICAgICAgICBpZiAoICEkSUQgfHwgJElEICF+IC9eXGQrJC8gKSB7CiAgICAgICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+IDAsIEVycm9yID0+ICdJbnZhbGlkSUQnIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBTZWN1cml0eTogQUNMIGNoZWNrIC0gZ2V0IGl0ZW0gdG8gZmluZCB0ZW1wbGF0ZSwgdGhlbiBjaGVjayBwZXJtaXNzaW9uCiAgICAgICAgbXkgJUl0ZW0gPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlSXRlbUdldCggSUQgPT4gJElEICk7CiAgICAgICAgaWYgKCAhJUl0ZW0gfHwgISRTZWxmLT5fVXNlckNhbkVkaXRUZW1wbGF0ZSggVGVtcGxhdGVJRCA9PiAkSXRlbXtUZW1wbGF0ZUlEfSApICkgewogICAgICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgU3VjY2VzcyA9PiAwLCBFcnJvciA9PiAnTm9QZXJtaXNzaW9uJyB9LAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRTdWNjZXNzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1EZWxldGUoCiAgICAgICAgICAgIElEICAgICA9PiAkSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsgU3VjY2VzcyA9PiAkU3VjY2VzcyA/IDEgOiAwIH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgSXRlbSBSZW9yZGVyIChBSkFYKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU3ViYWN0aW9uIGVxICdJdGVtUmVvcmRlcicgKSB7CgogICAgICAgICMgU0VDVVJJVFk6IENTUkYgcHJvdGVjdGlvbiBmb3IgdGhpcyBzdGF0ZS1jaGFuZ2luZyBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRJdGVtc0pTT04gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXRlbXMnICk7CgogICAgICAgIG15ICRTdWNjZXNzID0gMDsKICAgICAgICBpZiAoJEl0ZW1zSlNPTikgewogICAgICAgICAgICBteSAkSlNPTk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyk7CiAgICAgICAgICAgIG15ICRJdGVtcyA9ICRKU09OT2JqZWN0LT5EZWNvZGUoIERhdGEgPT4gJEl0ZW1zSlNPTiApOwoKICAgICAgICAgICAgaWYgKCByZWYgJEl0ZW1zIGVxICdBUlJBWScgJiYgQHskSXRlbXN9ICkgewogICAgICAgICAgICAgICAgIyBTZWN1cml0eTogVmFsaWRhdGUgYWxsIElEcyBhcmUgbnVtZXJpYwogICAgICAgICAgICAgICAgbXkgJEFsbFZhbGlkID0gMTsKICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JEl0ZW1zfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkSXRlbS0+e0lEfSB8fCAkSXRlbS0+e0lEfSAhfiAvXlxkKyQvICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQWxsVmFsaWQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICEkQWxsVmFsaWQgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgU3VjY2VzcyA9PiAwLCBFcnJvciA9PiAnSW52YWxpZElEJyB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgU2VjdXJpdHk6IEFDTCBjaGVjayAtIGdldCBmaXJzdCBpdGVtIHRvIGZpbmQgdGVtcGxhdGUsIHRoZW4gY2hlY2sgcGVybWlzc2lvbgogICAgICAgICAgICAgICAgbXkgJUZpcnN0SXRlbSA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtR2V0KCBJRCA9PiAkSXRlbXMtPlswXS0+e0lEfSApOwogICAgICAgICAgICAgICAgaWYgKCAhJUZpcnN0SXRlbSB8fCAhJFNlbGYtPl9Vc2VyQ2FuRWRpdFRlbXBsYXRlKCBUZW1wbGF0ZUlEID0+ICRGaXJzdEl0ZW17VGVtcGxhdGVJRH0gKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+IDAsIEVycm9yID0+ICdOb1Blcm1pc3Npb24nIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAxOwogICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskSXRlbXN9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRSZXN1bHQgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlSXRlbVJlb3JkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIElEICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgU29ydE9yZGVyID0+ICRJdGVtLT57U29ydE9yZGVyfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiB7IFN1Y2Nlc3MgPT4gJFN1Y2Nlc3MgPyAxIDogMCB9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIE92ZXJ2aWV3IChkZWZhdWx0KQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgcmV0dXJuICRTZWxmLT5fU2hvd092ZXJ2aWV3KCk7Cn0KCnN1YiBfU2hvd092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdFRlbXBsYXRlJyk7CiAgICBteSAkVmFsaWRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgICMgR2V0IHVzZXIncyBSVyBxdWV1ZXMgZm9yIGZpbHRlcmluZwogICAgbXkgQFVzZXJRdWV1ZUlEcyA9ICRTZWxmLT5fR2V0VXNlclJXUXVldWVJRHMoKTsKICAgIG15ICVVc2VyUXVldWVIYXNoID0gbWFwIHsgJF8gPT4gMSB9IEBVc2VyUXVldWVJRHM7CgogICAgbXkgJVRlbXBsYXRlcyA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVMaXN0KCk7CgogICAgIyBGaWx0ZXIgdGVtcGxhdGVzIGJ5IHVzZXIncyBxdWV1ZSBwZXJtaXNzaW9ucwogICAgbXkgJUZpbHRlcmVkVGVtcGxhdGVzOwogICAgZm9yIG15ICRJRCAoIGtleXMgJVRlbXBsYXRlcyApIHsKICAgICAgICBteSBAVGVtcGxhdGVRdWV1ZXMgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlUXVldWVMaXN0KCBUZW1wbGF0ZUlEID0+ICRJRCApOwoKICAgICAgICAjIE9ubHkgc2hvdyB0ZW1wbGF0ZXMgYXNzaWduZWQgdG8gcXVldWVzIHdoZXJlIHVzZXIgaGFzIFJXIGFjY2VzcwogICAgICAgIGlmICggJFNlbGYtPl9IYXNRdWV1ZU92ZXJsYXAoCiAgICAgICAgICAgIFRlbXBsYXRlUXVldWVzID0+IFxAVGVtcGxhdGVRdWV1ZXMsCiAgICAgICAgICAgIFVzZXJRdWV1ZXMgICAgID0+IFxAVXNlclF1ZXVlSURzLAogICAgICAgICkgKSB7CiAgICAgICAgICAgICRGaWx0ZXJlZFRlbXBsYXRlc3skSUR9ID0gJFRlbXBsYXRlc3skSUR9OwogICAgICAgIH0KICAgIH0KCiAgICBmb3IgbXkgJElEICggc29ydCB7ICRGaWx0ZXJlZFRlbXBsYXRlc3skYX0gY21wICRGaWx0ZXJlZFRlbXBsYXRlc3skYn0gfSBrZXlzICVGaWx0ZXJlZFRlbXBsYXRlcyApIHsKICAgICAgICBteSAlVGVtcGxhdGUgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlR2V0KCBJRCA9PiAkSUQgKTsKICAgICAgICBteSBAUXVldWVJRHMgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlUXVldWVMaXN0KCBUZW1wbGF0ZUlEID0+ICRJRCApOwoKICAgICAgICAjIEdldCBxdWV1ZSBuYW1lcwogICAgICAgIG15IEBRdWV1ZU5hbWVzOwogICAgICAgIGZvciBteSAkUXVldWVJRCAoQFF1ZXVlSURzKSB7CiAgICAgICAgICAgIG15ICRRdWV1ZU5hbWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CiAgICAgICAgICAgIHB1c2ggQFF1ZXVlTmFtZXMsICRRdWV1ZU5hbWUgaWYgJFF1ZXVlTmFtZTsKICAgICAgICB9CgogICAgICAgICMgR2V0IGl0ZW0gY291bnQKICAgICAgICBteSBASXRlbXMgPSAkVGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlSXRlbUxpc3QoIFRlbXBsYXRlSUQgPT4gJElEICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZVJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVRlbXBsYXRlLAogICAgICAgICAgICAgICAgVmFsaWQgICAgICA9PiAkVmFsaWRPYmplY3QtPlZhbGlkTG9va3VwKCBWYWxpZElEID0+ICRUZW1wbGF0ZXtWYWxpZElEfSApLAogICAgICAgICAgICAgICAgUXVldWVDb3VudCA9PiBzY2FsYXIgQFF1ZXVlSURzLAogICAgICAgICAgICAgICAgUXVldWVzICAgICA9PiBqb2luKCAnLCAnLCBAUXVldWVOYW1lcyApIHx8ICctJywKICAgICAgICAgICAgICAgIEl0ZW1Db3VudCAgPT4gc2NhbGFyIEBJdGVtcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggISVGaWx0ZXJlZFRlbXBsYXRlcyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9UZW1wbGF0ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50Q2hlY2tsaXN0VGVtcGxhdGUnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIFJlYWRPbmx5ID0+ICRTZWxmLT57UmVhZE9ubHl9LAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9TaG93RWRpdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkVmFsaWRPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CiAgICBteSAkUXVldWVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgIyBQYXNzIFJlYWRPbmx5IGZsYWcgdG8gdGVtcGxhdGUKICAgICRQYXJhbXtSZWFkT25seX0gPSAkU2VsZi0+e1JlYWRPbmx5fTsKCiAgICAjIEJ1aWxkIHZhbGlkIHNlbGVjdGlvbgogICAgbXkgJVZhbGlkTGlzdCA9ICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCk7CiAgICAkUGFyYW17VmFsaWRPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSB8fCAxLAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgQnVpbGQgcXVldWUgc2VsZWN0aW9uICh0cmVlKSAtIG9ubHkgcXVldWVzIHdoZXJlIHVzZXIgaGFzIFJXIHBlcm1pc3Npb24KICAgIG15ICVRdWV1ZUxpc3QgPSAkUXVldWVPYmplY3QtPkdldEFsbFF1ZXVlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgIFZhbGlkICA9PiAxLAogICAgKTsKICAgICRQYXJhbXtRdWV1ZU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICA9PiBcJVF1ZXVlTGlzdCwKICAgICAgICBOYW1lICAgICAgICA9PiAnUXVldWVJRHMnLAogICAgICAgIFNlbGVjdGVkSUQgID0+ICRQYXJhbXtRdWV1ZUlEc30gfHwgW10sCiAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICBTaXplICAgICAgICA9PiAxMCwKICAgICAgICBUcmVlVmlldyAgICA9PiAxLAogICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgICMgUmVuZGVyIFRlbXBsYXRlRm9ybSBibG9jayBmb3IgQWRkL0VkaXQgbW9kZXMKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRm9ybScsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIFNob3cgaXRlbXMgaWYgZWRpdGluZwogICAgaWYgKCAkUGFyYW17QWN0aW9ufSBlcSAnRWRpdCcgJiYgJFBhcmFte0l0ZW1zfSApIHsKICAgICAgICBteSAkSlNPTk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyk7CgogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtJdGVtc30gfSApIHsKICAgICAgICAgICAgIyBFbmNvZGUgY29uZmlnIGFzIEpTT04gZm9yIEphdmFTY3JpcHQKICAgICAgICAgICAgbXkgJENvbmZpZ0pTT04gPSAnJzsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0NvbmZpZ30gJiYgcmVmICRJdGVtLT57Q29uZmlnfSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgICAgICAkQ29uZmlnSlNPTiA9ICRKU09OT2JqZWN0LT5FbmNvZGUoIERhdGEgPT4gJEl0ZW0tPntDb25maWd9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSXRlbVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRJdGVtfSwKICAgICAgICAgICAgICAgICAgICBDb25maWdKU09OICAgICAgID0+ICRDb25maWdKU09OLAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeUNoZWNrZWQgPT4gJEl0ZW0tPntJc01hbmRhdG9yeX0gPyAnY2hlY2tlZD0iY2hlY2tlZCInIDogJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhQHsgJFBhcmFte0l0ZW1zfSB9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05vSXRlbXMnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRDaGVja2xpc3RUZW1wbGF0ZUVkaXQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfU2hvd0FkZEl0ZW0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgQnVpbGQgaXRlbSB0eXBlIHNlbGVjdGlvbgogICAgbXkgJEl0ZW1UeXBlT3B0aW9uID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIGNoZWNrYm94ID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgIHN0YXR1cyAgID0+ICdTdGF0dXMnLAogICAgICAgICAgICB2YWx1ZSAgICA9PiAnVmFsdWUnLAogICAgICAgICAgICByYXRpbmcgICA9PiAnUmF0aW5nJywKICAgICAgICB9LAogICAgICAgIE5hbWUgICAgICAgID0+ICdJdGVtVHlwZScsCiAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJ2NoZWNrYm94JywKICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIFNpZ25hbCBBZGRJdGVtIE1vZGUKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FkZEl0ZW1Nb2RlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBUZW1wbGF0ZU5hbWUgICA9PiAkUGFyYW17VGVtcGxhdGVOYW1lfSwKICAgICAgICAgICAgSXRlbVR5cGVPcHRpb24gPT4gJEl0ZW1UeXBlT3B0aW9uLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudENoZWNrbGlzdFRlbXBsYXRlRWRpdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgTW9kZSAgICAgICAgICAgPT4gJ0FkZEl0ZW0nLAogICAgICAgICAgICBUZW1wbGF0ZUlEICAgICA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFRlbXBsYXRlTmFtZSAgID0+ICRQYXJhbXtUZW1wbGF0ZU5hbWV9LAogICAgICAgICAgICBJdGVtVHlwZU9wdGlvbiA9PiAkSXRlbVR5cGVPcHRpb24sCiAgICAgICAgfSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX1Nob3dFZGl0SXRlbSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja2xpc3RUZW1wbGF0ZScpOwogICAgbXkgJEpTT05PYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKCiAgICAjIEdldCBpdGVtIGRhdGEKICAgIG15ICVJdGVtID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1HZXQoIElEID0+ICRQYXJhbXtJdGVtSUR9ICk7CgogICAgIyBCdWlsZCBpdGVtIHR5cGUgc2VsZWN0aW9uCiAgICBteSAkSXRlbVR5cGVPcHRpb24gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgY2hlY2tib3ggPT4gJ0NoZWNrYm94JywKICAgICAgICAgICAgc3RhdHVzICAgPT4gJ1N0YXR1cycsCiAgICAgICAgICAgIHZhbHVlICAgID0+ICdWYWx1ZScsCiAgICAgICAgICAgIHJhdGluZyAgID0+ICdSYXRpbmcnLAogICAgICAgIH0sCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ0l0ZW1UeXBlJywKICAgICAgICBTZWxlY3RlZElEICA9PiAkSXRlbXtJdGVtVHlwZX0gfHwgJ2NoZWNrYm94JywKICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIEVuY29kZSBjb25maWcgYXMgSlNPTgogICAgbXkgJENvbmZpZ0pTT04gPSAnJzsKICAgIGlmICggJEl0ZW17Q29uZmlnfSAmJiByZWYgJEl0ZW17Q29uZmlnfSBlcSAnSEFTSCcgKSB7CiAgICAgICAgJENvbmZpZ0pTT04gPSAkSlNPTk9iamVjdC0+RW5jb2RlKCBEYXRhID0+ICRJdGVte0NvbmZpZ30gKTsKICAgIH0KCiAgICAjIFNpZ25hbCBFZGl0SXRlbSBNb2RlCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdFZGl0SXRlbU1vZGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBJdGVtSUQgICAgICAgICA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBUZW1wbGF0ZU5hbWUgICA9PiAkUGFyYW17VGVtcGxhdGVOYW1lfSwKICAgICAgICAgICAgSXRlbVR5cGVPcHRpb24gPT4gJEl0ZW1UeXBlT3B0aW9uLAogICAgICAgICAgICBUaXRsZSAgICAgICAgICA9PiAkSXRlbXtUaXRsZX0sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgID0+ICRJdGVte0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgSXRlbVR5cGUgICAgICAgPT4gJEl0ZW17SXRlbVR5cGV9LAogICAgICAgICAgICBJc01hbmRhdG9yeSAgICA9PiAkSXRlbXtJc01hbmRhdG9yeX0sCiAgICAgICAgICAgIExpbmtVUkwgICAgICAgID0+ICRJdGVte0xpbmtVUkx9LAogICAgICAgICAgICBMaW5rVGV4dCAgICAgICA9PiAkSXRlbXtMaW5rVGV4dH0sCiAgICAgICAgICAgIENvbmZpZ0pTT04gICAgID0+ICRDb25maWdKU09OLAogICAgICAgICAgICBTb3J0T3JkZXIgICAgICA9PiAkSXRlbXtTb3J0T3JkZXJ9LAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudENoZWNrbGlzdFRlbXBsYXRlRWRpdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgTW9kZSAgICAgICAgICAgPT4gJ0VkaXRJdGVtJywKICAgICAgICAgICAgSXRlbUlEICAgICAgICAgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVGVtcGxhdGVOYW1lICAgPT4gJFBhcmFte1RlbXBsYXRlTmFtZX0sCiAgICAgICAgICAgIEl0ZW1UeXBlT3B0aW9uID0+ICRJdGVtVHlwZU9wdGlvbiwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfWE1MRW5jb2RlIHsKICAgIG15ICggJFNlbGYsICRTdHJpbmcgKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhZGVmaW5lZCAkU3RyaW5nOwoKICAgICMgRW5jb2RlIFhNTCBzcGVjaWFsIGNoYXJhY3RlcnMKICAgICRTdHJpbmcgPX4gcy8mLyZhbXA7L2c7CiAgICAkU3RyaW5nID1+IHMvPC8mbHQ7L2c7CiAgICAkU3RyaW5nID1+IHMvPi8mZ3Q7L2c7CiAgICAkU3RyaW5nID1+IHMvIi8mcXVvdDsvZzsKICAgICRTdHJpbmcgPX4gcy8nLyZhcG9zOy9nOwoKICAgIHJldHVybiAkU3RyaW5nOwp9CgpzdWIgX1hNTERlY29kZSB7CiAgICBteSAoICRTZWxmLCAkU3RyaW5nICkgPSBAXzsKCiAgICByZXR1cm4gJycgaWYgIWRlZmluZWQgJFN0cmluZzsKCiAgICAjIERlY29kZSBYTUwgc3BlY2lhbCBjaGFyYWN0ZXJzCiAgICAkU3RyaW5nID1+IHMvJmFwb3M7LycvZzsKICAgICRTdHJpbmcgPX4gcy8mcXVvdDsvIi9nOwogICAgJFN0cmluZyA9fiBzLyZndDsvPi9nOwogICAgJFN0cmluZyA9fiBzLyZsdDsvPC9nOwogICAgJFN0cmluZyA9fiBzLyZhbXA7LyYvZzsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKc3ViIF9JbXBvcnRUZW1wbGF0ZUZyb21YTUwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkWE1MQ29udGVudCA9ICRQYXJhbXtYTUxDb250ZW50fTsKICAgIG15ICRVc2VySUQgICAgID0gJFBhcmFte1VzZXJJRH07CgogICAgcmV0dXJuIHsgU3VjY2VzcyA9PiAwLCBNZXNzYWdlID0+ICdObyBYTUwgY29udGVudCBwcm92aWRlZCcgfSBpZiAhJFhNTENvbnRlbnQ7CgogICAgbXkgJFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdFRlbXBsYXRlJyk7CiAgICBteSAkUXVldWVPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRWYWxpZE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwogICAgbXkgJEpTT05PYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKCiAgICAjIFNpbXBsZSBYTUwgcGFyc2luZyAobm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzKQogICAgbXkgJVRlbXBsYXRlRGF0YTsKICAgIG15IEBJdGVtczsKICAgIG15IEBRdWV1ZU5hbWVzOwoKICAgICMgRXh0cmFjdCB0ZW1wbGF0ZSBuYW1lCiAgICBpZiAoICRYTUxDb250ZW50ID1+IG17PE5hbWU+KC4rPyk8L05hbWU+fXMgKSB7CiAgICAgICAgJFRlbXBsYXRlRGF0YXtOYW1lfSA9ICRTZWxmLT5fWE1MRGVjb2RlKCQxKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiB7IFN1Y2Nlc3MgPT4gMCwgTWVzc2FnZSA9PiAnTm8gdGVtcGxhdGUgbmFtZSBmb3VuZCBpbiBYTUwnIH07CiAgICB9CgogICAgIyBFeHRyYWN0IGRlc2NyaXB0aW9uCiAgICBpZiAoICRYTUxDb250ZW50ID1+IG17PERlc2NyaXB0aW9uPiguKz8pPC9EZXNjcmlwdGlvbj59cyApIHsKICAgICAgICAkVGVtcGxhdGVEYXRhe0Rlc2NyaXB0aW9ufSA9ICRTZWxmLT5fWE1MRGVjb2RlKCQxKTsKICAgIH0KCiAgICAjIEV4dHJhY3QgbGluayBVUkwKICAgIGlmICggJFhNTENvbnRlbnQgPX4gbXs8TGlua1VSTD4oLis/KTwvTGlua1VSTD59cyApIHsKICAgICAgICAkVGVtcGxhdGVEYXRhe0xpbmtVUkx9ID0gJFNlbGYtPl9YTUxEZWNvZGUoJDEpOwogICAgfQoKICAgICMgRXh0cmFjdCBsaW5rIHRleHQKICAgIGlmICggJFhNTENvbnRlbnQgPX4gbXs8TGlua1RleHQ+KC4rPyk8L0xpbmtUZXh0Pn1zICkgewogICAgICAgICRUZW1wbGF0ZURhdGF7TGlua1RleHR9ID0gJFNlbGYtPl9YTUxEZWNvZGUoJDEpOwogICAgfQoKICAgICMgRXh0cmFjdCB2YWxpZCBzdGF0ZQogICAgaWYgKCAkWE1MQ29udGVudCA9fiBtezxWYWxpZD4oLis/KTwvVmFsaWQ+fXMgKSB7CiAgICAgICAgbXkgJFZhbGlkTmFtZSA9ICRTZWxmLT5fWE1MRGVjb2RlKCQxKTsKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFZhbGlkT2JqZWN0LT5WYWxpZExpc3QoKTsKICAgICAgICBteSAlVmFsaWRSZXZlcnNlID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwogICAgICAgICRUZW1wbGF0ZURhdGF7VmFsaWRJRH0gPSAkVmFsaWRSZXZlcnNleyRWYWxpZE5hbWV9IHx8IDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkVGVtcGxhdGVEYXRhe1ZhbGlkSUR9ID0gMTsKICAgIH0KCiAgICAjIEV4dHJhY3QgcXVldWVzCiAgICBpZiAoICRYTUxDb250ZW50ID1+IG17PFF1ZXVlcz4oLis/KTwvUXVldWVzPn1zICkgewogICAgICAgIG15ICRRdWV1ZXNCbG9jayA9ICQxOwogICAgICAgIHdoaWxlICggJFF1ZXVlc0Jsb2NrID1+IG17PFF1ZXVlPiguKz8pPC9RdWV1ZT59c2cgKSB7CiAgICAgICAgICAgIHB1c2ggQFF1ZXVlTmFtZXMsICRTZWxmLT5fWE1MRGVjb2RlKCQxKTsKICAgICAgICB9CiAgICB9CgogICAgIyBFeHRyYWN0IGl0ZW1zCiAgICBpZiAoICRYTUxDb250ZW50ID1+IG17PEl0ZW1zPiguKz8pPC9JdGVtcz59cyApIHsKICAgICAgICBteSAkSXRlbXNCbG9jayA9ICQxOwogICAgICAgIHdoaWxlICggJEl0ZW1zQmxvY2sgPX4gbXs8SXRlbT4oLis/KTwvSXRlbT59c2cgKSB7CiAgICAgICAgICAgIG15ICRJdGVtWE1MID0gJDE7CiAgICAgICAgICAgIG15ICVJdGVtOwoKICAgICAgICAgICAgaWYgKCAkSXRlbVhNTCA9fiBtezxUaXRsZT4oLis/KTwvVGl0bGU+fXMgKSB7CiAgICAgICAgICAgICAgICAkSXRlbXtUaXRsZX0gPSAkU2VsZi0+X1hNTERlY29kZSgkMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkSXRlbVhNTCA9fiBtezxEZXNjcmlwdGlvbj4oLis/KTwvRGVzY3JpcHRpb24+fXMgKSB7CiAgICAgICAgICAgICAgICAkSXRlbXtEZXNjcmlwdGlvbn0gPSAkU2VsZi0+X1hNTERlY29kZSgkMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkSXRlbVhNTCA9fiBtezxJdGVtVHlwZT4oLis/KTwvSXRlbVR5cGU+fXMgKSB7CiAgICAgICAgICAgICAgICAkSXRlbXtJdGVtVHlwZX0gPSAkU2VsZi0+X1hNTERlY29kZSgkMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkSXRlbVhNTCA9fiBtezxJc01hbmRhdG9yeT4oLis/KTwvSXNNYW5kYXRvcnk+fXMgKSB7CiAgICAgICAgICAgICAgICAkSXRlbXtJc01hbmRhdG9yeX0gPSAkMSBlcSAnMScgPyAxIDogMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRJdGVtWE1MID1+IG17PFNvcnRPcmRlcj4oLis/KTwvU29ydE9yZGVyPn1zICkgewogICAgICAgICAgICAgICAgJEl0ZW17U29ydE9yZGVyfSA9IGludCgkMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkSXRlbVhNTCA9fiBtezxMaW5rVVJMPiguKz8pPC9MaW5rVVJMPn1zICkgewogICAgICAgICAgICAgICAgJEl0ZW17TGlua1VSTH0gPSAkU2VsZi0+X1hNTERlY29kZSgkMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkSXRlbVhNTCA9fiBtezxMaW5rVGV4dD4oLis/KTwvTGlua1RleHQ+fXMgKSB7CiAgICAgICAgICAgICAgICAkSXRlbXtMaW5rVGV4dH0gPSAkU2VsZi0+X1hNTERlY29kZSgkMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkSXRlbVhNTCA9fiBtezxDb25maWc+KC4rPyk8L0NvbmZpZz59cyApIHsKICAgICAgICAgICAgICAgIG15ICRDb25maWdKU09OID0gJFNlbGYtPl9YTUxEZWNvZGUoJDEpOwogICAgICAgICAgICAgICAgaWYgKCRDb25maWdKU09OKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW17Q29uZmlnfSA9ICRKU09OT2JqZWN0LT5EZWNvZGUoIERhdGEgPT4gJENvbmZpZ0pTT04gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBASXRlbXMsIFwlSXRlbSBpZiAkSXRlbXtUaXRsZX07CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgaWYgdGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIGFkZCBzdWZmaXggaWYgc28KICAgIG15ICVFeGlzdGluZ1RlbXBsYXRlcyA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVMaXN0KCk7CiAgICBteSAlTmFtZUV4aXN0cyA9IG1hcCB7ICRfID0+IDEgfSB2YWx1ZXMgJUV4aXN0aW5nVGVtcGxhdGVzOwogICAgbXkgJE9yaWdpbmFsTmFtZSA9ICRUZW1wbGF0ZURhdGF7TmFtZX07CiAgICBteSAkQ291bnRlciA9IDE7CiAgICB3aGlsZSAoICROYW1lRXhpc3RzeyAkVGVtcGxhdGVEYXRhe05hbWV9IH0gKSB7CiAgICAgICAgJFRlbXBsYXRlRGF0YXtOYW1lfSA9ICRPcmlnaW5hbE5hbWUgLiAnIChJbXBvcnQgJyAuICRDb3VudGVyIC4gJyknOwogICAgICAgICRDb3VudGVyKys7CiAgICB9CgogICAgIyBDcmVhdGUgdGVtcGxhdGUKICAgIG15ICRUZW1wbGF0ZUlEID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgICAgICBOYW1lICAgICAgICA9PiAkVGVtcGxhdGVEYXRhe05hbWV9LAogICAgICAgIERlc2NyaXB0aW9uID0+ICRUZW1wbGF0ZURhdGF7RGVzY3JpcHRpb259IHx8ICcnLAogICAgICAgIExpbmtVUkwgICAgID0+ICRUZW1wbGF0ZURhdGF7TGlua1VSTH0gfHwgJycsCiAgICAgICAgTGlua1RleHQgICAgPT4gJFRlbXBsYXRlRGF0YXtMaW5rVGV4dH0gfHwgJycsCiAgICAgICAgVmFsaWRJRCAgICAgPT4gJFRlbXBsYXRlRGF0YXtWYWxpZElEfSwKICAgICAgICBVc2VySUQgICAgICA9PiAkVXNlcklELAogICAgKTsKCiAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICByZXR1cm4geyBTdWNjZXNzID0+IDAsIE1lc3NhZ2UgPT4gJ0NvdWxkIG5vdCBjcmVhdGUgdGVtcGxhdGUnIH07CiAgICB9CgogICAgIyBBc3NpZ24gcXVldWVzCiAgICBteSBAUXVldWVJRHM7CiAgICBmb3IgbXkgJFF1ZXVlTmFtZSAoQFF1ZXVlTmFtZXMpIHsKICAgICAgICBteSAkUXVldWVJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRRdWV1ZU5hbWUgKTsKICAgICAgICBwdXNoIEBRdWV1ZUlEcywgJFF1ZXVlSUQgaWYgJFF1ZXVlSUQ7CiAgICB9CiAgICBpZiAoQFF1ZXVlSURzKSB7CiAgICAgICAgJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVF1ZXVlU2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBRdWV1ZUlEcyAgID0+IFxAUXVldWVJRHMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwogICAgfQoKICAgICMgQWRkIGl0ZW1zCiAgICBmb3IgbXkgJEl0ZW0gKEBJdGVtcykgewogICAgICAgICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtQWRkKAogICAgICAgICAgICBUZW1wbGF0ZUlEICA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgSXRlbVR5cGUgICAgPT4gJEl0ZW0tPntJdGVtVHlwZX0gfHwgJ2NoZWNrYm94JywKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJEl0ZW0tPntUaXRsZX0sCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259IHx8ICcnLAogICAgICAgICAgICBDb25maWcgICAgICA9PiAkSXRlbS0+e0NvbmZpZ30sCiAgICAgICAgICAgIExpbmtVUkwgICAgID0+ICRJdGVtLT57TGlua1VSTH0gfHwgJycsCiAgICAgICAgICAgIExpbmtUZXh0ICAgID0+ICRJdGVtLT57TGlua1RleHR9IHx8ICcnLAogICAgICAgICAgICBJc01hbmRhdG9yeSA9PiAkSXRlbS0+e0lzTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICBTb3J0T3JkZXIgICA9PiAkSXRlbS0+e1NvcnRPcmRlcn0gfHwgMCwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFVzZXJJRCwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyAgICAgID0+IDEsCiAgICAgICAgVGVtcGxhdGVJRCAgID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFRlbXBsYXRlTmFtZSA9PiAkVGVtcGxhdGVEYXRhe05hbWV9LAogICAgfTsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFF1ZXVlLWJhc2VkIHBlcm1pc3Npb24gaGVscGVyIGZ1bmN0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgo9aGVhZDIgX0dldFVzZXJSV1F1ZXVlSURzKCkKCkdldCBsaXN0IG9mIHF1ZXVlIElEcyB3aGVyZSB0aGUgY3VycmVudCB1c2VyIGhhcyBSVyBwZXJtaXNzaW9uLgoKICAgIG15IEBRdWV1ZUlEcyA9ICRTZWxmLT5fR2V0VXNlclJXUXVldWVJRHMoKTsKCj1jdXQKCnN1YiBfR2V0VXNlclJXUXVldWVJRHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICBteSAlUXVldWVzID0gJFF1ZXVlT2JqZWN0LT5HZXRBbGxRdWV1ZXMoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICBWYWxpZCAgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIGtleXMgJVF1ZXVlczsKfQoKPWhlYWQyIF9IYXNRdWV1ZU92ZXJsYXAoKQoKQ2hlY2sgaWYgdGhlcmUgaXMgYW55IG92ZXJsYXAgYmV0d2VlbiB0ZW1wbGF0ZSBxdWV1ZXMgYW5kIHVzZXIgcXVldWVzLgoKICAgIG15ICRIYXNPdmVybGFwID0gJFNlbGYtPl9IYXNRdWV1ZU92ZXJsYXAoCiAgICAgICAgVGVtcGxhdGVRdWV1ZXMgPT4gXEBUZW1wbGF0ZVF1ZXVlSURzLAogICAgICAgIFVzZXJRdWV1ZXMgICAgID0+IFxAVXNlclF1ZXVlSURzLAogICAgKTsKCj1jdXQKCnN1YiBfSGFzUXVldWVPdmVybGFwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRlbXBsYXRlUXVldWVzID0gJFBhcmFte1RlbXBsYXRlUXVldWVzfSB8fCBbXTsKICAgIG15ICRVc2VyUXVldWVzICAgICA9ICRQYXJhbXtVc2VyUXVldWVzfSB8fCBbXTsKCiAgICByZXR1cm4gMCBpZiAhQHskVGVtcGxhdGVRdWV1ZXN9IHx8ICFAeyRVc2VyUXVldWVzfTsKCiAgICBteSAlVXNlclF1ZXVlSGFzaCA9IG1hcCB7ICRfID0+IDEgfSBAeyRVc2VyUXVldWVzfTsKCiAgICBmb3IgbXkgJFF1ZXVlSUQgKCBAeyRUZW1wbGF0ZVF1ZXVlc30gKSB7CiAgICAgICAgcmV0dXJuIDEgaWYgJFVzZXJRdWV1ZUhhc2h7JFF1ZXVlSUR9OwogICAgfQoKICAgIHJldHVybiAwOwp9Cgo9aGVhZDIgX1VzZXJDYW5FZGl0VGVtcGxhdGUoKQoKQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgcGVybWlzc2lvbiB0byBlZGl0IGEgdGVtcGxhdGUuClVzZXIgbmVlZHMgUlcgYWNjZXNzIHRvIGF0IGxlYXN0IG9uZSBxdWV1ZSB0aGF0IHRoZSB0ZW1wbGF0ZSBpcyBhc3NpZ25lZCB0by4KCiAgICBteSAkQ2FuRWRpdCA9ICRTZWxmLT5fVXNlckNhbkVkaXRUZW1wbGF0ZSggVGVtcGxhdGVJRCA9PiAkSUQgKTsKCj1jdXQKCnN1YiBfVXNlckNhbkVkaXRUZW1wbGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUZW1wbGF0ZUlEID0gJFBhcmFte1RlbXBsYXRlSUR9OwogICAgcmV0dXJuIDAgaWYgISRUZW1wbGF0ZUlEOwoKICAgIG15ICRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja2xpc3RUZW1wbGF0ZScpOwoKICAgIG15IEBUZW1wbGF0ZVF1ZXVlcyA9ICRUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVRdWV1ZUxpc3QoIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQgKTsKCiAgICAjIFRlbXBsYXRlIHdpdGhvdXQgcXVldWVzOiBub3QgZWRpdGFibGUgKHNpbmNlIHF1ZXVlcyBhcmUgbWFuZGF0b3J5KQogICAgcmV0dXJuIDAgaWYgIUBUZW1wbGF0ZVF1ZXVlczsKCiAgICBteSBAVXNlclF1ZXVlSURzID0gJFNlbGYtPl9HZXRVc2VyUldRdWV1ZUlEcygpOwoKICAgIHJldHVybiAkU2VsZi0+X0hhc1F1ZXVlT3ZlcmxhcCgKICAgICAgICBUZW1wbGF0ZVF1ZXVlcyA9PiBcQFRlbXBsYXRlUXVldWVzLAogICAgICAgIFVzZXJRdWV1ZXMgICAgID0+IFxAVXNlclF1ZXVlSURzLAogICAgKTsKfQoKMTsK</File>
        <File Permission="660" Location="Kernel/Modules/AgentTicketChecklist.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0Q2hlY2tsaXN0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwp1c2UgSlNPTjsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0Q2hlY2tsaXN0IC0gQWdlbnQgbW9kdWxlIGZvciB0aWNrZXQgY2hlY2tsaXN0cwoKPWhlYWQxIERFU0NSSVBUSU9OCgpBZ2VudCBpbnRlcmZhY2UgZm9yIG1hbmFnaW5nIGNoZWNrbGlzdHMgb24gdGlja2V0cy4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkUGFyYW1PYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJENoZWNrbGlzdE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja2xpc3QnKTsKICAgIG15ICRUZW1wbGF0ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0VGVtcGxhdGUnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkU3ViYWN0aW9uID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1YmFjdGlvbicgKSB8fCAnJzsKICAgIG15ICRUaWNrZXRJRCAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnICk7CgogICAgIyBTZWN1cml0eTogVmFsaWRhdGUgVGlja2V0SUQgaXMgbnVtZXJpYwogICAgaWYgKCAkVGlja2V0SUQgJiYgJFRpY2tldElEICF+IC9eXGQrJC8gKSB7CiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsgU3VjY2VzcyA9PiAwLCBFcnJvciA9PiAnSW52YWxpZElEJyB9LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgQ2hlY2sgdGlja2V0IHBlcm1pc3Npb24KICAgIGlmICgkVGlja2V0SUQpIHsKICAgICAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3J3JywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgQUpBWDogQWRkIGNoZWNrbGlzdCBmcm9tIHRlbXBsYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTdWJhY3Rpb24gZXEgJ0FkZENoZWNrbGlzdCcgKSB7CgogICAgICAgICMgU0VDVVJJVFk6IENTUkYgcHJvdGVjdGlvbiBmb3IgdGhpcyBzdGF0ZS1jaGFuZ2luZyBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgU2VjdXJpdHk6IFZhbGlkYXRlIFRlbXBsYXRlSUQgaXMgbnVtZXJpYwogICAgICAgIGlmICggISRUZW1wbGF0ZUlEIHx8ICRUZW1wbGF0ZUlEICF+IC9eXGQrJC8gKSB7CiAgICAgICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+IDAsIEVycm9yID0+ICdJbnZhbGlkSUQnIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJENoZWNrbGlzdElEID0gJENoZWNrbGlzdE9iamVjdC0+Q2hlY2tsaXN0QWRkKAogICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgID0+ICRDaGVja2xpc3RJRCA/IDEgOiAwLAogICAgICAgICAgICAgICAgQ2hlY2tsaXN0SUQgPT4gJENoZWNrbGlzdElELAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEFKQVg6IFJlbW92ZSBjaGVja2xpc3QKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFN1YmFjdGlvbiBlcSAnUmVtb3ZlQ2hlY2tsaXN0JyApIHsKCiAgICAgICAgIyBTRUNVUklUWTogQ1NSRiBwcm90ZWN0aW9uIGZvciB0aGlzIHN0YXRlLWNoYW5naW5nIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJENoZWNrbGlzdElEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoZWNrbGlzdElEJyApOwoKICAgICAgICAjIFNlY3VyaXR5OiBWYWxpZGF0ZSBDaGVja2xpc3RJRCBpcyBudW1lcmljCiAgICAgICAgaWYgKCAhJENoZWNrbGlzdElEIHx8ICRDaGVja2xpc3RJRCAhfiAvXlxkKyQvICkgewogICAgICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgU3VjY2VzcyA9PiAwLCBFcnJvciA9PiAnSW52YWxpZElEJyB9LAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU0VDVVJJVFk6IHZlcmlmeSB0aGlzIGNoZWNrbGlzdCBhY3R1YWxseSBiZWxvbmdzIHRvIGEgdGlja2V0IHRoZQogICAgICAgICMgYWdlbnQgaGFzIHJ3IGFjY2VzcyB0byAobm90IGp1c3QgdGhlIGNsaWVudC1zdXBwbGllZCBUaWNrZXRJRCkuCiAgICAgICAgcmV0dXJuICRTZWxmLT5fQWNjZXNzRGVuaWVkSlNPTigpCiAgICAgICAgICAgIGlmICEkU2VsZi0+X1ZlcmlmeUNoZWNrbGlzdEFjY2VzcyggQ2hlY2tsaXN0SUQgPT4gJENoZWNrbGlzdElEICk7CgogICAgICAgIG15ICRTdWNjZXNzID0gJENoZWNrbGlzdE9iamVjdC0+Q2hlY2tsaXN0RGVsZXRlKAogICAgICAgICAgICBJRCAgICAgPT4gJENoZWNrbGlzdElELAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiB7IFN1Y2Nlc3MgPT4gJFN1Y2Nlc3MgPyAxIDogMCB9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEFKQVg6IFNldCBpdGVtIHN0YXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ1NldEl0ZW1TdGF0ZScgKSB7CgogICAgICAgICMgU0VDVVJJVFk6IENTUkYgcHJvdGVjdGlvbiBmb3IgdGhpcyBzdGF0ZS1jaGFuZ2luZyBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRJdGVtSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXRlbUlEJyApOwogICAgICAgIG15ICRTdGF0ZSAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RhdGUnICk7CgogICAgICAgICMgU2VjdXJpdHk6IFZhbGlkYXRlIEl0ZW1JRCBpcyBudW1lcmljCiAgICAgICAgaWYgKCAhJEl0ZW1JRCB8fCAkSXRlbUlEICF+IC9eXGQrJC8gKSB7CiAgICAgICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+IDAsIEVycm9yID0+ICdJbnZhbGlkSUQnIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBTRUNVUklUWTogdmVyaWZ5IHRoaXMgaXRlbSBhY3R1YWxseSBiZWxvbmdzIHRvIGEgdGlja2V0IHRoZQogICAgICAgICMgYWdlbnQgaGFzIHJ3IGFjY2VzcyB0byAobm90IGp1c3QgdGhlIGNsaWVudC1zdXBwbGllZCBUaWNrZXRJRCkuCiAgICAgICAgcmV0dXJuICRTZWxmLT5fQWNjZXNzRGVuaWVkSlNPTigpCiAgICAgICAgICAgIGlmICEkU2VsZi0+X1ZlcmlmeUl0ZW1BY2Nlc3MoIEl0ZW1JRCA9PiAkSXRlbUlEICk7CgogICAgICAgIG15ICRTdWNjZXNzID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbVNldFN0YXRlKAogICAgICAgICAgICBJRCAgICAgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgU3RhdGUgID0+ICRTdGF0ZSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIEdldCB1cGRhdGVkIHByb2dyZXNzCiAgICAgICAgbXkgJUl0ZW0gPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtR2V0KCBJRCA9PiAkSXRlbUlEICk7CiAgICAgICAgbXkgJVByb2dyZXNzID0gKCk7CiAgICAgICAgaWYgKCAkSXRlbXtDaGVja2xpc3RJRH0gKSB7CiAgICAgICAgICAgICVQcm9ncmVzcyA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdFByb2dyZXNzKCBDaGVja2xpc3RJRCA9PiAkSXRlbXtDaGVja2xpc3RJRH0gKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICA9PiAkU3VjY2VzcyA/IDEgOiAwLAogICAgICAgICAgICAgICAgUHJvZ3Jlc3MgPT4gXCVQcm9ncmVzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBBSkFYOiBBZGQgY3VzdG9tIGl0ZW0KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFN1YmFjdGlvbiBlcSAnQWRkSXRlbScgKSB7CgogICAgICAgICMgU0VDVVJJVFk6IENTUkYgcHJvdGVjdGlvbiBmb3IgdGhpcyBzdGF0ZS1jaGFuZ2luZyBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRDaGVja2xpc3RJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDaGVja2xpc3RJRCcgKTsKICAgICAgICBteSAkVGl0bGUgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGl0bGUnICk7CiAgICAgICAgbXkgJERlc2NyaXB0aW9uID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc2NyaXB0aW9uJyApOwogICAgICAgIG15ICRJdGVtVHlwZSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJdGVtVHlwZScgKSB8fCAnY2hlY2tib3gnOwogICAgICAgIG15ICRDb25maWdKU09OICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb25maWcnICkgfHwgJ3t9JzsKICAgICAgICBteSAkTGlua1VSTCAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTGlua1VSTCcgKTsKICAgICAgICBteSAkTGlua1RleHQgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTGlua1RleHQnICk7CgogICAgICAgICMgU2VjdXJpdHk6IFZhbGlkYXRlIENoZWNrbGlzdElEIGlzIG51bWVyaWMKICAgICAgICBpZiAoICEkQ2hlY2tsaXN0SUQgfHwgJENoZWNrbGlzdElEICF+IC9eXGQrJC8gKSB7CiAgICAgICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+IDAsIEVycm9yID0+ICdJbnZhbGlkSUQnIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBTRUNVUklUWTogdmVyaWZ5IHRoaXMgY2hlY2tsaXN0IGFjdHVhbGx5IGJlbG9uZ3MgdG8gYSB0aWNrZXQgdGhlCiAgICAgICAgIyBhZ2VudCBoYXMgcncgYWNjZXNzIHRvIChub3QganVzdCB0aGUgY2xpZW50LXN1cHBsaWVkIFRpY2tldElEKS4KICAgICAgICByZXR1cm4gJFNlbGYtPl9BY2Nlc3NEZW5pZWRKU09OKCkKICAgICAgICAgICAgaWYgISRTZWxmLT5fVmVyaWZ5Q2hlY2tsaXN0QWNjZXNzKCBDaGVja2xpc3RJRCA9PiAkQ2hlY2tsaXN0SUQgKTsKCiAgICAgICAgIyBQYXJzZSBjb25maWcgSlNPTgogICAgICAgIG15ICRDb25maWcgPSB7fTsKICAgICAgICBpZiAoJENvbmZpZ0pTT04pIHsKICAgICAgICAgICAgZXZhbCB7CiAgICAgICAgICAgICAgICAkQ29uZmlnID0gZGVjb2RlX2pzb24oJENvbmZpZ0pTT04pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoJEApIHsKICAgICAgICAgICAgICAgICRDb25maWcgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEl0ZW1JRCA9ICRDaGVja2xpc3RPYmplY3QtPkl0ZW1BZGQoCiAgICAgICAgICAgIENoZWNrbGlzdElEID0+ICRDaGVja2xpc3RJRCwKICAgICAgICAgICAgSXRlbVR5cGUgICAgPT4gJEl0ZW1UeXBlLAogICAgICAgICAgICBUaXRsZSAgICAgICA9PiAkVGl0bGUsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICREZXNjcmlwdGlvbiwKICAgICAgICAgICAgQ29uZmlnICAgICAgPT4gJENvbmZpZywKICAgICAgICAgICAgTGlua1VSTCAgICAgPT4gJExpbmtVUkwsCiAgICAgICAgICAgIExpbmtUZXh0ICAgID0+ICRMaW5rVGV4dCwKICAgICAgICAgICAgSXNNYW5kYXRvcnkgPT4gMCwKICAgICAgICAgICAgU3RhdGUgICAgICAgPT4gJ29wZW4nLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gJEl0ZW1JRCA/IDEgOiAwLAogICAgICAgICAgICAgICAgSXRlbUlEICA9PiAkSXRlbUlELAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEFKQVg6IERlbGV0ZSBpdGVtCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0RlbGV0ZUl0ZW0nICkgewoKICAgICAgICAjIFNFQ1VSSVRZOiBDU1JGIHByb3RlY3Rpb24gZm9yIHRoaXMgc3RhdGUtY2hhbmdpbmcgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAkSXRlbUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0l0ZW1JRCcgKTsKCiAgICAgICAgIyBTZWN1cml0eTogVmFsaWRhdGUgSXRlbUlEIGlzIG51bWVyaWMKICAgICAgICBpZiAoICEkSXRlbUlEIHx8ICRJdGVtSUQgIX4gL15cZCskLyApIHsKICAgICAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFN1Y2Nlc3MgPT4gMCwgRXJyb3IgPT4gJ0ludmFsaWRJRCcgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFNFQ1VSSVRZOiB2ZXJpZnkgdGhpcyBpdGVtIGFjdHVhbGx5IGJlbG9uZ3MgdG8gYSB0aWNrZXQgdGhlCiAgICAgICAgIyBhZ2VudCBoYXMgcncgYWNjZXNzIHRvIChub3QganVzdCB0aGUgY2xpZW50LXN1cHBsaWVkIFRpY2tldElEKS4KICAgICAgICByZXR1cm4gJFNlbGYtPl9BY2Nlc3NEZW5pZWRKU09OKCkKICAgICAgICAgICAgaWYgISRTZWxmLT5fVmVyaWZ5SXRlbUFjY2VzcyggSXRlbUlEID0+ICRJdGVtSUQgKTsKCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtRGVsZXRlKAogICAgICAgICAgICBJRCAgICAgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+ICRTdWNjZXNzID8gMSA6IDAgfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBBSkFYOiBTZXQgaXRlbSB2YWx1ZSAoZm9yIHZhbHVlL3N0YXR1cy9yYXRpbmcgdHlwZXMpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ1NldEl0ZW1WYWx1ZScgKSB7CgogICAgICAgICMgU0VDVVJJVFk6IENTUkYgcHJvdGVjdGlvbiBmb3IgdGhpcyBzdGF0ZS1jaGFuZ2luZyBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRJdGVtSUQgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXRlbUlEJyApOwogICAgICAgIG15ICRJdGVtVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXRlbVZhbHVlJyApOwoKICAgICAgICAjIFNlY3VyaXR5OiBWYWxpZGF0ZSBJdGVtSUQgaXMgbnVtZXJpYwogICAgICAgIGlmICggISRJdGVtSUQgfHwgJEl0ZW1JRCAhfiAvXlxkKyQvICkgewogICAgICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgU3VjY2VzcyA9PiAwLCBFcnJvciA9PiAnSW52YWxpZElEJyB9LAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgU0VDVVJJVFk6IHZlcmlmeSB0aGlzIGl0ZW0gYWN0dWFsbHkgYmVsb25ncyB0byBhIHRpY2tldCB0aGUKICAgICAgICAjIGFnZW50IGhhcyBydyBhY2Nlc3MgdG8gKG5vdCBqdXN0IHRoZSBjbGllbnQtc3VwcGxpZWQgVGlja2V0SUQpLgogICAgICAgIHJldHVybiAkU2VsZi0+X0FjY2Vzc0RlbmllZEpTT04oKQogICAgICAgICAgICBpZiAhJFNlbGYtPl9WZXJpZnlJdGVtQWNjZXNzKCBJdGVtSUQgPT4gJEl0ZW1JRCApOwoKICAgICAgICBteSAkU3VjY2VzcyA9ICRDaGVja2xpc3RPYmplY3QtPkl0ZW1TZXRWYWx1ZSgKICAgICAgICAgICAgSUQgICAgICAgID0+ICRJdGVtSUQsCiAgICAgICAgICAgIEl0ZW1WYWx1ZSA9PiAkSXRlbVZhbHVlLAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgR2V0IHVwZGF0ZWQgcHJvZ3Jlc3MKICAgICAgICBteSAlSXRlbSA9ICRDaGVja2xpc3RPYmplY3QtPkl0ZW1HZXQoIElEID0+ICRJdGVtSUQgKTsKICAgICAgICBteSAlUHJvZ3Jlc3MgPSAoKTsKICAgICAgICBpZiAoICRJdGVte0NoZWNrbGlzdElEfSApIHsKICAgICAgICAgICAgJVByb2dyZXNzID0gJENoZWNrbGlzdE9iamVjdC0+Q2hlY2tsaXN0UHJvZ3Jlc3MoIENoZWNrbGlzdElEID0+ICRJdGVte0NoZWNrbGlzdElEfSApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgID0+ICRTdWNjZXNzID8gMSA6IDAsCiAgICAgICAgICAgICAgICBQcm9ncmVzcyA9PiBcJVByb2dyZXNzLAogICAgICAgICAgICAgICAgTmV3U3RhdGUgPT4gJEl0ZW17U3RhdGV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEFKQVg6IFNldCBpdGVtIHJlbWFya3MKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFN1YmFjdGlvbiBlcSAnU2V0SXRlbVJlbWFya3MnICkgewoKICAgICAgICAjIFNFQ1VSSVRZOiBDU1JGIHByb3RlY3Rpb24gZm9yIHRoaXMgc3RhdGUtY2hhbmdpbmcgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSAkSXRlbUlEICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJdGVtSUQnICk7CiAgICAgICAgbXkgJFJlbWFya3MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUmVtYXJrcycgKTsKCiAgICAgICAgIyBTZWN1cml0eTogVmFsaWRhdGUgSXRlbUlEIGlzIG51bWVyaWMKICAgICAgICBpZiAoICEkSXRlbUlEIHx8ICRJdGVtSUQgIX4gL15cZCskLyApIHsKICAgICAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7IFN1Y2Nlc3MgPT4gMCwgRXJyb3IgPT4gJ0ludmFsaWRJRCcgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIFNFQ1VSSVRZOiB2ZXJpZnkgdGhpcyBpdGVtIGFjdHVhbGx5IGJlbG9uZ3MgdG8gYSB0aWNrZXQgdGhlCiAgICAgICAgIyBhZ2VudCBoYXMgcncgYWNjZXNzIHRvIChub3QganVzdCB0aGUgY2xpZW50LXN1cHBsaWVkIFRpY2tldElEKS4KICAgICAgICByZXR1cm4gJFNlbGYtPl9BY2Nlc3NEZW5pZWRKU09OKCkKICAgICAgICAgICAgaWYgISRTZWxmLT5fVmVyaWZ5SXRlbUFjY2VzcyggSXRlbUlEID0+ICRJdGVtSUQgKTsKCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtU2V0UmVtYXJrcygKICAgICAgICAgICAgSUQgICAgICA9PiAkSXRlbUlELAogICAgICAgICAgICBSZW1hcmtzID0+ICRSZW1hcmtzLAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+ICRTdWNjZXNzID8gMSA6IDAgfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBBSkFYOiBHZXQgd2lkZ2V0IGNvbnRlbnQgKGZvciBzaWRlYmFyIHJlZnJlc2gpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ1dpZGdldENvbnRlbnQnICkgewogICAgICAgIG15ICRDb250ZW50ID0gJFNlbGYtPl9SZW5kZXJXaWRnZXRDb250ZW50KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICAgICAgICAgIEhUTUwgICAgPT4gJENvbnRlbnQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgRGVmYXVsdDogU2hvdyB2aWV3IGJhc2VkIG9uIE1vZGUgcGFyYW1ldGVyCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBteSAkTW9kZSAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTW9kZScgKSB8fCAnJzsKICAgIG15ICRDaGVja2xpc3RJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDaGVja2xpc3RJRCcgKTsKCiAgICBpZiAoICRNb2RlIGVxICdFZGl0JyAmJiAkQ2hlY2tsaXN0SUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd0VkaXRWaWV3KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQsIENoZWNrbGlzdElEID0+ICRDaGVja2xpc3RJRCApOwogICAgfQogICAgZWxzaWYgKCAkTW9kZSBlcSAnQWRkSXRlbScgJiYgJENoZWNrbGlzdElEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X1Nob3dBZGRJdGVtVmlldyggVGlja2V0SUQgPT4gJFRpY2tldElELCBDaGVja2xpc3RJRCA9PiAkQ2hlY2tsaXN0SUQgKTsKICAgIH0KICAgIGVsc2lmICggJE1vZGUgZXEgJ01hbmFnZScgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd01hbmFnZVZpZXcoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwogICAgfQoKICAgICMgRmFsbGJhY2s6IFNob3cgZnVsbCBjaGVja2xpc3QgdmlldyAoYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpCiAgICByZXR1cm4gJFNlbGYtPl9TaG93Q2hlY2tsaXN0VmlldyggVGlja2V0SUQgPT4gJFRpY2tldElEICk7Cn0KCnN1YiBfU2hvd0NoZWNrbGlzdFZpZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENoZWNrbGlzdE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja2xpc3QnKTsKICAgIG15ICRUZW1wbGF0ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0VGVtcGxhdGUnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkVGlja2V0SUQgPSAkUGFyYW17VGlja2V0SUR9OwoKICAgICMgR2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgR2V0IGNoZWNrbGlzdHMgZm9yIHRoaXMgdGlja2V0CiAgICBteSBAQ2hlY2tsaXN0cyA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdExpc3QoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwoKICAgICMgR2V0IGF2YWlsYWJsZSB0ZW1wbGF0ZXMgZm9yIHRpY2tldCdzIHF1ZXVlCiAgICBteSAlQXZhaWxhYmxlVGVtcGxhdGVzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICk7CgogICAgIyBHZXQgaXRlbSBzdGF0ZXMgY29uZmlnCiAgICBteSAkSXRlbVN0YXRlcyA9ICRDb25maWdPYmplY3QtPkdldCgnQ2hlY2tsaXN0OjpJdGVtU3RhdGVzJykgfHwge307CgogICAgIyBTaWduYWwgRGVmYXVsdCBNb2RlCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdEZWZhdWx0TW9kZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIFRpY2tldElEICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBSZW5kZXIgY2hlY2tsaXN0cwogICAgZm9yIG15ICRDaGVja2xpc3QgKEBDaGVja2xpc3RzKSB7CiAgICAgICAgbXkgQEl0ZW1zID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbUxpc3QoIENoZWNrbGlzdElEID0+ICRDaGVja2xpc3QtPntJRH0gKTsKCiAgICAgICAgIyBDYWxjdWxhdGUgcHJvZ3Jlc3MgcGVyY2VudGFnZQogICAgICAgIG15ICRQcm9ncmVzc1BlcmNlbnQgPSAwOwogICAgICAgIGlmICggJENoZWNrbGlzdC0+e1RvdGFsSXRlbXN9ICYmICRDaGVja2xpc3QtPntUb3RhbEl0ZW1zfSA+IDAgKSB7CiAgICAgICAgICAgICRQcm9ncmVzc1BlcmNlbnQgPSBpbnQoICggJENoZWNrbGlzdC0+e0NvbXBsZXRlZEl0ZW1zfSAvICRDaGVja2xpc3QtPntUb3RhbEl0ZW1zfSApICogMTAwICk7CiAgICAgICAgfQoKICAgICAgICAjIFJlbmRlciBjaGVja2xpc3QgYmxvY2sgRklSU1QgKHBhcmVudCBjb250YWluZXIpCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NoZWNrbGlzdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskQ2hlY2tsaXN0fSwKICAgICAgICAgICAgICAgIFByb2dyZXNzUGVyY2VudCA9PiAkUHJvZ3Jlc3NQZXJjZW50LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgVGhlbiByZW5kZXIgaXRlbSBibG9ja3MgKG5lc3RlZCBpbnNpZGUgQ2hlY2tsaXN0KQogICAgICAgIGZvciBteSAkSXRlbSAoQEl0ZW1zKSB7CiAgICAgICAgICAgICRJdGVtLT57U3RhdGVOYW1lfSA9ICRJdGVtU3RhdGVzLT57ICRJdGVtLT57U3RhdGV9IH0gfHwgJEl0ZW0tPntTdGF0ZX07CgogICAgICAgICAgICAjIFByb2Nlc3MgdHlwZS1zcGVjaWZpYyBkaXNwbGF5IGRhdGEKICAgICAgICAgICAgJFNlbGYtPl9Qcm9jZXNzSXRlbUZvckRpc3BsYXkoIEl0ZW0gPT4gJEl0ZW0sIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0ICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NoZWNrbGlzdEl0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgQ2hlY2tsaXN0SUQgPT4gJENoZWNrbGlzdC0+e0lEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIUBDaGVja2xpc3RzICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0NoZWNrbGlzdHMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBCdWlsZCB0ZW1wbGF0ZSBzZWxlY3Rpb24KICAgIG15ICRUZW1wbGF0ZU9wdGlvbiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJUF2YWlsYWJsZVRlbXBsYXRlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RlbXBsYXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Q2hlY2tsaXN0JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFRpY2tldE51bWJlciAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVGVtcGxhdGVPcHRpb24gPT4gJFRlbXBsYXRlT3B0aW9uLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX1Nob3dFZGl0VmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ2hlY2tsaXN0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdCcpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRUaWNrZXRJRCAgICA9ICRQYXJhbXtUaWNrZXRJRH07CiAgICBteSAkQ2hlY2tsaXN0SUQgPSAkUGFyYW17Q2hlY2tsaXN0SUR9OwoKICAgICMgR2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgR2V0IGNoZWNrbGlzdAogICAgbXkgJUNoZWNrbGlzdCA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdEdldCggSUQgPT4gJENoZWNrbGlzdElEICk7CgogICAgIyBHZXQgcHJvZ3Jlc3MgaW5mbyAoQ2hlY2tsaXN0R2V0IGRvZXNuJ3QgaW5jbHVkZSBwcm9ncmVzcyBkYXRhKQogICAgbXkgJVByb2dyZXNzID0gJENoZWNrbGlzdE9iamVjdC0+Q2hlY2tsaXN0UHJvZ3Jlc3MoIENoZWNrbGlzdElEID0+ICRDaGVja2xpc3RJRCApOwogICAgJENoZWNrbGlzdHtUb3RhbEl0ZW1zfSAgICAgPSAkUHJvZ3Jlc3N7VG90YWxJdGVtc307CiAgICAkQ2hlY2tsaXN0e0NvbXBsZXRlZEl0ZW1zfSA9ICRQcm9ncmVzc3tDb21wbGV0ZWRJdGVtc307CiAgICAkQ2hlY2tsaXN0e01hbmRhdG9yeUl0ZW1zfSA9ICRQcm9ncmVzc3tNYW5kYXRvcnlJdGVtc307CiAgICAkQ2hlY2tsaXN0e01hbmRhdG9yeURvbmV9ICA9ICRQcm9ncmVzc3tNYW5kYXRvcnlEb25lfTsKICAgICRDaGVja2xpc3R7SXNDb21wbGV0ZX0gICAgID0gJFByb2dyZXNze0lzQ29tcGxldGV9OwoKICAgICMgR2V0IGl0ZW1zIGZvciB0aGlzIGNoZWNrbGlzdAogICAgbXkgQEl0ZW1zID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbUxpc3QoIENoZWNrbGlzdElEID0+ICRDaGVja2xpc3RJRCApOwoKICAgICMgR2V0IGl0ZW0gc3RhdGVzIGNvbmZpZwogICAgbXkgJEl0ZW1TdGF0ZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoZWNrbGlzdDo6SXRlbVN0YXRlcycpIHx8IHt9OwoKICAgICMgU2lnbmFsIEVkaXQgTW9kZQogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRWRpdE1vZGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFRpY2tldE51bWJlciAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgQ2hlY2tsaXN0SUQgICAgPT4gJENoZWNrbGlzdElELAogICAgICAgICAgICBDaGVja2xpc3ROYW1lICA9PiAkQ2hlY2tsaXN0e05hbWV9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgQ2FsY3VsYXRlIHByb2dyZXNzIHBlcmNlbnRhZ2UKICAgIG15ICRQcm9ncmVzc1BlcmNlbnQgPSAwOwogICAgaWYgKCAkQ2hlY2tsaXN0e1RvdGFsSXRlbXN9ICYmICRDaGVja2xpc3R7VG90YWxJdGVtc30gPiAwICkgewogICAgICAgICRQcm9ncmVzc1BlcmNlbnQgPSBpbnQoICggJENoZWNrbGlzdHtDb21wbGV0ZWRJdGVtc30gLyAkQ2hlY2tsaXN0e1RvdGFsSXRlbXN9ICkgKiAxMDAgKTsKICAgIH0KCiAgICAjIFJlbmRlciBjaGVja2xpc3QgYmxvY2sKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NoZWNrbGlzdCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVDaGVja2xpc3QsCiAgICAgICAgICAgIFByb2dyZXNzUGVyY2VudCA9PiAkUHJvZ3Jlc3NQZXJjZW50LAogICAgICAgIH0sCiAgICApOwoKICAgICMgUmVuZGVyIGl0ZW1zCiAgICBmb3IgbXkgJEl0ZW0gKEBJdGVtcykgewogICAgICAgICRJdGVtLT57U3RhdGVOYW1lfSA9ICRJdGVtU3RhdGVzLT57ICRJdGVtLT57U3RhdGV9IH0gfHwgJEl0ZW0tPntTdGF0ZX07CgogICAgICAgICMgUHJvY2VzcyB0eXBlLXNwZWNpZmljIGRpc3BsYXkgZGF0YQogICAgICAgICRTZWxmLT5fUHJvY2Vzc0l0ZW1Gb3JEaXNwbGF5KCBJdGVtID0+ICRJdGVtLCBMYXlvdXRPYmplY3QgPT4gJExheW91dE9iamVjdCApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2hlY2tsaXN0SXRlbScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskSXRlbX0sCiAgICAgICAgICAgICAgICBDaGVja2xpc3RJRCA9PiAkQ2hlY2tsaXN0SUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRDaGVja2xpc3QnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBUaWNrZXROdW1iZXIgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgQ2hlY2tsaXN0SUQgICA9PiAkQ2hlY2tsaXN0SUQsCiAgICAgICAgICAgIENoZWNrbGlzdE5hbWUgPT4gJENoZWNrbGlzdHtOYW1lfSwKICAgICAgICB9LAogICAgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9TaG93TWFuYWdlVmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ2hlY2tsaXN0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdCcpOwogICAgbXkgJFRlbXBsYXRlT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja2xpc3RUZW1wbGF0ZScpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICBteSAkVGlja2V0SUQgPSAkUGFyYW17VGlja2V0SUR9OwoKICAgICMgR2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgR2V0IGNoZWNrbGlzdHMgZm9yIHRoaXMgdGlja2V0CiAgICBteSBAQ2hlY2tsaXN0cyA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdExpc3QoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwoKICAgICMgR2V0IGF2YWlsYWJsZSB0ZW1wbGF0ZXMgZm9yIHRpY2tldCdzIHF1ZXVlCiAgICBteSAlQXZhaWxhYmxlVGVtcGxhdGVzID0gJFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICk7CgogICAgIyBCdWlsZCB0ZW1wbGF0ZSBzZWxlY3Rpb24KICAgIG15ICRUZW1wbGF0ZU9wdGlvbiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcJUF2YWlsYWJsZVRlbXBsYXRlcywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RlbXBsYXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgIyBTaWduYWwgTWFuYWdlIE1vZGUKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ01hbmFnZU1vZGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFRpY2tldE51bWJlciAgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVGVtcGxhdGVPcHRpb24gPT4gJFRlbXBsYXRlT3B0aW9uLAogICAgICAgIH0sCiAgICApOwoKICAgICMgUmVuZGVyIGFzc2lnbmVkIGNoZWNrbGlzdHMgKG5hbWUgb25seSwgZm9yIHJlbW92YWwpCiAgICBmb3IgbXkgJENoZWNrbGlzdCAoQENoZWNrbGlzdHMpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWFuYWdlQ2hlY2tsaXN0JywKICAgICAgICAgICAgRGF0YSA9PiAkQ2hlY2tsaXN0LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAhQENoZWNrbGlzdHMgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vQ2hlY2tsaXN0c01hbmFnZScsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRDaGVja2xpc3QnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVGlja2V0TnVtYmVyICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBUZW1wbGF0ZU9wdGlvbiA9PiAkVGVtcGxhdGVPcHRpb24sCiAgICAgICAgfSwKICAgICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBfUmVuZGVyV2lkZ2V0Q29udGVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ2hlY2tsaXN0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdCcpOwoKICAgIG15IEBDaGVja2xpc3RzID0gJENoZWNrbGlzdE9iamVjdC0+Q2hlY2tsaXN0TGlzdCggVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSApOwogICAgbXkgJEhhc0NoZWNrbGlzdHMgPSAwOwoKICAgIGZvciBteSAkQ2hlY2tsaXN0IChAQ2hlY2tsaXN0cykgewogICAgICAgICRIYXNDaGVja2xpc3RzID0gMTsKCiAgICAgICAgIyBDYWxjdWxhdGUgcHJvZ3Jlc3MgcGVyY2VudGFnZQogICAgICAgIG15ICRQcm9ncmVzc1BlcmNlbnQgPSAwOwogICAgICAgIGlmICggJENoZWNrbGlzdC0+e1RvdGFsSXRlbXN9ID4gMCApIHsKICAgICAgICAgICAgJFByb2dyZXNzUGVyY2VudCA9IGludCggKCAkQ2hlY2tsaXN0LT57Q29tcGxldGVkSXRlbXN9IC8gJENoZWNrbGlzdC0+e1RvdGFsSXRlbXN9ICkgKiAxMDAgKTsKICAgICAgICB9CgogICAgICAgICMgUmVuZGVyIGNoZWNrbGlzdCBibG9jayAobm8gaXRlbXMgLSBzaW1wbGlmaWVkIHdpZGdldCkKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnV2lkZ2V0Q2hlY2tsaXN0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRDaGVja2xpc3R9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBQcm9ncmVzc1BlcmNlbnQgPT4gJFByb2dyZXNzUGVyY2VudCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggISRIYXNDaGVja2xpc3RzICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0NoZWNrbGlzdHMnLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Wm9vbS9DaGVja2xpc3RXaWRnZXRDb250ZW50JywKICAgICAgICBEYXRhICAgICAgICAgPT4geyBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9IH0sCiAgICApOwp9CgpzdWIgX1Byb2Nlc3NJdGVtRm9yRGlzcGxheSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRJdGVtICAgICAgICAgPSAkUGFyYW17SXRlbX07CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJFBhcmFte0xheW91dE9iamVjdH07CgogICAgIyBFbnN1cmUgSXRlbVR5cGUgaGFzIGEgZGVmYXVsdAogICAgJEl0ZW0tPntJdGVtVHlwZX0gfHw9ICdjaGVja2JveCc7CgogICAgIyBDb252ZXJ0IENvbmZpZyBoYXNoIHRvIEpTT04gc3RyaW5nIGZvciBKYXZhU2NyaXB0CiAgICBpZiAoIHJlZiAkSXRlbS0+e0NvbmZpZ30gZXEgJ0hBU0gnICkgewogICAgICAgIG15ICRKU09OT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkpTT04nKTsKICAgICAgICAkSXRlbS0+e0NvbmZpZ0pTT059ID0gJEpTT05PYmplY3QtPkVuY29kZSggRGF0YSA9PiAkSXRlbS0+e0NvbmZpZ30gKTsKCiAgICAgICAgIyBFeHRyYWN0IGNvbW1vbmx5IHVzZWQgY29uZmlnIHZhbHVlcyBmb3IgdGVtcGxhdGUKICAgICAgICAkSXRlbS0+e0NvbmZpZ1VuaXR9ICAgICAgPSAkSXRlbS0+e0NvbmZpZ30tPnt1bml0fSB8fCAnJzsKICAgICAgICAkSXRlbS0+e0NvbmZpZ1RhcmdldH0gICAgPSAkSXRlbS0+e0NvbmZpZ30tPnt0YXJnZXRWYWx1ZX0gLy8gJyc7CiAgICAgICAgJEl0ZW0tPntDb25maWdUb2xlcmFuY2V9ID0gJEl0ZW0tPntDb25maWd9LT57dG9sZXJhbmNlfSAvLyAnJzsKICAgICAgICAkSXRlbS0+e0NvbmZpZ1NjYWxlfSAgICAgPSAkSXRlbS0+e0NvbmZpZ30tPntzY2FsZX0gfHwgNTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRJdGVtLT57Q29uZmlnSlNPTn0gICAgICA9ICd7fSc7CiAgICAgICAgJEl0ZW0tPntDb25maWdVbml0fSAgICAgID0gJyc7CiAgICAgICAgJEl0ZW0tPntDb25maWdUYXJnZXR9ICAgID0gJyc7CiAgICAgICAgJEl0ZW0tPntDb25maWdUb2xlcmFuY2V9ID0gJyc7CiAgICAgICAgJEl0ZW0tPntDb25maWdTY2FsZX0gICAgID0gNTsKICAgIH0KCiAgICAjIEJ1aWxkIHN0YXR1cyBvcHRpb25zIEhUTUwgZm9yIHN0YXR1cyB0eXBlCiAgICBpZiAoICRJdGVtLT57SXRlbVR5cGV9IGVxICdzdGF0dXMnICYmIHJlZiAkSXRlbS0+e0NvbmZpZ30gZXEgJ0hBU0gnICYmICRJdGVtLT57Q29uZmlnfS0+e29wdGlvbnN9ICkgewogICAgICAgIG15IEBPcHRpb25zID0gQHsgJEl0ZW0tPntDb25maWd9LT57b3B0aW9uc30gfTsKICAgICAgICBteSAkQ3VycmVudFZhbHVlID0gJEl0ZW0tPntJdGVtVmFsdWV9IHx8ICcnOwogICAgICAgIG15ICRPcHRpb25zSFRNTCA9ICcnOwoKICAgICAgICBmb3IgbXkgJE9wdGlvbiAoQE9wdGlvbnMpIHsKICAgICAgICAgICAgbXkgJFNlbGVjdGVkID0gKCAkQ3VycmVudFZhbHVlIGVxICRPcHRpb24gKSA/ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIicgOiAnJzsKICAgICAgICAgICAgbXkgJEVzY2FwZWRPcHRpb24gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcHRpb24gKTsKICAgICAgICAgICAgJE9wdGlvbnNIVE1MIC49IHFxezxvcHRpb24gdmFsdWU9IiRFc2NhcGVkT3B0aW9uIiRTZWxlY3RlZD4kRXNjYXBlZE9wdGlvbjwvb3B0aW9uPlxufTsKICAgICAgICB9CiAgICAgICAgJEl0ZW0tPntTdGF0dXNPcHRpb25zfSA9ICRPcHRpb25zSFRNTDsKICAgIH0KCiAgICAjIEJ1aWxkIHJhdGluZyBzdGFycyBIVE1MIGZvciByYXRpbmcgdHlwZQogICAgaWYgKCAkSXRlbS0+e0l0ZW1UeXBlfSBlcSAncmF0aW5nJyApIHsKICAgICAgICBteSAkU2NhbGUgPSAkSXRlbS0+e0NvbmZpZ1NjYWxlfSB8fCA1OwogICAgICAgIG15ICRDdXJyZW50VmFsdWUgPSAkSXRlbS0+e0l0ZW1WYWx1ZX0gfHwgMDsKICAgICAgICBteSAkU3RhcnNIVE1MID0gJyc7CgogICAgICAgICMgR2V0IGxhYmVscyBmcm9tIGNvbmZpZwogICAgICAgIG15IEBMYWJlbHM7CiAgICAgICAgaWYgKCByZWYgJEl0ZW0tPntDb25maWd9IGVxICdIQVNIJyAmJiAkSXRlbS0+e0NvbmZpZ30tPntsYWJlbHN9ICkgewogICAgICAgICAgICBATGFiZWxzID0gQHsgJEl0ZW0tPntDb25maWd9LT57bGFiZWxzfSB9OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRpICggMSAuLiAkU2NhbGUgKSB7CiAgICAgICAgICAgIG15ICRTdGFyQ2xhc3MgPSAoICRpIDw9ICRDdXJyZW50VmFsdWUgKSA/ICdmYSBmYS1zdGFyJyA6ICdmYSBmYS1zdGFyLW8nOwogICAgICAgICAgICAjIE1hcmsgdGhlIGFjdGl2ZSBzdGFyIChjdXJyZW50IHZhbHVlKSBmb3IgcmVzZXQgaW5kaWNhdG9yCiAgICAgICAgICAgIG15ICRBY3RpdmVDbGFzcyA9ICggJGkgPT0gJEN1cnJlbnRWYWx1ZSAmJiAkQ3VycmVudFZhbHVlID4gMCApID8gJyBhY3RpdmUtc3RhcicgOiAnJzsKICAgICAgICAgICAgIyBHZXQgbGFiZWwgZm9yIHRoaXMgc3RhciAoaW5kZXggaXMgaS0xKQogICAgICAgICAgICBteSAkTGFiZWwgPSAoICRpIC0gMSA8IHNjYWxhciBATGFiZWxzICkgPyAkTGFiZWxzWyAkaSAtIDEgXSA6ICcnOwogICAgICAgICAgICBteSAkVGl0bGUgPSAkTGFiZWwgPyAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICIkaSAtICRMYWJlbCIgKSA6ICRpOwogICAgICAgICAgICAkU3RhcnNIVE1MIC49IHFxezxhIGhyZWY9IiMiIGNsYXNzPSJSYXRpbmdTdGFyJEFjdGl2ZUNsYXNzIiBkYXRhLXZhbHVlPSIkaSIgdGl0bGU9IiRUaXRsZSI+PGkgY2xhc3M9IiRTdGFyQ2xhc3MiPjwvaT48L2E+fTsKICAgICAgICB9CiAgICAgICAgJEl0ZW0tPntSYXRpbmdTdGFyc30gPSAkU3RhcnNIVE1MOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX1Nob3dBZGRJdGVtVmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ2hlY2tsaXN0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdCcpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICBteSAkVGlja2V0SUQgICAgPSAkUGFyYW17VGlja2V0SUR9OwogICAgbXkgJENoZWNrbGlzdElEID0gJFBhcmFte0NoZWNrbGlzdElEfTsKCiAgICAjIEdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIEdldCBjaGVja2xpc3QKICAgIG15ICVDaGVja2xpc3QgPSAkQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3RHZXQoIElEID0+ICRDaGVja2xpc3RJRCApOwoKICAgICMgQnVpbGQgaXRlbSB0eXBlIHNlbGVjdGlvbgogICAgbXkgJEl0ZW1UeXBlT3B0aW9uID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIGNoZWNrYm94ID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgIHN0YXR1cyAgID0+ICdTdGF0dXMnLAogICAgICAgICAgICB2YWx1ZSAgICA9PiAnVmFsdWUnLAogICAgICAgICAgICByYXRpbmcgICA9PiAnUmF0aW5nJywKICAgICAgICB9LAogICAgICAgIE5hbWUgICAgICAgID0+ICdJdGVtVHlwZScsCiAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJ2NoZWNrYm94JywKICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgIENsYXNzICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAjIFNpZ25hbCBBZGRJdGVtIE1vZGUKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FkZEl0ZW1Nb2RlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBUaWNrZXROdW1iZXIgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIENoZWNrbGlzdElEICAgID0+ICRDaGVja2xpc3RJRCwKICAgICAgICAgICAgQ2hlY2tsaXN0TmFtZSAgPT4gJENoZWNrbGlzdHtOYW1lfSwKICAgICAgICAgICAgSXRlbVR5cGVPcHRpb24gPT4gJEl0ZW1UeXBlT3B0aW9uLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldENoZWNrbGlzdCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBUaWNrZXROdW1iZXIgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIENoZWNrbGlzdElEICAgID0+ICRDaGVja2xpc3RJRCwKICAgICAgICAgICAgQ2hlY2tsaXN0TmFtZSAgPT4gJENoZWNrbGlzdHtOYW1lfSwKICAgICAgICAgICAgSXRlbVR5cGVPcHRpb24gPT4gJEl0ZW1UeXBlT3B0aW9uLAogICAgICAgIH0sCiAgICApOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9Cgo9aGVhZDIgX1ZlcmlmeUNoZWNrbGlzdEFjY2VzcygpCgpTRUNVUklUWTogUnVuKCkgb25seSBjaGVja3MgVGlja2V0UGVybWlzc2lvbiBmb3IgdGhlIGNsaWVudC1zdXBwbGllZApUaWNrZXRJRCBwYXJhbSwgbmV2ZXIgYWdhaW5zdCB0aGUgQ2hlY2tsaXN0SUQvSXRlbUlEIGFjdHVhbGx5IGJlaW5nCmFjdGVkIG9uLiBXaXRob3V0IHRoaXMsIGFuIGFnZW50IHdpdGggcncgb24gQU5ZIHRpY2tldCBjb3VsZCBwYXNzIGFuCkl0ZW1JRC9DaGVja2xpc3RJRCBiZWxvbmdpbmcgdG8gYSB0aWNrZXQgdGhleSBoYXZlIG5vIGFjY2VzcyB0byAoZS5nLiBhCmNvbmZpZGVudGlhbCBxdWV1ZSkgYW5kIHJlYWQvbW9kaWZ5L2RlbGV0ZSBpdHMgY2hlY2tsaXN0IGRhdGEuIFJlc29sdmVzCnRoZSBjaGVja2xpc3QncyByZWFsIFRpY2tldElEIGFuZCByZS1jaGVja3MgcGVybWlzc2lvbiBhZ2FpbnN0IHRoYXQuCgogICAgbXkgJFRpY2tldElEID0gJFNlbGYtPl9WZXJpZnlDaGVja2xpc3RBY2Nlc3MoIENoZWNrbGlzdElEID0+IDQ1NiApOwogICAgIyByZXR1cm5zIHRoZSByZWFsIFRpY2tldElEIG9uIHN1Y2Nlc3MsIHVuZGVmIGlmIG5vdCBmb3VuZCBvciBkZW5pZWQKCj1jdXQKCnN1YiBfVmVyaWZ5Q2hlY2tsaXN0QWNjZXNzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENoZWNrbGlzdE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja2xpc3QnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgcmV0dXJuIGlmICEkUGFyYW17Q2hlY2tsaXN0SUR9OwoKICAgIG15ICVDaGVja2xpc3QgPSAkQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3RHZXQoIElEID0+ICRQYXJhbXtDaGVja2xpc3RJRH0gKTsKICAgIHJldHVybiBpZiAhJENoZWNrbGlzdHtUaWNrZXRJRH07CgogICAgbXkgJEFjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJ3J3JywKICAgICAgICBUaWNrZXRJRCA9PiAkQ2hlY2tsaXN0e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgcmV0dXJuIGlmICEkQWNjZXNzOwoKICAgIHJldHVybiAkQ2hlY2tsaXN0e1RpY2tldElEfTsKfQoKPWhlYWQyIF9WZXJpZnlJdGVtQWNjZXNzKCkKClNhbWUgYXMgX1ZlcmlmeUNoZWNrbGlzdEFjY2VzcygpLCBidXQgc3RhcnRpbmcgZnJvbSBhbiBJdGVtSUQgKHJlc29sdmVzCkl0ZW0gLT4gQ2hlY2tsaXN0IC0+IFRpY2tldElEKS4KCj1jdXQKCnN1YiBfVmVyaWZ5SXRlbUFjY2VzcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDaGVja2xpc3RPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0Jyk7CgogICAgcmV0dXJuIGlmICEkUGFyYW17SXRlbUlEfTsKCiAgICBteSAlSXRlbSA9ICRDaGVja2xpc3RPYmplY3QtPkl0ZW1HZXQoIElEID0+ICRQYXJhbXtJdGVtSUR9ICk7CiAgICByZXR1cm4gaWYgISRJdGVte0NoZWNrbGlzdElEfTsKCiAgICByZXR1cm4gJFNlbGYtPl9WZXJpZnlDaGVja2xpc3RBY2Nlc3MoIENoZWNrbGlzdElEID0+ICRJdGVte0NoZWNrbGlzdElEfSApOwp9Cgo9aGVhZDIgX0FjY2Vzc0RlbmllZEpTT04oKQoKUmV0dXJuIHRoZSBzdGFuZGFyZCAiYWNjZXNzIGRlbmllZCIgSlNPTiBlcnJvciByZXNwb25zZSwgbWF0Y2hpbmcgdGhlCmV4aXN0aW5nIEludmFsaWRJRCBlcnJvciByZXNwb25zZSBwYXR0ZXJuIHVzZWQgdGhyb3VnaG91dCB0aGlzIG1vZHVsZS4KCj1jdXQKCnN1YiBfQWNjZXNzRGVuaWVkSlNPTiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgIERhdGEgPT4geyBTdWNjZXNzID0+IDAsIEVycm9yID0+ICdBY2Nlc3NEZW5pZWQnIH0sCiAgICApOwogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKMTsK</File>

        <!-- Output modules -->
        <File Permission="660" Location="Kernel/Output/HTML/TicketZoom/ChecklistWidget.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0Wm9vbTo6Q2hlY2tsaXN0V2lkZ2V0OwoKdXNlIHBhcmVudCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkJhc2UnOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0Wm9vbTo6Q2hlY2tsaXN0V2lkZ2V0IC0gU2lkZWJhciB3aWRnZXQgZm9yIGNoZWNrbGlzdHMKCj1oZWFkMSBERVNDUklQVElPTgoKRGlzcGxheXMgYSBjb21wYWN0IGNoZWNrbGlzdCB3aWRnZXQgaW4gdGhlIHRpY2tldCB6b29tIHNpZGViYXIuCgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDaGVja2xpc3RPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkVGlja2V0SUQgPSAkUGFyYW17VGlja2V0fS0+e1RpY2tldElEfTsKCiAgICAjIEdldCBjaGVja2xpc3RzIGZvciB0aGlzIHRpY2tldAogICAgbXkgQENoZWNrbGlzdHMgPSAkQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3RMaXN0KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKCiAgICBteSAkSXRlbVN0YXRlcyA9ICRDb25maWdPYmplY3QtPkdldCgnQ2hlY2tsaXN0OjpJdGVtU3RhdGVzJykgfHwge307CiAgICBteSAkSGFzSW5jb21wbGV0ZSA9IDA7CgogICAgIyBSZW5kZXIgZWFjaCBjaGVja2xpc3QgaWYgYW55IGV4aXN0CiAgICBpZiAoQENoZWNrbGlzdHMpIHsKICAgICAgICBmb3IgbXkgJENoZWNrbGlzdCAoQENoZWNrbGlzdHMpIHsKICAgICAgICAgICAgbXkgQEl0ZW1zID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbUxpc3QoIENoZWNrbGlzdElEID0+ICRDaGVja2xpc3QtPntJRH0gKTsKCiAgICAgICAgICAgICMgQ2FsY3VsYXRlIHByb2dyZXNzIHBlcmNlbnRhZ2UKICAgICAgICAgICAgbXkgJFByb2dyZXNzUGVyY2VudCA9IDA7CiAgICAgICAgICAgIGlmICggJENoZWNrbGlzdC0+e1RvdGFsSXRlbXN9ID4gMCApIHsKICAgICAgICAgICAgICAgICRQcm9ncmVzc1BlcmNlbnQgPSBpbnQoICggJENoZWNrbGlzdC0+e0NvbXBsZXRlZEl0ZW1zfSAvICRDaGVja2xpc3QtPntUb3RhbEl0ZW1zfSApICogMTAwICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgUmVuZGVyIGNoZWNrbGlzdCBibG9jayBGSVJTVCAocGFyZW50IGNvbnRhaW5lcikKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdXaWRnZXRDaGVja2xpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskQ2hlY2tsaXN0fSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFByb2dyZXNzUGVyY2VudCA9PiAkUHJvZ3Jlc3NQZXJjZW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVGhlbiByZW5kZXIgaXRlbSBibG9ja3MgKG5lc3RlZCBpbnNpZGUgV2lkZ2V0Q2hlY2tsaXN0KQogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKEBJdGVtcykgewogICAgICAgICAgICAgICAgbXkgJFN0YXRlQ2xhc3MgPSAnb3Blbic7CiAgICAgICAgICAgICAgICBpZiAoICRJdGVtLT57U3RhdGV9IGVxICdkb25lJyApIHsKICAgICAgICAgICAgICAgICAgICAkU3RhdGVDbGFzcyA9ICdkb25lJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEl0ZW0tPntTdGF0ZX0gZXEgJ25vdF9hcHBsaWNhYmxlJyApIHsKICAgICAgICAgICAgICAgICAgICAkU3RhdGVDbGFzcyA9ICduYSc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnV2lkZ2V0SXRlbScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7JEl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICBDaGVja2xpc3RJRCA9PiAkQ2hlY2tsaXN0LT57SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZUNsYXNzICA9PiAkU3RhdGVDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVOYW1lICAgPT4gJEl0ZW1TdGF0ZXMtPnsgJEl0ZW0tPntTdGF0ZX0gfSB8fCAkSXRlbS0+e1N0YXRlfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaGVjayBpZiBpbmNvbXBsZXRlCiAgICAgICAgICAgIGlmICggISRDaGVja2xpc3QtPntJc0NvbXBsZXRlfSApIHsKICAgICAgICAgICAgICAgICRIYXNJbmNvbXBsZXRlID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICMgU2hvdyAibm8gY2hlY2tsaXN0cyIgbWVzc2FnZQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0NoZWNrbGlzdHMnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Wm9vbS9DaGVja2xpc3RXaWRnZXQnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBIYXNJbmNvbXBsZXRlID0+ICRIYXNJbmNvbXBsZXRlLAogICAgICAgIH0sCiAgICApOwoKICAgICMgR2V0IHJhbmsgZnJvbSBjb25maWcgb3IgdXNlIGRlZmF1bHQKICAgIG15ICRDb25maWcgPSAkUGFyYW17Q29uZmlnfSB8fCB7fTsKICAgIG15ICRSYW5rID0gJENvbmZpZy0+e1Jhbmt9IHx8ICcwNDAwJzsKCiAgICByZXR1cm4gewogICAgICAgIExvY2F0aW9uID0+ICdTaWRlYmFyJywKICAgICAgICBPdXRwdXQgICA9PiAkT3V0cHV0LAogICAgICAgIFJhbmsgICAgID0+ICRSYW5rLAogICAgfTsKfQoKMTsK</File>

        <!-- Templates -->
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/AgentChecklistTemplate.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKWyUgU0VUIFJlYWRPbmx5ID0gRGF0YS5SZWFkT25seSAlXQoKPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCBBY3Rpb25zU2lkZUJhciBBZG1pbk1hbmFnZW1lbnQiPgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiBBY3Rpb25zU2lkZUJhckNvbXAiPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBY3Rpb25zIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KWyUgSUYgIVJlYWRPbmx5ICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249QWRkIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIgQ3JlYXRlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPlslIFRyYW5zbGF0ZSgiQWRkIFRlbXBsYXRlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJJbXBvcnRUZW1wbGF0ZUJ1dHRvbiIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS11cGxvYWQiPjwvaT5bJSBUcmFuc2xhdGUoIkltcG9ydCBUZW1wbGF0ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9IkltcG9ydFRlbXBsYXRlRmlsZSIgYWNjZXB0PSIueG1sIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJZb3UgaGF2ZSByZWFkLW9ubHkgYWNjZXNzLiBZb3UgY2Fubm90IG1vZGlmeSB0ZW1wbGF0ZXMuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRGVzY3JpcHRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDcmVhdGUgYW5kIG1hbmFnZSBjaGVja2xpc3QgdGVtcGxhdGVzIHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvIHRpY2tldHMuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUZW1wbGF0ZXMgYXJlIGFzc2lnbmVkIHRvIHF1ZXVlcy4gQSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIGFzc2lnbmVkIHF1ZXVlIGFuZCBhbGwgaXRzIHN1Yi1xdWV1ZXMuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiQ2hlY2tsaXN0cyIpIHwgaHRtbCAlXTwvaDE+CgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDaGVja2xpc3QgVGVtcGxhdGVzIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiIGlkPSJUZW1wbGF0ZVRhYmxlIj4KICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiRGVzY3JpcHRpb24iKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiUXVldWVzIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIkl0ZW1zIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlZhbGlkIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIj5bJSBUcmFuc2xhdGUoIkV4cG9ydCIpIHwgaHRtbCAlXTwvdGg+ClslIElGICFSZWFkT25seSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIiPlslIFRyYW5zbGF0ZSgiRHVwbGljYXRlIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvdGg+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBpZD0iVGVtcGxhdGVJRF9bJSBEYXRhLklEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPUVkaXQ7SUQ9WyUgRGF0YS5JRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuRGVzY3JpcHRpb24gfCB0cnVuY2F0ZSg1MCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB0aXRsZT0iWyUgRGF0YS5RdWV1ZXMgfCBodG1sICVdIj5bJSBEYXRhLlF1ZXVlQ291bnQgfCBodG1sICVdIFslIFRyYW5zbGF0ZSgiUXVldWUocykiKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIERhdGEuSXRlbUNvdW50IHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoIkl0ZW0ocykiKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZShEYXRhLlZhbGlkKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJFeHBvcnRUZW1wbGF0ZSBUZW1wbGF0ZUFjdGlvbiIgZGF0YS1pZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iIGRhdGEtbmFtZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRXhwb3J0IGFzIFhNTCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1kb3dubG9hZCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIElGICFSZWFkT25seSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJEdXBsaWNhdGVUZW1wbGF0ZSBUZW1wbGF0ZUFjdGlvbiIgZGF0YS1pZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iIGRhdGEtbmFtZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRHVwbGljYXRlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNvcHkiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJEZWxldGVUZW1wbGF0ZSBUZW1wbGF0ZUFjdGlvbiIgZGF0YS1pZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iIGRhdGEtbmFtZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlUm93IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9UZW1wbGF0ZXMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iWyUgSUYgUmVhZE9ubHkgJV02WyUgRUxTRSAlXThbJSBFTkQgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gdGVtcGxhdGVzIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vVGVtcGxhdGVzIikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cg==</File>
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/AgentChecklistTemplateEdit.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKWyUgU0VUIFJlYWRPbmx5ID0gRGF0YS5SZWFkT25seSAlXQoKPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCBBY3Rpb25zU2lkZUJhciBBZG1pbk1hbmFnZW1lbnQiPgogICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiBBY3Rpb25zU2lkZUJhckNvbXAiPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBY3Rpb25zIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25MaXN0Ij4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBGdWxsc2l6ZSBDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWxlZnQiPjwvaT5bJSBUcmFuc2xhdGUoIkdvIHRvIG92ZXJ2aWV3IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGgxIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkNoZWNrbGlzdCBUZW1wbGF0ZSBNYW5hZ2VtZW50IikgfCBodG1sICVdPC9oMT4KCiAgICAgICAgPHVsIGNsYXNzPSJCcmVhZENydW1iIj4KICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV0iPlslIFRyYW5zbGF0ZSgiQ2hlY2tsaXN0cyIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9saT4KWyUgSUYgRGF0YS5Nb2RlID09ICdBZGRJdGVtJyAlXQogICAgICAgICAgICA8bGk+PGkgY2xhc3M9ImZhIGZhLWFuZ2xlLXJpZ2h0Ij48L2k+PC9saT4KICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPUVkaXQ7SUQ9WyUgRGF0YS5UZW1wbGF0ZUlEIHwgdXJpICVdIj5bJSBUcmFuc2xhdGUoIkVkaXQgVGVtcGxhdGUiKSB8IGh0bWwgJV06IFslIERhdGEuVGVtcGxhdGVOYW1lIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPGxpPjxpIGNsYXNzPSJmYSBmYS1hbmdsZS1yaWdodCI+PC9pPjwvbGk+CiAgICAgICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoIkFkZCBJdGVtIikgfCBodG1sICVdPC9saT4KWyUgRUxTSUYgRGF0YS5Nb2RlID09ICdFZGl0SXRlbScgJV0KICAgICAgICAgICAgPGxpPjxpIGNsYXNzPSJmYSBmYS1hbmdsZS1yaWdodCI+PC9pPjwvbGk+CiAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1FZGl0O0lEPVslIERhdGEuVGVtcGxhdGVJRCB8IHVyaSAlXSI+WyUgVHJhbnNsYXRlKCJFZGl0IFRlbXBsYXRlIikgfCBodG1sICVdOiBbJSBEYXRhLlRlbXBsYXRlTmFtZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDxsaT48aSBjbGFzcz0iZmEgZmEtYW5nbGUtcmlnaHQiPjwvaT48L2xpPgogICAgICAgICAgICA8bGk+WyUgVHJhbnNsYXRlKCJFZGl0IEl0ZW0iKSB8IGh0bWwgJV08L2xpPgpbJSBFTFNJRiBEYXRhLkFjdGlvbiA9PSAnQWRkJyAlXQogICAgICAgICAgICA8bGk+PGkgY2xhc3M9ImZhIGZhLWFuZ2xlLXJpZ2h0Ij48L2k+PC9saT4KICAgICAgICAgICAgPGxpPlslIFRyYW5zbGF0ZSgiQWRkIFRlbXBsYXRlIikgfCBodG1sICVdPC9saT4KWyUgRUxTRSAlXQogICAgICAgICAgICA8bGk+PGkgY2xhc3M9ImZhIGZhLWFuZ2xlLXJpZ2h0Ij48L2k+PC9saT4KICAgICAgICAgICAgPGxpPlslIFRyYW5zbGF0ZSgiRWRpdCBUZW1wbGF0ZSIpIHwgaHRtbCAlXTogWyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvbGk+ClslIEVORCAlXQogICAgICAgIDwvdWw+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUZvcm0iKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgSUYgRGF0YS5BY3Rpb24gPT0gJ0FkZCcgJV1bJSBUcmFuc2xhdGUoIkFkZCBUZW1wbGF0ZSIpIHwgaHRtbCAlXVslIEVMU0UgJV1bJSBUcmFuc2xhdGUoIkVkaXQgVGVtcGxhdGUiKSB8IGh0bWwgJV1bJSBJRiBSZWFkT25seSAlXSAoWyUgVHJhbnNsYXRlKCJSZWFkLW9ubHkiKSB8IGh0bWwgJV0pWyUgRU5EICVdWyUgRU5EICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgpbJSBJRiBSZWFkT25seSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWVzc2FnZUJveCBOb3RpY2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiWW91IGhhdmUgcmVhZC1vbmx5IGFjY2Vzcy4gWW91IGNhbm5vdCBtb2RpZnkgdGVtcGxhdGVzLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyIgaWQ9IlRlbXBsYXRlRm9ybSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlslIERhdGEuQWN0aW9uIHwgaHRtbCAlXUFjdGlvbiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IklEIiB2YWx1ZT0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDaGFsbGVuZ2VUb2tlbiIgdmFsdWU9IlslIEVudigiVXNlckNoYWxsZW5nZVRva2VuIikgfCBodG1sICVdIi8+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iTmFtZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJOYW1lIikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTmFtZSIgaWQ9Ik5hbWUiIHZhbHVlPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5OYW1lSW52YWxpZCB8IGh0bWwgJV0iIG1heGxlbmd0aD0iMjAwIiBbJSBJRiBSZWFkT25seSAlXWRpc2FibGVkPSJkaXNhYmxlZCJbJSBFTkQgJV0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkRlc2NyaXB0aW9uIj5bJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJEZXNjcmlwdGlvbiIgaWQ9IkRlc2NyaXB0aW9uIiByb3dzPSI0IiBjbGFzcz0iVzUwcGMiIFslIElGIFJlYWRPbmx5ICVdZGlzYWJsZWQ9ImRpc2FibGVkIlslIEVORCAlXT5bJSBEYXRhLkRlc2NyaXB0aW9uIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTGlua1VSTCI+WyUgVHJhbnNsYXRlKCJEb2N1bWVudGF0aW9uIExpbmsiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkxpbmtVUkwiIGlkPSJMaW5rVVJMIiB2YWx1ZT0iWyUgRGF0YS5MaW5rVVJMIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjIwMDAiIHBsYWNlaG9sZGVyPSJodHRwczovL2RvY3MuZXhhbXBsZS5jb20vLi4uIiBbJSBJRiBSZWFkT25seSAlXWRpc2FibGVkPSJkaXNhYmxlZCJbJSBFTkQgJV0vPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT3B0aW9uYWwgVVJMIHRvIGV4dGVybmFsIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgY2hlY2tsaXN0LiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkxpbmtUZXh0Ij5bJSBUcmFuc2xhdGUoIkxpbmsgVGV4dCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iTGlua1RleHQiIGlkPSJMaW5rVGV4dCIgdmFsdWU9IlslIERhdGEuTGlua1RleHQgfCBodG1sICVdIiBjbGFzcz0iVzUwcGMiIG1heGxlbmd0aD0iMjUwIiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJEb2N1bWVudGF0aW9uIikgfCBodG1sICVdIiBbJSBJRiBSZWFkT25seSAlXWRpc2FibGVkPSJkaXNhYmxlZCJbJSBFTkQgJV0vPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlF1ZXVlSURzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlF1ZXVlcyIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5RdWV1ZU9wdGlvbiAlXQpbJSBJRiBEYXRhLlF1ZXVlSURzSW52YWxpZCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUXVldWVJRHNTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiIHN0eWxlPSJkaXNwbGF5OiBibG9jazsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgcXVldWUuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoZSBxdWV1ZXMgd2hlcmUgdGhpcyB0ZW1wbGF0ZSBzaG91bGQgYmUgYXZhaWxhYmxlLiBTdWItcXVldWVzIHdpbGwgaW5oZXJpdCB0aGUgYXNzaWdubWVudC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWxpZElEIj5bJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgpbJSBJRiAhUmVhZE9ubHkgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCBTYXZlQnV0dG9ucyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSIgY2xhc3M9ImJ0bi1jYW5jZWwtZ2hvc3QgYnRuLW1haW4gYnRuLXdpZHRoLW1kIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0bi1jYW5jZWwtZ2hvc3QgYnRuLW1haW4gYnRuLXdpZHRoLW1kIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdEFuZENsb3NlIiB2YWx1ZT0iMSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIGFuZCBmaW5pc2giKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSBidG4tcHJpbWFyeSBidG4tbWFpbiBidG4td2lkdGgtbWQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV0iIGNsYXNzPSJidG4tY2FuY2VsLWdob3N0IGJ0bi1tYWluIGJ0bi13aWR0aC1tZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJCYWNrIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUZvcm0iKSAlXQoKWyUgSUYgRGF0YS5BY3Rpb24gPT0gJ0VkaXQnICVdCiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlRlbXBsYXRlSUQiIHZhbHVlPSJbJSBEYXRhLklEIHwgaHRtbCAlXSIvPgoKICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQ2hlY2tsaXN0IEl0ZW1zIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24gU3BhY2luZ0JvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJEZWZpbmUgdGhlIGl0ZW1zIHRoYXQgc2hvdWxkIGFwcGVhciBpbiB0aGlzIGNoZWNrbGlzdC4gTWFuZGF0b3J5IGl0ZW1zIG11c3QgYmUgY29tcGxldGVkIGJlZm9yZSB0aGUgdGlja2V0IGNhbiBiZSBjbG9zZWQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICA8L3A+CgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiIGlkPSJJdGVtVGFibGUiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXNXBjIj5bJSBUcmFuc2xhdGUoIk9yZGVyIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVzEwcGMiPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9Ilc4cGMgQ2VudGVyIj5bJSBUcmFuc2xhdGUoIk1hbmRhdG9yeSIpIHwgaHRtbCAlXTwvdGg+ClslIElGICFSZWFkT25seSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXNXBjIENlbnRlciI+WyUgVHJhbnNsYXRlKCJFZGl0IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVzVwYyBDZW50ZXIiPlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdPC90aD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHkgaWQ9Ikl0ZW1MaXN0Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSXRlbVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iSXRlbVJvdyIgZGF0YS1pZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iIGRhdGEtc29ydD0iWyUgRGF0YS5Tb3J0T3JkZXIgfCBodG1sICVdIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1pdGVtdHlwZT0iWyUgRGF0YS5JdGVtVHlwZSB8IGh0bWwgJV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWNvbmZpZz0nWyUgRGF0YS5Db25maWdKU09OIHwgaHRtbCAlXScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbGlua3VybD0iWyUgRGF0YS5MaW5rVVJMIHwgaHRtbCAlXSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbGlua3RleHQ9IlslIERhdGEuTGlua1RleHQgfCBodG1sICVdIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWRlc2NyaXB0aW9uPSJbJSBEYXRhLkRlc2NyaXB0aW9uIHwgaHRtbCAlXSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtbWFuZGF0b3J5PSJbJSBEYXRhLklzTWFuZGF0b3J5IHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IlslIElGICFSZWFkT25seSAlXURyYWdIYW5kbGUgWyUgRU5EICVdQ2VudGVyIj4KWyUgSUYgIVJlYWRPbmx5ICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWJhcnMiPjwvaT4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlNvcnRPcmRlciI+WyUgRGF0YS5Tb3J0T3JkZXIgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iSXRlbVR5cGVEaXNwbGF5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSXRlbVR5cGVCYWRnZSBJdGVtVHlwZS1bJSBEYXRhLkl0ZW1UeXBlIHwgaHRtbCAlXSI+WyUgRGF0YS5JdGVtVHlwZSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJJdGVtVGl0bGVEaXNwbGF5Ij5bJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9Ikl0ZW1EZXNjcmlwdGlvbkRpc3BsYXkiPlslIERhdGEuRGVzY3JpcHRpb24gfCB0cnVuY2F0ZSg1MCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLklzTWFuZGF0b3J5ICVdPGkgY2xhc3M9ImZhIGZhLWNoZWNrIj48L2k+WyUgRUxTRSAlXS1bJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIElGICFSZWFkT25seSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudENoZWNrbGlzdFRlbXBsYXRlO1N1YmFjdGlvbj1FZGl0SXRlbTtJdGVtSUQ9WyUgRGF0YS5JRCB8IHVyaSAlXSIgY2xhc3M9InRhYmxlLWljb24taG92ZXItbWQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkVkaXQiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGVuY2lsIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iRGVsZXRlSXRlbSB0YWJsZS1pY29uLWhvdmVyLW1kIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiSXRlbVJvdyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk5vSXRlbXMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9Ik5vSXRlbXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IlslIElGIFJlYWRPbmx5ICVdNVslIEVMU0UgJV03WyUgRU5EICVdIiBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk5vIGl0ZW1zIGRlZmluZWQgeWV0LiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vSXRlbXMiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgoKWyUgSUYgIVJlYWRPbmx5ICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wIENlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50Q2hlY2tsaXN0VGVtcGxhdGU7U3ViYWN0aW9uPUFkZEl0ZW07VGVtcGxhdGVJRD1bJSBEYXRhLklEIHwgdXJpICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBHaG9zdCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzIj48L2k+IFslIFRyYW5zbGF0ZSgiQWRkIEl0ZW0iKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+ClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBZGRJdGVtTW9kZSIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFkZCBJdGVtIHRvIFRlbXBsYXRlIikgfCBodG1sICVdOiBbJSBEYXRhLlRlbXBsYXRlTmFtZSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iVGVtcGxhdGVJRCIgdmFsdWU9IlslIERhdGEuVGVtcGxhdGVJRCB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iSXRlbVRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJJdGVtVGl0bGUiIGNsYXNzPSJXNzVwYyIgbWF4bGVuZ3RoPSIyNTAiLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSXRlbURlc2NyaXB0aW9uIj5bJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Ikl0ZW1EZXNjcmlwdGlvbiIgY2xhc3M9Ilc3NXBjIiBtYXhsZW5ndGg9IjIwMDAiLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSXRlbVR5cGUiPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5JdGVtVHlwZU9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJJdGVtTWFuZGF0b3J5Ij5bJSBUcmFuc2xhdGUoIk1hbmRhdG9yeSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iSXRlbU1hbmRhdG9yeSIvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8IS0tIFN0YXR1cyBUeXBlIENvbmZpZyAtLT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdGF0dXNDb25maWciIGNsYXNzPSJJdGVtVHlwZUNvbmZpZyBIaWRkZW4iPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGF0dXNPcHRpb25zIj5bJSBUcmFuc2xhdGUoIlN0YXR1cyBPcHRpb25zIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iU3RhdHVzT3B0aW9ucyIgY2xhc3M9Ilc3NXBjIiByb3dzPSI0IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJPbmUgb3B0aW9uIHBlciBsaW5lIikgfCBodG1sICVdIj48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiRW50ZXIgb25lIHN0YXR1cyBvcHRpb24gcGVyIGxpbmUuIFRoZSBsYXN0IG9wdGlvbiB3aWxsIGJlIHRoZSBkZWZhdWx0LiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwhLS0gVmFsdWUgVHlwZSBDb25maWcgLS0+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVmFsdWVDb25maWciIGNsYXNzPSJJdGVtVHlwZUNvbmZpZyBIaWRkZW4iPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWx1ZVVuaXQiPlslIFRyYW5zbGF0ZSgiVW5pdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlZhbHVlVW5pdCIgY2xhc3M9IlcyNXBjIiBtYXhsZW5ndGg9IjUwIiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJlLmcuIGJhciwgbW0sIGtnIikgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVmFsdWVUYXJnZXQiPlslIFRyYW5zbGF0ZSgiVGFyZ2V0IFZhbHVlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJWYWx1ZVRhcmdldCIgY2xhc3M9IlcyNXBjIiBzdGVwPSJhbnkiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWx1ZVRvbGVyYW5jZSI+WyUgVHJhbnNsYXRlKCJUb2xlcmFuY2UiKSB8IGh0bWwgJV0gKCsvLSk6PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9IlZhbHVlVG9sZXJhbmNlIiBjbGFzcz0iVzI1cGMiIHN0ZXA9ImFueSIgbWluPSIwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8IS0tIFJhdGluZyBUeXBlIENvbmZpZyAtLT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSYXRpbmdDb25maWciIGNsYXNzPSJJdGVtVHlwZUNvbmZpZyBIaWRkZW4iPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJSYXRpbmcgdXNlcyBhIDUtc3RhciBzY2FsZS4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwhLS0gRG9jdW1lbnRhdGlvbiBMaW5rIC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikl0ZW1MaW5rVVJMIj5bJSBUcmFuc2xhdGUoIkRvY3VtZW50YXRpb24gTGluayIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJJdGVtTGlua1VSTCIgY2xhc3M9Ilc3NXBjIiBtYXhsZW5ndGg9IjIwMDAiIHBsYWNlaG9sZGVyPSJodHRwczovLy4uLiIvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJJdGVtTGlua1RleHQiPlslIFRyYW5zbGF0ZSgiTGluayBUZXh0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Ikl0ZW1MaW5rVGV4dCIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjI1MCIvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIFNhdmVCdXR0b25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50Q2hlY2tsaXN0VGVtcGxhdGU7U3ViYWN0aW9uPUVkaXQ7SUQ9WyUgRGF0YS5UZW1wbGF0ZUlEIHwgdXJpICVdIiBjbGFzcz0iYnRuLWNhbmNlbC1naG9zdCBidG4tbWFpbiBidG4td2lkdGgtbWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBQcmltYXJ5IGJ0bi1wcmltYXJ5IGJ0bi1tYWluIGJ0bi13aWR0aC1tZCIgaWQ9IlNhdmVJdGVtQnRuIiB0eXBlPSJidXR0b24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQWRkSXRlbU1vZGUiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRWRpdEl0ZW1Nb2RlIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRWRpdCBJdGVtIikgfCBodG1sICVdOiBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJJdGVtSUQiIHZhbHVlPSJbJSBEYXRhLkl0ZW1JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iWyUgRGF0YS5UZW1wbGF0ZUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9Ikl0ZW1Tb3J0T3JkZXIiIHZhbHVlPSJbJSBEYXRhLlNvcnRPcmRlciB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJJdGVtQ29uZmlnSlNPTiIgdmFsdWU9IlslIERhdGEuQ29uZmlnSlNPTiB8IGh0bWwgJV0iLz4KCiAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iSXRlbVRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaXRsZSIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJJdGVtVGl0bGUiIGNsYXNzPSJXNzVwYyIgbWF4bGVuZ3RoPSIyNTAiIHZhbHVlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJJdGVtRGVzY3JpcHRpb24iPlslIFRyYW5zbGF0ZSgiRGVzY3JpcHRpb24iKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iSXRlbURlc2NyaXB0aW9uIiBjbGFzcz0iVzc1cGMiIG1heGxlbmd0aD0iMjAwMCIgdmFsdWU9IlslIERhdGEuRGVzY3JpcHRpb24gfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikl0ZW1UeXBlIj5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSXRlbVR5cGVPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSXRlbU1hbmRhdG9yeSI+WyUgVHJhbnNsYXRlKCJNYW5kYXRvcnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9Ikl0ZW1NYW5kYXRvcnkiIFslIElGIERhdGEuSXNNYW5kYXRvcnkgJV1jaGVja2VkPSJjaGVja2VkIlslIEVORCAlXS8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwhLS0gU3RhdHVzIFR5cGUgQ29uZmlnIC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlN0YXR1c0NvbmZpZyIgY2xhc3M9Ikl0ZW1UeXBlQ29uZmlnIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YXR1c09wdGlvbnMiPlslIFRyYW5zbGF0ZSgiU3RhdHVzIE9wdGlvbnMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJTdGF0dXNPcHRpb25zIiBjbGFzcz0iVzc1cGMiIHJvd3M9IjQiIHBsYWNlaG9sZGVyPSJbJSBUcmFuc2xhdGUoIk9uZSBvcHRpb24gcGVyIGxpbmUiKSB8IGh0bWwgJV0iPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJFbnRlciBvbmUgc3RhdHVzIG9wdGlvbiBwZXIgbGluZS4gVGhlIGxhc3Qgb3B0aW9uIHdpbGwgYmUgdGhlIGRlZmF1bHQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPCEtLSBWYWx1ZSBUeXBlIENvbmZpZyAtLT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJWYWx1ZUNvbmZpZyIgY2xhc3M9Ikl0ZW1UeXBlQ29uZmlnIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbHVlVW5pdCI+WyUgVHJhbnNsYXRlKCJVbml0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVmFsdWVVbml0IiBjbGFzcz0iVzI1cGMiIG1heGxlbmd0aD0iNTAiIHBsYWNlaG9sZGVyPSJbJSBUcmFuc2xhdGUoImUuZy4gYmFyLCBtbSwga2ciKSB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWx1ZVRhcmdldCI+WyUgVHJhbnNsYXRlKCJUYXJnZXQgVmFsdWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9IlZhbHVlVGFyZ2V0IiBjbGFzcz0iVzI1cGMiIHN0ZXA9ImFueSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbHVlVG9sZXJhbmNlIj5bJSBUcmFuc2xhdGUoIlRvbGVyYW5jZSIpIHwgaHRtbCAlXSAoKy8tKTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0iVmFsdWVUb2xlcmFuY2UiIGNsYXNzPSJXMjVwYyIgc3RlcD0iYW55IiBtaW49IjAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwhLS0gUmF0aW5nIFR5cGUgQ29uZmlnIC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJhdGluZ0NvbmZpZyIgY2xhc3M9Ikl0ZW1UeXBlQ29uZmlnIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIlJhdGluZyB1c2VzIGEgNS1zdGFyIHNjYWxlLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPCEtLSBEb2N1bWVudGF0aW9uIExpbmsgLS0+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSXRlbUxpbmtVUkwiPlslIFRyYW5zbGF0ZSgiRG9jdW1lbnRhdGlvbiBMaW5rIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Ikl0ZW1MaW5rVVJMIiBjbGFzcz0iVzc1cGMiIG1heGxlbmd0aD0iMjAwMCIgcGxhY2Vob2xkZXI9Imh0dHBzOi8vLi4uIiB2YWx1ZT0iWyUgRGF0YS5MaW5rVVJMIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJJdGVtTGlua1RleHQiPlslIFRyYW5zbGF0ZSgiTGluayBUZXh0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Ikl0ZW1MaW5rVGV4dCIgY2xhc3M9Ilc1MHBjIiBtYXhsZW5ndGg9IjI1MCIgdmFsdWU9IlslIERhdGEuTGlua1RleHQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AgU2F2ZUJ1dHRvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRDaGVja2xpc3RUZW1wbGF0ZTtTdWJhY3Rpb249RWRpdDtJRD1bJSBEYXRhLlRlbXBsYXRlSUQgfCB1cmkgJV0iIGNsYXNzPSJidG4tY2FuY2VsLWdob3N0IGJ0bi1tYWluIGJ0bi13aWR0aC1tZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFByaW1hcnkgYnRuLXByaW1hcnkgYnRuLW1haW4gYnRuLXdpZHRoLW1kIiBpZD0iVXBkYXRlSXRlbUJ0biIgdHlwZT0iYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkVkaXRJdGVtTW9kZSIpICVdCiAgICA8L2Rpdj4KPC9kaXY+Cg==</File>
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/AgentTicketChecklist.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRWRpdE1vZGUiKSAlXQo8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICA8aDE+WyUgVHJhbnNsYXRlKCJFZGl0IENoZWNrbGlzdCIpIHwgaHRtbCAlXTogWyUgRGF0YS5DaGVja2xpc3ROYW1lIHwgaHRtbCAlXTwvaDE+CiAgICAgICAgPHAgY2xhc3M9IkFzdGVyaXNrRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiQWxsIGZpZWxkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayAoKikgYXJlIG1hbmRhdG9yeS4iKSB8IGh0bWwgJV08L3A+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2hlY2tsaXN0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgQ2hlY2tsaXN0Qm94IiBkYXRhLWNoZWNrbGlzdC1pZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIgQ2hlY2tsaXN0SGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMz4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2hlY2stc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlByb2dyZXNzIj4oWyUgRGF0YS5Db21wbGV0ZWRJdGVtcyB8IGh0bWwgJV0vWyUgRGF0YS5Ub3RhbEl0ZW1zIHwgaHRtbCAlXSk8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgWyUgSUYgIURhdGEuSXNDb21wbGV0ZSAlXQogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJXYXJuaW5nIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJJbmNvbXBsZXRlIG1hbmRhdG9yeSBpdGVtcyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi10cmlhbmdsZSI+PC9pPgogICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgIDwvaDM+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIFslIElGIERhdGEuRGVzY3JpcHRpb24gJV0KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJDaGVja2xpc3REZXNjcmlwdGlvbiI+WyUgRGF0YS5EZXNjcmlwdGlvbiB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICBbJSBFTkQgJV0KCiAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLkxpbmtVUkwgJV0KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJDaGVja2xpc3RMaW5rIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBEYXRhLkxpbmtVUkwgfCBodG1sICVdIiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1leHRlcm5hbC1saW5rIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuTGlua1RleHQgJV1bJSBEYXRhLkxpbmtUZXh0IHwgaHRtbCAlXVslIEVMU0UgJV1bJSBUcmFuc2xhdGUoIkRvY3VtZW50YXRpb24iKSB8IGh0bWwgJV1bJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICBbJSBFTkQgJV0KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJQcm9ncmVzc0JhciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvZ3Jlc3MiIHN0eWxlPSJ3aWR0aDogWyUgRGF0YS5Qcm9ncmVzc1BlcmNlbnQgfCBodG1sICVdJSI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkNoZWNrbGlzdEl0ZW1zIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2hlY2tsaXN0SXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJDaGVja2xpc3RJdGVtIFslIElGIERhdGEuU3RhdGUgPT0gJ2RvbmUnICVdRG9uZVslIEVMU0lGIERhdGEuU3RhdGUgPT0gJ25vdF9hcHBsaWNhYmxlJyAlXU5vdEFwcGxpY2FibGVbJSBFTkQgJV0gWyUgSUYgRGF0YS5Jc01hbmRhdG9yeSAlXU1hbmRhdG9yeVslIEVORCAlXSBJdGVtVHlwZS1bJSBEYXRhLkl0ZW1UeXBlIHwgaHRtbCAlXSIKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1pdGVtLWlkPSJbJSBEYXRhLklEIHwgaHRtbCAlXSIKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1pdGVtdHlwZT0iWyUgRGF0YS5JdGVtVHlwZSB8IGh0bWwgJV0iCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY29uZmlnPSJbJSBEYXRhLkNvbmZpZ0pTT04gfCBodG1sICVdIgogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXZhbHVlPSJbJSBEYXRhLkl0ZW1WYWx1ZSB8IGh0bWwgJV0iCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtcmVtYXJrcz0iWyUgRGF0YS5SZW1hcmtzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ikl0ZW1Db250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuSXRlbVR5cGUgPT0gJ2NoZWNrYm94JyB8fCAhRGF0YS5JdGVtVHlwZSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ikl0ZW1DaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5TdGF0ZSA9PSAnb3BlbicgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iU2V0U3RhdGUiIGRhdGEtc3RhdGU9ImRvbmUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1hcmsgYXMgZG9uZSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTFNJRiBEYXRhLlN0YXRlID09ICdkb25lJyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJTZXRTdGF0ZSIgZGF0YS1zdGF0ZT0ib3BlbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiTWFyayBhcyBvcGVuIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIHRleHQtc3VjY2VzcyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IlNldFN0YXRlIiBkYXRhLXN0YXRlPSJvcGVuIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZXNldCB0byBvcGVuIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIHRleHQtbXV0ZWQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSXRlbVRpdGxlIFslIElGIERhdGEuU3RhdGUgIT0gJ29wZW4nICVdQ29tcGxldGVkWyUgRU5EICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuSXNNYW5kYXRvcnkgJV08c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ikl0ZW1UaXRsZSBbJSBJRiBEYXRhLlN0YXRlICE9ICdvcGVuJyAlXUNvbXBsZXRlZFslIEVORCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLklzTWFuZGF0b3J5ICVdPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuSXRlbVR5cGUgPT0gJ3N0YXR1cycgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJdGVtU3RhdHVzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJJdGVtU3RhdHVzU2VsZWN0IE1vZGVybml6ZSIgZGF0YS1pdGVtLWlkPSJbJSBEYXRhLklEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+LS0gWyUgVHJhbnNsYXRlKCJTZWxlY3QiKSB8IGh0bWwgJV0gLS08L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGF0dXNPcHRpb25zICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTFNJRiBEYXRhLkl0ZW1UeXBlID09ICd2YWx1ZScgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJdGVtVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJJdGVtVmFsdWVJbnB1dCIgdmFsdWU9IlslIERhdGEuSXRlbVZhbHVlIHwgaHRtbCAlXSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcD0iYW55IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJWYWx1ZSIpIHwgaHRtbCAlXSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1pdGVtLWlkPSJbJSBEYXRhLklEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuQ29uZmlnVW5pdCAlXTxzcGFuIGNsYXNzPSJWYWx1ZVVuaXQiPlslIERhdGEuQ29uZmlnVW5pdCB8IGh0bWwgJV08L3NwYW4+WyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Db25maWdUYXJnZXQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVmFsdWVUYXJnZXQiPlslIFRyYW5zbGF0ZSgiVGFyZ2V0IikgfCBodG1sICVdOiBbJSBEYXRhLkNvbmZpZ1RhcmdldCB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Db25maWdUb2xlcmFuY2UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVmFsdWVUb2xlcmFuY2UiPisvLSBbJSBEYXRhLkNvbmZpZ1RvbGVyYW5jZSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTFNJRiBEYXRhLkl0ZW1UeXBlID09ICdyYXRpbmcnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSXRlbVJhdGluZyIgZGF0YS1zY2FsZT0iWyUgRGF0YS5Db25maWdTY2FsZSB8IGh0bWwgJV0iIGRhdGEtdmFsdWU9IlslIERhdGEuSXRlbVZhbHVlIHwgaHRtbCAlXSIgZGF0YS1pdGVtLWlkPSJbJSBEYXRhLklEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SYXRpbmdTdGFycyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuRGVzY3JpcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJdGVtRGVzY3JpcHRpb24iPlslIERhdGEuRGVzY3JpcHRpb24gfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSXRlbVJlbWFya3NDb250YWluZXIgWyUgSUYgIURhdGEuUmVtYXJrcyAlXUhpZGRlblslIEVORCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPSJJdGVtUmVtYXJrc0lucHV0IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJSZW1hcmtzLi4uIikgfCBodG1sICVdIiBkYXRhLWl0ZW0taWQ9IlslIERhdGEuSUQgfCBodG1sICVdIj5bJSBEYXRhLlJlbWFya3MgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSXRlbUFjdGlvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Ikl0ZW1BY3Rpb24gVG9nZ2xlUmVtYXJrcyBbJSBJRiBEYXRhLlJlbWFya3MgJV1IYXNSZW1hcmtzWyUgRU5EICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1hcmtzIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY29tbWVudC1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLkxpbmtVUkwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIERhdGEuTGlua1VSTCB8IGh0bWwgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iSXRlbUFjdGlvbiBJdGVtTGluayIgdGl0bGU9IlslIERhdGEuTGlua1RleHQgfHwgVHJhbnNsYXRlKCJEb2N1bWVudGF0aW9uIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtZXh0ZXJuYWwtbGluayI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ikl0ZW1BY3Rpb24gSXRlbUFjdGlvblBsYWNlaG9sZGVyIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuU3RhdGUgIT0gJ25vdF9hcHBsaWNhYmxlJyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Ikl0ZW1BY3Rpb24gU2V0U3RhdGUiIGRhdGEtc3RhdGU9Im5vdF9hcHBsaWNhYmxlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNYXJrIGFzIG5vdCBhcHBsaWNhYmxlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtYmFuIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iSXRlbUFjdGlvbiBTZXRTdGF0ZSIgZGF0YS1zdGF0ZT0ib3BlbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVzZXQgdG8gb3BlbiIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXVuZG8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgIURhdGEuSXNNYW5kYXRvcnkgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJJdGVtQWN0aW9uIERlbGV0ZUl0ZW0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJdGVtQWN0aW9uIEl0ZW1BY3Rpb25QbGFjZWhvbGRlciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJDaGVja2xpc3RJdGVtIikgJV0KICAgICAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWRkSXRlbVNlY3Rpb24iPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldENoZWNrbGlzdDtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO01vZGU9QWRkSXRlbTtDaGVja2xpc3RJRD1bJSBEYXRhLklEIHwgdXJpICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBHaG9zdCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzIj48L2k+IFslIFRyYW5zbGF0ZSgiQWRkIEl0ZW0iKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2hlY2tsaXN0IikgJV0KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBQcmltYXJ5IGJ0bi1wcmltYXJ5IGJ0bi1tYWluIGJ0bi13aWR0aC1tZCIgaWQ9IkNsb3NlQnRuIiB0eXBlPSJidXR0b24iPgogICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkNsb3NlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgIDwvYnV0dG9uPgogICAgPC9kaXY+CjwvZGl2PgoKPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkNoZWNrbGlzdElEIiB2YWx1ZT0iWyUgRGF0YS5DaGVja2xpc3RJRCB8IGh0bWwgJV0iLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkVkaXRNb2RlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkFkZEl0ZW1Nb2RlIikgJV0KPGRpdiBjbGFzcz0iTGF5b3V0UG9wdXAgQVJJQVJvbGVNYWluIj4KICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiQWRkIEl0ZW0gdG8iKSB8IGh0bWwgJV06IFslIERhdGEuQ2hlY2tsaXN0TmFtZSB8IGh0bWwgJV08L2gxPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgPGZvcm0gaWQ9IkFkZEl0ZW1Gb3JtIiBjbGFzcz0iVmFsaWRhdGUiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldENoZWNrbGlzdCIvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJBZGRJdGVtIi8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2hlY2tsaXN0SUQiIHZhbHVlPSJbJSBEYXRhLkNoZWNrbGlzdElEIHwgaHRtbCAlXSIvPgoKICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iSXRlbVRpdGxlIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iSXRlbVRpdGxlIiBuYW1lPSJUaXRsZSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIiBtYXhsZW5ndGg9IjI1MCIvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ikl0ZW1UaXRsZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikl0ZW1EZXNjcmlwdGlvbiI+WyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iSXRlbURlc2NyaXB0aW9uIiBuYW1lPSJEZXNjcmlwdGlvbiIgY2xhc3M9Ilc3NXBjIiBtYXhsZW5ndGg9IjIwMDAiLz4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikl0ZW1UeXBlIj5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkl0ZW1UeXBlT3B0aW9uICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdGF0dXNDb25maWciIGNsYXNzPSJJdGVtVHlwZUNvbmZpZyBIaWRkZW4iPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YXR1c09wdGlvbnMiPlslIFRyYW5zbGF0ZSgiU3RhdHVzIE9wdGlvbnMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iU3RhdHVzT3B0aW9ucyIgbmFtZT0iU3RhdHVzT3B0aW9ucyIgY2xhc3M9Ilc3NXBjIiByb3dzPSI0IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJPbmUgb3B0aW9uIHBlciBsaW5lIikgfCBodG1sICVdIj48L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJFbnRlciBvbmUgc3RhdHVzIG9wdGlvbiBwZXIgbGluZSwgZS5nLjoiKSB8IGh0bWwgJV08YnIvPmkuTy48YnIvPm4uaS5PLjxici8+bmljaHQgZ2VwcnVlZnQ8L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJWYWx1ZUNvbmZpZyIgY2xhc3M9Ikl0ZW1UeXBlQ29uZmlnIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVmFsdWVVbml0Ij5bJSBUcmFuc2xhdGUoIlVuaXQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVmFsdWVVbml0IiBuYW1lPSJWYWx1ZVVuaXQiIGNsYXNzPSJXMjVwYyIgbWF4bGVuZ3RoPSI1MCIgcGxhY2Vob2xkZXI9IlslIFRyYW5zbGF0ZSgiZS5nLiBiYXIsIG1tLCBrZyIpIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWx1ZVRhcmdldCI+WyUgVHJhbnNsYXRlKCJUYXJnZXQgVmFsdWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJWYWx1ZVRhcmdldCIgbmFtZT0iVmFsdWVUYXJnZXQiIHN0ZXA9ImFueSIgY2xhc3M9IlcyNXBjIi8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlZhbHVlVG9sZXJhbmNlIj5bJSBUcmFuc2xhdGUoIlRvbGVyYW5jZSIpIHwgaHRtbCAlXSAoKy8tKTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9IlZhbHVlVG9sZXJhbmNlIiBuYW1lPSJWYWx1ZVRvbGVyYW5jZSIgc3RlcD0iYW55IiBtaW49IjAiIGNsYXNzPSJXMjVwYyIvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBpZD0iUmF0aW5nQ29uZmlnIiBjbGFzcz0iSXRlbVR5cGVDb25maWcgSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJSYXRpbmcgdXNlcyBhIDUtc3RhciBzY2FsZS4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmF0aW5nTGFiZWxzIj5bJSBUcmFuc2xhdGUoIkxhYmVscyAob3B0aW9uYWwpIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJhdGluZ0xhYmVscyIgbmFtZT0iUmF0aW5nTGFiZWxzIiBjbGFzcz0iVzc1cGMiIHJvd3M9IjMiIHBsYWNlaG9sZGVyPSJbJSBUcmFuc2xhdGUoIk9uZSBsYWJlbCBwZXIgbGluZSIpIHwgaHRtbCAlXSI+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikl0ZW1MaW5rVVJMIj5bJSBUcmFuc2xhdGUoIkRvY3VtZW50YXRpb24gTGluayIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iSXRlbUxpbmtVUkwiIG5hbWU9IkxpbmtVUkwiIGNsYXNzPSJXNzVwYyIgbWF4bGVuZ3RoPSIyMDAwIiBwbGFjZWhvbGRlcj0iaHR0cHM6Ly8uLi4iLz4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikl0ZW1MaW5rVGV4dCI+WyUgVHJhbnNsYXRlKCJMaW5rIFRleHQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Ikl0ZW1MaW5rVGV4dCIgbmFtZT0iTGlua1RleHQiIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSIyNTAiLz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkZvb3RlciI+CiAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Q2hlY2tsaXN0O1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07TW9kZT1FZGl0O0NoZWNrbGlzdElEPVslIERhdGEuQ2hlY2tsaXN0SUQgfCB1cmkgJV0iIGNsYXNzPSJidG4tY2FuY2VsLWdob3N0IGJ0bi1tYWluIGJ0bi13aWR0aC1tZCI+CiAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdCiAgICAgICAgPC9hPgogICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSBidG4tcHJpbWFyeSBidG4tbWFpbiBidG4td2lkdGgtbWQiIGlkPSJTYXZlSXRlbUJ0biIgdHlwZT0iYnV0dG9uIj4KICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgIDwvYnV0dG9uPgogICAgPC9kaXY+CjwvZGl2PgoKPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkNoZWNrbGlzdElEIiB2YWx1ZT0iWyUgRGF0YS5DaGVja2xpc3RJRCB8IGh0bWwgJV0iLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkFkZEl0ZW1Nb2RlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk1hbmFnZU1vZGUiKSAlXQo8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICA8aDE+WyUgVHJhbnNsYXRlKCJNYW5hZ2UgQ2hlY2tsaXN0cyBmb3IgVGlja2V0IikgfCBodG1sICVdICNbJSBEYXRhLlRpY2tldE51bWJlciB8IGh0bWwgJV08L2gxPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFkZCBDaGVja2xpc3QiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGVtcGxhdGVJRCI+WyUgVHJhbnNsYXRlKCJUZW1wbGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5UZW1wbGF0ZU9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSBidG4tcHJpbWFyeSBidG4tbWFpbiBidG4td2lkdGgtbWQiIGlkPSJBZGRDaGVja2xpc3RCdG4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXBsdXMiPjwvaT4gWyUgVHJhbnNsYXRlKCJBZGQgQ2hlY2tsaXN0IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiIGlkPSJBc3NpZ25lZENoZWNrbGlzdHNXaWRnZXQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQXNzaWduZWQgQ2hlY2tsaXN0cyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWFuYWdlQ2hlY2tsaXN0IikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1hbmFnZUNoZWNrbGlzdFJvdyIgZGF0YS1jaGVja2xpc3QtaWQ9IlslIERhdGEuSUQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDaGVja2xpc3RJbmZvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNoZWNrbGlzdE5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUHJvZ3Jlc3MiPihbJSBEYXRhLkNvbXBsZXRlZEl0ZW1zIHwgaHRtbCAlXS9bJSBEYXRhLlRvdGFsSXRlbXMgfCBodG1sICVdKTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLkRlc2NyaXB0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDaGVja2xpc3REZXNjcmlwdGlvbiI+WyUgRGF0YS5EZXNjcmlwdGlvbiB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJSZW1vdmVDaGVja2xpc3QgSXRlbUFjdGlvbiIgZGF0YS1pZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlbW92ZSBjaGVja2xpc3QiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTWFuYWdlQ2hlY2tsaXN0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9DaGVja2xpc3RzTWFuYWdlIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik5vQ2hlY2tsaXN0c01hbmFnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJObyBjaGVja2xpc3RzIGFzc2lnbmVkIHRvIHRoaXMgdGlja2V0LiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9DaGVja2xpc3RzTWFuYWdlIikgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJGb290ZXIiPgogICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSBidG4tcHJpbWFyeSBidG4tbWFpbiBidG4td2lkdGgtbWQiIGlkPSJDbG9zZUJ0biIgdHlwZT0iYnV0dG9uIj4KICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJDbG9zZSIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICA8L2J1dHRvbj4KICAgIDwvZGl2Pgo8L2Rpdj4KCjxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIi8+ClslIFJlbmRlckJsb2NrRW5kKCJNYW5hZ2VNb2RlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRlZmF1bHRNb2RlIikgJV0KPGRpdiBjbGFzcz0iTGF5b3V0UG9wdXAgQVJJQVJvbGVNYWluIj4KICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgPGgxPlslIFRyYW5zbGF0ZSgiQ2hlY2tsaXN0cyBmb3IgVGlja2V0IikgfCBodG1sICVdICNbJSBEYXRhLlRpY2tldE51bWJlciB8IGh0bWwgJV08L2gxPgogICAgICAgIDxwIGNsYXNzPSJBc3Rlcmlza0V4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkFsbCBmaWVsZHMgbWFya2VkIHdpdGggYW4gYXN0ZXJpc2sgKCopIGFyZSBtYW5kYXRvcnkuIikgfCBodG1sICVdPC9wPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIiBpZD0iQ2hlY2tsaXN0Q29udGFpbmVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFzc2lnbmVkIENoZWNrbGlzdHMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNoZWNrbGlzdCIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDaGVja2xpc3RCb3giIGRhdGEtY2hlY2tsaXN0LWlkPSJbJSBEYXRhLklEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2hlY2tsaXN0SGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iUHJvZ3Jlc3MiPihbJSBEYXRhLkNvbXBsZXRlZEl0ZW1zIHwgaHRtbCAlXS9bJSBEYXRhLlRvdGFsSXRlbXMgfCBodG1sICVdKTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGICFEYXRhLklzQ29tcGxldGUgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJXYXJuaW5nIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJJbmNvbXBsZXRlIG1hbmRhdG9yeSBpdGVtcyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWN0aW9ucyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iUmVtb3ZlQ2hlY2tsaXN0IiBkYXRhLWlkPSJbJSBEYXRhLklEIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIGNoZWNrbGlzdCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIFslIElGIERhdGEuRGVzY3JpcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iQ2hlY2tsaXN0RGVzY3JpcHRpb24iPlslIERhdGEuRGVzY3JpcHRpb24gfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQoKICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLkxpbmtVUkwgJV0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iQ2hlY2tsaXN0TGluayI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIERhdGEuTGlua1VSTCB8IGh0bWwgJV0iIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1leHRlcm5hbC1saW5rIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLkxpbmtUZXh0ICVdWyUgRGF0YS5MaW5rVGV4dCB8IGh0bWwgJV1bJSBFTFNFICVdWyUgVHJhbnNsYXRlKCJEb2N1bWVudGF0aW9uIikgfCBodG1sICVdWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb2dyZXNzQmFyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvZ3Jlc3MiIHN0eWxlPSJ3aWR0aDogWyUgRGF0YS5Qcm9ncmVzc1BlcmNlbnQgfCBodG1sICVdJSI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iQ2hlY2tsaXN0SXRlbXMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDaGVja2xpc3RJdGVtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJDaGVja2xpc3RJdGVtIFslIElGIERhdGEuU3RhdGUgPT0gJ2RvbmUnICVdRG9uZVslIEVMU0lGIERhdGEuU3RhdGUgPT0gJ25vdF9hcHBsaWNhYmxlJyAlXU5vdEFwcGxpY2FibGVbJSBFTkQgJV0gWyUgSUYgRGF0YS5Jc01hbmRhdG9yeSAlXU1hbmRhdG9yeVslIEVORCAlXSBJdGVtVHlwZS1bJSBEYXRhLkl0ZW1UeXBlIHwgaHRtbCAlXSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaXRlbS1pZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWl0ZW10eXBlPSJbJSBEYXRhLkl0ZW1UeXBlIHwgaHRtbCAlXSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY29uZmlnPSJbJSBEYXRhLkNvbmZpZ0pTT04gfCBodG1sICVdIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS12YWx1ZT0iWyUgRGF0YS5JdGVtVmFsdWUgfCBodG1sICVdIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1yZW1hcmtzPSJbJSBEYXRhLlJlbWFya3MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ikl0ZW1Db250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLkl0ZW1UeXBlID09ICdjaGVja2JveCcgfHwgIURhdGEuSXRlbVR5cGUgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSXRlbUNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5TdGF0ZSA9PSAnb3BlbicgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IlNldFN0YXRlIiBkYXRhLXN0YXRlPSJkb25lIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNYXJrIGFzIGRvbmUiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRUxTSUYgRGF0YS5TdGF0ZSA9PSAnZG9uZScgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IlNldFN0YXRlIiBkYXRhLXN0YXRlPSJvcGVuIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNYXJrIGFzIG9wZW4iKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNoZWNrLXNxdWFyZS1vIHRleHQtc3VjY2VzcyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IlNldFN0YXRlIiBkYXRhLXN0YXRlPSJvcGVuIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZXNldCB0byBvcGVuIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyB0ZXh0LW11dGVkIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJdGVtVGl0bGUgWyUgSUYgRGF0YS5TdGF0ZSAhPSAnb3BlbicgJV1Db21wbGV0ZWRbJSBFTkQgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLklzTWFuZGF0b3J5ICVdPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJdGVtVGl0bGUgWyUgSUYgRGF0YS5TdGF0ZSAhPSAnb3BlbicgJV1Db21wbGV0ZWRbJSBFTkQgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLklzTWFuZGF0b3J5ICVdPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5JdGVtVHlwZSA9PSAnc3RhdHVzJyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJdGVtU3RhdHVzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iSXRlbVN0YXR1c1NlbGVjdCBNb2Rlcm5pemUiIGRhdGEtaXRlbS1pZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj4tLSBbJSBUcmFuc2xhdGUoIlNlbGVjdCIpIHwgaHRtbCAlXSAtLTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGF0dXNPcHRpb25zICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTFNJRiBEYXRhLkl0ZW1UeXBlID09ICd2YWx1ZScgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSXRlbVZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9Ikl0ZW1WYWx1ZUlucHV0IiB2YWx1ZT0iWyUgRGF0YS5JdGVtVmFsdWUgfCBodG1sICVdIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcD0iYW55IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJWYWx1ZSIpIHwgaHRtbCAlXSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtaXRlbS1pZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Db25maWdVbml0ICVdPHNwYW4gY2xhc3M9IlZhbHVlVW5pdCI+WyUgRGF0YS5Db25maWdVbml0IHwgaHRtbCAlXTwvc3Bhbj5bJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Db25maWdUYXJnZXQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlZhbHVlVGFyZ2V0Ij5bJSBUcmFuc2xhdGUoIlRhcmdldCIpIHwgaHRtbCAlXTogWyUgRGF0YS5Db25maWdUYXJnZXQgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Db25maWdUb2xlcmFuY2UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlZhbHVlVG9sZXJhbmNlIj4rLy0gWyUgRGF0YS5Db25maWdUb2xlcmFuY2UgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRUxTSUYgRGF0YS5JdGVtVHlwZSA9PSAncmF0aW5nJyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJdGVtUmF0aW5nIiBkYXRhLXNjYWxlPSJbJSBEYXRhLkNvbmZpZ1NjYWxlIHwgaHRtbCAlXSIgZGF0YS12YWx1ZT0iWyUgRGF0YS5JdGVtVmFsdWUgfCBodG1sICVdIiBkYXRhLWl0ZW0taWQ9IlslIERhdGEuSUQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SYXRpbmdTdGFycyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLkRlc2NyaXB0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ikl0ZW1EZXNjcmlwdGlvbiI+WyUgRGF0YS5EZXNjcmlwdGlvbiB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ikl0ZW1SZW1hcmtzQ29udGFpbmVyIFslIElGICFEYXRhLlJlbWFya3MgJV1IaWRkZW5bJSBFTkQgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9Ikl0ZW1SZW1hcmtzSW5wdXQiIHBsYWNlaG9sZGVyPSJbJSBUcmFuc2xhdGUoIlJlbWFya3MuLi4iKSB8IGh0bWwgJV0iIGRhdGEtaXRlbS1pZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iPlslIERhdGEuUmVtYXJrcyB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJJdGVtQWN0aW9ucyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Ikl0ZW1BY3Rpb24gVG9nZ2xlUmVtYXJrcyBbJSBJRiBEYXRhLlJlbWFya3MgJV1IYXNSZW1hcmtzWyUgRU5EICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZW1hcmtzIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNvbW1lbnQtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLkxpbmtVUkwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBEYXRhLkxpbmtVUkwgfCBodG1sICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9Ikl0ZW1BY3Rpb24gSXRlbUxpbmsiIHRpdGxlPSJbJSBEYXRhLkxpbmtUZXh0IHx8IFRyYW5zbGF0ZSgiRG9jdW1lbnRhdGlvbiIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1leHRlcm5hbC1saW5rIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSXRlbUFjdGlvbiBJdGVtQWN0aW9uUGxhY2Vob2xkZXIiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlN0YXRlICE9ICdub3RfYXBwbGljYWJsZScgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iSXRlbUFjdGlvbiBTZXRTdGF0ZSIgZGF0YS1zdGF0ZT0ibm90X2FwcGxpY2FibGUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1hcmsgYXMgbm90IGFwcGxpY2FibGUiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtYmFuIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iSXRlbUFjdGlvbiBTZXRTdGF0ZSIgZGF0YS1zdGF0ZT0ib3BlbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVzZXQgdG8gb3BlbiIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS11bmRvIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIElGICFEYXRhLklzTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Ikl0ZW1BY3Rpb24gRGVsZXRlSXRlbSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJdGVtQWN0aW9uIEl0ZW1BY3Rpb25QbGFjZWhvbGRlciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJDaGVja2xpc3RJdGVtIikgJV0KICAgICAgICAgICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBZGRJdGVtU2VjdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldENoZWNrbGlzdDtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO01vZGU9QWRkSXRlbTtDaGVja2xpc3RJRD1bJSBEYXRhLklEIHwgdXJpICVdIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBHaG9zdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aSBjbGFzcz0iZmEgZmEtcGx1cyI+PC9pPiBbJSBUcmFuc2xhdGUoIkFkZCBJdGVtIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNoZWNrbGlzdCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0NoZWNrbGlzdHMiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTm9DaGVja2xpc3RzIj4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIk5vIGNoZWNrbGlzdHMgYXNzaWduZWQgdG8gdGhpcyB0aWNrZXQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJOb0NoZWNrbGlzdHMiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFkZCBDaGVja2xpc3QiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGVtcGxhdGVJRCI+WyUgVHJhbnNsYXRlKCJUZW1wbGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5UZW1wbGF0ZU9wdGlvbiAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSBidG4tcHJpbWFyeSBidG4tbWFpbiBidG4td2lkdGgtbWQiIGlkPSJBZGRDaGVja2xpc3RCdG4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGkgY2xhc3M9ImZhIGZhLXBsdXMiPjwvaT4gWyUgVHJhbnNsYXRlKCJBZGQgQ2hlY2tsaXN0IikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iRm9vdGVyIj4KICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFByaW1hcnkgYnRuLXByaW1hcnkgYnRuLW1haW4gYnRuLXdpZHRoLW1kIiBpZD0iQ2xvc2VCdG4iIHR5cGU9ImJ1dHRvbiI+CiAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiQ2xvc2UiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgPC9idXR0b24+CiAgICA8L2Rpdj4KPC9kaXY+Cgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiRGVmYXVsdE1vZGUiKSAlXQo=</File>
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/AgentTicketZoom/ChecklistWidget.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIiBpZD0iQ2hlY2tsaXN0V2lkZ2V0Ij4KICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT4KICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+CiAgICAgICAgICAgIDwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDaGVja2xpc3RzIikgfCBodG1sICVdPC9oMj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ29udGVudCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vQ2hlY2tsaXN0cyIpICVdCiAgICAgICAgPHAgY2xhc3M9IlNwYWNpbmdUb3AgQ2VudGVyIj4KICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWluZm8tY2lyY2xlIj48L2k+IFslIFRyYW5zbGF0ZSgiTm8gY2hlY2tsaXN0cyBhc3NpZ25lZC4iKSB8IGh0bWwgJV0KICAgICAgICA8L3A+ClslIFJlbmRlckJsb2NrRW5kKCJOb0NoZWNrbGlzdHMiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXaWRnZXRDaGVja2xpc3QiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldENoZWNrbGlzdEJveCIgZGF0YS1jaGVja2xpc3QtaWQ9IlslIERhdGEuSUQgfCBodG1sICVdIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0Q2hlY2tsaXN0SGVhZGVyIj4KICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldENoZWNrbGlzdDtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO01vZGU9RWRpdDtDaGVja2xpc3RJRD1bJSBEYXRhLklEIHwgdXJpICVdIgogICAgICAgICAgICAgICAgICAgY2xhc3M9IkFzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbiBXaWRnZXRDaGVja2xpc3ROYW1lIj4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L3N0cm9uZz4KICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJXaWRnZXRQcm9ncmVzcyI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Db21wbGV0ZWRJdGVtcyB8IGh0bWwgJV0vWyUgRGF0YS5Ub3RhbEl0ZW1zIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgIFslIElGICFEYXRhLklzQ29tcGxldGUgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlIiBzdHlsZT0iY29sb3I6ICNmODA7IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJJbmNvbXBsZXRlIikgfCBodG1sICVdIj48L2k+CiAgICAgICAgICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2hlY2siIHN0eWxlPSJjb2xvcjogIzVhNTsiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkNvbXBsZXRlIikgfCBodG1sICVdIj48L2k+CiAgICAgICAgICAgICAgICAgICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRQcm9ncmVzc0JhciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRQcm9ncmVzc0ZpbGwiIHN0eWxlPSJ3aWR0aDogWyUgRGF0YS5Qcm9ncmVzc1BlcmNlbnQgfCBodG1sICVdJSI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiV2lkZ2V0Q2hlY2tsaXN0IikgJV0KCiAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Q2hlY2tsaXN0O1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07TW9kZT1NYW5hZ2UiCiAgICAgICAgICAgY2xhc3M9IkFzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbiBNYW5hZ2VDaGVja2xpc3RCdG4iPgogICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGVuY2lsIj48L2k+IFslIFRyYW5zbGF0ZSgiTWFuYWdlIENoZWNrbGlzdHMiKSB8IGh0bWwgJV0KICAgICAgICA8L2E+CiAgICA8L2Rpdj4KPC9kaXY+Cg==</File>
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/AgentTicketZoom/ChecklistWidgetContent.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9DaGVja2xpc3RzIikgJV0KICAgICAgICA8cCBjbGFzcz0iU3BhY2luZ1RvcCBDZW50ZXIiPgogICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtaW5mby1jaXJjbGUiPjwvaT4gWyUgVHJhbnNsYXRlKCJObyBjaGVja2xpc3RzIGFzc2lnbmVkLiIpIHwgaHRtbCAlXQogICAgICAgIDwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vQ2hlY2tsaXN0cyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIldpZGdldENoZWNrbGlzdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0Q2hlY2tsaXN0Qm94IiBkYXRhLWNoZWNrbGlzdC1pZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRDaGVja2xpc3RIZWFkZXIiPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Q2hlY2tsaXN0O1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07TW9kZT1FZGl0O0NoZWNrbGlzdElEPVslIERhdGEuSUQgfCB1cmkgJV0iCiAgICAgICAgICAgICAgICAgICBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIFdpZGdldENoZWNrbGlzdE5hbWUiPgogICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvc3Ryb25nPgogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IldpZGdldFByb2dyZXNzIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNvbXBsZXRlZEl0ZW1zIHwgaHRtbCAlXS9bJSBEYXRhLlRvdGFsSXRlbXMgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgWyUgSUYgIURhdGEuSXNDb21wbGV0ZSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUiIHN0eWxlPSJjb2xvcjogI2Y4MDsiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkluY29tcGxldGUiKSB8IGh0bWwgJV0iPjwvaT4KICAgICAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jaGVjayIgc3R5bGU9ImNvbG9yOiAjNWE1OyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ29tcGxldGUiKSB8IGh0bWwgJV0iPjwvaT4KICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFByb2dyZXNzQmFyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFByb2dyZXNzRmlsbCIgc3R5bGU9IndpZHRoOiBbJSBEYXRhLlByb2dyZXNzUGVyY2VudCB8IGh0bWwgJV0lIj48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJXaWRnZXRDaGVja2xpc3QiKSAlXQoKICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRDaGVja2xpc3Q7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtNb2RlPU1hbmFnZSIKICAgICAgICAgICBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIE1hbmFnZUNoZWNrbGlzdEJ0biI+CiAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wZW5jaWwiPjwvaT4gWyUgVHJhbnNsYXRlKCJNYW5hZ2UgQ2hlY2tsaXN0cyIpIHwgaHRtbCAlXQogICAgICAgIDwvYT4K</File>

        <!-- Language files -->
        <File Permission="660" Location="Kernel/Language/de_Checklist.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkZV9DaGVja2xpc3Q7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIEFkbWluCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVja2xpc3QgVGVtcGxhdGUgTWFuYWdlbWVudCd9ID0gJ0NoZWNrbGlzdGVuLVZvcmxhZ2VudmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVja2xpc3QgVGVtcGxhdGVzJ30gPSAnQ2hlY2tsaXN0ZW4tVm9ybGFnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIFRlbXBsYXRlJ30gPSAnVm9ybGFnZSBoaW56dWZ1ZWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IFRlbXBsYXRlJ30gPSAnVm9ybGFnZSBiZWFyYmVpdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBjaGVja2xpc3QgdGVtcGxhdGVzJ30gPSAnQ2hlY2tsaXN0ZW4tVm9ybGFnZW4gdmVyd2FsdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIGNoZWNrbGlzdCB0ZW1wbGF0ZXMgZm9yIHRpY2tldHMuJ30gPSAnQ2hlY2tsaXN0ZW4tVm9ybGFnZW4gZnVlciBUaWNrZXRzIGVyc3RlbGxlbiB1bmQgdmVyd2FsdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSBjaGVja2xpc3QgdGVtcGxhdGVzIHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvIHRpY2tldHMuJ30gPSAnQ2hlY2tsaXN0ZW4tVm9ybGFnZW4gZXJzdGVsbGVuIHVuZCB2ZXJ3YWx0ZW4sIGRpZSBUaWNrZXRzIHp1Z2VvcmRuZXQgd2VyZGVuIGtvZW5uZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlcyBhcmUgYXNzaWduZWQgdG8gcXVldWVzLiBBIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgYXNzaWduZWQgcXVldWUgYW5kIGFsbCBpdHMgc3ViLXF1ZXVlcy4nfSA9ICdWb3JsYWdlbiB3ZXJkZW4gUXVldWVzIHp1Z2VvcmRuZXQuIEVpbmUgVm9ybGFnZSBpc3QgaW4gZGVyIHp1Z2VvcmRuZXRlbiBRdWV1ZSB1bmQgYWxsZW4gVW50ZXItUXVldWVzIHZlcmZ1ZWdiYXIuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHRlbXBsYXRlcyBmb3VuZC4nfSA9ICdLZWluZSBWb3JsYWdlbiBnZWZ1bmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUXVldWUocyknfSA9ICdRdWV1ZShzKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJdGVtKHMpJ30gPSAnRWludHJhZy9FaW50cmFlZ2UnOwoKICAgICMgVGVtcGxhdGUgRWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR28gdG8gb3ZlcnZpZXcnfSA9ICdadXIgVWViZXJzaWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTYXZlIGFuZCBmaW5pc2gnfSA9ICdTcGVpY2hlcm4gdW5kIGFic2NobGllc3Nlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgdGhlIHF1ZXVlcyB3aGVyZSB0aGlzIHRlbXBsYXRlIHNob3VsZCBiZSBhdmFpbGFibGUuIFN1Yi1xdWV1ZXMgd2lsbCBpbmhlcml0IHRoZSBhc3NpZ25tZW50Lid9ID0gJ1dhZWhsZW4gU2llIGRpZSBRdWV1ZXMsIGluIGRlbmVuIGRpZXNlIFZvcmxhZ2UgdmVyZnVlZ2JhciBzZWluIHNvbGwuIFVudGVyLVF1ZXVlcyBlcmJlbiBkaWUgWnVvcmRudW5nLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGVja2xpc3QgSXRlbXMnfSA9ICdDaGVja2xpc3Rlbi1FaW50cmFlZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIHRoZSBpdGVtcyB0aGF0IHNob3VsZCBhcHBlYXIgaW4gdGhpcyBjaGVja2xpc3QuIE1hbmRhdG9yeSBpdGVtcyBtdXN0IGJlIGNvbXBsZXRlZCBiZWZvcmUgdGhlIHRpY2tldCBjYW4gYmUgY2xvc2VkLid9ID0gJ0RlZmluaWVyZW4gU2llIGRpZSBFaW50cmFlZ2UsIGRpZSBpbiBkaWVzZXIgQ2hlY2tsaXN0ZSBlcnNjaGVpbmVuIHNvbGxlbi4gUGZsaWNodGVpbnRyYWVnZSBtdWVzc2VuIGVybGVkaWd0IHdlcmRlbiwgYmV2b3IgZGFzIFRpY2tldCBnZXNjaGxvc3NlbiB3ZXJkZW4ga2Fubi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gaXRlbXMgZGVmaW5lZCB5ZXQuIEFkZCBpdGVtcyBiZWxvdy4nfSA9ICdOb2NoIGtlaW5lIEVpbnRyYWVnZSBkZWZpbmllcnQuIEZ1ZWdlbiBTaWUgdW50ZW4gRWludHJhZWdlIGhpbnp1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTmV3IEl0ZW0nfSA9ICdOZXVlbiBFaW50cmFnIGhpbnp1ZnVlZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBJdGVtJ30gPSAnRWludHJhZyBoaW56dWZ1ZWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5kYXRvcnknfSA9ICdQZmxpY2h0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09yZGVyJ30gPSAnUmVpaGVuZm9sZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVHlwZSd9ID0gJ1R5cCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb2N1bWVudGF0aW9uIExpbmsnfSA9ICdEb2t1bWVudGF0aW9ucy1MaW5rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgVGV4dCd9ID0gJ0xpbmstVGV4dCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcHRpb25hbCBVUkwgdG8gZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBjaGVja2xpc3QuJ30gPSAnT3B0aW9uYWxlIFVSTCB6dSBleHRlcm5lciBEb2t1bWVudGF0aW9uIGZ1ZXIgZGllc2UgQ2hlY2tsaXN0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG9jdW1lbnRhdGlvbid9ID0gJ0Rva3VtZW50YXRpb24nOwoKICAgICMgSXRlbSBUeXBlcwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2tib3gnfSA9ICdDaGVja2JveCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGF0dXMnfSA9ICdTdGF0dXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmFsdWUnfSA9ICdNZXNzd2VydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYXRpbmcnfSA9ICdCZXdlcnR1bmcnOwoKICAgICMgU3RhdHVzIFR5cGUgQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGF0dXMgT3B0aW9ucyd9ID0gJ1N0YXR1cy1PcHRpb25lbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPbmUgb3B0aW9uIHBlciBsaW5lLCBlLmcuOid9ID0gJ0VpbmUgT3B0aW9uIHBybyBaZWlsZSwgei5CLjonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW50ZXIgb25lIHN0YXR1cyBvcHRpb24gcGVyIGxpbmUuJ30gPSAnR2ViZW4gU2llIGVpbmUgU3RhdHVzLU9wdGlvbiBwcm8gWmVpbGUgZWluLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQbGVhc2UgZW50ZXIgYXQgbGVhc3Qgb25lIHN0YXR1cyBvcHRpb24uJ30gPSAnQml0dGUgZ2ViZW4gU2llIG1pbmRlc3RlbnMgZWluZSBTdGF0dXMtT3B0aW9uIGVpbi4nOwoKICAgICMgVmFsdWUgVHlwZSBDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1VuaXQnfSA9ICdFaW5oZWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2UuZy4gYmFyLCBtbSwga2cnfSA9ICd6LkIuIGJhciwgbW0sIGtnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhcmdldCBWYWx1ZSd9ID0gJ1NvbGx3ZXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RvbGVyYW5jZSd9ID0gJ1RvbGVyYW56JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pbmltdW0nfSA9ICdNaW5pbXVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01heGltdW0nfSA9ICdNYXhpbXVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2ltYWwgUGxhY2VzJ30gPSAnTmFjaGtvbW1hc3RlbGxlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydvcHRpb25hbCd9ID0gJ29wdGlvbmFsJzsKCiAgICAjIFJhdGluZyBUeXBlIENvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2NhbGUnfSA9ICdTa2FsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFycyd9ID0gJ1N0ZXJuZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYWJlbHMnfSA9ICdCZXNjaHJpZnR1bmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPbmUgbGFiZWwgcGVyIGxpbmUgKG9wdGlvbmFsKSwgZS5nLjonfSA9ICdFaW5lIEJlc2NocmlmdHVuZyBwcm8gWmVpbGUgKG9wdGlvbmFsKSwgei5CLjonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3B0aW9uYWwgbGFiZWxzIGZvciBlYWNoIHJhdGluZyBsZXZlbC4nfSA9ICdPcHRpb25hbGUgQmVzY2hyaWZ0dW5nZW4gZnVlciBqZWRlIEJld2VydHVuZ3NzdHVmZS4nOwoKICAgICMgSXRlbSBJbnB1dC9EaXNwbGF5CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QnfSA9ICdBdXN3YWVobGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhcmdldCd9ID0gJ1NvbGx3ZXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlbWFya3MnfSA9ICdCZW1lcmt1bmdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZW1hcmtzLi4uJ30gPSAnQmVtZXJrdW5nZW4uLi4nOwoKICAgICMgQWdlbnQgVGlja2V0IENoZWNrbGlzdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hlY2tsaXN0cyd9ID0gJ0NoZWNrbGlzdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBDaGVja2xpc3RzJ30gPSAnVGlja2V0LUNoZWNrbGlzdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoZWNrbGlzdHMgZm9yIFRpY2tldCd9ID0gJ0NoZWNrbGlzdGVuIGZ1ZXIgVGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hbmFnZSBjaGVja2xpc3RzIGZvciB0aWNrZXRzJ30gPSAnQ2hlY2tsaXN0ZW4gZnVlciBUaWNrZXRzIHZlcndhbHRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBc3NpZ25lZCBDaGVja2xpc3RzJ30gPSAnWnVnZW9yZG5ldGUgQ2hlY2tsaXN0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENoZWNrbGlzdCd9ID0gJ0NoZWNrbGlzdGUgaGluenVmdWVnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVtb3ZlIGNoZWNrbGlzdCd9ID0gJ0NoZWNrbGlzdGUgZW50ZmVybmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNoZWNrbGlzdHMgYXNzaWduZWQgdG8gdGhpcyB0aWNrZXQuJ30gPSAnS2VpbmUgQ2hlY2tsaXN0ZW4gZGllc2VtIFRpY2tldCB6dWdlb3JkbmV0Lic7CgogICAgIyBJdGVtIFN0YXRlcwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3Blbid9ID0gJ09mZmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvbmUnfSA9ICdFcmxlZGlndCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3QgQXBwbGljYWJsZSd9ID0gJ05pY2h0IHp1dHJlZmZlbmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTi9BJ30gPSAnTi56Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYXJrIGFzIGRvbmUnfSA9ICdBbHMgZXJsZWRpZ3QgbWFya2llcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01hcmsgYXMgb3Blbid9ID0gJ0FscyBvZmZlbiBtYXJraWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFyayBhcyBub3QgYXBwbGljYWJsZSd9ID0gJ0FscyBuaWNodCB6dXRyZWZmZW5kIG1hcmtpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNldCd9ID0gJ1p1cnVlY2tzZXR6ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzZXQgdG8gb3Blbid9ID0gJ0F1ZiBvZmZlbiB6dXJ1ZWNrc2V0emVuJzsKCiAgICAjIFdpZGdldAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jb21wbGV0ZSd9ID0gJ1Vudm9sbHN0YWVuZGlnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbXBsZXRlJ30gPSAnVm9sbHN0YWVuZGlnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIHRvIGV4cGFuZC9jb2xsYXBzZSd9ID0gJ0tsaWNrZW4genVtIEF1Zi0vWnVrbGFwcGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNoZWNrbGlzdHMgYXNzaWduZWQuJ30gPSAnS2VpbmUgQ2hlY2tsaXN0ZW4genVnZW9yZG5ldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jb21wbGV0ZSBtYW5kYXRvcnkgaXRlbXMnfSA9ICdVbnZvbGxzdGFlbmRpZ2UgUGZsaWNodGVpbnRyYWVnZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNYW5hZ2UnfSA9ICdWZXJ3YWx0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENoZWNrbGlzdHMnfSA9ICdDaGVja2xpc3RlbiB2ZXJ3YWx0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlIENoZWNrbGlzdHMgZm9yIFRpY2tldCd9ID0gJ0NoZWNrbGlzdGVuIHZlcndhbHRlbiBmdWVyIFRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IENoZWNrbGlzdCd9ID0gJ0NoZWNrbGlzdGUgYmVhcmJlaXRlbic7CgogICAgIyBBY3Rpb25zCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQnfSA9ICdIaW56dWZ1ZWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbmV3IGl0ZW0uLi4nfSA9ICdOZXVlbiBFaW50cmFnIGhpbnp1ZnVlZ2VuLi4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlbnRlciBhIHRpdGxlIGZvciB0aGUgaXRlbS4nfSA9ICdCaXR0ZSBnZWJlbiBTaWUgZWluZW4gVGl0ZWwgZnVlciBkZW4gRWludHJhZyBlaW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBzZWxlY3QgYSB0ZW1wbGF0ZS4nfSA9ICdCaXR0ZSB3YWVobGVuIFNpZSBlaW5lIFZvcmxhZ2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JhY2snfSA9ICdadXJ1ZWNrJzsKCiAgICAjIFBlcm1pc3Npb25zCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydZb3UgaGF2ZSByZWFkLW9ubHkgYWNjZXNzLiBZb3UgY2Fubm90IG1vZGlmeSB0ZW1wbGF0ZXMuJ30gPSAnU2llIGhhYmVuIG51ciBMZXNlenVncmlmZi4gU2llIGtvZW5uZW4gVm9ybGFnZW4gbmljaHQgYWVuZGVybi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhZC1vbmx5J30gPSAnTnVyIExlc2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRlbXBsYXRlcyd9ID0gJ0tlaW5lIEJlcmVjaHRpZ3VuZyB6dW0gQWVuZGVybiB2b24gVm9ybGFnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gaXRlbXMgZGVmaW5lZCB5ZXQuJ30gPSAnTm9jaCBrZWluZSBFaW50cmFlZ2UgZGVmaW5pZXJ0Lic7CgogICAgIyBDb25maXJtYXRpb25zCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRlbXBsYXRlICIlcyI/J30gPSAnU2luZCBTaWUgc2ljaGVyLCBkYXNzIFNpZSBkaWUgVm9ybGFnZSAiJXMiIGxvZXNjaGVuIG1vZWNodGVuPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgaXRlbT8nfSA9ICdTaW5kIFNpZSBzaWNoZXIsIGRhc3MgU2llIGRpZXNlbiBFaW50cmFnIGxvZXNjaGVuIG1vZWNodGVuPyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgY2hlY2tsaXN0Pyd9ID0gJ1NpbmQgU2llIHNpY2hlciwgZGFzcyBTaWUgZGllc2UgQ2hlY2tsaXN0ZSBlbnRmZXJuZW4gbW9lY2h0ZW4/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvIHlvdSB3YW50IHRvIGR1cGxpY2F0ZSB0ZW1wbGF0ZSAiJXMiPyd9ID0gJ01vZWNodGVuIFNpZSBkaWUgVm9ybGFnZSAiJXMiIGR1cGxpemllcmVuPyc7CgogICAgIyBEdXBsaWNhdGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSd9ID0gJ0R1cGxpemllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBkdXBsaWNhdGUgdGVtcGxhdGUhJ30gPSAnVm9ybGFnZSBrb25udGUgbmljaHQgZHVwbGl6aWVydCB3ZXJkZW4hJzsKCiAgICAjIEVkaXQgTW9kYWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VkaXQgRGV0YWlscyd9ID0gJ0RldGFpbHMgYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFZGl0IEl0ZW0gRGV0YWlscyd9ID0gJ0VpbnRyYWdzZGV0YWlscyBiZWFyYmVpdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09uZSBvcHRpb24gcGVyIGxpbmUnfSA9ICdFaW5lIE9wdGlvbiBwcm8gWmVpbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT25lIGxhYmVsIHBlciBsaW5lIChvcHRpb25hbCknfSA9ICdFaW5lIEJlc2NocmlmdHVuZyBwcm8gWmVpbGUgKG9wdGlvbmFsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSYXRpbmcgdXNlcyBhIDUtc3RhciBzY2FsZS4nfSA9ICdCZXdlcnR1bmcgdmVyd2VuZGV0IGVpbmUgNS1TdGVybmUtU2thbGEuJzsKCiAgICAjIEVycm9ycwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgcXVldWUuJ30gPSAnQml0dGUgd2FlaGxlbiBTaWUgbWluZGVzdGVucyBlaW5lIFF1ZXVlIGF1cy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiB0byBkZWxldGUgdGhpcyB0ZW1wbGF0ZSd9ID0gJ0tlaW5lIEJlcmVjaHRpZ3VuZyB6dW0gTG9lc2NoZW4gZGllc2VyIFZvcmxhZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gcGVybWlzc2lvbiB0byBkdXBsaWNhdGUgdGhpcyB0ZW1wbGF0ZSd9ID0gJ0tlaW5lIEJlcmVjaHRpZ3VuZyB6dW0gRHVwbGl6aWVyZW4gZGllc2VyIFZvcmxhZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSEnfSA9ICdWb3JsYWdlIGtvbm50ZSBuaWNodCBlcnN0ZWxsdCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCB1cGRhdGUgdGVtcGxhdGUhJ30gPSAnVm9ybGFnZSBrb25udGUgbmljaHQgYWt0dWFsaXNpZXJ0IHdlcmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGRlbGV0ZSB0ZW1wbGF0ZSEnfSA9ICdWb3JsYWdlIGtvbm50ZSBuaWNodCBnZWxvZXNjaHQgd2VyZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5ub3QgZGVsZXRlOiB0aGlzIHRlbXBsYXRlIGlzIHN0aWxsIGF0dGFjaGVkIHRvICVzIHRpY2tldChzKS4nfSA9ICdMb2VzY2hlbiBuaWNodCBtb2VnbGljaDogRGllc2UgVm9ybGFnZSBpc3Qgbm9jaCBhbiAlcyBUaWNrZXQocykgYW5nZWhhZW5ndC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGFkZCBpdGVtISd9ID0gJ0VpbnRyYWcga29ubnRlIG5pY2h0IGhpbnp1Z2VmdWVndCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBzYXZlIGl0ZW0hJ30gPSAnRWludHJhZyBrb25udGUgbmljaHQgZ2VzcGVpY2hlcnQgd2VyZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgZGVsZXRlIGl0ZW0hJ30gPSAnRWludHJhZyBrb25udGUgbmljaHQgZ2Vsb2VzY2h0IHdlcmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGFkZCBjaGVja2xpc3QhJ30gPSAnQ2hlY2tsaXN0ZSBrb25udGUgbmljaHQgaGluenVnZWZ1ZWd0IHdlcmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHJlbW92ZSBjaGVja2xpc3QhJ30gPSAnQ2hlY2tsaXN0ZSBrb25udGUgbmljaHQgZW50ZmVybnQgd2VyZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgdXBkYXRlIGl0ZW0gc3RhdGUhJ30gPSAnRWludHJhZ3NzdGF0dXMga29ubnRlIG5pY2h0IGFrdHVhbGlzaWVydCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCB1cGRhdGUgaXRlbSBzdGF0ZS4nfSA9ICdFaW50cmFnc3N0YXR1cyBrb25udGUgbmljaHQgYWt0dWFsaXNpZXJ0IHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbm90IGZvdW5kISd9ID0gJ1ZvcmxhZ2UgbmljaHQgZ2VmdW5kZW4hJzsKCiAgICAjIEltcG9ydC9FeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCd9ID0gJ0V4cG9ydGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBhcyBYTUwnfSA9ICdBbHMgWE1MIGV4cG9ydGllcmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBUZW1wbGF0ZSd9ID0gJ1ZvcmxhZ2UgaW1wb3J0aWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIHNlbGVjdCBhbiBYTUwgZmlsZS4nfSA9ICdCaXR0ZSB3YWVobGVuIFNpZSBlaW5lIFhNTC1EYXRlaSBhdXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlICIlcyIgaW1wb3J0ZWQgc3VjY2Vzc2Z1bGx5Lid9ID0gJ1ZvcmxhZ2UgIiVzIiBlcmZvbGdyZWljaCBpbXBvcnRpZXJ0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgaW1wb3J0IHRlbXBsYXRlOiAlcyd9ID0gJ1ZvcmxhZ2Uga29ubnRlIG5pY2h0IGltcG9ydGllcnQgd2VyZGVuOiAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcmVhZCBmaWxlLid9ID0gJ0RhdGVpIGtvbm50ZSBuaWNodCBnZWxlc2VuIHdlcmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBYTUwgY29udGVudCd9ID0gJ1VuZ3VlbHRpZ2VyIFhNTC1JbmhhbHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdGVtcGxhdGUgbmFtZSBmb3VuZCBpbiBYTUwnfSA9ICdLZWluIFZvcmxhZ2VubmFtZSBpbiBYTUwgZ2VmdW5kZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSd9ID0gJ1ZvcmxhZ2Uga29ubnRlIG5pY2h0IGVyc3RlbGx0IHdlcmRlbic7CgogICAgIyBSYXRpbmcgaGludHMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NsaWNrIGFnYWluIHRvIHJlc2V0IHJhdGluZyd9ID0gJ0VybmV1dCBrbGlja2VuIHVtIEJld2VydHVuZyB6dXJ1ZWNrenVzZXR6ZW4nOwoKICAgICMgUHJvY2VzcyBNYW5hZ2VtZW50IFRyYW5zaXRpb25BY3Rpb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fzc2lnbiBjaGVja2xpc3QgdG8gdGlja2V0J30gPSAnQ2hlY2tsaXN0ZSBkZW0gVGlja2V0IHp1d2Vpc2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Fzc2lnbnMgYSBjaGVja2xpc3QgdGVtcGxhdGUgdG8gdGhlIHRpY2tldC4nfSA9ICdXZWlzdCBkZW0gVGlja2V0IGVpbmUgQ2hlY2tsaXN0ZW4tVm9ybGFnZSB6dS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgSUQgb2YgdGhlIGNoZWNrbGlzdCB0byBhc3NpZ24uJ30gPSAnVm9ybGFnZW4tSUQgZGVyIHp1enV3ZWlzZW5kZW4gQ2hlY2tsaXN0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbmFtZSBvZiB0aGUgY2hlY2tsaXN0IHRvIGFzc2lnbiAoYWx0ZXJuYXRpdmUgdG8gSUQpLid9ID0gJ1ZvcmxhZ2VubmFtZSBkZXIgenV6dXdlaXNlbmRlbiBDaGVja2xpc3RlIChBbHRlcm5hdGl2ZSB6dXIgSUQpLic7CgogICAgIyBTZWN1cml0eSBNZXNzYWdlcwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBJRCEnfSA9ICdVbmd1ZWx0aWdlIElEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIElELid9ID0gJ1VuZ3VlbHRpZ2UgSUQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoaXMgdGVtcGxhdGUuJ30gPSAnS2VpbmUgQmVyZWNodGlndW5nLCBkaWVzZSBWb3JsYWdlIHp1IGJlYXJiZWl0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZpbGUgdG9vIGxhcmdlLiBNYXhpbXVtIHNpemUgaXMgMSBNQi4nfSA9ICdEYXRlaSB6dSBncm9zcy4gTWF4aW1hbGUgR3JvZXNzZSBpc3QgMSBNQi4nOwoKICAgICMgQ29uc29sZSBDb21tYW5kcwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGEgY2hlY2tsaXN0IHRlbXBsYXRlIGZyb20gYW4gWE1MIGZpbGUuJ30gPSAnQ2hlY2tsaXN0ZW4tVm9ybGFnZSBhdXMgWE1MLURhdGVpIGltcG9ydGllcmVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnQgYSBjaGVja2xpc3QgdGVtcGxhdGUgdG8gYW4gWE1MIGZpbGUuJ30gPSAnQ2hlY2tsaXN0ZW4tVm9ybGFnZSBpbiBYTUwtRGF0ZWkgZXhwb3J0aWVyZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhdGggdG8gdGhlIFhNTCBmaWxlIHRvIGltcG9ydC4nfSA9ICdQZmFkIHp1ciBYTUwtRGF0ZWkgZnVlciBkZW4gSW1wb3J0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdmVyd3JpdGUgZXhpc3RpbmcgdGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUgaW5zdGVhZCBvZiBjcmVhdGluZyBhIGNvcHkuJ30gPSAnQmVzdGVoZW5kZSBWb3JsYWdlIG1pdCBnbGVpY2hlbSBOYW1lbiB1ZWJlcnNjaHJlaWJlbiBzdGF0dCBLb3BpZSB6dSBlcnN0ZWxsZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIElEIHRvIGV4cG9ydC4nfSA9ICdWb3JsYWdlbi1JRCB6dW0gRXhwb3J0aWVyZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIG5hbWUgdG8gZXhwb3J0IChhbHRlcm5hdGl2ZSB0byAtLWlkKS4nfSA9ICdWb3JsYWdlbm5hbWUgenVtIEV4cG9ydGllcmVuIChBbHRlcm5hdGl2ZSB6dSAtLWlkKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGlyZWN0b3J5IHRvIHNhdmUgdGhlIGV4cG9ydGVkIGZpbGUgKGRlZmF1bHQ6IGN1cnJlbnQgZGlyZWN0b3J5KS4nfSA9ICdWZXJ6ZWljaG5pcyB6dW0gU3BlaWNoZXJuIGRlciBleHBvcnRpZXJ0ZW4gRGF0ZWkgKFN0YW5kYXJkOiBha3R1ZWxsZXMgVmVyemVpY2huaXMpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPdXRwdXQgWE1MIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIGZpbGUuJ30gPSAnWE1MIGF1ZiBzdGRvdXQgYXVzZ2ViZW4gc3RhdHQgaW4gRGF0ZWkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0V4cG9ydCBhbGwgdGVtcGxhdGVzLid9ID0gJ0FsbGUgVm9ybGFnZW4gZXhwb3J0aWVyZW4uJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK</File>

        <!-- JavaScript -->
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Admin.Checklist.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI1IFpudW55IENoZWNrbGlzdCBQcm9qZWN0Ci8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CkNvcmUuQWdlbnQuQWRtaW4gPSBDb3JlLkFnZW50LkFkbWluIHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5BZG1pbi5DaGVja2xpc3QKICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4KICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgZnVuY3Rpb25zIGZvciBBZ2VudENoZWNrbGlzdFRlbXBsYXRlLgogKi8KQ29yZS5BZ2VudC5BZG1pbi5DaGVja2xpc3QgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgdmFyIEhhc1Vuc2F2ZWRDaGFuZ2VzID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgTWFya1Vuc2F2ZWQKICAgICAqIEBkZXNjcmlwdGlvbiBNYXJrIHRoYXQgdGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcwogICAgICovCiAgICBmdW5jdGlvbiBNYXJrVW5zYXZlZCgpIHsKICAgICAgICBIYXNVbnNhdmVkQ2hhbmdlcyA9IHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2xlYXJVbnNhdmVkCiAgICAgKiBAZGVzY3JpcHRpb24gQ2xlYXIgdW5zYXZlZCBjaGFuZ2VzIGZsYWcKICAgICAqLwogICAgZnVuY3Rpb24gQ2xlYXJVbnNhdmVkKCkgewogICAgICAgIEhhc1Vuc2F2ZWRDaGFuZ2VzID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgU2hvd01vZGFsVHlwZUNvbmZpZwogICAgICogQGRlc2NyaXB0aW9uIFNob3cvaGlkZSB0eXBlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmllbGRzIGluIG1vZGFsCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gSXRlbVR5cGUgLSBUaGUgc2VsZWN0ZWQgaXRlbSB0eXBlCiAgICAgKiBAcGFyYW0ge2pRdWVyeX0gJENvbnRhaW5lciAtIE9wdGlvbmFsIGNvbnRhaW5lciB0byBzY29wZSBzZWxlY3RvcnMgKGRlZmF1bHQ6IC5EaWFsb2cgb3IgZG9jdW1lbnQpCiAgICAgKi8KICAgIGZ1bmN0aW9uIFNob3dNb2RhbFR5cGVDb25maWcoSXRlbVR5cGUsICRDb250YWluZXIpIHsKICAgICAgICAvLyBVc2UgcHJvdmlkZWQgY29udGFpbmVyIG9yIGZpbmQgdGhlIGRpYWxvZywgb3IgZmFsbCBiYWNrIHRvIGRvY3VtZW50CiAgICAgICAgdmFyICRTY29wZSA9ICRDb250YWluZXIgfHwgJCgnLkRpYWxvZycpOwogICAgICAgIGlmICgkU2NvcGUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICRTY29wZSA9ICQoZG9jdW1lbnQpOwogICAgICAgIH0KCiAgICAgICAgLy8gSGlkZSBhbGwgdHlwZSBjb25maWcgc2VjdGlvbnMKICAgICAgICAkU2NvcGUuZmluZCgnLkl0ZW1Nb2RhbFR5cGVDb25maWcnKS5hZGRDbGFzcygnSGlkZGVuJyk7CgogICAgICAgIC8vIFNob3cgdGhlIHJlbGV2YW50IGNvbmZpZyBzZWN0aW9uCiAgICAgICAgc3dpdGNoIChJdGVtVHlwZSkgewogICAgICAgICAgICBjYXNlICdzdGF0dXMnOgogICAgICAgICAgICAgICAgJFNjb3BlLmZpbmQoJyNJdGVtTW9kYWxTdGF0dXNDb25maWcnKS5yZW1vdmVDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAndmFsdWUnOgogICAgICAgICAgICAgICAgJFNjb3BlLmZpbmQoJyNJdGVtTW9kYWxWYWx1ZUNvbmZpZycpLnJlbW92ZUNsYXNzKCdIaWRkZW4nKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdyYXRpbmcnOgogICAgICAgICAgICAgICAgJFNjb3BlLmZpbmQoJyNJdGVtTW9kYWxSYXRpbmdDb25maWcnKS5yZW1vdmVDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gY2hlY2tib3ggbmVlZHMgbm8gZXh0cmEgY29uZmlnCiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEdldE1vZGFsQ29uZmlnCiAgICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgY29uZmlnIG9iamVjdCBmcm9tIG1vZGFsIGZpZWxkcwogICAgICogQHBhcmFtIHtTdHJpbmd9IEl0ZW1UeXBlIC0gVGhlIGl0ZW0gdHlwZQogICAgICogQHJldHVybnMge09iamVjdH0gQ29uZmlnIG9iamVjdAogICAgICovCiAgICBmdW5jdGlvbiBHZXRNb2RhbENvbmZpZyhJdGVtVHlwZSkgewogICAgICAgIHZhciBDb25maWcgPSB7fTsKICAgICAgICB2YXIgJERpYWxvZyA9ICQoJy5EaWFsb2cnKTsKCiAgICAgICAgc3dpdGNoIChJdGVtVHlwZSkgewogICAgICAgICAgICBjYXNlICdzdGF0dXMnOgogICAgICAgICAgICAgICAgdmFyIE9wdGlvbnNUZXh0ID0gJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsU3RhdHVzT3B0aW9ucycpLnZhbCgpLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmIChPcHRpb25zVGV4dCkgewogICAgICAgICAgICAgICAgICAgIENvbmZpZy5vcHRpb25zID0gT3B0aW9uc1RleHQuc3BsaXQoJ1xuJykuZmlsdGVyKGZ1bmN0aW9uKG9wdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0LnRyaW0oKSAhPT0gJyc7CiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uKG9wdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0LnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLm9wdGlvbnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuZGVmYXVsdE9wdGlvbiA9IENvbmZpZy5vcHRpb25zW0NvbmZpZy5vcHRpb25zLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAndmFsdWUnOgogICAgICAgICAgICAgICAgdmFyIFVuaXQgPSAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxWYWx1ZVVuaXQnKS52YWwoKS50cmltKCk7CiAgICAgICAgICAgICAgICB2YXIgVGFyZ2V0ID0gJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsVmFsdWVUYXJnZXQnKS52YWwoKTsKICAgICAgICAgICAgICAgIHZhciBUb2xlcmFuY2UgPSAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxWYWx1ZVRvbGVyYW5jZScpLnZhbCgpOwogICAgICAgICAgICAgICAgdmFyIE1pbiA9ICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFZhbHVlTWluJykudmFsKCk7CiAgICAgICAgICAgICAgICB2YXIgTWF4ID0gJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsVmFsdWVNYXgnKS52YWwoKTsKICAgICAgICAgICAgICAgIHZhciBEZWNpbWFscyA9ICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFZhbHVlRGVjaW1hbHMnKS52YWwoKTsKCiAgICAgICAgICAgICAgICBpZiAoVW5pdCkgQ29uZmlnLnVuaXQgPSBVbml0OwogICAgICAgICAgICAgICAgaWYgKFRhcmdldCAhPT0gJycpIENvbmZpZy50YXJnZXRWYWx1ZSA9IHBhcnNlRmxvYXQoVGFyZ2V0KTsKICAgICAgICAgICAgICAgIGlmIChUb2xlcmFuY2UgIT09ICcnKSBDb25maWcudG9sZXJhbmNlID0gcGFyc2VGbG9hdChUb2xlcmFuY2UpOwogICAgICAgICAgICAgICAgaWYgKE1pbiAhPT0gJycpIENvbmZpZy5taW4gPSBwYXJzZUZsb2F0KE1pbik7CiAgICAgICAgICAgICAgICBpZiAoTWF4ICE9PSAnJykgQ29uZmlnLm1heCA9IHBhcnNlRmxvYXQoTWF4KTsKICAgICAgICAgICAgICAgIENvbmZpZy5kZWNpbWFsUGxhY2VzID0gcGFyc2VJbnQoRGVjaW1hbHMsIDEwKSB8fCAyOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdyYXRpbmcnOgogICAgICAgICAgICAgICAgQ29uZmlnLnNjYWxlID0gNTsgLy8gRml4ZWQgNS1zdGFyIHJhdGluZwogICAgICAgICAgICAgICAgdmFyIExhYmVsc1RleHQgPSAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxSYXRpbmdMYWJlbHMnKS52YWwoKS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAoTGFiZWxzVGV4dCkgewogICAgICAgICAgICAgICAgICAgIENvbmZpZy5sYWJlbHMgPSBMYWJlbHNUZXh0LnNwbGl0KCdcbicpLmZpbHRlcihmdW5jdGlvbihsYmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxibC50cmltKCkgIT09ICcnOwogICAgICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbihsYmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxibC50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHJldHVybiBDb25maWc7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2xlYXJNb2RhbAogICAgICogQGRlc2NyaXB0aW9uIFJlc2V0IHRoZSBtb2RhbCB0byBkZWZhdWx0cyBmb3IgYWRkaW5nIGEgbmV3IGl0ZW0KICAgICAqLwogICAgZnVuY3Rpb24gQ2xlYXJNb2RhbCgpIHsKICAgICAgICB2YXIgJERpYWxvZyA9ICQoJy5EaWFsb2cnKTsKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxNb2RlJykudmFsKCdhZGQnKTsKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxJRCcpLnZhbCgnJyk7CiAgICAgICAgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsVGl0bGUnKS52YWwoJycpOwogICAgICAgICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbERlc2NyaXB0aW9uJykudmFsKCcnKTsKCiAgICAgICAgLy8gQWRkIG1vZGU6IFNob3cgc2VsZWN0LCBoaWRlIGRpc3BsYXkKICAgICAgICB2YXIgJFR5cGVTZWxlY3QgPSAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxUeXBlJyk7CiAgICAgICAgdmFyICRUeXBlRGlzcGxheSA9ICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFR5cGVEaXNwbGF5Jyk7CgogICAgICAgICRUeXBlU2VsZWN0LnZhbCgnY2hlY2tib3gnKTsKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxUeXBlU2VsZWN0V3JhcHBlcicpLnNob3coKTsKICAgICAgICAkVHlwZURpc3BsYXkuYWRkQ2xhc3MoJ0hpZGRlbicpOwoKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxNYW5kYXRvcnknKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFN0YXR1c09wdGlvbnMnKS52YWwoJycpOwogICAgICAgICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFZhbHVlVW5pdCcpLnZhbCgnJyk7CiAgICAgICAgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsVmFsdWVUYXJnZXQnKS52YWwoJycpOwogICAgICAgICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFZhbHVlVG9sZXJhbmNlJykudmFsKCcnKTsKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxWYWx1ZU1pbicpLnZhbCgnJyk7CiAgICAgICAgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsVmFsdWVNYXgnKS52YWwoJycpOwogICAgICAgICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFZhbHVlRGVjaW1hbHMnKS52YWwoJzInKTsKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxSYXRpbmdMYWJlbHMnKS52YWwoJycpOwogICAgICAgICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbExpbmtVUkwnKS52YWwoJycpOwogICAgICAgICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbExpbmtUZXh0JykudmFsKCcnKTsKICAgICAgICBTaG93TW9kYWxUeXBlQ29uZmlnKCdjaGVja2JveCcsICREaWFsb2cpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFBvcHVsYXRlTW9kYWwKICAgICAqIEBkZXNjcmlwdGlvbiBGaWxsIG1vZGFsIHdpdGggaXRlbSBkYXRhIGZvciBlZGl0aW5nCiAgICAgKiBAcGFyYW0ge2pRdWVyeX0gJFJvdyAtIFRoZSB0YWJsZSByb3cgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBQb3B1bGF0ZU1vZGFsKCRSb3cpIHsKICAgICAgICAvLyBVc2UgYXR0cigpIGluc3RlYWQgb2YgZGF0YSgpIHRvIGdldCBmcmVzaCB2YWx1ZXMgZnJvbSBET00KICAgICAgICB2YXIgSXRlbVR5cGUgPSAkUm93LmF0dHIoJ2RhdGEtaXRlbXR5cGUnKSB8fCAnY2hlY2tib3gnLAogICAgICAgICAgICBUaXRsZSA9ICRSb3cuYXR0cignZGF0YS10aXRsZScpIHx8ICcnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9ICRSb3cuYXR0cignZGF0YS1kZXNjcmlwdGlvbicpIHx8ICcnLAogICAgICAgICAgICBJc01hbmRhdG9yeSA9ICRSb3cuYXR0cignZGF0YS1tYW5kYXRvcnknKSA9PSAnMScsCiAgICAgICAgICAgIExpbmtVUkwgPSAkUm93LmF0dHIoJ2RhdGEtbGlua3VybCcpIHx8ICcnLAogICAgICAgICAgICBMaW5rVGV4dCA9ICRSb3cuYXR0cignZGF0YS1saW5rdGV4dCcpIHx8ICcnLAogICAgICAgICAgICBDb25maWdEYXRhID0gJFJvdy5hdHRyKCdkYXRhLWNvbmZpZycpLAogICAgICAgICAgICBDb25maWcgPSB7fTsKCiAgICAgICAgLy8gR2V0IGRpYWxvZyBjb250YWluZXIgLSBmaWVsZHMgYXJlIGluc2lkZSB0aGUgZGlhbG9nLCBub3QgdGhlIGhpZGRlbiBvcmlnaW5hbAogICAgICAgIHZhciAkRGlhbG9nID0gJCgnLkRpYWxvZycpOwoKICAgICAgICAvLyBEZWJ1ZyBsb2dnaW5nCiAgICAgICAgY29uc29sZS5sb2coJ1BvcHVsYXRlTW9kYWwgLSBEaWFsb2cgZm91bmQ6JywgJERpYWxvZy5sZW5ndGgpOwogICAgICAgIGNvbnNvbGUubG9nKCdQb3B1bGF0ZU1vZGFsIC0gUm93IGRhdGE6JywgewogICAgICAgICAgICBJdGVtVHlwZTogSXRlbVR5cGUsCiAgICAgICAgICAgIFRpdGxlOiBUaXRsZSwKICAgICAgICAgICAgRGVzY3JpcHRpb246IERlc2NyaXB0aW9uLAogICAgICAgICAgICBJc01hbmRhdG9yeTogSXNNYW5kYXRvcnksCiAgICAgICAgICAgIExpbmtVUkw6IExpbmtVUkwsCiAgICAgICAgICAgIExpbmtUZXh0OiBMaW5rVGV4dCwKICAgICAgICAgICAgQ29uZmlnRGF0YTogQ29uZmlnRGF0YQogICAgICAgIH0pOwoKICAgICAgICAvLyBQYXJzZSBjb25maWcgLSBpdCBtaWdodCBiZSBhIHN0cmluZyBvciBhbHJlYWR5IGFuIG9iamVjdAogICAgICAgIGlmICh0eXBlb2YgQ29uZmlnRGF0YSA9PT0gJ3N0cmluZycgJiYgQ29uZmlnRGF0YSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgQ29uZmlnID0gSlNPTi5wYXJzZShDb25maWdEYXRhKTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdQb3B1bGF0ZU1vZGFsIC0gUGFyc2VkIGNvbmZpZzonLCBDb25maWcpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQb3B1bGF0ZU1vZGFsIC0gRXJyb3IgcGFyc2luZyBjb25maWc6JywgZSwgQ29uZmlnRGF0YSk7CiAgICAgICAgICAgICAgICBDb25maWcgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIENvbmZpZ0RhdGEgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgIENvbmZpZyA9IENvbmZpZ0RhdGEgfHwge307CiAgICAgICAgfQoKICAgICAgICAvLyBTZXQgbW9kZSBhbmQgSUQgKHNjb3BlIHRvIGRpYWxvZykKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxNb2RlJykudmFsKCdlZGl0Jyk7CiAgICAgICAgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsSUQnKS52YWwoJFJvdy5hdHRyKCdkYXRhLWlkJykpOwoKICAgICAgICAvLyBTZXQgYmFzaWMgZmllbGRzIChzY29wZSB0byBkaWFsb2cpCiAgICAgICAgY29uc29sZS5sb2coJ1BvcHVsYXRlTW9kYWwgLSBTZXR0aW5nIGZpZWxkcyBpbiBkaWFsb2cnKTsKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxUaXRsZScpLnZhbChUaXRsZSk7CiAgICAgICAgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsRGVzY3JpcHRpb24nKS52YWwoRGVzY3JpcHRpb24pOwoKICAgICAgICAvLyBFZGl0IG1vZGU6IEhpZGUgc2VsZWN0IHdyYXBwZXIsIHNob3cgdHlwZSBhcyByZWFkLW9ubHkgYmFkZ2UKICAgICAgICB2YXIgJFR5cGVTZWxlY3QgPSAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxUeXBlJyk7CiAgICAgICAgdmFyICRUeXBlRGlzcGxheSA9ICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFR5cGVEaXNwbGF5Jyk7CiAgICAgICAgdmFyIFR5cGVMYWJlbHMgPSB7CiAgICAgICAgICAgICdjaGVja2JveCc6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDaGVja2JveCcpLAogICAgICAgICAgICAnc3RhdHVzJzogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N0YXR1cycpLAogICAgICAgICAgICAndmFsdWUnOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVmFsdWUnKSwKICAgICAgICAgICAgJ3JhdGluZyc6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdSYXRpbmcnKQogICAgICAgIH07CgogICAgICAgIC8vIFNldCB0aGUgc2VsZWN0IHZhbHVlIChuZWVkZWQgZm9yIHNhdmluZykKICAgICAgICAkVHlwZVNlbGVjdC52YWwoSXRlbVR5cGUpOwogICAgICAgIC8vIEhpZGUgdGhlIHNlbGVjdCB3cmFwcGVyCiAgICAgICAgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsVHlwZVNlbGVjdFdyYXBwZXInKS5oaWRlKCk7CgogICAgICAgIC8vIFNob3cgdGhlIHR5cGUgYmFkZ2UKICAgICAgICAkVHlwZURpc3BsYXkKICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdJdGVtVHlwZS1jaGVja2JveCBJdGVtVHlwZS1zdGF0dXMgSXRlbVR5cGUtdmFsdWUgSXRlbVR5cGUtcmF0aW5nIEhpZGRlbicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnSXRlbVR5cGUtJyArIEl0ZW1UeXBlKQogICAgICAgICAgICAudGV4dChUeXBlTGFiZWxzW0l0ZW1UeXBlXSB8fCBJdGVtVHlwZSk7CgogICAgICAgICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbE1hbmRhdG9yeScpLnByb3AoJ2NoZWNrZWQnLCBJc01hbmRhdG9yeSk7CiAgICAgICAgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsTGlua1VSTCcpLnZhbChMaW5rVVJMKTsKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxMaW5rVGV4dCcpLnZhbChMaW5rVGV4dCk7CgogICAgICAgIC8vIFZlcmlmeSBmaWVsZHMgd2VyZSBzZXQKICAgICAgICBjb25zb2xlLmxvZygnUG9wdWxhdGVNb2RhbCAtIEFmdGVyIHNldHRpbmcsIHZhbHVlcyBhcmU6JywgewogICAgICAgICAgICBUaXRsZUZpZWxkOiAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxUaXRsZScpLnZhbCgpLAogICAgICAgICAgICBEZXNjRmllbGQ6ICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbERlc2NyaXB0aW9uJykudmFsKCksCiAgICAgICAgICAgIFR5cGVGaWVsZDogJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsVHlwZScpLnZhbCgpLAogICAgICAgICAgICBNYW5kYXRvcnlGaWVsZDogJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsTWFuZGF0b3J5JykuaXMoJzpjaGVja2VkJykKICAgICAgICB9KTsKCiAgICAgICAgLy8gQ2xlYXIgYWxsIGNvbmZpZyBmaWVsZHMgZmlyc3QgKHNjb3BlIHRvIGRpYWxvZykKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxTdGF0dXNPcHRpb25zJykudmFsKCcnKTsKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxWYWx1ZVVuaXQnKS52YWwoJycpOwogICAgICAgICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFZhbHVlVGFyZ2V0JykudmFsKCcnKTsKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxWYWx1ZVRvbGVyYW5jZScpLnZhbCgnJyk7CiAgICAgICAgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsVmFsdWVNaW4nKS52YWwoJycpOwogICAgICAgICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFZhbHVlTWF4JykudmFsKCcnKTsKICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxWYWx1ZURlY2ltYWxzJykudmFsKCcyJyk7CiAgICAgICAgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsUmF0aW5nTGFiZWxzJykudmFsKCcnKTsKCiAgICAgICAgLy8gUG9wdWxhdGUgdHlwZS1zcGVjaWZpYyBjb25maWcgKHNjb3BlIHRvIGRpYWxvZykKICAgICAgICBzd2l0Y2ggKEl0ZW1UeXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ3N0YXR1cyc6CiAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLm9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShDb25maWcub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgICAgICAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxTdGF0dXNPcHRpb25zJykudmFsKENvbmZpZy5vcHRpb25zLmpvaW4oJ1xuJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICd2YWx1ZSc6CiAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLnVuaXQpICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFZhbHVlVW5pdCcpLnZhbChDb25maWcudW5pdCk7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIENvbmZpZy50YXJnZXRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFZhbHVlVGFyZ2V0JykudmFsKENvbmZpZy50YXJnZXRWYWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIENvbmZpZy50b2xlcmFuY2UgIT09ICd1bmRlZmluZWQnKSAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxWYWx1ZVRvbGVyYW5jZScpLnZhbChDb25maWcudG9sZXJhbmNlKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQ29uZmlnLm1pbiAhPT0gJ3VuZGVmaW5lZCcpICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFZhbHVlTWluJykudmFsKENvbmZpZy5taW4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBDb25maWcubWF4ICE9PSAndW5kZWZpbmVkJykgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsVmFsdWVNYXgnKS52YWwoQ29uZmlnLm1heCk7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIENvbmZpZy5kZWNpbWFsUGxhY2VzICE9PSAndW5kZWZpbmVkJykgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsVmFsdWVEZWNpbWFscycpLnZhbChDb25maWcuZGVjaW1hbFBsYWNlcyk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ3JhdGluZyc6CiAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLmxhYmVscyAmJiBBcnJheS5pc0FycmF5KENvbmZpZy5sYWJlbHMpKSB7CiAgICAgICAgICAgICAgICAgICAgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsUmF0aW5nTGFiZWxzJykudmFsKENvbmZpZy5sYWJlbHMuam9pbignXG4nKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIC8vIFNob3cgcmVsZXZhbnQgY29uZmlnIHNlY3Rpb24gKHNjb3BlIHRvIGRpYWxvZykKICAgICAgICBTaG93TW9kYWxUeXBlQ29uZmlnKEl0ZW1UeXBlLCAkRGlhbG9nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBPcGVuSXRlbU1vZGFsCiAgICAgKiBAZGVzY3JpcHRpb24gT3BlbiB0aGUgaXRlbSBtb2RhbCBmb3IgYWRkIG9yIGVkaXQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBNb2RlIC0gJ2FkZCcgb3IgJ2VkaXQnCiAgICAgKiBAcGFyYW0ge2pRdWVyeX0gJFJvdyAtIFRoZSB0YWJsZSByb3cgZWxlbWVudCAoZm9yIGVkaXQgbW9kZSkKICAgICAqLwogICAgZnVuY3Rpb24gT3Blbkl0ZW1Nb2RhbChNb2RlLCAkUm93KSB7CiAgICAgICAgdmFyICRNb2RhbCA9ICQoJyNJdGVtTW9kYWwnKTsKCiAgICAgICAgLy8gRGVidWc6IENoZWNrIGlmIG1vZGFsIGV4aXN0cwogICAgICAgIGlmICgkTW9kYWwubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0l0ZW1Nb2RhbCBub3QgZm91bmQgaW4gRE9NJyk7CiAgICAgICAgICAgIGFsZXJ0KCdFcnJvcjogTW9kYWwgZWxlbWVudCBub3QgZm91bmQuIE1ha2Ugc3VyZSB5b3UgYXJlIGVkaXRpbmcgYSB0ZW1wbGF0ZSwgbm90IGNyZWF0aW5nIG9uZS4nKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIERpYWxvZ1RpdGxlID0gTW9kZSA9PT0gJ2VkaXQnCiAgICAgICAgICAgICAgICA/IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdFZGl0IEl0ZW0nKQogICAgICAgICAgICAgICAgOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQWRkIEl0ZW0nKTsKCiAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dDb250ZW50RGlhbG9nKAogICAgICAgICAgICAgICAgJE1vZGFsLAogICAgICAgICAgICAgICAgRGlhbG9nVGl0bGUsCiAgICAgICAgICAgICAgICAnMTBweCcsCiAgICAgICAgICAgICAgICAnQ2VudGVyJywKICAgICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZTogJ1N1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnUHJpbWFyeScsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlSXRlbUZyb21Nb2RhbCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ2FuY2VsJyksCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGU6ICdDbG9zZScKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAvLyBJTVBPUlRBTlQ6IFBvcHVsYXRlIEFGVEVSIGRpYWxvZyBpcyBzaG93biAoZGlhbG9nIGNsb25lcyB0aGUgY29udGVudCkKICAgICAgICAgICAgLy8gVXNlIHNldFRpbWVvdXQgdG8gZW5zdXJlIGRpYWxvZyBpcyBmdWxseSByZW5kZXJlZAogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKE1vZGUgPT09ICdlZGl0JyAmJiAkUm93KSB7CiAgICAgICAgICAgICAgICAgICAgUG9wdWxhdGVNb2RhbCgkUm93KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQ2xlYXJNb2RhbCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCA1MCk7CgogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igb3BlbmluZyBtb2RhbDonLCBlKTsKICAgICAgICAgICAgYWxlcnQoJ0Vycm9yIG9wZW5pbmcgZGlhbG9nOiAnICsgZS5tZXNzYWdlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgU2F2ZUl0ZW1Gcm9tTW9kYWwKICAgICAqIEBkZXNjcmlwdGlvbiBTYXZlIGl0ZW0gKGFkZCBvciB1cGRhdGUpIGZyb20gbW9kYWwgZGF0YQogICAgICovCiAgICBmdW5jdGlvbiBTYXZlSXRlbUZyb21Nb2RhbCgpIHsKICAgICAgICB2YXIgJERpYWxvZyA9ICQoJy5EaWFsb2cnKSwKICAgICAgICAgICAgTW9kZSA9ICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbE1vZGUnKS52YWwoKSwKICAgICAgICAgICAgSXRlbUlEID0gJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsSUQnKS52YWwoKSwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9ICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFRlbXBsYXRlSUQnKS52YWwoKSwKICAgICAgICAgICAgVGl0bGUgPSAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxUaXRsZScpLnZhbCgpLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9ICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbERlc2NyaXB0aW9uJykudmFsKCksCiAgICAgICAgICAgIEl0ZW1UeXBlID0gJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsVHlwZScpLnZhbCgpLAogICAgICAgICAgICBJc01hbmRhdG9yeSA9ICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbE1hbmRhdG9yeScpLmlzKCc6Y2hlY2tlZCcpID8gMSA6IDAsCiAgICAgICAgICAgIExpbmtVUkwgPSAkRGlhbG9nLmZpbmQoJyNJdGVtTW9kYWxMaW5rVVJMJykudmFsKCksCiAgICAgICAgICAgIExpbmtUZXh0ID0gJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsTGlua1RleHQnKS52YWwoKSwKICAgICAgICAgICAgQ29uZmlnID0gR2V0TW9kYWxDb25maWcoSXRlbVR5cGUpOwoKICAgICAgICAvLyBWYWxpZGF0ZSB0aXRsZQogICAgICAgIGlmICghVGl0bGUpIHsKICAgICAgICAgICAgYWxlcnQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1BsZWFzZSBlbnRlciBhIHRpdGxlIGZvciB0aGUgaXRlbS4nKSk7CiAgICAgICAgICAgICREaWFsb2cuZmluZCgnI0l0ZW1Nb2RhbFRpdGxlJykuZm9jdXMoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gVmFsaWRhdGUgc3RhdHVzIHR5cGUKICAgICAgICBpZiAoSXRlbVR5cGUgPT09ICdzdGF0dXMnICYmICghQ29uZmlnLm9wdGlvbnMgfHwgQ29uZmlnLm9wdGlvbnMubGVuZ3RoID09PSAwKSkgewogICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUGxlYXNlIGVudGVyIGF0IGxlYXN0IG9uZSBzdGF0dXMgb3B0aW9uLicpKTsKICAgICAgICAgICAgJERpYWxvZy5maW5kKCcjSXRlbU1vZGFsU3RhdHVzT3B0aW9ucycpLmZvY3VzKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBBamF4RGF0YSA9IHsKICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDaGVja2xpc3RUZW1wbGF0ZScsCiAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBDb3JlLkNvbmZpZy5HZXQoJ0NoYWxsZW5nZVRva2VuJyksCiAgICAgICAgICAgIFRpdGxlOiBUaXRsZSwKICAgICAgICAgICAgRGVzY3JpcHRpb246IERlc2NyaXB0aW9uLAogICAgICAgICAgICBJdGVtVHlwZTogSXRlbVR5cGUsCiAgICAgICAgICAgIElzTWFuZGF0b3J5OiBJc01hbmRhdG9yeSwKICAgICAgICAgICAgQ29uZmlnOiBKU09OLnN0cmluZ2lmeShDb25maWcpLAogICAgICAgICAgICBMaW5rVVJMOiBMaW5rVVJMLAogICAgICAgICAgICBMaW5rVGV4dDogTGlua1RleHQKICAgICAgICB9OwoKICAgICAgICBpZiAoTW9kZSA9PT0gJ2VkaXQnKSB7CiAgICAgICAgICAgIEFqYXhEYXRhLlN1YmFjdGlvbiA9ICdJdGVtVXBkYXRlJzsKICAgICAgICAgICAgQWpheERhdGEuSUQgPSBJdGVtSUQ7CiAgICAgICAgICAgIC8vIEdldCBzb3J0IG9yZGVyIGZyb20gcm93CiAgICAgICAgICAgIHZhciAkUm93ID0gJCgndHIuSXRlbVJvd1tkYXRhLWlkPSInICsgSXRlbUlEICsgJyJdJyk7CiAgICAgICAgICAgIEFqYXhEYXRhLlNvcnRPcmRlciA9ICRSb3cuYXR0cignZGF0YS1zb3J0Jyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgQWpheERhdGEuU3ViYWN0aW9uID0gJ0l0ZW1BZGQnOwogICAgICAgICAgICBBamF4RGF0YS5UZW1wbGF0ZUlEID0gVGVtcGxhdGVJRDsKICAgICAgICB9CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwKICAgICAgICAgICAgQWpheERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlICYmIFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nJykpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoTW9kZSA9PT0gJ2VkaXQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyByb3cKICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRUYXJnZXRSb3cgPSAkKCd0ci5JdGVtUm93W2RhdGEtaWQ9IicgKyBJdGVtSUQgKyAnIl0nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBkYXRhIGF0dHJpYnV0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldFJvdy5kYXRhKCd0aXRsZScsIFRpdGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldFJvdy5kYXRhKCdkZXNjcmlwdGlvbicsIERlc2NyaXB0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldFJvdy5kYXRhKCdtYW5kYXRvcnknLCBJc01hbmRhdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRSb3cuZGF0YSgnaXRlbXR5cGUnLCBJdGVtVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRSb3cuZGF0YSgnY29uZmlnJywgSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRSb3cuZGF0YSgnbGlua3VybCcsIExpbmtVUkwpOwogICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0Um93LmRhdGEoJ2xpbmt0ZXh0JywgTGlua1RleHQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIEhUTUwgYXR0cmlidXRlcyBmb3IgcGVyc2lzdGVuY2UKICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldFJvdy5hdHRyKCdkYXRhLXRpdGxlJywgVGl0bGUpOwogICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0Um93LmF0dHIoJ2RhdGEtZGVzY3JpcHRpb24nLCBEZXNjcmlwdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRSb3cuYXR0cignZGF0YS1tYW5kYXRvcnknLCBJc01hbmRhdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRSb3cuYXR0cignZGF0YS1jb25maWcnLCBKU09OLnN0cmluZ2lmeShDb25maWcpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBkaXNwbGF5IHRleHQKICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldFJvdy5maW5kKCcuSXRlbVRpdGxlRGlzcGxheScpLnRleHQoVGl0bGUpOwogICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0Um93LmZpbmQoJy5JdGVtRGVzY3JpcHRpb25EaXNwbGF5JykudGV4dChEZXNjcmlwdGlvbi5sZW5ndGggPiA1MCA/IERlc2NyaXB0aW9uLnN1YnN0cmluZygwLCA1MCkgKyAnLi4uJyA6IERlc2NyaXB0aW9uKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtYW5kYXRvcnkgaW5kaWNhdG9yCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBNYW5kYXRvcnlDZWxsID0gJFRhcmdldFJvdy5maW5kKCd0ZCcpLmVxKDQpOwogICAgICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnlDZWxsLmh0bWwoSXNNYW5kYXRvcnkgPyAnPGkgY2xhc3M9ImZhIGZhLWNoZWNrIj48L2k+JyA6ICctJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdHlwZSBiYWRnZQogICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0Um93LmZpbmQoJy5JdGVtVHlwZUJhZGdlJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnSXRlbVR5cGUtY2hlY2tib3ggSXRlbVR5cGUtc3RhdHVzIEl0ZW1UeXBlLXZhbHVlIEl0ZW1UeXBlLXJhdGluZycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0l0ZW1UeXBlLScgKyBJdGVtVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KEl0ZW1UeXBlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZpc3VhbCBmZWVkYmFjawogICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0Um93LmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjZGZkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldFJvdy5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsb2FkIHBhZ2UgdG8gc2hvdyBuZXcgaXRlbQogICAgICAgICAgICAgICAgICAgICAgICBDbGVhclVuc2F2ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ291bGQgbm90IHNhdmUgaXRlbSEnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdqc29uJwogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbi5DaGVja2xpc3QKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemUgdGhlIGFkbWluIGNoZWNrbGlzdCB0ZW1wbGF0ZSBtb2R1bGUuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgIC8vIFdhcm4gYmVmb3JlIGxlYXZpbmcgcGFnZSB3aXRoIHVuc2F2ZWQgY2hhbmdlcwogICAgICAgICQod2luZG93KS5vbignYmVmb3JldW5sb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoSGFzVW5zYXZlZENoYW5nZXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbGVhdmU/Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gQWxsb3cgZm9ybSBzdWJtaXNzaW9uIHdpdGhvdXQgd2FybmluZwogICAgICAgICQoJyNUZW1wbGF0ZUZvcm0nKS5vbignc3VibWl0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDbGVhclVuc2F2ZWQoKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gSXRlbSB0eXBlIHNlbGVjdGlvbiBpbiBtb2RhbCAtIHNob3cvaGlkZSBjb25maWcgZmllbGRzCiAgICAgICAgJChkb2N1bWVudCkub24oJ2NoYW5nZScsICcjSXRlbU1vZGFsVHlwZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgU2hvd01vZGFsVHlwZUNvbmZpZygkKHRoaXMpLnZhbCgpLCAkKCcuRGlhbG9nJykpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBBZGRJdGVtIFBhZ2U6IFR5cGUgc2VsZWN0aW9uIC0gc2hvdy9oaWRlIGNvbmZpZyBmaWVsZHMKICAgICAgICBmdW5jdGlvbiBVcGRhdGVBZGRJdGVtVHlwZUNvbmZpZygpIHsKICAgICAgICAgICAgdmFyIEl0ZW1UeXBlID0gJCgnc2VsZWN0W25hbWU9Ikl0ZW1UeXBlIl0nKS52YWwoKSB8fCAnY2hlY2tib3gnOwogICAgICAgICAgICAkKCcuSXRlbVR5cGVDb25maWcnKS5hZGRDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgIHN3aXRjaCAoSXRlbVR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3N0YXR1cyc6CiAgICAgICAgICAgICAgICAgICAgJCgnI1N0YXR1c0NvbmZpZycpLnJlbW92ZUNsYXNzKCdIaWRkZW4nKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbHVlJzoKICAgICAgICAgICAgICAgICAgICAkKCcjVmFsdWVDb25maWcnKS5yZW1vdmVDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdyYXRpbmcnOgogICAgICAgICAgICAgICAgICAgICQoJyNSYXRpbmdDb25maWcnKS5yZW1vdmVDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAnc2VsZWN0W25hbWU9Ikl0ZW1UeXBlIl0nLCBVcGRhdGVBZGRJdGVtVHlwZUNvbmZpZyk7CgogICAgICAgIC8vIEVkaXRJdGVtIFBhZ2U6IEluaXRpYWxpemUgb24gbG9hZAogICAgICAgIGlmICgkKCcjSXRlbUlEJykubGVuZ3RoICYmICQoJyNJdGVtQ29uZmlnSlNPTicpLmxlbmd0aCkgewogICAgICAgICAgICAvLyBXZSdyZSBvbiB0aGUgRWRpdEl0ZW0gcGFnZSAtIHBvcHVsYXRlIGNvbmZpZyBmaWVsZHMgZnJvbSBzdG9yZWQgZGF0YQogICAgICAgICAgICB2YXIgQ29uZmlnSlNPTiA9ICQoJyNJdGVtQ29uZmlnSlNPTicpLnZhbCgpOwogICAgICAgICAgICB2YXIgSXRlbVR5cGUgPSAkKCdzZWxlY3RbbmFtZT0iSXRlbVR5cGUiXScpLnZhbCgpIHx8ICdjaGVja2JveCc7CiAgICAgICAgICAgIHZhciBDb25maWcgPSB7fTsKCiAgICAgICAgICAgIGlmIChDb25maWdKU09OKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9IEpTT04ucGFyc2UoQ29uZmlnSlNPTik7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBpdGVtIGNvbmZpZzonLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUG9wdWxhdGUgdHlwZS1zcGVjaWZpYyBmaWVsZHMKICAgICAgICAgICAgc3dpdGNoIChJdGVtVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAnc3RhdHVzJzoKICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLm9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShDb25maWcub3B0aW9ucykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI1N0YXR1c09wdGlvbnMnKS52YWwoQ29uZmlnLm9wdGlvbnMuam9pbignXG4nKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbHVlJzoKICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLnVuaXQpICQoJyNWYWx1ZVVuaXQnKS52YWwoQ29uZmlnLnVuaXQpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQ29uZmlnLnRhcmdldFZhbHVlICE9PSAndW5kZWZpbmVkJykgJCgnI1ZhbHVlVGFyZ2V0JykudmFsKENvbmZpZy50YXJnZXRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBDb25maWcudG9sZXJhbmNlICE9PSAndW5kZWZpbmVkJykgJCgnI1ZhbHVlVG9sZXJhbmNlJykudmFsKENvbmZpZy50b2xlcmFuY2UpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ3JhdGluZyc6CiAgICAgICAgICAgICAgICAgICAgLy8gUmF0aW5nIHVzZXMgZml4ZWQgNS1zdGFyIHNjYWxlLCBubyBmaWVsZHMgdG8gcG9wdWxhdGUKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU2hvdyB0aGUgY29ycmVjdCBjb25maWcgc2VjdGlvbgogICAgICAgICAgICBVcGRhdGVBZGRJdGVtVHlwZUNvbmZpZygpOwogICAgICAgIH0KCiAgICAgICAgLy8gRWRpdEl0ZW0gUGFnZTogVXBkYXRlIGJ1dHRvbgogICAgICAgICQoJyNVcGRhdGVJdGVtQnRuJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgSXRlbUlEID0gJCgnI0l0ZW1JRCcpLnZhbCgpLAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9ICQoJyNUZW1wbGF0ZUlEJykudmFsKCksCiAgICAgICAgICAgICAgICBTb3J0T3JkZXIgPSAkKCcjSXRlbVNvcnRPcmRlcicpLnZhbCgpIHx8IDAsCiAgICAgICAgICAgICAgICBUaXRsZSA9ICQoJyNJdGVtVGl0bGUnKS52YWwoKS50cmltKCksCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9ICQoJyNJdGVtRGVzY3JpcHRpb24nKS52YWwoKS50cmltKCksCiAgICAgICAgICAgICAgICBJdGVtVHlwZSA9ICQoJ3NlbGVjdFtuYW1lPSJJdGVtVHlwZSJdJykudmFsKCkgfHwgJ2NoZWNrYm94JywKICAgICAgICAgICAgICAgIElzTWFuZGF0b3J5ID0gJCgnI0l0ZW1NYW5kYXRvcnknKS5pcygnOmNoZWNrZWQnKSA/IDEgOiAwLAogICAgICAgICAgICAgICAgTGlua1VSTCA9ICQoJyNJdGVtTGlua1VSTCcpLnZhbCgpLnRyaW0oKSwKICAgICAgICAgICAgICAgIExpbmtUZXh0ID0gJCgnI0l0ZW1MaW5rVGV4dCcpLnZhbCgpLnRyaW0oKSwKICAgICAgICAgICAgICAgIENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGl0bGUKICAgICAgICAgICAgaWYgKCFUaXRsZSkgewogICAgICAgICAgICAgICAgJCgnI0l0ZW1UaXRsZScpLmZvY3VzKCkuYWRkQ2xhc3MoJ0Vycm9yJyk7CiAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUGxlYXNlIGVudGVyIGEgdGl0bGUgZm9yIHRoZSBpdGVtLicpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQnVpbGQgY29uZmlnIGJhc2VkIG9uIHR5cGUKICAgICAgICAgICAgc3dpdGNoIChJdGVtVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAnc3RhdHVzJzoKICAgICAgICAgICAgICAgICAgICB2YXIgT3B0aW9uc1RleHQgPSAkKCcjU3RhdHVzT3B0aW9ucycpLnZhbCgpLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT3B0aW9uc1RleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLm9wdGlvbnMgPSBPcHRpb25zVGV4dC5zcGxpdCgnXG4nKS5maWx0ZXIoZnVuY3Rpb24ob3B0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0LnRyaW0oKSAhPT0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbihvcHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHQudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5vcHRpb25zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5kZWZhdWx0T3B0aW9uID0gQ29uZmlnLm9wdGlvbnNbQ29uZmlnLm9wdGlvbnMubGVuZ3RoIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFDb25maWcub3B0aW9ucyB8fCBDb25maWcub3B0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1BsZWFzZSBlbnRlciBhdCBsZWFzdCBvbmUgc3RhdHVzIG9wdGlvbi4nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTdGF0dXNPcHRpb25zJykuZm9jdXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICd2YWx1ZSc6CiAgICAgICAgICAgICAgICAgICAgdmFyIFVuaXQgPSAkKCcjVmFsdWVVbml0JykudmFsKCkudHJpbSgpOwogICAgICAgICAgICAgICAgICAgIHZhciBUYXJnZXQgPSAkKCcjVmFsdWVUYXJnZXQnKS52YWwoKTsKICAgICAgICAgICAgICAgICAgICB2YXIgVG9sZXJhbmNlID0gJCgnI1ZhbHVlVG9sZXJhbmNlJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKFVuaXQpIENvbmZpZy51bml0ID0gVW5pdDsKICAgICAgICAgICAgICAgICAgICBpZiAoVGFyZ2V0ICE9PSAnJykgQ29uZmlnLnRhcmdldFZhbHVlID0gcGFyc2VGbG9hdChUYXJnZXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChUb2xlcmFuY2UgIT09ICcnKSBDb25maWcudG9sZXJhbmNlID0gcGFyc2VGbG9hdChUb2xlcmFuY2UpOwogICAgICAgICAgICAgICAgICAgIENvbmZpZy5kZWNpbWFsUGxhY2VzID0gMjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdyYXRpbmcnOgogICAgICAgICAgICAgICAgICAgIENvbmZpZy5zY2FsZSA9IDU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFNlbmQgQUpBWCByZXF1ZXN0CiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDaGVja2xpc3RUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IENvcmUuQ29uZmlnLkdldCgnQ2hhbGxlbmdlVG9rZW4nKSwKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdJdGVtVXBkYXRlJywKICAgICAgICAgICAgICAgICAgICBJRDogSXRlbUlELAogICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlOiBJdGVtVHlwZSwKICAgICAgICAgICAgICAgICAgICBUaXRsZTogVGl0bGUsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb246IERlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgIElzTWFuZGF0b3J5OiBJc01hbmRhdG9yeSwKICAgICAgICAgICAgICAgICAgICBTb3J0T3JkZXI6IFNvcnRPcmRlciwKICAgICAgICAgICAgICAgICAgICBMaW5rVVJMOiBMaW5rVVJMLAogICAgICAgICAgICAgICAgICAgIExpbmtUZXh0OiBMaW5rVGV4dCwKICAgICAgICAgICAgICAgICAgICBDb25maWc6IEpTT04uc3RyaW5naWZ5KENvbmZpZykKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXZpZ2F0ZSBiYWNrIHRvIEVkaXQgcGFnZQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWN0aW9uPUFnZW50Q2hlY2tsaXN0VGVtcGxhdGU7U3ViYWN0aW9uPUVkaXQ7SUQ9JyArIFRlbXBsYXRlSUQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NvdWxkIG5vdCB1cGRhdGUgaXRlbS4nKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdqc29uJwogICAgICAgICAgICApOwogICAgICAgIH0pOwoKICAgICAgICAvLyBBZGRJdGVtIFBhZ2U6IFNhdmUgYnV0dG9uCiAgICAgICAgJCgnI1NhdmVJdGVtQnRuJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgVGVtcGxhdGVJRCA9ICQoJyNUZW1wbGF0ZUlEJykudmFsKCksCiAgICAgICAgICAgICAgICBUaXRsZSA9ICQoJyNJdGVtVGl0bGUnKS52YWwoKS50cmltKCksCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9ICQoJyNJdGVtRGVzY3JpcHRpb24nKS52YWwoKS50cmltKCksCiAgICAgICAgICAgICAgICBJdGVtVHlwZSA9ICQoJ3NlbGVjdFtuYW1lPSJJdGVtVHlwZSJdJykudmFsKCkgfHwgJ2NoZWNrYm94JywKICAgICAgICAgICAgICAgIElzTWFuZGF0b3J5ID0gJCgnI0l0ZW1NYW5kYXRvcnknKS5pcygnOmNoZWNrZWQnKSA/IDEgOiAwLAogICAgICAgICAgICAgICAgTGlua1VSTCA9ICQoJyNJdGVtTGlua1VSTCcpLnZhbCgpLnRyaW0oKSwKICAgICAgICAgICAgICAgIExpbmtUZXh0ID0gJCgnI0l0ZW1MaW5rVGV4dCcpLnZhbCgpLnRyaW0oKSwKICAgICAgICAgICAgICAgIENvbmZpZyA9IHt9OwoKICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGl0bGUKICAgICAgICAgICAgaWYgKCFUaXRsZSkgewogICAgICAgICAgICAgICAgJCgnI0l0ZW1UaXRsZScpLmZvY3VzKCkuYWRkQ2xhc3MoJ0Vycm9yJyk7CiAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUGxlYXNlIGVudGVyIGEgdGl0bGUgZm9yIHRoZSBpdGVtLicpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQnVpbGQgY29uZmlnIGJhc2VkIG9uIHR5cGUKICAgICAgICAgICAgc3dpdGNoIChJdGVtVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAnc3RhdHVzJzoKICAgICAgICAgICAgICAgICAgICB2YXIgT3B0aW9uc1RleHQgPSAkKCcjU3RhdHVzT3B0aW9ucycpLnZhbCgpLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT3B0aW9uc1RleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLm9wdGlvbnMgPSBPcHRpb25zVGV4dC5zcGxpdCgnXG4nKS5maWx0ZXIoZnVuY3Rpb24ob3B0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0LnRyaW0oKSAhPT0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbihvcHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHQudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZy5vcHRpb25zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5kZWZhdWx0T3B0aW9uID0gQ29uZmlnLm9wdGlvbnNbQ29uZmlnLm9wdGlvbnMubGVuZ3RoIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFDb25maWcub3B0aW9ucyB8fCBDb25maWcub3B0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1BsZWFzZSBlbnRlciBhdCBsZWFzdCBvbmUgc3RhdHVzIG9wdGlvbi4nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTdGF0dXNPcHRpb25zJykuZm9jdXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICd2YWx1ZSc6CiAgICAgICAgICAgICAgICAgICAgdmFyIFVuaXQgPSAkKCcjVmFsdWVVbml0JykudmFsKCkudHJpbSgpOwogICAgICAgICAgICAgICAgICAgIHZhciBUYXJnZXQgPSAkKCcjVmFsdWVUYXJnZXQnKS52YWwoKTsKICAgICAgICAgICAgICAgICAgICB2YXIgVG9sZXJhbmNlID0gJCgnI1ZhbHVlVG9sZXJhbmNlJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKFVuaXQpIENvbmZpZy51bml0ID0gVW5pdDsKICAgICAgICAgICAgICAgICAgICBpZiAoVGFyZ2V0ICE9PSAnJykgQ29uZmlnLnRhcmdldFZhbHVlID0gcGFyc2VGbG9hdChUYXJnZXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChUb2xlcmFuY2UgIT09ICcnKSBDb25maWcudG9sZXJhbmNlID0gcGFyc2VGbG9hdChUb2xlcmFuY2UpOwogICAgICAgICAgICAgICAgICAgIENvbmZpZy5kZWNpbWFsUGxhY2VzID0gMjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdyYXRpbmcnOgogICAgICAgICAgICAgICAgICAgIENvbmZpZy5zY2FsZSA9IDU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFNlbmQgQUpBWCByZXF1ZXN0CiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDaGVja2xpc3RUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IENvcmUuQ29uZmlnLkdldCgnQ2hhbGxlbmdlVG9rZW4nKSwKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdJdGVtQWRkJywKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEOiBUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlOiBJdGVtVHlwZSwKICAgICAgICAgICAgICAgICAgICBUaXRsZTogVGl0bGUsCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb246IERlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgIElzTWFuZGF0b3J5OiBJc01hbmRhdG9yeSwKICAgICAgICAgICAgICAgICAgICBMaW5rVVJMOiBMaW5rVVJMLAogICAgICAgICAgICAgICAgICAgIExpbmtUZXh0OiBMaW5rVGV4dCwKICAgICAgICAgICAgICAgICAgICBDb25maWc6IEpTT04uc3RyaW5naWZ5KENvbmZpZykKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXZpZ2F0ZSBiYWNrIHRvIEVkaXQgcGFnZQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQWN0aW9uPUFnZW50Q2hlY2tsaXN0VGVtcGxhdGU7U3ViYWN0aW9uPUVkaXQ7SUQ9JyArIFRlbXBsYXRlSUQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NvdWxkIG5vdCBhZGQgaXRlbS4nKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdqc29uJwogICAgICAgICAgICApOwogICAgICAgIH0pOwoKICAgICAgICAvLyBFZGl0IGl0ZW0gYnV0dG9uIC0gb3BlbiBtb2RhbCBpbiBlZGl0IG1vZGUKICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLkVkaXRJdGVtRGV0YWlscycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ0VkaXRJdGVtRGV0YWlscyBjbGlja2VkJyk7CiAgICAgICAgICAgIHZhciAkUm93ID0gJCh0aGlzKS5jbG9zZXN0KCd0cicpOwogICAgICAgICAgICBjb25zb2xlLmxvZygnRm91bmQgcm93OicsICRSb3cubGVuZ3RoLCAnSUQ6JywgJFJvdy5hdHRyKCdkYXRhLWlkJykpOwogICAgICAgICAgICBjb25zb2xlLmxvZygnUm93IEhUTUwgYXR0cmlidXRlczonLCB7CiAgICAgICAgICAgICAgICAnZGF0YS1pZCc6ICRSb3cuYXR0cignZGF0YS1pZCcpLAogICAgICAgICAgICAgICAgJ2RhdGEtdGl0bGUnOiAkUm93LmF0dHIoJ2RhdGEtdGl0bGUnKSwKICAgICAgICAgICAgICAgICdkYXRhLWRlc2NyaXB0aW9uJzogJFJvdy5hdHRyKCdkYXRhLWRlc2NyaXB0aW9uJyksCiAgICAgICAgICAgICAgICAnZGF0YS1pdGVtdHlwZSc6ICRSb3cuYXR0cignZGF0YS1pdGVtdHlwZScpLAogICAgICAgICAgICAgICAgJ2RhdGEtbWFuZGF0b3J5JzogJFJvdy5hdHRyKCdkYXRhLW1hbmRhdG9yeScpLAogICAgICAgICAgICAgICAgJ2RhdGEtY29uZmlnJzogJFJvdy5hdHRyKCdkYXRhLWNvbmZpZycpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBPcGVuSXRlbU1vZGFsKCdlZGl0JywgJFJvdyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gRGVsZXRlIHRlbXBsYXRlCiAgICAgICAgJCgnLkRlbGV0ZVRlbXBsYXRlJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgIEV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciAkVGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0gJFRoaXMuZGF0YSgnaWQnKSwKICAgICAgICAgICAgICAgIFRlbXBsYXRlTmFtZSA9ICRUaGlzLmRhdGEoJ25hbWUnKTsKCiAgICAgICAgICAgIGlmICghY29uZmlybShDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0ZW1wbGF0ZSAiJXMiPycsIFRlbXBsYXRlTmFtZSkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDaGVja2xpc3RUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IENvcmUuQ29uZmlnLkdldCgnQ2hhbGxlbmdlVG9rZW4nKSwKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdEZWxldGUnLAogICAgICAgICAgICAgICAgICAgIElEOiBUZW1wbGF0ZUlECiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlICYmIFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI1RlbXBsYXRlSURfJyArIFRlbXBsYXRlSUQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCgnI1RlbXBsYXRlVGFibGUgdGJvZHkgdHI6dmlzaWJsZScpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFJlc3BvbnNlICYmIFJlc3BvbnNlLkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KFJlc3BvbnNlLkVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ291bGQgbm90IGRlbGV0ZSB0ZW1wbGF0ZS4nKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdqc29uJwogICAgICAgICAgICApOwogICAgICAgIH0pOwoKICAgICAgICAvLyBEdXBsaWNhdGUgdGVtcGxhdGUKICAgICAgICAkKCcuRHVwbGljYXRlVGVtcGxhdGUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyICRUaGlzID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPSAkVGhpcy5kYXRhKCdpZCcpLAogICAgICAgICAgICAgICAgVGVtcGxhdGVOYW1lID0gJFRoaXMuZGF0YSgnbmFtZScpOwoKICAgICAgICAgICAgaWYgKCFjb25maXJtKENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEbyB5b3Ugd2FudCB0byBkdXBsaWNhdGUgdGVtcGxhdGUgIiVzIj8nLCBUZW1wbGF0ZU5hbWUpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q2hlY2tsaXN0VGVtcGxhdGUnLAogICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBDb3JlLkNvbmZpZy5HZXQoJ0NoYWxsZW5nZVRva2VuJyksCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnRHVwbGljYXRlJywKICAgICAgICAgICAgICAgICAgICBJRDogVGVtcGxhdGVJRAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzICYmIFJlc3BvbnNlLk5ld1RlbXBsYXRlSUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdGlvbj1BZ2VudENoZWNrbGlzdFRlbXBsYXRlO1N1YmFjdGlvbj1FZGl0O0lEPScgKyBSZXNwb25zZS5OZXdUZW1wbGF0ZUlEOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDb3VsZCBub3QgZHVwbGljYXRlIHRlbXBsYXRlIScpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pzb24nCiAgICAgICAgICAgICk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEV4cG9ydCB0ZW1wbGF0ZSBhcyBYTUwKICAgICAgICAkKCcuRXhwb3J0VGVtcGxhdGUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyICRUaGlzID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPSAkVGhpcy5kYXRhKCdpZCcpOwoKICAgICAgICAgICAgLy8gRGlyZWN0IGRvd25sb2FkIHZpYSBVUkwKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgKwogICAgICAgICAgICAgICAgJ0FjdGlvbj1BZ2VudENoZWNrbGlzdFRlbXBsYXRlO1N1YmFjdGlvbj1FeHBvcnQ7SUQ9JyArIFRlbXBsYXRlSUQ7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEltcG9ydCB0ZW1wbGF0ZSAtIHRyaWdnZXIgZmlsZSBpbnB1dAogICAgICAgICQoJyNJbXBvcnRUZW1wbGF0ZUJ1dHRvbicpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAkKCcjSW1wb3J0VGVtcGxhdGVGaWxlJykudHJpZ2dlcignY2xpY2snKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gSW1wb3J0IHRlbXBsYXRlIC0gaGFuZGxlIGZpbGUgc2VsZWN0aW9uCiAgICAgICAgJCgnI0ltcG9ydFRlbXBsYXRlRmlsZScpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgdmFyIEZpbGUgPSB0aGlzLmZpbGVzWzBdOwogICAgICAgICAgICBpZiAoIUZpbGUpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQ2hlY2sgZmlsZSB0eXBlCiAgICAgICAgICAgIGlmICghRmlsZS5uYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy54bWwnKSkgewogICAgICAgICAgICAgICAgYWxlcnQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1BsZWFzZSBzZWxlY3QgYW4gWE1MIGZpbGUuJykpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBTZWN1cml0eTogQ2hlY2sgZmlsZSBzaXplIGxpbWl0ICgxIE1CKQogICAgICAgICAgICB2YXIgTWF4RmlsZVNpemUgPSAxMDI0ICogMTAyNDsKICAgICAgICAgICAgaWYgKEZpbGUuc2l6ZSA+IE1heEZpbGVTaXplKSB7CiAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRmlsZSB0b28gbGFyZ2UuIE1heGltdW0gc2l6ZSBpcyAxIE1CLicpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIFJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgICAgICAgIFJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIFhNTENvbnRlbnQgPSBlLnRhcmdldC5yZXN1bHQ7CgogICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudENoZWNrbGlzdFRlbXBsYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IENvcmUuQ29uZmlnLkdldCgnQ2hhbGxlbmdlVG9rZW4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnSW1wb3J0JywKICAgICAgICAgICAgICAgICAgICAgICAgWE1MQ29udGVudDogWE1MQ29udGVudAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGVtcGxhdGUgIiVzIiBpbXBvcnRlZCBzdWNjZXNzZnVsbHkuJywgUmVzcG9uc2UuVGVtcGxhdGVOYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWxvYWQgcGFnZSB0byBzaG93IG5ldyB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ291bGQgbm90IGltcG9ydCB0ZW1wbGF0ZTogJXMnLCBSZXNwb25zZS5NZXNzYWdlIHx8ICdVbmtub3duIGVycm9yJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnanNvbicKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBSZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGFsZXJ0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDb3VsZCBub3QgcmVhZCBmaWxlLicpKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFJlYWRlci5yZWFkQXNUZXh0KEZpbGUpOwoKICAgICAgICAgICAgLy8gUmVzZXQgZmlsZSBpbnB1dCBmb3IgbmV4dCBzZWxlY3Rpb24KICAgICAgICAgICAgJCh0aGlzKS52YWwoJycpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0aWFsaXplIHNvcnRhYmxlIGZvciBkcmFnICYgZHJvcCByZW9yZGVyaW5nCiAgICAgICAgaWYgKCQoJyNJdGVtTGlzdCcpLmxlbmd0aCAmJiB0eXBlb2YgJC5mbi5zb3J0YWJsZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgJCgnI0l0ZW1MaXN0Jykuc29ydGFibGUoewogICAgICAgICAgICAgICAgaGFuZGxlOiAnLkRyYWdIYW5kbGUnLAogICAgICAgICAgICAgICAgYXhpczogJ3knLAogICAgICAgICAgICAgICAgY29udGFpbm1lbnQ6ICdwYXJlbnQnLAogICAgICAgICAgICAgICAgdG9sZXJhbmNlOiAncG9pbnRlcicsCiAgICAgICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgSXRlbXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAkKCcjSXRlbUxpc3QgdHIuSXRlbVJvdycpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBJdGVtSUQgPSAkKHRoaXMpLmF0dHIoJ2RhdGEtaWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDogSXRlbUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydE9yZGVyOiBpbmRleCArIDEKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDaGVja2xpc3RUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogQ29yZS5Db25maWcuR2V0KCdDaGFsbGVuZ2VUb2tlbicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnSXRlbVJlb3JkZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlbXM6IEpTT04uc3RyaW5naWZ5KEl0ZW1zKQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUmVzcG9uc2UgfHwgIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ291bGQgbm90IHNhdmUgbmV3IG9yZGVyLicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjSXRlbUxpc3QnKS5zb3J0YWJsZSgnY2FuY2VsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdqc29uJwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gRGVsZXRlIGl0ZW0KICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLkRlbGV0ZUl0ZW0nLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyICRSb3cgPSAkKHRoaXMpLmNsb3Nlc3QoJ3RyJyksCiAgICAgICAgICAgICAgICBJdGVtSUQgPSAkUm93LmF0dHIoJ2RhdGEtaWQnKTsKCiAgICAgICAgICAgIGlmIChjb25maXJtKENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgaXRlbT8nKSkpIHsKICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDaGVja2xpc3RUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBDb3JlLkNvbmZpZy5HZXQoJ0NoYWxsZW5nZVRva2VuJyksCiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0l0ZW1EZWxldGUnLAogICAgICAgICAgICAgICAgICAgICAgICBJRDogSXRlbUlECiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlICYmIFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSb3cuZmFkZU91dCgzMDAsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ291bGQgbm90IGRlbGV0ZSBpdGVtIScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ2pzb24nCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgfTsKCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQWRtaW4uQ2hlY2tsaXN0IHx8IHt9KSk7Cg==</File>
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.TicketChecklist.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI1IFpudW55IENoZWNrbGlzdCBQcm9qZWN0Ci8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CgovKioKICogQG5hbWVzcGFjZSBDb3JlLkFnZW50LlRpY2tldENoZWNrbGlzdAogKiBAbWVtYmVyb2YgQ29yZS5BZ2VudAogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIHRpY2tldCBjaGVja2xpc3RzLgogKi8KQ29yZS5BZ2VudC5UaWNrZXRDaGVja2xpc3QgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgdmFyIFN0b3JhZ2VLZXkgPSAnQ2hlY2tsaXN0UG9wdXBIYXNDaGFuZ2VzJzsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBNYXJrQ2hhbmdlZAogICAgICogQGRlc2NyaXB0aW9uIE1hcmsgdGhhdCBjaGFuZ2VzIHdlcmUgbWFkZSAodG8gcmVmcmVzaCBwYXJlbnQgb24gY2xvc2UpCiAgICAgKi8KICAgIGZ1bmN0aW9uIE1hcmtDaGFuZ2VkKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oU3RvcmFnZUtleSwgJzEnKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIC8vIHNlc3Npb25TdG9yYWdlIG5vdCBhdmFpbGFibGUKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgSGFzQ2hhbmdlcwogICAgICogQGRlc2NyaXB0aW9uIENoZWNrIGlmIGNoYW5nZXMgd2VyZSBtYWRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIEhhc0NoYW5nZXMoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oU3RvcmFnZUtleSkgPT09ICcxJzsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2xlYXJDaGFuZ2VzCiAgICAgKiBAZGVzY3JpcHRpb24gQ2xlYXIgdGhlIGNoYW5nZXMgZmxhZwogICAgICovCiAgICBmdW5jdGlvbiBDbGVhckNoYW5nZXMoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShTdG9yYWdlS2V5KTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIC8vIHNlc3Npb25TdG9yYWdlIG5vdCBhdmFpbGFibGUKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgVXBkYXRlQ2hlY2tsaXN0UHJvZ3Jlc3MKICAgICAqIEBkZXNjcmlwdGlvbiBVcGRhdGUgdGhlIHByb2dyZXNzIGJhciBhbmQgY291bnRlciBmb3IgYSBjaGVja2xpc3QKICAgICAqIEBwYXJhbSB7alF1ZXJ5fSAkSXRlbSAtIEFueSBlbGVtZW50IGluc2lkZSB0aGUgY2hlY2tsaXN0IGJveAogICAgICogQHBhcmFtIHtPYmplY3R9IFByb2dyZXNzIC0gUHJvZ3Jlc3MgZGF0YSBmcm9tIGJhY2tlbmQgKFRvdGFsSXRlbXMsIENvbXBsZXRlZEl0ZW1zLCBJc0NvbXBsZXRlKQogICAgICovCiAgICBmdW5jdGlvbiBVcGRhdGVDaGVja2xpc3RQcm9ncmVzcygkSXRlbSwgUHJvZ3Jlc3MpIHsKICAgICAgICBpZiAoIVByb2dyZXNzKSByZXR1cm47CgogICAgICAgIC8vIEZpbmQgdGhlIGNoZWNrbGlzdCBjb250YWluZXIgLSB0cnkgbXVsdGlwbGUgc2VsZWN0b3JzIGZvciBkaWZmZXJlbnQgbW9kZXMKICAgICAgICB2YXIgJEJveCA9ICRJdGVtLmNsb3Nlc3QoJy5DaGVja2xpc3RCb3gnKTsKICAgICAgICBpZiAoISRCb3gubGVuZ3RoKSB7CiAgICAgICAgICAgICRCb3ggPSAkSXRlbS5jbG9zZXN0KCcuV2lkZ2V0U2ltcGxlJyk7CiAgICAgICAgfQogICAgICAgIGlmICghJEJveC5sZW5ndGgpIHJldHVybjsKCiAgICAgICAgdmFyIFRvdGFsSXRlbXMgPSBQcm9ncmVzcy5Ub3RhbEl0ZW1zIHx8IDAsCiAgICAgICAgICAgIENvbXBsZXRlZEl0ZW1zID0gUHJvZ3Jlc3MuQ29tcGxldGVkSXRlbXMgfHwgMCwKICAgICAgICAgICAgSXNDb21wbGV0ZSA9IFByb2dyZXNzLklzQ29tcGxldGUsCiAgICAgICAgICAgIFByb2dyZXNzUGVyY2VudCA9IDA7CgogICAgICAgIGlmIChUb3RhbEl0ZW1zID4gMCkgewogICAgICAgICAgICBQcm9ncmVzc1BlcmNlbnQgPSBNYXRoLnJvdW5kKChDb21wbGV0ZWRJdGVtcyAvIFRvdGFsSXRlbXMpICogMTAwKTsKICAgICAgICB9CgogICAgICAgIC8vIFVwZGF0ZSBwcm9ncmVzcyB0ZXh0ICIoMy80KSIgLSB0cnkgYm90aCBoMyBhbmQgaDIKICAgICAgICB2YXIgJFByb2dyZXNzVGV4dCA9ICRCb3guZmluZCgnLkNoZWNrbGlzdEhlYWRlciBoMyAuUHJvZ3Jlc3MsIC5IZWFkZXIgaDMgLlByb2dyZXNzLCAuSGVhZGVyIGgyIC5Qcm9ncmVzcycpOwogICAgICAgICRQcm9ncmVzc1RleHQudGV4dCgnKCcgKyBDb21wbGV0ZWRJdGVtcyArICcvJyArIFRvdGFsSXRlbXMgKyAnKScpOwoKICAgICAgICAvLyBVcGRhdGUgcHJvZ3Jlc3MgYmFyIHdpZHRoCiAgICAgICAgJEJveC5maW5kKCcuUHJvZ3Jlc3NCYXIgLlByb2dyZXNzJykuY3NzKCd3aWR0aCcsIFByb2dyZXNzUGVyY2VudCArICclJyk7CgogICAgICAgIC8vIFVwZGF0ZSB3YXJuaW5nIHRyaWFuZ2xlIChzaG93IGlmIGluY29tcGxldGUsIGhpZGUgaWYgY29tcGxldGUpCiAgICAgICAgdmFyICRXYXJuaW5nID0gJEJveC5maW5kKCcuQ2hlY2tsaXN0SGVhZGVyIC5XYXJuaW5nLCAuSGVhZGVyIC5XYXJuaW5nJyk7CiAgICAgICAgaWYgKElzQ29tcGxldGUpIHsKICAgICAgICAgICAgJFdhcm5pbmcuYWRkQ2xhc3MoJ0hpZGRlbicpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRXYXJuaW5nLnJlbW92ZUNsYXNzKCdIaWRkZW4nKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgR2V0QWRkSXRlbUNvbmZpZwogICAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGNvbmZpZyBvYmplY3QgZnJvbSBBZGRJdGVtIHBhZ2UgZmllbGRzCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdldEFkZEl0ZW1Db25maWcoKSB7CiAgICAgICAgLy8gR2V0IEl0ZW1UeXBlIC0gdXNlIG5hbWUgc2VsZWN0b3IgZm9yIE1vZGVybml6ZSBjb21wYXRpYmlsaXR5CiAgICAgICAgdmFyIEl0ZW1UeXBlID0gJCgnc2VsZWN0W25hbWU9Ikl0ZW1UeXBlIl0nKS52YWwoKSB8fCAkKCcjSXRlbVR5cGUnKS52YWwoKSB8fCAnY2hlY2tib3gnOwoKICAgICAgICAvLyBEZWJ1ZyBvdXRwdXQKICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUubG9nKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdHZXRBZGRJdGVtQ29uZmlnIC0gSXRlbVR5cGU6JywgSXRlbVR5cGUpOwogICAgICAgIH0KCiAgICAgICAgdmFyIENvbmZpZyA9IHt9OwoKICAgICAgICBzd2l0Y2ggKEl0ZW1UeXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ3N0YXR1cyc6CiAgICAgICAgICAgICAgICB2YXIgT3B0aW9uc1RleHQgPSAkKCcjU3RhdHVzT3B0aW9ucycpLnZhbCgpLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmIChPcHRpb25zVGV4dCkgewogICAgICAgICAgICAgICAgICAgIENvbmZpZy5vcHRpb25zID0gT3B0aW9uc1RleHQuc3BsaXQoJ1xuJykuZmlsdGVyKGZ1bmN0aW9uKG9wdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0LnRyaW0oKSAhPT0gJyc7CiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uKG9wdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0LnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLm9wdGlvbnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuZGVmYXVsdE9wdGlvbiA9IENvbmZpZy5vcHRpb25zW0NvbmZpZy5vcHRpb25zLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAndmFsdWUnOgogICAgICAgICAgICAgICAgdmFyIFVuaXQgPSAkKCcjVmFsdWVVbml0JykudmFsKCkgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0ID0gJCgnI1ZhbHVlVGFyZ2V0JykudmFsKCkgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgVG9sZXJhbmNlID0gJCgnI1ZhbHVlVG9sZXJhbmNlJykudmFsKCkgfHwgJyc7CgogICAgICAgICAgICAgICAgLy8gRGVidWcgb3V0cHV0CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUubG9nKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dldEFkZEl0ZW1Db25maWcgLSB2YWx1ZSBmaWVsZHM6JywgewogICAgICAgICAgICAgICAgICAgICAgICBVbml0OiBVbml0LAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ6IFRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgVG9sZXJhbmNlOiBUb2xlcmFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIFVuaXRFbGVtZW50OiAkKCcjVmFsdWVVbml0JykubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRFbGVtZW50OiAkKCcjVmFsdWVUYXJnZXQnKS5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgIFRvbGVyYW5jZUVsZW1lbnQ6ICQoJyNWYWx1ZVRvbGVyYW5jZScpLmxlbmd0aAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIFVuaXQgPSBVbml0LnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmIChVbml0KSBDb25maWcudW5pdCA9IFVuaXQ7CiAgICAgICAgICAgICAgICBpZiAoVGFyZ2V0ICE9PSAnJykgQ29uZmlnLnRhcmdldFZhbHVlID0gcGFyc2VGbG9hdChUYXJnZXQpOwogICAgICAgICAgICAgICAgaWYgKFRvbGVyYW5jZSAhPT0gJycpIENvbmZpZy50b2xlcmFuY2UgPSBwYXJzZUZsb2F0KFRvbGVyYW5jZSk7CiAgICAgICAgICAgICAgICBDb25maWcuZGVjaW1hbFBsYWNlcyA9IDI7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ3JhdGluZyc6CiAgICAgICAgICAgICAgICBDb25maWcuc2NhbGUgPSA1OwogICAgICAgICAgICAgICAgdmFyIExhYmVsc1RleHQgPSAkKCcjUmF0aW5nTGFiZWxzJykudmFsKCkudHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKExhYmVsc1RleHQpIHsKICAgICAgICAgICAgICAgICAgICBDb25maWcubGFiZWxzID0gTGFiZWxzVGV4dC5zcGxpdCgnXG4nKS5maWx0ZXIoZnVuY3Rpb24obGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRyaW0oKSAhPT0gJyc7CiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uKGxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbC50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHJldHVybiBDb25maWc7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5UaWNrZXRDaGVja2xpc3QKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemUgdGhlIHRpY2tldCBjaGVja2xpc3QgbW9kdWxlLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBUaWNrZXRJRCA9ICQoJyNUaWNrZXRJRCcpLnZhbCgpLAogICAgICAgICAgICBDaGVja2xpc3RJRCA9ICQoJyNDaGVja2xpc3RJRCcpLnZhbCgpOwoKICAgICAgICAvLyBJbml0aWFsaXplIE1vZGVybml6ZSBzZWxlY3QgZmllbGRzCiAgICAgICAgaWYgKHR5cGVvZiBDb3JlLlVJLklucHV0RmllbGRzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBTZXQgaXRlbSBzdGF0ZQogICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuU2V0U3RhdGUnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyICRUaGlzID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICRJdGVtID0gJFRoaXMuY2xvc2VzdCgnLkNoZWNrbGlzdEl0ZW0nKSwKICAgICAgICAgICAgICAgIEl0ZW1JRCA9ICRJdGVtLmRhdGEoJ2l0ZW0taWQnKSwKICAgICAgICAgICAgICAgIE5ld1N0YXRlID0gJFRoaXMuZGF0YSgnc3RhdGUnKTsKCiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRUaWNrZXRDaGVja2xpc3QnLAogICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBDb3JlLkNvbmZpZy5HZXQoJ0NoYWxsZW5nZVRva2VuJyksCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnU2V0SXRlbVN0YXRlJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRDogVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEOiBJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgU3RhdGU6IE5ld1N0YXRlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlICYmIFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgTWFya0NoYW5nZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NvdWxkIG5vdCB1cGRhdGUgaXRlbSBzdGF0ZS4nKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdqc29uJwogICAgICAgICAgICApOwogICAgICAgIH0pOwoKICAgICAgICAvLyBEZWxldGUgaXRlbQogICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuRGVsZXRlSXRlbScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgJEl0ZW0gPSAkKHRoaXMpLmNsb3Nlc3QoJy5DaGVja2xpc3RJdGVtJyksCiAgICAgICAgICAgICAgICBJdGVtSUQgPSAkSXRlbS5kYXRhKCdpdGVtLWlkJyk7CgogICAgICAgICAgICBpZiAoIWNvbmZpcm0oQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBpdGVtPycpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50VGlja2V0Q2hlY2tsaXN0JywKICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogQ29yZS5Db25maWcuR2V0KCdDaGFsbGVuZ2VUb2tlbicpLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0RlbGV0ZUl0ZW0nLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEOiBUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBJdGVtSUQ6IEl0ZW1JRAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRJdGVtLmZhZGVPdXQoZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDb3VsZCBub3QgZGVsZXRlIGl0ZW0uJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnanNvbicKICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gQWRkSXRlbSBwYWdlOiBUeXBlIHNlbGVjdGlvbiAtIHNob3cvaGlkZSBjb25maWcgZmllbGRzCiAgICAgICAgLy8gRnVuY3Rpb24gdG8gdXBkYXRlIGNvbmZpZyBzZWN0aW9uIHZpc2liaWxpdHkKICAgICAgICBmdW5jdGlvbiBVcGRhdGVJdGVtVHlwZUNvbmZpZygpIHsKICAgICAgICAgICAgdmFyIEl0ZW1UeXBlID0gJCgnc2VsZWN0W25hbWU9Ikl0ZW1UeXBlIl0nKS52YWwoKSB8fCAkKCcjSXRlbVR5cGUnKS52YWwoKTsKCiAgICAgICAgICAgIC8vIEhpZGUgYWxsIGNvbmZpZyBzZWN0aW9ucwogICAgICAgICAgICAkKCcuSXRlbVR5cGVDb25maWcnKS5hZGRDbGFzcygnSGlkZGVuJyk7CgogICAgICAgICAgICAvLyBTaG93IHJlbGV2YW50IGNvbmZpZyBzZWN0aW9uCiAgICAgICAgICAgIHN3aXRjaCAoSXRlbVR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3N0YXR1cyc6CiAgICAgICAgICAgICAgICAgICAgJCgnI1N0YXR1c0NvbmZpZycpLnJlbW92ZUNsYXNzKCdIaWRkZW4nKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbHVlJzoKICAgICAgICAgICAgICAgICAgICAkKCcjVmFsdWVDb25maWcnKS5yZW1vdmVDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdyYXRpbmcnOgogICAgICAgICAgICAgICAgICAgICQoJyNSYXRpbmdDb25maWcnKS5yZW1vdmVDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIE11bHRpcGxlIGV2ZW50IGJpbmRpbmdzIGZvciBNb2Rlcm5pemUgY29tcGF0aWJpbGl0eQogICAgICAgICQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAnc2VsZWN0W25hbWU9Ikl0ZW1UeXBlIl0nLCBVcGRhdGVJdGVtVHlwZUNvbmZpZyk7CiAgICAgICAgJChkb2N1bWVudCkub24oJ2NoYW5nZScsICcjSXRlbVR5cGUnLCBVcGRhdGVJdGVtVHlwZUNvbmZpZyk7CgogICAgICAgIC8vIEFsc28gbGlzdGVuIGZvciBabnVueSBJbnB1dEZpZWxkIGV2ZW50cwogICAgICAgIGlmICh0eXBlb2YgQ29yZS5BcHAgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBDb3JlLkFwcC5TdWJzY3JpYmUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgQ29yZS5BcHAuU3Vic2NyaWJlKCdFdmVudC5VSS5JbnB1dEZpZWxkcy5DaGFuZ2UnLCBmdW5jdGlvbihEYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoRGF0YSAmJiBEYXRhLiRFbGVtZW50ICYmIERhdGEuJEVsZW1lbnQuYXR0cignbmFtZScpID09PSAnSXRlbVR5cGUnKSB7CiAgICAgICAgICAgICAgICAgICAgVXBkYXRlSXRlbVR5cGVDb25maWcoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBGYWxsYmFjazogUG9sbCBmb3IgY2hhbmdlcyAobGFzdCByZXNvcnQpCiAgICAgICAgdmFyICRJdGVtVHlwZVNlbGVjdCA9ICQoJ3NlbGVjdFtuYW1lPSJJdGVtVHlwZSJdJyk7CiAgICAgICAgaWYgKCRJdGVtVHlwZVNlbGVjdC5sZW5ndGgpIHsKICAgICAgICAgICAgdmFyIGxhc3RWYWx1ZSA9ICRJdGVtVHlwZVNlbGVjdC52YWwoKTsKICAgICAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gJEl0ZW1UeXBlU2VsZWN0LnZhbCgpOwogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFZhbHVlID0gY3VycmVudFZhbHVlOwogICAgICAgICAgICAgICAgICAgIFVwZGF0ZUl0ZW1UeXBlQ29uZmlnKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGRJdGVtIHBhZ2U6IFNhdmUgYnV0dG9uCiAgICAgICAgJCgnI1NhdmVJdGVtQnRuJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgVGl0bGUgPSAkKCcjSXRlbVRpdGxlJykudmFsKCkudHJpbSgpLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPSAkKCcjSXRlbURlc2NyaXB0aW9uJykudmFsKCkudHJpbSgpLAogICAgICAgICAgICAgICAgSXRlbVR5cGUgPSAkKCdzZWxlY3RbbmFtZT0iSXRlbVR5cGUiXScpLnZhbCgpIHx8ICQoJyNJdGVtVHlwZScpLnZhbCgpIHx8ICdjaGVja2JveCcsCiAgICAgICAgICAgICAgICBMaW5rVVJMID0gJCgnI0l0ZW1MaW5rVVJMJykudmFsKCkudHJpbSgpLAogICAgICAgICAgICAgICAgTGlua1RleHQgPSAkKCcjSXRlbUxpbmtUZXh0JykudmFsKCkudHJpbSgpLAogICAgICAgICAgICAgICAgQ29uZmlnID0gR2V0QWRkSXRlbUNvbmZpZygpOwoKICAgICAgICAgICAgLy8gRGVidWcgb3V0cHV0CiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZS5sb2cpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTYXZlSXRlbUJ0biAtIERhdGEgdG8gc2VuZDonLCB7CiAgICAgICAgICAgICAgICAgICAgVGl0bGU6IFRpdGxlLAogICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlOiBJdGVtVHlwZSwKICAgICAgICAgICAgICAgICAgICBDb25maWc6IENvbmZpZywKICAgICAgICAgICAgICAgICAgICBDb25maWdKU09OOiBKU09OLnN0cmluZ2lmeShDb25maWcpCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGl0bGUKICAgICAgICAgICAgaWYgKCFUaXRsZSkgewogICAgICAgICAgICAgICAgJCgnI0l0ZW1UaXRsZScpLmZvY3VzKCkuYWRkQ2xhc3MoJ0Vycm9yJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFZhbGlkYXRlIHN0YXR1cyBvcHRpb25zCiAgICAgICAgICAgIGlmIChJdGVtVHlwZSA9PT0gJ3N0YXR1cycgJiYgKCFDb25maWcub3B0aW9ucyB8fCBDb25maWcub3B0aW9ucy5sZW5ndGggPT09IDApKSB7CiAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUGxlYXNlIGVudGVyIGF0IGxlYXN0IG9uZSBzdGF0dXMgb3B0aW9uLicpKTsKICAgICAgICAgICAgICAgICQoJyNTdGF0dXNPcHRpb25zJykuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudFRpY2tldENoZWNrbGlzdCcsCiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IENvcmUuQ29uZmlnLkdldCgnQ2hhbGxlbmdlVG9rZW4nKSwKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdBZGRJdGVtJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRDogVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgQ2hlY2tsaXN0SUQ6IENoZWNrbGlzdElELAogICAgICAgICAgICAgICAgICAgIFRpdGxlOiBUaXRsZSwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogRGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgSXRlbVR5cGU6IEl0ZW1UeXBlLAogICAgICAgICAgICAgICAgICAgIENvbmZpZzogSlNPTi5zdHJpbmdpZnkoQ29uZmlnKSwKICAgICAgICAgICAgICAgICAgICBMaW5rVVJMOiBMaW5rVVJMLAogICAgICAgICAgICAgICAgICAgIExpbmtUZXh0OiBMaW5rVGV4dAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdmlnYXRlIGJhY2sgdG8gRWRpdCBwYWdlCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBY3Rpb249QWdlbnRUaWNrZXRDaGVja2xpc3Q7VGlja2V0SUQ9JyArIFRpY2tldElEICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc7TW9kZT1FZGl0O0NoZWNrbGlzdElEPScgKyBDaGVja2xpc3RJRDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ291bGQgbm90IGFkZCBpdGVtLicpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pzb24nCiAgICAgICAgICAgICk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFN0YXR1cyBkcm9wZG93biBjaGFuZ2UKICAgICAgICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJy5JdGVtU3RhdHVzU2VsZWN0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgJFRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgSXRlbUlEID0gJFRoaXMuZGF0YSgnaXRlbS1pZCcpLAogICAgICAgICAgICAgICAgVmFsdWUgPSAkVGhpcy52YWwoKTsKCiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRUaWNrZXRDaGVja2xpc3QnLAogICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBDb3JlLkNvbmZpZy5HZXQoJ0NoYWxsZW5nZVRva2VuJyksCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnU2V0SXRlbVZhbHVlJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRDogVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEOiBJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgSXRlbVZhbHVlOiBWYWx1ZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkSXRlbSA9ICRUaGlzLmNsb3Nlc3QoJy5DaGVja2xpc3RJdGVtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRJdGVtLnJlbW92ZUNsYXNzKCdEb25lIE5vdEFwcGxpY2FibGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlLk5ld1N0YXRlID09PSAnZG9uZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJdGVtLmFkZENsYXNzKCdEb25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUmVzcG9uc2UuTmV3U3RhdGUgPT09ICdub3RfYXBwbGljYWJsZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJdGVtLmFkZENsYXNzKCdOb3RBcHBsaWNhYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ2hlY2tsaXN0UHJvZ3Jlc3MoJEl0ZW0sIFJlc3BvbnNlLlByb2dyZXNzKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ291bGQgbm90IHVwZGF0ZSBpdGVtIHN0YXRlLicpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pzb24nCiAgICAgICAgICAgICk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFZhbHVlIGlucHV0IGNoYW5nZSAoc2F2ZSBvbiBibHVyKQogICAgICAgICQoZG9jdW1lbnQpLm9uKCdibHVyJywgJy5JdGVtVmFsdWVJbnB1dCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyICRUaGlzID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIEl0ZW1JRCA9ICRUaGlzLmRhdGEoJ2l0ZW0taWQnKSwKICAgICAgICAgICAgICAgIFZhbHVlID0gJFRoaXMudmFsKCk7CgogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50VGlja2V0Q2hlY2tsaXN0JywKICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogQ29yZS5Db25maWcuR2V0KCdDaGFsbGVuZ2VUb2tlbicpLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1NldEl0ZW1WYWx1ZScsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQ6IFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIEl0ZW1JRDogSXRlbUlELAogICAgICAgICAgICAgICAgICAgIEl0ZW1WYWx1ZTogVmFsdWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICBNYXJrQ2hhbmdlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJEl0ZW0gPSAkVGhpcy5jbG9zZXN0KCcuQ2hlY2tsaXN0SXRlbScpOwogICAgICAgICAgICAgICAgICAgICAgICAkSXRlbS5yZW1vdmVDbGFzcygnRG9uZSBOb3RBcHBsaWNhYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5OZXdTdGF0ZSA9PT0gJ2RvbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSXRlbS5hZGRDbGFzcygnRG9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFJlc3BvbnNlLk5ld1N0YXRlID09PSAnbm90X2FwcGxpY2FibGUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSXRlbS5hZGRDbGFzcygnTm90QXBwbGljYWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkNoZWNrVmFsdWVUb2xlcmFuY2UoJFRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVDaGVja2xpc3RQcm9ncmVzcygkSXRlbSwgUmVzcG9uc2UuUHJvZ3Jlc3MpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDb3VsZCBub3QgdXBkYXRlIGl0ZW0gc3RhdGUuJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnanNvbicKICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gUmF0aW5nIHN0YXIgY2xpY2sKICAgICAgICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLlJhdGluZ1N0YXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyICRUaGlzID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgICRSYXRpbmcgPSAkVGhpcy5jbG9zZXN0KCcuSXRlbVJhdGluZycpLAogICAgICAgICAgICAgICAgSXRlbUlEID0gJFJhdGluZy5kYXRhKCdpdGVtLWlkJyksCiAgICAgICAgICAgICAgICBDbGlja2VkVmFsdWUgPSBwYXJzZUludCgkVGhpcy5kYXRhKCd2YWx1ZScpLCAxMCksCiAgICAgICAgICAgICAgICBDdXJyZW50VmFsdWUgPSBwYXJzZUludCgkUmF0aW5nLmRhdGEoJ3ZhbHVlJyksIDEwKSB8fCAwLAogICAgICAgICAgICAgICAgVmFsdWU7CgogICAgICAgICAgICAvLyBJZiBjbGlja2luZyB0aGUgc2FtZSBzdGFyIHRoYXQncyBhbHJlYWR5IHNlbGVjdGVkLCByZXNldCB0byAwCiAgICAgICAgICAgIGlmIChDbGlja2VkVmFsdWUgPT09IEN1cnJlbnRWYWx1ZSkgewogICAgICAgICAgICAgICAgVmFsdWUgPSAwOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgVmFsdWUgPSBDbGlja2VkVmFsdWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRUaWNrZXRDaGVja2xpc3QnLAogICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBDb3JlLkNvbmZpZy5HZXQoJ0NoYWxsZW5nZVRva2VuJyksCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnU2V0SXRlbVZhbHVlJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRDogVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEOiBJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgSXRlbVZhbHVlOiBWYWx1ZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRSYXRpbmcuZmluZCgnLlJhdGluZ1N0YXInKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkU3RhciA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhclZhbHVlID0gcGFyc2VJbnQoJFN0YXIuZGF0YSgndmFsdWUnKSwgMTApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTdGFyVmFsdWUgPD0gVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3Rhci5maW5kKCdpJykucmVtb3ZlQ2xhc3MoJ2ZhLXN0YXItbycpLmFkZENsYXNzKCdmYS1zdGFyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTdGFyLmZpbmQoJ2knKS5yZW1vdmVDbGFzcygnZmEtc3RhcicpLmFkZENsYXNzKCdmYS1zdGFyLW8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3RhclZhbHVlID09PSBWYWx1ZSAmJiBWYWx1ZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3Rhci5hZGRDbGFzcygnYWN0aXZlLXN0YXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFN0YXIucmVtb3ZlQ2xhc3MoJ2FjdGl2ZS1zdGFyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAkUmF0aW5nLmRhdGEoJ3ZhbHVlJywgVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAkUmF0aW5nLmF0dHIoJ2RhdGEtdmFsdWUnLCBWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkSXRlbSA9ICRSYXRpbmcuY2xvc2VzdCgnLkNoZWNrbGlzdEl0ZW0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEl0ZW0ucmVtb3ZlQ2xhc3MoJ0RvbmUgTm90QXBwbGljYWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuTmV3U3RhdGUgPT09ICdkb25lJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEl0ZW0uYWRkQ2xhc3MoJ0RvbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChSZXNwb25zZS5OZXdTdGF0ZSA9PT0gJ25vdF9hcHBsaWNhYmxlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEl0ZW0uYWRkQ2xhc3MoJ05vdEFwcGxpY2FibGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVDaGVja2xpc3RQcm9ncmVzcygkSXRlbSwgUmVzcG9uc2UuUHJvZ3Jlc3MpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDb3VsZCBub3QgdXBkYXRlIGl0ZW0gc3RhdGUuJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnanNvbicKICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gVG9nZ2xlIHJlbWFya3MgdmlzaWJpbGl0eQogICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuVG9nZ2xlUmVtYXJrcycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgJFRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgJEl0ZW0gPSAkVGhpcy5jbG9zZXN0KCcuQ2hlY2tsaXN0SXRlbScpLAogICAgICAgICAgICAgICAgJENvbnRhaW5lciA9ICRJdGVtLmZpbmQoJy5JdGVtUmVtYXJrc0NvbnRhaW5lcicpOwoKICAgICAgICAgICAgJENvbnRhaW5lci50b2dnbGVDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgICAgIGlmICghJENvbnRhaW5lci5oYXNDbGFzcygnSGlkZGVuJykpIHsKICAgICAgICAgICAgICAgICRDb250YWluZXIuZmluZCgnLkl0ZW1SZW1hcmtzSW5wdXQnKS5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIFNhdmUgcmVtYXJrcyBvbiBibHVyCiAgICAgICAgJChkb2N1bWVudCkub24oJ2JsdXInLCAnLkl0ZW1SZW1hcmtzSW5wdXQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkVGhpcyA9ICQodGhpcyksCiAgICAgICAgICAgICAgICBJdGVtSUQgPSAkVGhpcy5kYXRhKCdpdGVtLWlkJyksCiAgICAgICAgICAgICAgICBSZW1hcmtzID0gJFRoaXMudmFsKCk7CgogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50VGlja2V0Q2hlY2tsaXN0JywKICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogQ29yZS5Db25maWcuR2V0KCdDaGFsbGVuZ2VUb2tlbicpLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1NldEl0ZW1SZW1hcmtzJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRDogVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEOiBJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgUmVtYXJrczogUmVtYXJrcwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkVG9nZ2xlID0gJFRoaXMuY2xvc2VzdCgnLkNoZWNrbGlzdEl0ZW0nKS5maW5kKCcuVG9nZ2xlUmVtYXJrcycpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVtYXJrcy50cmltKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb2dnbGUuYWRkQ2xhc3MoJ0hhc1JlbWFya3MnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUb2dnbGUucmVtb3ZlQ2xhc3MoJ0hhc1JlbWFya3MnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnanNvbicKICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gUmVtb3ZlIGNoZWNrbGlzdCAoZnJvbSBDaGVja2xpc3RCb3ggaW4gZWRpdC9kZWZhdWx0IG1vZGUpCiAgICAgICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5DaGVja2xpc3RCb3ggLlJlbW92ZUNoZWNrbGlzdCcsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB2YXIgJEJveCA9ICQodGhpcykuY2xvc2VzdCgnLkNoZWNrbGlzdEJveCcpLAogICAgICAgICAgICAgICAgQm94Q2hlY2tsaXN0SUQgPSAkQm94LmRhdGEoJ2NoZWNrbGlzdC1pZCcpOwoKICAgICAgICAgICAgaWYgKCFjb25maXJtKENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgY2hlY2tsaXN0PycpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50VGlja2V0Q2hlY2tsaXN0JywKICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogQ29yZS5Db25maWcuR2V0KCdDaGFsbGVuZ2VUb2tlbicpLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1JlbW92ZUNoZWNrbGlzdCcsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQ6IFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIENoZWNrbGlzdElEOiBCb3hDaGVja2xpc3RJRAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1hcmtDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRCb3guZmFkZU91dChmdW5jdGlvbigpIHsgJCh0aGlzKS5yZW1vdmUoKTsgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NvdWxkIG5vdCByZW1vdmUgY2hlY2tsaXN0LicpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pzb24nCiAgICAgICAgICAgICk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFJlbW92ZSBjaGVja2xpc3QgKGZyb20gTWFuYWdlQ2hlY2tsaXN0Um93IGluIG1hbmFnZSBtb2RlKQogICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuTWFuYWdlQ2hlY2tsaXN0Um93IC5SZW1vdmVDaGVja2xpc3QnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyICRSb3cgPSAkKHRoaXMpLmNsb3Nlc3QoJy5NYW5hZ2VDaGVja2xpc3RSb3cnKSwKICAgICAgICAgICAgICAgIFJvd0NoZWNrbGlzdElEID0gJFJvdy5kYXRhKCdjaGVja2xpc3QtaWQnKTsKCiAgICAgICAgICAgIGlmICghY29uZmlybShDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIGNoZWNrbGlzdD8nKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudFRpY2tldENoZWNrbGlzdCcsCiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46IENvcmUuQ29uZmlnLkdldCgnQ2hhbGxlbmdlVG9rZW4nKSwKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdSZW1vdmVDaGVja2xpc3QnLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEOiBUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBDaGVja2xpc3RJRDogUm93Q2hlY2tsaXN0SUQKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICBNYXJrQ2hhbmdlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAkUm93LmZhZGVPdXQoZnVuY3Rpb24oKSB7ICQodGhpcykucmVtb3ZlKCk7IH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDb3VsZCBub3QgcmVtb3ZlIGNoZWNrbGlzdC4nKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdqc29uJwogICAgICAgICAgICApOwogICAgICAgIH0pOwoKICAgICAgICAvLyBBZGQgY2hlY2tsaXN0IGZyb20gdGVtcGxhdGUKICAgICAgICAkKCcjQWRkQ2hlY2tsaXN0QnRuJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgVGVtcGxhdGVJRCA9ICQoJyNUZW1wbGF0ZUlEJykudmFsKCk7CgogICAgICAgICAgICBpZiAoIVRlbXBsYXRlSUQpIHsKICAgICAgICAgICAgICAgIGFsZXJ0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdQbGVhc2Ugc2VsZWN0IGEgdGVtcGxhdGUuJykpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50VGlja2V0Q2hlY2tsaXN0JywKICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogQ29yZS5Db25maWcuR2V0KCdDaGFsbGVuZ2VUb2tlbicpLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0FkZENoZWNrbGlzdCcsCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQ6IFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQ6IFRlbXBsYXRlSUQKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICBNYXJrQ2hhbmdlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ291bGQgbm90IGFkZCBjaGVja2xpc3QuJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnanNvbicKICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gQ2xvc2UgYnV0dG9uIC0gZm9yIHBvcHVwIHZpZXdzCiAgICAgICAgJCgnI0Nsb3NlQnRuJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAodHlwZW9mIENvcmUuVUkuUG9wdXAgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBDb3JlLlVJLlBvcHVwLkNsb3NlUG9wdXAgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGlmIChIYXNDaGFuZ2VzKCkpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLlBvcHVwLkV4ZWN1dGVJblBhcmVudFdpbmRvdyhmdW5jdGlvbiAoV2luZG93T2JqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd09iamVjdC5Db3JlLlVJLlBvcHVwLkZpcmVQb3B1cEV2ZW50KCdSZWxvYWQnKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIENsZWFyQ2hhbmdlcygpOwogICAgICAgICAgICAgICAgQ29yZS5VSS5Qb3B1cC5DbG9zZVBvcHVwKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBDaGVja1ZhbHVlVG9sZXJhbmNlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5UaWNrZXRDaGVja2xpc3QKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnl9ICRJbnB1dCAtIFRoZSB2YWx1ZSBpbnB1dCBlbGVtZW50CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ2hlY2sgaWYgdmFsdWUgaXMgd2l0aGluIHRvbGVyYW5jZSBhbmQgc2hvdyB3YXJuaW5nIGlmIG5vdC4KICAgICAqLwogICAgVGFyZ2V0TlMuQ2hlY2tWYWx1ZVRvbGVyYW5jZSA9IGZ1bmN0aW9uICgkSW5wdXQpIHsKICAgICAgICB2YXIgJEl0ZW0gPSAkSW5wdXQuY2xvc2VzdCgnLkNoZWNrbGlzdEl0ZW0nKSwKICAgICAgICAgICAgQ29uZmlnID0ge307CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIENvbmZpZyA9IEpTT04ucGFyc2UoJEl0ZW0uZGF0YSgnY29uZmlnJykgfHwgJ3t9Jyk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBDb25maWcgPSB7fTsKICAgICAgICB9CgogICAgICAgIHZhciBWYWx1ZSA9IHBhcnNlRmxvYXQoJElucHV0LnZhbCgpKSwKICAgICAgICAgICAgVGFyZ2V0ID0gQ29uZmlnLnRhcmdldFZhbHVlLAogICAgICAgICAgICBUb2xlcmFuY2UgPSBDb25maWcudG9sZXJhbmNlLAogICAgICAgICAgICAkVmFsdWVTcGFuID0gJEl0ZW0uZmluZCgnLkl0ZW1WYWx1ZScpOwoKICAgICAgICAkVmFsdWVTcGFuLnJlbW92ZUNsYXNzKCdWYWx1ZVdhcm5pbmcnKTsKCiAgICAgICAgaWYgKHR5cGVvZiBUYXJnZXQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBUb2xlcmFuY2UgIT09ICd1bmRlZmluZWQnICYmICFpc05hTihWYWx1ZSkpIHsKICAgICAgICAgICAgdmFyIExvd2VyQm91bmQgPSBUYXJnZXQgLSBUb2xlcmFuY2UsCiAgICAgICAgICAgICAgICBVcHBlckJvdW5kID0gVGFyZ2V0ICsgVG9sZXJhbmNlOwoKICAgICAgICAgICAgaWYgKFZhbHVlIDwgTG93ZXJCb3VuZCB8fCBWYWx1ZSA+IFVwcGVyQm91bmQpIHsKICAgICAgICAgICAgICAgICRWYWx1ZVNwYW4uYWRkQ2xhc3MoJ1ZhbHVlV2FybmluZycpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuVGlja2V0Q2hlY2tsaXN0IHx8IHt9KSk7Cg==</File>
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.TicketZoom.ChecklistWidget.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI1IFpudW55IENoZWNrbGlzdCBQcm9qZWN0Ci8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CkNvcmUuQWdlbnQuVGlja2V0Wm9vbSA9IENvcmUuQWdlbnQuVGlja2V0Wm9vbSB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuQWdlbnQuVGlja2V0Wm9vbS5DaGVja2xpc3RXaWRnZXQKICogQG1lbWJlcm9mIENvcmUuQWdlbnQuVGlja2V0Wm9vbQogKiBAZGVzY3JpcHRpb24KICogICAgICBGdW5jdGlvbnMgZm9yIHRoZSBjaGVja2xpc3Qgc2lkZWJhciB3aWRnZXQgaW4gdGlja2V0IHpvb20uCiAqLwpDb3JlLkFnZW50LlRpY2tldFpvb20uQ2hlY2tsaXN0V2lkZ2V0ID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEdldFRpY2tldElECiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHRoZSBUaWNrZXRJRCBmcm9tIHZhcmlvdXMgc291cmNlcwogICAgICogQHJldHVybnMge1N0cmluZ30gVGhlIFRpY2tldElEIG9yIGVtcHR5IHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBHZXRUaWNrZXRJRCgpIHsKICAgICAgICB2YXIgVGlja2V0SUQgPSAnJzsKCiAgICAgICAgLy8gVHJ5IGhpZGRlbiBpbnB1dAogICAgICAgIFRpY2tldElEID0gJCgnaW5wdXRbbmFtZT0iVGlja2V0SUQiXScpLnZhbCgpOwogICAgICAgIGlmIChUaWNrZXRJRCkgewogICAgICAgICAgICByZXR1cm4gVGlja2V0SUQ7CiAgICAgICAgfQoKICAgICAgICAvLyBUcnkgQ29yZS5Db25maWcKICAgICAgICBUaWNrZXRJRCA9IENvcmUuQ29uZmlnLkdldCgnVGlja2V0SUQnKTsKICAgICAgICBpZiAoVGlja2V0SUQpIHsKICAgICAgICAgICAgcmV0dXJuIFRpY2tldElEOwogICAgICAgIH0KCiAgICAgICAgLy8gVHJ5IFVSTCBwYXJhbWV0ZXIKICAgICAgICB2YXIgTWF0Y2ggPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLm1hdGNoKC9UaWNrZXRJRD0oXGQrKS8pOwogICAgICAgIGlmIChNYXRjaCAmJiBNYXRjaFsxXSkgewogICAgICAgICAgICByZXR1cm4gTWF0Y2hbMV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5UaWNrZXRab29tLkNoZWNrbGlzdFdpZGdldAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZSB0aGUgY2hlY2tsaXN0IHdpZGdldC4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBXaWRnZXQgaXMgbm93IHNpbXBsaWZpZWQgLSBubyBpdGVtIGludGVyYWN0aW9uLCBqdXN0IGxpbmtzIHRvIHBvcHVwcwogICAgICAgIC8vIFRoZSBSZWZyZXNoV2lkZ2V0IGZ1bmN0aW9uIGlzIHN0aWxsIGF2YWlsYWJsZSBmb3IgcG9wdXAgY2FsbGJhY2tzCiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgUmVmcmVzaFdpZGdldAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuVGlja2V0Wm9vbS5DaGVja2xpc3RXaWRnZXQKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtTdHJpbmd9IFRpY2tldElEIC0gVGhlIHRpY2tldCBJRAogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFJlZnJlc2ggdGhlIGNoZWNrbGlzdCB3aWRnZXQgY29udGVudC4KICAgICAqLwogICAgVGFyZ2V0TlMuUmVmcmVzaFdpZGdldCA9IGZ1bmN0aW9uIChUaWNrZXRJRCkgewogICAgICAgIGlmICghVGlja2V0SUQpIHsKICAgICAgICAgICAgVGlja2V0SUQgPSBHZXRUaWNrZXRJRCgpOwogICAgICAgIH0KCiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudFRpY2tldENoZWNrbGlzdCcsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdXaWRnZXRDb250ZW50JywKICAgICAgICAgICAgICAgIFRpY2tldElEOiBUaWNrZXRJRAogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIC8vIFNlY3VyaXR5OiBWYWxpZGF0ZSByZXNwb25zZSBiZWZvcmUgdXNpbmcgLmh0bWwoKQogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlICYmIFJlc3BvbnNlLlN1Y2Nlc3MgJiYgUmVzcG9uc2UuSFRNTCAmJiB0eXBlb2YgUmVzcG9uc2UuSFRNTCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjQ2hlY2tsaXN0V2lkZ2V0IC5Db250ZW50JykuaHRtbChSZXNwb25zZS5IVE1MKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHJlbG9hZCBwYWdlCiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdqc29uJwogICAgICAgICk7CiAgICB9OwoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5BZ2VudC5UaWNrZXRab29tLkNoZWNrbGlzdFdpZGdldCB8fCB7fSkpOwo=</File>

        <!-- CSS -->
        <File Permission="660" Location="var/httpd/htdocs/skins/Agent/default/css/Core.Agent.Checklist.css" Encode="Base64">LyoqCiAqIFpudW55IENoZWNrbGlzdCBBZGQtb24gU3R5bGVzCiAqLwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogQWRtaW4gVGVtcGxhdGUgTGlzdCAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qIFRlbXBsYXRlIGFjdGlvbiBidXR0b25zIC0gdW5pZmllZCBzdHlsZSAqLwojVGVtcGxhdGVUYWJsZSAuVGVtcGxhdGVBY3Rpb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMzJweDsKICAgIGhlaWdodDogMzJweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGNvbG9yOiAjNzc3OwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKI1RlbXBsYXRlVGFibGUgLlRlbXBsYXRlQWN0aW9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNmOTI7CiAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50Owp9CgojVGVtcGxhdGVUYWJsZSAuVGVtcGxhdGVBY3Rpb246aG92ZXIgaSB7CiAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50Owp9CgovKiBJbXBvcnQgYnV0dG9uIHN0eWxpbmcgKi8KI0ltcG9ydFRlbXBsYXRlQnV0dG9uIHNwYW4gaSB7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKfQoKLyogU2F2ZSBidXR0b25zIHJvdyAqLwouU2F2ZUJ1dHRvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogMTBweDsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogQWRtaW4gVGVtcGxhdGUgRWRpdCAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCiNJdGVtVGFibGUgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwp9CgojSXRlbVRhYmxlIHRoZWFkIHsKICAgIGRpc3BsYXk6IHRhYmxlLWhlYWRlci1ncm91cDsKfQoKI0l0ZW1UYWJsZSB0Ym9keSB7CiAgICBkaXNwbGF5OiB0YWJsZS1yb3ctZ3JvdXA7Cn0KCiNJdGVtVGFibGUgdHIgewogICAgZGlzcGxheTogdGFibGUtcm93Owp9CgojSXRlbVRhYmxlIHRoLAojSXRlbVRhYmxlIHRkIHsKICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICBwYWRkaW5nOiA4cHg7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7Cn0KCiNJdGVtVGFibGUgdGggewogICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKI0l0ZW1UYWJsZSAuRHJhZ0hhbmRsZSB7CiAgICBjdXJzb3I6IG1vdmU7CiAgICBjb2xvcjogIzk5OTsKICAgIHdpZHRoOiA1MHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgojSXRlbVRhYmxlIC5EcmFnSGFuZGxlOmhvdmVyIHsKICAgIGNvbG9yOiAjMzMzOwp9CgojSXRlbVRhYmxlIC5Tb3J0T3JkZXIgewogICAgZGlzcGxheTogbm9uZTsKfQoKI0l0ZW1UYWJsZSBpbnB1dFt0eXBlPSJ0ZXh0Il0gewogICAgd2lkdGg6IDk1JTsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgcGFkZGluZzogNXB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKI0l0ZW1UYWJsZSBpbnB1dFt0eXBlPSJ0ZXh0Il06Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiAjNjljOwogICAgb3V0bGluZTogbm9uZTsKfQoKLyogQWN0aW9uIGljb25zIC0gWm51bnkgc3RhbmRhcmQ6IG5vIGJhY2tncm91bmQsIG9yYW5nZSBvbiBob3ZlciAqLwojSXRlbVRhYmxlIC5TYXZlSXRlbSwKI0l0ZW1UYWJsZSAuRGVsZXRlSXRlbSwKI0l0ZW1UYWJsZSAuRWRpdEl0ZW1EZXRhaWxzIHsKICAgIGNvbG9yOiAjNzc3OwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7Cn0KCiNJdGVtVGFibGUgLlNhdmVJdGVtOmhvdmVyLAojSXRlbVRhYmxlIC5EZWxldGVJdGVtOmhvdmVyLAojSXRlbVRhYmxlIC5FZGl0SXRlbURldGFpbHM6aG92ZXIgewogICAgY29sb3I6ICNmOTI7Cn0KCi8qIFVuaWZpZWQgSXRlbSBNb2RhbCAoQWRkL0VkaXQpICovCi5JdGVtTW9kYWxDb250ZW50IHsKICAgIHdpZHRoOiA3MDBweDsKICAgIG1heC13aWR0aDogOTB2dzsKICAgIHBhZGRpbmc6IDIwcHg7Cn0KCiNJdGVtTW9kYWwgZmllbGRzZXQgewogICAgYm9yZGVyOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbjogMDsKfQoKI0l0ZW1Nb2RhbCBmaWVsZHNldC5UYWJsZUxpa2UgPiBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLXRvcDogMTVweDsKICAgIG1hcmdpbi1ib3R0b206IDVweDsKfQoKI0l0ZW1Nb2RhbCBmaWVsZHNldC5UYWJsZUxpa2UgPiBsYWJlbDpmaXJzdC1jaGlsZCB7CiAgICBtYXJnaW4tdG9wOiAwOwp9CgojSXRlbU1vZGFsIC5GaWVsZCB7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgojSXRlbU1vZGFsIGlucHV0W3R5cGU9InRleHQiXSwKI0l0ZW1Nb2RhbCBpbnB1dFt0eXBlPSJudW1iZXIiXSwKI0l0ZW1Nb2RhbCBzZWxlY3QsCiNJdGVtTW9kYWwgdGV4dGFyZWEgewogICAgcGFkZGluZzogOHB4IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgZm9udC1zaXplOiAxM3B4Owp9CgojSXRlbU1vZGFsIGlucHV0W3R5cGU9InRleHQiXTpmb2N1cywKI0l0ZW1Nb2RhbCBpbnB1dFt0eXBlPSJudW1iZXIiXTpmb2N1cywKI0l0ZW1Nb2RhbCBzZWxlY3Q6Zm9jdXMsCiNJdGVtTW9kYWwgdGV4dGFyZWE6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiAjNjljOwogICAgb3V0bGluZTogbm9uZTsKfQoKI0l0ZW1Nb2RhbCB0ZXh0YXJlYSB7CiAgICB3aWR0aDogMTAwJTsKICAgIG1pbi1oZWlnaHQ6IDgwcHg7CiAgICByZXNpemU6IHZlcnRpY2FsOwp9CgojSXRlbU1vZGFsIGlucHV0W3R5cGU9ImNoZWNrYm94Il0gewogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7Cn0KCi8qIFNlbGVjdCB3aWR0aCBmaXggZm9yIHR5cGUgZHJvcGRvd24gKi8KI0l0ZW1Nb2RhbCBzZWxlY3QsCi5EaWFsb2cgI0l0ZW1Nb2RhbFR5cGUsCi5EaWFsb2cgc2VsZWN0Llc1MHBjIHsKICAgIHdpZHRoOiA1MCU7CiAgICBtaW4td2lkdGg6IDIwMHB4Owp9CgojSXRlbU1vZGFsVHlwZVNlbGVjdFdyYXBwZXIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgovKiBUeXBlIGNvbmZpZyBzZWN0aW9ucyBpbiBtb2RhbCAqLwouSXRlbU1vZGFsVHlwZUNvbmZpZyB7CiAgICBtYXJnaW46IDE1cHggMDsKICAgIHBhZGRpbmc6IDE1cHg7CiAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwogICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZjkyOwogICAgYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7Cn0KCi5JdGVtTW9kYWxUeXBlQ29uZmlnLkhpZGRlbiB7CiAgICBkaXNwbGF5OiBub25lOwp9CgouSXRlbU1vZGFsVHlwZUNvbmZpZyBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIG1hcmdpbi1ib3R0b206IDVweDsKfQoKLkl0ZW1Nb2RhbFR5cGVDb25maWcgbGFiZWw6Zmlyc3QtY2hpbGQgewogICAgbWFyZ2luLXRvcDogMDsKfQoKLyogQ29uZmlnIHJvdyBmb3Igc2lkZS1ieS1zaWRlIGZpZWxkcyAqLwouSXRlbU1vZGFsQ29uZmlnUm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDE1cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgouSXRlbU1vZGFsQ29uZmlnRmllbGQgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMTUwcHg7Cn0KCi5JdGVtTW9kYWxDb25maWdGaWVsZCBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgZm9udC1zaXplOiAxMnB4Owp9CgouSXRlbU1vZGFsQ29uZmlnRmllbGQgaW5wdXQsCi5JdGVtTW9kYWxDb25maWdGaWVsZCBzZWxlY3QgewogICAgd2lkdGg6IDEwMCU7Cn0KCiNJdGVtVGFibGUgLkl0ZW1Sb3cgdGQgewogICAgYmFja2dyb3VuZDogI2ZmZjsKfQoKLyogSXRlbSBUeXBlIEJhZGdlcyAqLwouSXRlbVR5cGVCYWRnZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBwYWRkaW5nOiAycHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5JdGVtVHlwZUJhZGdlLkl0ZW1UeXBlLWNoZWNrYm94IHsKICAgIGJhY2tncm91bmQ6ICNlM2YyZmQ7CiAgICBjb2xvcjogIzE5NzZkMjsKfQoKLkl0ZW1UeXBlQmFkZ2UuSXRlbVR5cGUtc3RhdHVzIHsKICAgIGJhY2tncm91bmQ6ICNmZmYzZTA7CiAgICBjb2xvcjogI2U2NTEwMDsKfQoKLkl0ZW1UeXBlQmFkZ2UuSXRlbVR5cGUtdmFsdWUgewogICAgYmFja2dyb3VuZDogI2U4ZjVlOTsKICAgIGNvbG9yOiAjMmU3ZDMyOwp9CgouSXRlbVR5cGVCYWRnZS5JdGVtVHlwZS1yYXRpbmcgewogICAgYmFja2dyb3VuZDogI2ZjZTRlYzsKICAgIGNvbG9yOiAjYzIxODViOwp9CgovKiBUeXBlLXNwZWNpZmljIGNvbmZpZyBzZWN0aW9ucyAqLwouSXRlbVR5cGVDb25maWcgewogICAgbWFyZ2luOiAxMHB4IDA7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYmFja2dyb3VuZDogI2Y5ZjlmOTsKICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2Y5MjsKfQoKLkl0ZW1UeXBlQ29uZmlnLkhpZGRlbiB7CiAgICBkaXNwbGF5OiBub25lOwp9CgovKiBVdGlsaXR5IGNsYXNzICovCi5IaWRkZW4gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBJdGVtIFR5cGUgU3BlY2lmaWMgU3R5bGVzICAgICAgICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyogU3RhdHVzIGRyb3Bkb3duIC0gbmF0aXZlIHNlbGVjdCBzdHlsaW5nICovCi5JdGVtU3RhdHVzU2VsZWN0IHsKICAgIG1pbi13aWR0aDogMTgwcHg7CiAgICBtYXgtd2lkdGg6IDMwMHB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLkl0ZW1TdGF0dXNTZWxlY3Q6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiAjZjkyOwp9CgouSXRlbVN0YXR1c1NlbGVjdDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6ICNmOTI7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHJnYmEoMjU1LCAxNTMsIDM0LCAwLjE1KTsKfQoKLyogVmFsdWUgaW5wdXQgKi8KLkl0ZW1WYWx1ZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGJhY2tncm91bmQ6ICNmOGY5ZmE7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMGUwZTA7Cn0KCi5JdGVtVmFsdWVJbnB1dCB7CiAgICB3aWR0aDogODBweDsKICAgIHBhZGRpbmc6IDZweCAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgI2RkZDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAxNHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgouSXRlbVZhbHVlSW5wdXQ6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiAjZjkyOwogICAgb3V0bGluZTogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDI1NSwgMTUzLCAzNCwgMC4xNSk7Cn0KCi5WYWx1ZVVuaXQgewogICAgY29sb3I6ICM1NTU7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgouVmFsdWVUYXJnZXQgewogICAgY29sb3I6ICM2NjY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBwYWRkaW5nOiAzcHggOHB4OwogICAgYmFja2dyb3VuZDogI2U4ZjVlOTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLlZhbHVlVG9sZXJhbmNlIHsKICAgIGNvbG9yOiAjODg4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJhY2tncm91bmQ6ICNmZmYzZTA7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KCi8qIFZhbHVlIG91dCBvZiB0b2xlcmFuY2Ugd2FybmluZyAqLwouSXRlbVZhbHVlLlZhbHVlV2FybmluZyB7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOGUxOwogICAgYm9yZGVyLWNvbG9yOiAjZmZjMTA3Owp9CgouSXRlbVZhbHVlLlZhbHVlV2FybmluZyAuSXRlbVZhbHVlSW5wdXQgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjNjZDsKICAgIGJvcmRlci1jb2xvcjogI2ZmYzEwNzsKfQoKLkl0ZW1WYWx1ZS5WYWx1ZVdhcm5pbmcgLlZhbHVlVW5pdCB7CiAgICBjb2xvcjogIzg1NjQwNDsKfQoKLyogUmF0aW5nIHN0YXJzICovCi5JdGVtUmF0aW5nIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogI2ZlZjllNzsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLlJhdGluZ1N0YXIgewogICAgY29sb3I6ICNkZGQ7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKfQoKLlJhdGluZ1N0YXI6aG92ZXIgewogICAgY29sb3I6ICNmZmMxMDc7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMTUpOwp9CgouUmF0aW5nU3RhciAuZmEtc3RhciB7CiAgICBjb2xvcjogI2ZmYzEwNzsKfQoKLlJhdGluZ1N0YXIgLmZhLXN0YXItbyB7CiAgICBjb2xvcjogI2RkZDsKfQoKLyogQWN0aXZlIHN0YXIgaW5kaWNhdG9yIC0gc2hvd3Mgd2hpY2ggc3RhciBjYW4gYmUgY2xpY2tlZCB0byByZXNldCAqLwouUmF0aW5nU3Rhci5hY3RpdmUtc3RhciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5SYXRpbmdTdGFyLmFjdGl2ZS1zdGFyOjphZnRlciB7CiAgICBjb250ZW50OiAnJzsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogLTJweDsKICAgIGxlZnQ6IDUwJTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIHdpZHRoOiA0cHg7CiAgICBoZWlnaHQ6IDRweDsKICAgIGJhY2tncm91bmQ6ICNmOTI7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7Cn0KCi8qIFJlbWFya3MgKi8KLkl0ZW1SZW1hcmtzQ29udGFpbmVyIHsKICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICB3aWR0aDogMTAwJTsKfQoKLyogRm9yIGNoZWNrYm94IHR5cGUsIGluZGVudCByZW1hcmtzIHVuZGVyIGNoZWNrYm94ICovCi5DaGVja2xpc3RJdGVtLkl0ZW1UeXBlLWNoZWNrYm94IC5JdGVtUmVtYXJrc0NvbnRhaW5lciB7CiAgICBtYXJnaW4tbGVmdDogMzVweDsKICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAzNXB4KTsKfQoKLkl0ZW1SZW1hcmtzSW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiA2MHB4OwogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgI2UwZTBlMDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHJlc2l6ZTogdmVydGljYWw7CiAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLkl0ZW1SZW1hcmtzSW5wdXQ6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiAjZjkyOwogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgyNTUsIDE1MywgMzQsIDAuMSk7Cn0KCi8qIEZpbGxlZCBjb21tZW50IGljb24gd2hlbiByZW1hcmtzIGV4aXN0ICovCi5JdGVtQWN0aW9uLkhhc1JlbWFya3MgLmZhLWNvbW1lbnQtbzo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcZjA3NSI7IC8qIGZhLWNvbW1lbnQgKGZpbGxlZCkgKi8KfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogQWdlbnQgVGlja2V0IENoZWNrbGlzdCBQb3B1cCAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi5DaGVja2xpc3RCb3ggewogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNlMGUwZTA7CiAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgcGFkZGluZzogMTVweDsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMDUpOwp9CgouQ2hlY2tsaXN0SGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7Cn0KCi5DaGVja2xpc3RIZWFkZXIgaDMgewogICAgbWFyZ2luOiAwOwogICAgZm9udC1zaXplOiAxNXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAjMzMzOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKfQoKLkNoZWNrbGlzdEhlYWRlciBoMyBpIHsKICAgIGNvbG9yOiAjZjkyOwp9CgouQ2hlY2tsaXN0SGVhZGVyIC5Qcm9ncmVzcyB7CiAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgY29sb3I6ICM4ODg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwogICAgcGFkZGluZzogMnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7Cn0KCi5DaGVja2xpc3RIZWFkZXIgLldhcm5pbmcgewogICAgY29sb3I6ICNlNjUxMDA7CiAgICBtYXJnaW4tbGVmdDogNXB4Owp9CgouQ2hlY2tsaXN0SGVhZGVyIC5BY3Rpb25zIGEgewogICAgY29sb3I6ICM5OTk7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLkNoZWNrbGlzdEhlYWRlciAuQWN0aW9ucyBhOmhvdmVyIHsKICAgIGNvbG9yOiAjYzAwOwogICAgYmFja2dyb3VuZDogcmdiYSgyMDQsIDAsIDAsIDAuMSk7Cn0KCi5DaGVja2xpc3REZXNjcmlwdGlvbiB7CiAgICBjb2xvcjogIzY2NjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICBwYWRkaW5nOiA4cHggMTBweDsKICAgIGJhY2tncm91bmQ6ICNmOWY5Zjk7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBsaW5lLWhlaWdodDogMS40Owp9CgouQ2hlY2tsaXN0TGluayB7CiAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgZm9udC1zaXplOiAxMnB4Owp9CgouQ2hlY2tsaXN0TGluayBhIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgY29sb3I6ICMyMTk2ZjM7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGJhY2tncm91bmQ6ICNlM2YyZmQ7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgouQ2hlY2tsaXN0TGluayBhOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNiYmRlZmI7CiAgICBjb2xvcjogIzE1NjVjMDsKfQoKLkNoZWNrbGlzdExpbmsgYSBpIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLlByb2dyZXNzQmFyIHsKICAgIGhlaWdodDogOHB4OwogICAgYmFja2dyb3VuZDogI2VlZTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgouUHJvZ3Jlc3NCYXIgLlByb2dyZXNzIHsKICAgIGhlaWdodDogMTAwJTsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgIzRjYWY1MCwgIzhiYzM0YSk7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzIGVhc2U7Cn0KCi5DaGVja2xpc3RJdGVtcyB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGJhY2tncm91bmQ6ICNmYWZhZmE7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgouQ2hlY2tsaXN0SXRlbSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBwYWRkaW5nOiAxMnB4IDE1cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgouQ2hlY2tsaXN0SXRlbTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhOwp9CgouQ2hlY2tsaXN0SXRlbTpsYXN0LWNoaWxkIHsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KCi5DaGVja2xpc3RJdGVtLkRvbmUgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCAjZThmNWU5LCAjZmZmKTsKfQoKLkNoZWNrbGlzdEl0ZW0uRG9uZTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICNlMGYyZTEsICNmNWY1ZjUpOwp9CgouQ2hlY2tsaXN0SXRlbS5Ob3RBcHBsaWNhYmxlIHsKICAgIGJhY2tncm91bmQ6ICNmOGY4Zjg7CiAgICBjb2xvcjogIzk5OTsKfQoKLkNoZWNrbGlzdEl0ZW0gLkl0ZW1Db250ZW50IHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKfQoKLkNoZWNrbGlzdEl0ZW0gLkl0ZW1JbnB1dCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLkNoZWNrbGlzdEl0ZW0gLkl0ZW1DaGVja2JveCB7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIGZvbnQtc2l6ZTogMjBweDsKfQoKLkNoZWNrbGlzdEl0ZW0gLkl0ZW1DaGVja2JveCBhIHsKICAgIGNvbG9yOiAjYmJiOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLkNoZWNrbGlzdEl0ZW0gLkl0ZW1DaGVja2JveCBhOmhvdmVyIHsKICAgIGNvbG9yOiAjNGNhZjUwOwogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpOwp9CgouQ2hlY2tsaXN0SXRlbSAuSXRlbUNoZWNrYm94IC50ZXh0LXN1Y2Nlc3MgewogICAgY29sb3I6ICM0Y2FmNTA7Cn0KCi5DaGVja2xpc3RJdGVtIC5JdGVtQ2hlY2tib3ggLnRleHQtbXV0ZWQgewogICAgY29sb3I6ICNiYmI7Cn0KCi5DaGVja2xpc3RJdGVtIC5JdGVtVGl0bGUgewogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiAjMzMzOwp9CgouQ2hlY2tsaXN0SXRlbSAuSXRlbVRpdGxlLkNvbXBsZXRlZCB7CiAgICBjb2xvcjogIzg4ODsKfQoKLkNoZWNrbGlzdEl0ZW0gLkl0ZW1UaXRsZSAuTWFya2VyIHsKICAgIGNvbG9yOiAjZTUzOTM1OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBtYXJnaW4tbGVmdDogNHB4Owp9CgouQ2hlY2tsaXN0SXRlbSAuSXRlbURlc2NyaXB0aW9uIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCU7CiAgICBjb2xvcjogIzc3NzsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG1hcmdpbi10b3A6IDRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi8qIEZvciBjaGVja2JveCB0eXBlLCBpbmRlbnQgZGVzY3JpcHRpb24gdW5kZXIgY2hlY2tib3ggKi8KLkNoZWNrbGlzdEl0ZW0uSXRlbVR5cGUtY2hlY2tib3ggLkl0ZW1EZXNjcmlwdGlvbiB7CiAgICBtYXJnaW4tbGVmdDogMzVweDsKfQoKLkNoZWNrbGlzdEl0ZW0gLkl0ZW1BY3Rpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDRweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKfQoKLyogSW5kaXZpZHVhbCBhY3Rpb24gaWNvbnMgLSBmaXhlZCB3aWR0aCBjb2x1bW5zICovCi5DaGVja2xpc3RJdGVtIC5JdGVtQWN0aW9ucyAuSXRlbUFjdGlvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4OwogICAgY29sb3I6ICM4ODg7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5DaGVja2xpc3RJdGVtIC5JdGVtQWN0aW9ucyAuSXRlbUFjdGlvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjZjkyOwogICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoKLkNoZWNrbGlzdEl0ZW0gLkl0ZW1BY3Rpb25zIC5JdGVtQWN0aW9uOmhvdmVyIGkgewogICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoKLyogSGFzUmVtYXJrcyBpbmRpY2F0b3IgKi8KLkNoZWNrbGlzdEl0ZW0gLkl0ZW1BY3Rpb25zIC5JdGVtQWN0aW9uLkhhc1JlbWFya3MgewogICAgY29sb3I6ICNmOTI7Cn0KCi8qIFBsYWNlaG9sZGVyIGZvciBlbXB0eSBpY29uIHNsb3RzIC0gbWFpbnRhaW5zIHNwYWNpbmcgKi8KLkNoZWNrbGlzdEl0ZW0gLkl0ZW1BY3Rpb25zIC5JdGVtQWN0aW9uUGxhY2Vob2xkZXIgewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwp9CgovKiBMZWdhY3kgZmFsbGJhY2sgZm9yIGxpbmtzIHdpdGhvdXQgSXRlbUFjdGlvbiBjbGFzcyAqLwouQ2hlY2tsaXN0SXRlbSAuSXRlbUFjdGlvbnMgYTpub3QoLkl0ZW1BY3Rpb24pIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLXdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4OwogICAgcGFkZGluZzogMCA2cHg7CiAgICBjb2xvcjogIzc3NzsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7Cn0KCi5DaGVja2xpc3RJdGVtIC5JdGVtQWN0aW9ucyBhOm5vdCguSXRlbUFjdGlvbik6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y5MjsKICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7Cn0KCi5DaGVja2xpc3RJdGVtIC5JdGVtQWN0aW9ucyBhOm5vdCguSXRlbUFjdGlvbik6aG92ZXIgaSB7CiAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50Owp9CgovKiBBZGQgSXRlbSBTZWN0aW9uIC0gQnV0dG9uIG9ubHkgKi8KLkFkZEl0ZW1TZWN0aW9uIHsKICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICBwYWRkaW5nLXRvcDogMTVweDsKICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQgI2UwZTBlMDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLkFkZEl0ZW1TZWN0aW9uIC5BZGRJdGVtQnRuIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogOHB4IDE2cHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwp9CgouQWRkSXRlbVNlY3Rpb24gLkFkZEl0ZW1CdG46aG92ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMjU1LCAxNTMsIDM0LCAwLjMpOwp9CgovKiBBZGQgSXRlbSBNb2RhbCBzdHlsaW5nICovCiNBZGRJdGVtTW9kYWwgLkl0ZW1Nb2RhbENvbnRlbnQsCi5EaWFsb2cgLkl0ZW1Nb2RhbENvbnRlbnQgewogICAgcGFkZGluZzogMTBweDsKfQoKLyogTW9kYWwgdHlwZSBkcm9wZG93biB1c2VzIE1vZGVybml6ZSAtIG5vIGN1c3RvbSBzdHlsaW5nIG5lZWRlZCAqLwoKI0FkZEl0ZW1Nb2RhbCBpbnB1dFt0eXBlPSJ0ZXh0Il0sCiNBZGRJdGVtTW9kYWwgaW5wdXRbdHlwZT0ibnVtYmVyIl0sCiNBZGRJdGVtTW9kYWwgdGV4dGFyZWEsCi5EaWFsb2cgLkl0ZW1Nb2RhbENvbnRlbnQgaW5wdXRbdHlwZT0idGV4dCJdLAouRGlhbG9nIC5JdGVtTW9kYWxDb250ZW50IGlucHV0W3R5cGU9Im51bWJlciJdLAouRGlhbG9nIC5JdGVtTW9kYWxDb250ZW50IHRleHRhcmVhIHsKICAgIHBhZGRpbmc6IDhweCAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKI0FkZEl0ZW1Nb2RhbCAuSXRlbU1vZGFsVHlwZUNvbmZpZywKLkRpYWxvZyAuSXRlbU1vZGFsVHlwZUNvbmZpZyB7CiAgICBtYXJnaW46IDE1cHggMDsKICAgIHBhZGRpbmc6IDE1cHg7CiAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwogICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZjkyOwogICAgYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7Cn0KCiNBZGRJdGVtTW9kYWwgLkl0ZW1Nb2RhbENvbmZpZ1JvdywKLkRpYWxvZyAuSXRlbU1vZGFsQ29uZmlnUm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDE1cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgojQWRkSXRlbU1vZGFsIC5JdGVtTW9kYWxDb25maWdGaWVsZCwKLkRpYWxvZyAuSXRlbU1vZGFsQ29uZmlnRmllbGQgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMTUwcHg7Cn0KCiNBZGRJdGVtTW9kYWwgLkl0ZW1Nb2RhbENvbmZpZ0ZpZWxkIGxhYmVsLAouRGlhbG9nIC5JdGVtTW9kYWxDb25maWdGaWVsZCBsYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgZm9udC1zaXplOiAxMnB4Owp9CgojQWRkSXRlbU1vZGFsIC5JdGVtTW9kYWxDb25maWdGaWVsZCBpbnB1dCwKLkRpYWxvZyAuSXRlbU1vZGFsQ29uZmlnRmllbGQgaW5wdXQgewogICAgd2lkdGg6IDEwMCU7Cn0KCi8qIExlZ2FjeSBBZGRJdGVtRm9ybSBzdHlsZXMgKGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgKi8KLkFkZEl0ZW1Gb3JtIHsKICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICBwYWRkaW5nLXRvcDogMTBweDsKICAgIGJvcmRlci10b3A6IDFweCBkYXNoZWQgI2RkZDsKfQoKLkFkZEl0ZW1Sb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogNXB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLkFkZEl0ZW1Gb3JtIC5OZXdJdGVtVHlwZSB7CiAgICB3aWR0aDogMTIwcHg7CiAgICBwYWRkaW5nOiA1cHggOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLkFkZEl0ZW1Gb3JtIC5OZXdJdGVtVGl0bGUgewogICAgZmxleDogMTsKICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLkFkZEl0ZW1Gb3JtIGJ1dHRvbiB7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKfQoKLyogVHlwZS1zcGVjaWZpYyBjb25maWcgZm9yIGFkLWhvYyBpdGVtcyAqLwouQWRkSXRlbUZvcm0gLk5ld0l0ZW1Db25maWcgewogICAgbWFyZ2luLXRvcDogOHB4OwogICAgcGFkZGluZzogMTBweDsKICAgIGJhY2tncm91bmQ6ICNmOWY5Zjk7CiAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNmOTI7CiAgICBib3JkZXItcmFkaXVzOiAwIDNweCAzcHggMDsKfQoKLkFkZEl0ZW1Gb3JtIC5OZXdJdGVtQ29uZmlnIGxhYmVsIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6ICM1NTU7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgIG1hcmdpbi10b3A6IDVweDsKfQoKLkFkZEl0ZW1Gb3JtIC5OZXdJdGVtQ29uZmlnIGxhYmVsOmZpcnN0LWNoaWxkIHsKICAgIG1hcmdpbi10b3A6IDA7Cn0KCi5BZGRJdGVtRm9ybSAuTmV3SXRlbUNvbmZpZyBpbnB1dCwKLkFkZEl0ZW1Gb3JtIC5OZXdJdGVtQ29uZmlnIHNlbGVjdCwKLkFkZEl0ZW1Gb3JtIC5OZXdJdGVtQ29uZmlnIHRleHRhcmVhIHsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbWFyZ2luLXJpZ2h0OiAxMHB4Owp9CgouQWRkSXRlbUZvcm0gLk5ld0l0ZW1Db25maWcgaW5wdXRbdHlwZT0ibnVtYmVyIl0gewogICAgd2lkdGg6IDgwcHg7Cn0KCi5BZGRJdGVtRm9ybSAuTmV3SXRlbUNvbmZpZyBpbnB1dFt0eXBlPSJ0ZXh0Il0gewogICAgd2lkdGg6IDEyMHB4Owp9CgouQWRkSXRlbUZvcm0gLk5ld0l0ZW1TdGF0dXNPcHRpb25zIHsKICAgIHdpZHRoOiAxMDAlOwogICAgbWluLWhlaWdodDogNjBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLk5vQ2hlY2tsaXN0cyB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAyMHB4OwogICAgY29sb3I6ICM2NjY7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qIFNpZGViYXIgV2lkZ2V0ICAgICAgICAgICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouV2lkZ2V0Q2hlY2tsaXN0Qm94IHsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICBwYWRkaW5nLWJvdHRvbTogMTBweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOwp9CgouV2lkZ2V0Q2hlY2tsaXN0Qm94Omxhc3Qtb2YtdHlwZSB7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICBwYWRkaW5nLWJvdHRvbTogNXB4OwogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoKLldpZGdldENoZWNrbGlzdEhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgIGdhcDogNXB4Owp9CgouV2lkZ2V0Q2hlY2tsaXN0SGVhZGVyIHN0cm9uZyB7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5XaWRnZXRQcm9ncmVzcyB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogIzY2NjsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwp9CgouV2lkZ2V0UHJvZ3Jlc3MgLnRleHQtd2FybmluZyB7CiAgICBjb2xvcjogI2Y4MDsKfQoKLldpZGdldFByb2dyZXNzIC50ZXh0LXN1Y2Nlc3MgewogICAgY29sb3I6ICM1YTU7Cn0KCi5XaWRnZXRQcm9ncmVzc0JhciB7CiAgICBoZWlnaHQ6IDRweDsKICAgIGJhY2tncm91bmQ6ICNlNWU1ZTU7CiAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgouV2lkZ2V0UHJvZ3Jlc3NGaWxsIHsKICAgIGhlaWdodDogMTAwJTsKICAgIGJhY2tncm91bmQ6ICM1YTU7CiAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzIGVhc2U7Cn0KCi5XaWRnZXRJdGVtTGlzdCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKfQoKLldpZGdldENoZWNrbGlzdEJveCB7CiAgICBtYXgtaGVpZ2h0OiAyODBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87Cn0KCi5XaWRnZXRJdGVtIHsKICAgIHBhZGRpbmc6IDNweCAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDVweDsKfQoKLldpZGdldEl0ZW0uZG9uZSAuV2lkZ2V0SXRlbVRpdGxlIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwogICAgY29sb3I6ICM5OTk7Cn0KCi5XaWRnZXRJdGVtLm5hIC5XaWRnZXRJdGVtVGl0bGUgewogICAgY29sb3I6ICM5OTk7Cn0KCi5XaWRnZXRJdGVtU3RhdGUgewogICAgY29sb3I6ICM5OTk7Cn0KCi5XaWRnZXRJdGVtU3RhdGUgYSB7CiAgICBjb2xvcjogaW5oZXJpdDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLldpZGdldEl0ZW1TdGF0ZSBhOmhvdmVyIHsKICAgIGNvbG9yOiAjZjkyOwp9CgouV2lkZ2V0SXRlbS5kb25lIC5XaWRnZXRJdGVtU3RhdGUgewogICAgY29sb3I6ICM1YTU7Cn0KCi5XaWRnZXRJdGVtLmRvbmUgLldpZGdldEl0ZW1TdGF0ZSBhOmhvdmVyIHsKICAgIGNvbG9yOiAjYzAwOwp9CgouV2lkZ2V0SXRlbS5uYSAuV2lkZ2V0SXRlbVN0YXRlIGE6aG92ZXIgewogICAgY29sb3I6ICNmOTI7Cn0KCi5XaWRnZXRJdGVtVGl0bGUuTWFuZGF0b3J5IC5NYXJrZXIgewogICAgY29sb3I6ICNjMDA7Cn0KCi5XaWRnZXRGb290ZXIgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZy10b3A6IDVweDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWVlOwp9CgouV2lkZ2V0Rm9vdGVyIGEgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6ICM2NjY7Cn0KCi5XaWRnZXRGb290ZXIgYTpob3ZlciB7CiAgICBjb2xvcjogIzMzMzsKfQoKLyogQ29sbGFwc2libGUgY2hlY2tsaXN0IGluIHdpZGdldCAqLwouV2lkZ2V0Q2hlY2tsaXN0VG9nZ2xlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLldpZGdldENoZWNrbGlzdFRvZ2dsZTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTM4LCAzNywgMC4xNSk7Cn0KCi5XaWRnZXRUb2dnbGVJY29uIHsKICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgY29sb3I6ICM5OTk7CiAgICB3aWR0aDogMTJweDsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLyogQnkgZGVmYXVsdCBzaG93IGNhcmV0LWRvd24gKGV4cGFuZGVkKSwgaGlkZSBjYXJldC1yaWdodCAqLwouV2lkZ2V0VG9nZ2xlSWNvbiAuZmEtY2FyZXQtcmlnaHQgewogICAgZGlzcGxheTogbm9uZTsKfQoKLldpZGdldFRvZ2dsZUljb24gLmZhLWNhcmV0LWRvd24gewogICAgZGlzcGxheTogaW5saW5lOwp9CgovKiBDb2xsYXBzZWQgc3RhdGUgKi8KLldpZGdldENoZWNrbGlzdEJveC5Db2xsYXBzZWQgLldpZGdldENoZWNrbGlzdENvbnRlbnQgewogICAgZGlzcGxheTogbm9uZTsKfQoKLldpZGdldENoZWNrbGlzdEJveC5Db2xsYXBzZWQgLldpZGdldFRvZ2dsZUljb24gLmZhLWNhcmV0LXJpZ2h0IHsKICAgIGRpc3BsYXk6IGlubGluZTsKfQoKLldpZGdldENoZWNrbGlzdEJveC5Db2xsYXBzZWQgLldpZGdldFRvZ2dsZUljb24gLmZhLWNhcmV0LWRvd24gewogICAgZGlzcGxheTogbm9uZTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogTWFuYWdlIENoZWNrbGlzdCBCdXR0b24gICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qIEJ1dHRvbiBsaWtlICIrIE5ldWVyIFRlcm1pbiIgc3R5bGUgKi8KLk1hbmFnZUNoZWNrbGlzdEJ0biB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgI2Y5MjsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6ICMzMzM7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLk1hbmFnZUNoZWNrbGlzdEJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjZjkyOwogICAgY29sb3I6ICNmZmY7Cn0KCi5NYW5hZ2VDaGVja2xpc3RCdG4gaSB7CiAgICBtYXJnaW4tcmlnaHQ6IDVweDsKfQoKLyogQ2xpY2thYmxlIGNoZWNrbGlzdCBuYW1lIGluIHdpZGdldCAqLwouV2lkZ2V0Q2hlY2tsaXN0TmFtZSB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogIzMzMzsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGZsZXg6IDE7Cn0KCi5XaWRnZXRDaGVja2xpc3ROYW1lOmhvdmVyIHsKICAgIGNvbG9yOiAjZjkyOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBNYW5hZ2UgTW9kZSBQb3B1cCAgICAgICAgICAgICAgICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLk1hbmFnZUNoZWNrbGlzdFJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDEycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBnYXA6IDE1cHg7Cn0KCi5NYW5hZ2VDaGVja2xpc3RSb3c6bGFzdC1jaGlsZCB7CiAgICBib3JkZXItYm90dG9tOiBub25lOwp9CgouTWFuYWdlQ2hlY2tsaXN0Um93IC5DaGVja2xpc3RJbmZvIHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNHB4Owp9CgouTWFuYWdlQ2hlY2tsaXN0Um93IC5DaGVja2xpc3ROYW1lIHsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjb2xvcjogIzMzMzsKfQoKLk1hbmFnZUNoZWNrbGlzdFJvdyAuQ2hlY2tsaXN0TmFtZSBpIHsKICAgIG1hcmdpbi1yaWdodDogOHB4OwogICAgY29sb3I6ICNmOTI7Cn0KCi5NYW5hZ2VDaGVja2xpc3RSb3cgLkNoZWNrbGlzdE5hbWUgLlByb2dyZXNzIHsKICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICBjb2xvcjogIzY2NjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG1hcmdpbi1sZWZ0OiA1cHg7Cn0KCi5NYW5hZ2VDaGVja2xpc3RSb3cgLkNoZWNrbGlzdERlc2NyaXB0aW9uIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiAjNjY2OwogICAgcGFkZGluZy1sZWZ0OiAyNHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLk1hbmFnZUNoZWNrbGlzdFJvdyAuUmVtb3ZlQ2hlY2tsaXN0IHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBjb2xvcjogIzg4ODsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICBmbGV4LXNocmluazogMDsKfQoKLk1hbmFnZUNoZWNrbGlzdFJvdyAuUmVtb3ZlQ2hlY2tsaXN0OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNmOTI7CiAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50Owp9CgouTWFuYWdlQ2hlY2tsaXN0Um93IC5SZW1vdmVDaGVja2xpc3Q6aG92ZXIgaSB7CiAgICBjb2xvcjogI2ZmZiAhaW1wb3J0YW50Owp9CgouTm9DaGVja2xpc3RzTWFuYWdlIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICBjb2xvcjogIzY2NjsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogQWRkSXRlbSBQYWdlIFN0eWxlcyAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi5JdGVtVHlwZUNvbmZpZyB7CiAgICBtYXJnaW46IDE1cHggMDsKICAgIHBhZGRpbmc6IDE1cHg7CiAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwogICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZjkyOwogICAgYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7Cn0KCi5JdGVtVHlwZUNvbmZpZy5IaWRkZW4gewogICAgZGlzcGxheTogbm9uZTsKfQoKLkl0ZW1UeXBlQ29uZmlnIGxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgbWFyZ2luLWJvdHRvbTogNXB4Owp9CgouSXRlbVR5cGVDb25maWcgbGFiZWw6Zmlyc3QtY2hpbGQgewogICAgbWFyZ2luLXRvcDogMDsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogQWRkIEl0ZW0gU2VjdGlvbiAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi5BZGRJdGVtU2VjdGlvbiB7CiAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgcGFkZGluZy10b3A6IDE1cHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2U4ZThlODsKfQoKLyogR2hvc3QgQnV0dG9uIChPcmFuZ2UgT3V0bGluZSkgLSBSZXVzYWJsZSAqLwouQ2FsbEZvckFjdGlvbi5HaG9zdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGhlaWdodDogMzhweDsKICAgIHBhZGRpbmc6IDAgMTZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNmOTI7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiAjMzMzOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKLkNhbGxGb3JBY3Rpb24uR2hvc3Q6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Y5MjsKICAgIGNvbG9yOiAjZmZmOwp9CgouQ2FsbEZvckFjdGlvbi5HaG9zdCBzcGFuIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA1cHg7Cn0KCi5DYWxsRm9yQWN0aW9uLkdob3N0IGkgewogICAgZm9udC1zaXplOiAxMnB4Owp9CgouQ2FsbEZvckFjdGlvbi5HaG9zdDpob3ZlciBpIHsKICAgIGNvbG9yOiAjZmZmOwp9Cg==</File>

        <!-- Unit tests -->
        <File Permission="660" Location="scripts/test/Checklist/ChecklistTemplate.t" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKbXkgJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdFRlbXBsYXRlJyk7Cm15ICRDaGVja2xpc3RPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0Jyk7Cm15ICRUaWNrZXRPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgpteSAkUmFuZG9tSUQgPSAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQYXJ0IDE6IFRlbXBsYXRlQWRkIC8gVGVtcGxhdGVHZXQKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCm15ICRUZW1wbGF0ZUlEMSA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICBOYW1lICAgICAgICA9PiAiU2VydmVyIE1haW50ZW5hbmNlICRSYW5kb21JRCIsCiAgICBEZXNjcmlwdGlvbiA9PiAnQ2hlY2tsaXN0IGZvciBzZXJ2ZXIgbWFpbnRlbmFuY2UgdGFza3MnLAogICAgTGlua1VSTCAgICAgPT4gJ2h0dHBzOi8vZG9jcy5leGFtcGxlLmNvbS9tYWludGVuYW5jZScsCiAgICBMaW5rVGV4dCAgICA9PiAnRG9jdW1lbnRhdGlvbicsCiAgICBWYWxpZElEICAgICA9PiAxLAogICAgVXNlcklEICAgICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFRlbXBsYXRlSUQxLAogICAgJ1RlbXBsYXRlQWRkKCk6IGNyZWF0ZXMgYSB0ZW1wbGF0ZSB3aXRoIGFsbCBmaWVsZHMgLSBJRDogJyAuICggJFRlbXBsYXRlSUQxIHx8ICdGQUlMRUQnICksCik7CgpteSAlVGVtcGxhdGUxID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUdldCggSUQgPT4gJFRlbXBsYXRlSUQxICk7CgokU2VsZi0+SXMoCiAgICAkVGVtcGxhdGUxe05hbWV9LAogICAgIlNlcnZlciBNYWludGVuYW5jZSAkUmFuZG9tSUQiLAogICAgJ1RlbXBsYXRlR2V0KCk6IE5hbWUgbWF0Y2hlcyB3aGF0IHdhcyBhZGRlZCcsCik7CgokU2VsZi0+SXMoCiAgICAkVGVtcGxhdGUxe0xpbmtVUkx9LAogICAgJ2h0dHBzOi8vZG9jcy5leGFtcGxlLmNvbS9tYWludGVuYW5jZScsCiAgICAnVGVtcGxhdGVHZXQoKTogTGlua1VSTCBtYXRjaGVzIHdoYXQgd2FzIGFkZGVkJywKKTsKCiRTZWxmLT5JcygKICAgICRUZW1wbGF0ZTF7VmFsaWRJRH0sCiAgICAxLAogICAgJ1RlbXBsYXRlR2V0KCk6IFZhbGlkSUQgbWF0Y2hlcyB3aGF0IHdhcyBhZGRlZCcsCik7CgpteSAlTWlzc2luZ1RlbXBsYXRlID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUdldCggSUQgPT4gOTk5OTk5OTk5ICk7CgokU2VsZi0+RmFsc2UoCiAgICBzY2FsYXIgJU1pc3NpbmdUZW1wbGF0ZSwKICAgICdUZW1wbGF0ZUdldCgpOiBub24tZXhpc3RlbnQgSUQgcmV0dXJucyBlbXB0eSBsaXN0JywKKTsKCiMgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIKbXkgJE5vTmFtZUlEID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiRTZWxmLT5GYWxzZSgKICAgICROb05hbWVJRCwKICAgICdUZW1wbGF0ZUFkZCgpOiBtaXNzaW5nIHJlcXVpcmVkIE5hbWUgZmFpbHMnLAopOwoKIyBEdXBsaWNhdGUgbmFtZSBpcyByZWplY3RlZApteSAkRHVwbGljYXRlSUQgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlQWRkKAogICAgTmFtZSAgICA9PiAiU2VydmVyIE1haW50ZW5hbmNlICRSYW5kb21JRCIsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgokU2VsZi0+RmFsc2UoCiAgICAkRHVwbGljYXRlSUQsCiAgICAnVGVtcGxhdGVBZGQoKTogZHVwbGljYXRlIE5hbWUgaXMgcmVqZWN0ZWQnLAopOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQYXJ0IDI6IFRlbXBsYXRlVXBkYXRlCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpteSAkVGVtcGxhdGVJRDIgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlQWRkKAogICAgTmFtZSAgICA9PiAiTmV0d29yayBDaGVjayAkUmFuZG9tSUQiLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkVGVtcGxhdGVJRDIsCiAgICAnVGVtcGxhdGVBZGQoKTogc2Vjb25kIHRlbXBsYXRlIGNyZWF0ZWQgZm9yIFRlbXBsYXRlVXBkYXRlKCkgdGVzdHMnLAopOwoKbXkgJFVwZGF0ZVN1Y2Nlc3MgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlVXBkYXRlKAogICAgSUQgICAgICA9PiAkVGVtcGxhdGVJRDIsCiAgICBOYW1lICAgID0+ICJOZXR3b3JrIENoZWNrIFVwZGF0ZWQgJFJhbmRvbUlEIiwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFVwZGF0ZVN1Y2Nlc3MsCiAgICAnVGVtcGxhdGVVcGRhdGUoKTogdXBkYXRlIHN1Y2NlZWRzJywKKTsKCm15ICVUZW1wbGF0ZTJVcGRhdGVkID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUdldCggSUQgPT4gJFRlbXBsYXRlSUQyICk7CgokU2VsZi0+SXMoCiAgICAkVGVtcGxhdGUyVXBkYXRlZHtOYW1lfSwKICAgICJOZXR3b3JrIENoZWNrIFVwZGF0ZWQgJFJhbmRvbUlEIiwKICAgICdUZW1wbGF0ZVVwZGF0ZSgpOiBOYW1lIHdhcyBhY3R1YWxseSBjaGFuZ2VkJywKKTsKCiMgUmVuYW1pbmcgdG8gYSBuYW1lIGFscmVhZHkgdXNlZCBieSBhbm90aGVyIHRlbXBsYXRlIGlzIHJlamVjdGVkCm15ICRVcGRhdGVDb25mbGljdCA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVVcGRhdGUoCiAgICBJRCAgICAgID0+ICRUZW1wbGF0ZUlEMiwKICAgIE5hbWUgICAgPT4gIlNlcnZlciBNYWludGVuYW5jZSAkUmFuZG9tSUQiLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJFVwZGF0ZUNvbmZsaWN0LAogICAgJ1RlbXBsYXRlVXBkYXRlKCk6IHJlbmFtaW5nIHRvIGFuIGV4aXN0aW5nIHRlbXBsYXRlIG5hbWUgaXMgcmVqZWN0ZWQnLAopOwoKIyBVcGRhdGluZyBhIHRlbXBsYXRlIHRvIGtlZXAgaXRzIG93biBjdXJyZW50IG5hbWUgbXVzdCBzdGlsbCBzdWNjZWVkCiMgKHRoaXMgaXMgdGhlIHNhbWUgbmFtZSwgc2FtZSBJRCAtIG5vdCBhIGNvbmZsaWN0IHdpdGggaXRzZWxmKS4KbXkgJFVwZGF0ZVNhbWVOYW1lID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVVwZGF0ZSgKICAgIElEICAgICAgPT4gJFRlbXBsYXRlSUQyLAogICAgTmFtZSAgICA9PiAiTmV0d29yayBDaGVjayBVcGRhdGVkICRSYW5kb21JRCIsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRVcGRhdGVTYW1lTmFtZSwKICAgICdUZW1wbGF0ZVVwZGF0ZSgpOiBrZWVwaW5nIHRoZSB0ZW1wbGF0ZVwncyBvd24gY3VycmVudCBuYW1lIHN1Y2NlZWRzJywKKTsKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCAzOiBUZW1wbGF0ZUxvb2t1cCAvIFRlbXBsYXRlTGlzdAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKJFNlbGYtPklzKAogICAgJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxvb2t1cCggTmFtZSA9PiAiU2VydmVyIE1haW50ZW5hbmNlICRSYW5kb21JRCIgKSwKICAgICRUZW1wbGF0ZUlEMSwKICAgICdUZW1wbGF0ZUxvb2t1cCgpOiBieSBOYW1lIHJldHVybnMgdGhlIGNvcnJlY3QgSUQnLAopOwoKJFNlbGYtPklzKAogICAgJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUxvb2t1cCggSUQgPT4gJFRlbXBsYXRlSUQxICksCiAgICAiU2VydmVyIE1haW50ZW5hbmNlICRSYW5kb21JRCIsCiAgICAnVGVtcGxhdGVMb29rdXAoKTogYnkgSUQgcmV0dXJucyB0aGUgY29ycmVjdCBOYW1lJywKKTsKCm15ICVUZW1wbGF0ZUxpc3QgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlTGlzdCggVmFsaWRJRCA9PiAxICk7CgokU2VsZi0+VHJ1ZSgKICAgICggZXhpc3RzICRUZW1wbGF0ZUxpc3R7JFRlbXBsYXRlSUQxfSAmJiBleGlzdHMgJFRlbXBsYXRlTGlzdHskVGVtcGxhdGVJRDJ9ICksCiAgICAnVGVtcGxhdGVMaXN0KCk6IGJvdGggdGVzdCB0ZW1wbGF0ZXMgYXBwZWFyIHdoZW4gZmlsdGVyaW5nIGJ5IFZhbGlkSUQgPT4gMScsCik7CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBhcnQgNDogVGVtcGxhdGVJdGVtQWRkIC8gVGVtcGxhdGVJdGVtR2V0IC8gVGVtcGxhdGVJdGVtTGlzdAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKbXkgJEl0ZW1JRDEgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlSXRlbUFkZCgKICAgIFRlbXBsYXRlSUQgID0+ICRUZW1wbGF0ZUlEMSwKICAgIEl0ZW1UeXBlICAgID0+ICdjaGVja2JveCcsCiAgICBUaXRsZSAgICAgICA9PiAnQ2hlY2sgc2VydmVyIGxvZ3MnLAogICAgRGVzY3JpcHRpb24gPT4gJ1JldmlldyBsb2dzIGZvciBlcnJvcnMnLAogICAgSXNNYW5kYXRvcnkgPT4gMSwKICAgIFVzZXJJRCAgICAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRJdGVtSUQxLAogICAgJ1RlbXBsYXRlSXRlbUFkZCgpOiBtYW5kYXRvcnkgY2hlY2tib3ggaXRlbSBjcmVhdGVkIC0gSUQ6ICcgLiAoICRJdGVtSUQxIHx8ICdGQUlMRUQnICksCik7CgpteSAkSXRlbUlEMiA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtQWRkKAogICAgVGVtcGxhdGVJRCAgPT4gJFRlbXBsYXRlSUQxLAogICAgSXRlbVR5cGUgICAgPT4gJ3ZhbHVlJywKICAgIFRpdGxlICAgICAgID0+ICdSZWNvcmQgdGVtcGVyYXR1cmUnLAogICAgQ29uZmlnICAgICAgPT4geyB1bml0ID0+ICfCsEMnIH0sCiAgICBJc01hbmRhdG9yeSA9PiAwLAogICAgVXNlcklEICAgICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJEl0ZW1JRDIsCiAgICAnVGVtcGxhdGVJdGVtQWRkKCk6IG9wdGlvbmFsIHZhbHVlIGl0ZW0gY3JlYXRlZCAtIElEOiAnIC4gKCAkSXRlbUlEMiB8fCAnRkFJTEVEJyApLAopOwoKbXkgJUl0ZW0xID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1HZXQoIElEID0+ICRJdGVtSUQxICk7CgokU2VsZi0+SXMoCiAgICAkSXRlbTF7VGl0bGV9LAogICAgJ0NoZWNrIHNlcnZlciBsb2dzJywKICAgICdUZW1wbGF0ZUl0ZW1HZXQoKTogVGl0bGUgbWF0Y2hlcyB3aGF0IHdhcyBhZGRlZCcsCik7CgokU2VsZi0+SXMoCiAgICAkSXRlbTF7SXNNYW5kYXRvcnl9LAogICAgMSwKICAgICdUZW1wbGF0ZUl0ZW1HZXQoKTogSXNNYW5kYXRvcnkgbWF0Y2hlcyB3aGF0IHdhcyBhZGRlZCcsCik7CgpteSAlSXRlbTIgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlSXRlbUdldCggSUQgPT4gJEl0ZW1JRDIgKTsKCiRTZWxmLT5JcygKICAgICRJdGVtMntDb25maWd9e3VuaXR9LAogICAgJ8KwQycsCiAgICAnVGVtcGxhdGVJdGVtR2V0KCk6IENvbmZpZyBoYXNocmVmIGlzIHJvdW5kLXRyaXBwZWQgdGhyb3VnaCBKU09OIGNvcnJlY3RseScsCik7CgojIEludmFsaWQgaXRlbSB0eXBlIGlzIHJlamVjdGVkCm15ICRJbnZhbGlkVHlwZUlEID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1BZGQoCiAgICBUZW1wbGF0ZUlEICA9PiAkVGVtcGxhdGVJRDEsCiAgICBJdGVtVHlwZSAgICA9PiAnbm90LWEtcmVhbC10eXBlJywKICAgIFRpdGxlICAgICAgID0+ICdCb2d1cyBpdGVtJywKICAgIElzTWFuZGF0b3J5ID0+IDAsCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJEludmFsaWRUeXBlSUQsCiAgICAnVGVtcGxhdGVJdGVtQWRkKCk6IGludmFsaWQgSXRlbVR5cGUgaXMgcmVqZWN0ZWQnLAopOwoKbXkgQEl0ZW1zID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1MaXN0KCBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEMSApOwoKJFNlbGYtPklzKAogICAgc2NhbGFyIEBJdGVtcywKICAgIDIsCiAgICAnVGVtcGxhdGVJdGVtTGlzdCgpOiByZXR1cm5zIGV4YWN0bHkgdGhlIDIgdmFsaWQgaXRlbXMgYWRkZWQgKGludmFsaWQtdHlwZSBhZGQgZGlkIG5vdCBwZXJzaXN0KScsCik7CgokU2VsZi0+VHJ1ZSgKICAgICggJEl0ZW1zWzBde1NvcnRPcmRlcn0gPCAkSXRlbXNbMV17U29ydE9yZGVyfSApLAogICAgJ1RlbXBsYXRlSXRlbUxpc3QoKTogaXRlbXMgYXJlIG9yZGVyZWQgYnkgU29ydE9yZGVyIGFzY2VuZGluZycsCik7CgojIFRlbXBsYXRlSXRlbVVwZGF0ZSAvIFRlbXBsYXRlSXRlbURlbGV0ZQpteSAkSXRlbVVwZGF0ZVN1Y2Nlc3MgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlSXRlbVVwZGF0ZSgKICAgIElEICAgICAgICAgID0+ICRJdGVtSUQyLAogICAgSXRlbVR5cGUgICAgPT4gJ3ZhbHVlJywKICAgIFRpdGxlICAgICAgID0+ICdSZWNvcmQgdGVtcGVyYXR1cmUgKHVwZGF0ZWQpJywKICAgIElzTWFuZGF0b3J5ID0+IDEsCiAgICBTb3J0T3JkZXIgICA9PiAkSXRlbTJ7U29ydE9yZGVyfSwKICAgIFVzZXJJRCAgICAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRJdGVtVXBkYXRlU3VjY2VzcywKICAgICdUZW1wbGF0ZUl0ZW1VcGRhdGUoKTogdXBkYXRlIHN1Y2NlZWRzJywKKTsKCm15ICVJdGVtMlVwZGF0ZWQgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlSXRlbUdldCggSUQgPT4gJEl0ZW1JRDIgKTsKCiRTZWxmLT5JcygKICAgICRJdGVtMlVwZGF0ZWR7VGl0bGV9LAogICAgJ1JlY29yZCB0ZW1wZXJhdHVyZSAodXBkYXRlZCknLAogICAgJ1RlbXBsYXRlSXRlbVVwZGF0ZSgpOiBUaXRsZSB3YXMgYWN0dWFsbHkgY2hhbmdlZCcsCik7CgokU2VsZi0+SXMoCiAgICAkSXRlbTJVcGRhdGVke0lzTWFuZGF0b3J5fSwKICAgIDEsCiAgICAnVGVtcGxhdGVJdGVtVXBkYXRlKCk6IElzTWFuZGF0b3J5IHdhcyBhY3R1YWxseSBjaGFuZ2VkJywKKTsKCm15ICRJdGVtRGVsZXRlU3VjY2VzcyA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtRGVsZXRlKAogICAgSUQgICAgID0+ICRJdGVtSUQyLAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRJdGVtRGVsZXRlU3VjY2VzcywKICAgICdUZW1wbGF0ZUl0ZW1EZWxldGUoKTogZGVsZXRlIHN1Y2NlZWRzJywKKTsKCm15IEBJdGVtc0FmdGVyRGVsZXRlID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1MaXN0KCBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEMSApOwoKJFNlbGYtPklzKAogICAgc2NhbGFyIEBJdGVtc0FmdGVyRGVsZXRlLAogICAgMSwKICAgICdUZW1wbGF0ZUl0ZW1MaXN0KCk6IG9ubHkgMSBpdGVtIHJlbWFpbnMgYWZ0ZXIgVGVtcGxhdGVJdGVtRGVsZXRlKCknLAopOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQYXJ0IDU6IFRlbXBsYXRlVXNhZ2VDb3VudCAvIFRlbXBsYXRlRGVsZXRlCiMKIyBUZW1wbGF0ZURlbGV0ZSgpIG11c3QgcmVmdXNlIHRvIGRlbGV0ZSAoYW5kIHRvdWNoIG5vdGhpbmcpIHdoaWxlIHRoZQojIHRlbXBsYXRlIGlzIHN0aWxsIGF0dGFjaGVkIHRvIGEgdGlja2V0IHZpYSB0aWNrZXRfY2hlY2tsaXN0IC0gdGhlIERCCiMgc2NoZW1hIGVuZm9yY2VzIHRoaXMgd2l0aCBhIHJlYWwgRksgKFJFU1RSSUNULCBubyBDQVNDQURFKSwgYW5kCiMgVGVtcGxhdGVEZWxldGUoKSBjaGVja3MgVGVtcGxhdGVVc2FnZUNvdW50KCkgZmlyc3Qgc28gaXQgZmFpbHMgY2xlYW5seQojIGluc3RlYWQgb2YgcGFydGlhbGx5IGRlbGV0aW5nIGl0ZW1zL3F1ZXVlLWFzc2lnbm1lbnRzIGJlZm9yZSBoaXR0aW5nCiMgdGhhdCBGSyB3YWxsLgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKbXkgJFRlbXBsYXRlSUQzID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgIE5hbWUgICAgPT4gIlVudXNlZCBUZW1wbGF0ZSAkUmFuZG9tSUQiLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPklzKAogICAgJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVVzYWdlQ291bnQoIElEID0+ICRUZW1wbGF0ZUlEMyApLAogICAgMCwKICAgICdUZW1wbGF0ZVVzYWdlQ291bnQoKTogYSBmcmVzaCwgdW51c2VkIHRlbXBsYXRlIHJlcG9ydHMgMCcsCik7CgojIEEgdGVtcGxhdGUgbm90IGF0dGFjaGVkIHRvIGFueSB0aWNrZXQgbXVzdCBkZWxldGUgY2xlYW5seS4KbXkgJERlbGV0ZVVudXNlZFN1Y2Nlc3MgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlRGVsZXRlKAogICAgSUQgICAgID0+ICRUZW1wbGF0ZUlEMywKICAgIFVzZXJJRCA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkRGVsZXRlVW51c2VkU3VjY2VzcywKICAgICdUZW1wbGF0ZURlbGV0ZSgpOiBzdWNjZWVkcyBmb3IgYSB0ZW1wbGF0ZSB0aGF0IGlzIG5vdCBpbiB1c2UnLAopOwoKbXkgJURlbGV0ZWRUZW1wbGF0ZSA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVHZXQoIElEID0+ICRUZW1wbGF0ZUlEMyApOwoKJFNlbGYtPkZhbHNlKAogICAgc2NhbGFyICVEZWxldGVkVGVtcGxhdGUsCiAgICAnVGVtcGxhdGVEZWxldGUoKTogdGVtcGxhdGUgaXMgYWN0dWFsbHkgZ29uZSBhZnRlciBhIHN1Y2Nlc3NmdWwgZGVsZXRlJywKKTsKCiMgTm93IGF0dGFjaCBhIHRlbXBsYXRlIHRvIGEgcmVhbCB0aWNrZXQgdmlhIENoZWNrbGlzdEFkZCgpIGFuZCBjb25maXJtCiMgVGVtcGxhdGVEZWxldGUoKSByZWZ1c2VzLgpteSAkVGVtcGxhdGVJRDQgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlQWRkKAogICAgTmFtZSAgICA9PiAiSW4tVXNlIFRlbXBsYXRlICRSYW5kb21JRCIsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgokQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlSXRlbUFkZCgKICAgIFRlbXBsYXRlSUQgID0+ICRUZW1wbGF0ZUlENCwKICAgIFRpdGxlICAgICAgID0+ICdNYW5kYXRvcnkgc3RlcCcsCiAgICBJc01hbmRhdG9yeSA9PiAxLAogICAgVXNlcklEICAgICAgPT4gMSwKKTsKCm15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgIFRpdGxlICAgICAgICA9PiAiQ2hlY2tsaXN0VGVtcGxhdGUgdGVzdCB0aWNrZXQgJFJhbmRvbUlEIiwKICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgIFByaW9yaXR5ICAgICA9PiAnMyBub3JtYWwnLAogICAgU3RhdGUgICAgICAgID0+ICduZXcnLAogICAgQ3VzdG9tZXJJRCAgID0+ICd1bml0dGVzdCcsCiAgICBDdXN0b21lclVzZXIgPT4gJ3VuaXR0ZXN0QGxvY2FsaG9zdCcsCiAgICBPd25lcklEICAgICAgPT4gMSwKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkVGlja2V0SUQsCiAgICAiVGlja2V0Q3JlYXRlKCk6IHRlc3QgdGlja2V0IGNyZWF0ZWQgLSBJRDogJFRpY2tldElEIiwKKTsKCm15ICRDaGVja2xpc3RJRCA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdEFkZCgKICAgIFRpY2tldElEICAgPT4gJFRpY2tldElELAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRDQsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRDaGVja2xpc3RJRCwKICAgICJDaGVja2xpc3RBZGQoKTogY2hlY2tsaXN0IGNyZWF0ZWQgZnJvbSB0ZW1wbGF0ZSAtIElEOiAkQ2hlY2tsaXN0SUQiLAopOwoKJFNlbGYtPklzKAogICAgJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVVzYWdlQ291bnQoIElEID0+ICRUZW1wbGF0ZUlENCApLAogICAgMSwKICAgICdUZW1wbGF0ZVVzYWdlQ291bnQoKTogcmVwb3J0cyAxIG9uY2UgYSB0aWNrZXQgaGFzIGEgY2hlY2tsaXN0IGZyb20gdGhpcyB0ZW1wbGF0ZScsCik7CgpteSAkRGVsZXRlSW5Vc2VSZXN1bHQgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlRGVsZXRlKAogICAgSUQgICAgID0+ICRUZW1wbGF0ZUlENCwKICAgIFVzZXJJRCA9PiAxLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJERlbGV0ZUluVXNlUmVzdWx0LAogICAgJ1RlbXBsYXRlRGVsZXRlKCk6IHJlZnVzZXMgdG8gZGVsZXRlIGEgdGVtcGxhdGUgdGhhdCBpcyBzdGlsbCBpbiB1c2UnLAopOwoKbXkgJVN0aWxsVGhlcmVUZW1wbGF0ZSA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVHZXQoIElEID0+ICRUZW1wbGF0ZUlENCApOwoKJFNlbGYtPlRydWUoCiAgICAoIHNjYWxhciAlU3RpbGxUaGVyZVRlbXBsYXRlID8gMSA6IDAgKSwKICAgICdUZW1wbGF0ZURlbGV0ZSgpOiB0ZW1wbGF0ZSBpdHNlbGYgaXMgdW50b3VjaGVkIGFmdGVyIGEgcmVmdXNlZCBkZWxldGUnLAopOwoKbXkgQFN0aWxsVGhlcmVJdGVtcyA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtTGlzdCggVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRDQgKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBAU3RpbGxUaGVyZUl0ZW1zLAogICAgMSwKICAgICdUZW1wbGF0ZURlbGV0ZSgpOiB0ZW1wbGF0ZSBpdGVtcyBhcmUgdW50b3VjaGVkIGFmdGVyIGEgcmVmdXNlZCBkZWxldGUgKG5vIHBhcnRpYWwgZGVsZXRlKScsCik7CgojIE9uY2UgdGhlIGNoZWNrbGlzdCBpcyByZW1vdmVkIGZyb20gdGhlIHRpY2tldCwgdGhlIHRlbXBsYXRlIGlzIGZyZWUKIyBhZ2FpbiBhbmQgVGVtcGxhdGVEZWxldGUoKSBtdXN0IG5vdyBzdWNjZWVkLgokQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3REZWxldGUoCiAgICBJRCAgICAgICA9PiAkQ2hlY2tsaXN0SUQsCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBVc2VySUQgICA9PiAxLAopOwoKJFNlbGYtPklzKAogICAgJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVVzYWdlQ291bnQoIElEID0+ICRUZW1wbGF0ZUlENCApLAogICAgMCwKICAgICdUZW1wbGF0ZVVzYWdlQ291bnQoKTogYmFjayB0byAwIGFmdGVyIHRoZSB0aWNrZXRcJ3MgY2hlY2tsaXN0IGlzIHJlbW92ZWQnLAopOwoKbXkgJERlbGV0ZU5vd0ZyZWVSZXN1bHQgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlRGVsZXRlKAogICAgSUQgICAgID0+ICRUZW1wbGF0ZUlENCwKICAgIFVzZXJJRCA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkRGVsZXRlTm93RnJlZVJlc3VsdCwKICAgICdUZW1wbGF0ZURlbGV0ZSgpOiBzdWNjZWVkcyBvbmNlIHRoZSB0ZW1wbGF0ZSBpcyBubyBsb25nZXIgaW4gdXNlJywKKTsKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCA2OiBUZW1wbGF0ZVF1ZXVlQWRkIC8gVGVtcGxhdGVRdWV1ZUxpc3QgLyBUZW1wbGF0ZVF1ZXVlUmVtb3ZlIC8gVGVtcGxhdGVRdWV1ZVNldAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKbXkgJFF1ZXVlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7Cm15ICRSYXdRdWV1ZUlEICA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICdSYXcnICk7CgokU2VsZi0+VHJ1ZSgKICAgICRSYXdRdWV1ZUlELAogICAgJ1F1ZXVlTG9va3VwKCk6IHRoZSBzdGFuZGFyZCAiUmF3IiBxdWV1ZSBleGlzdHMgaW4gdGhpcyB0ZXN0IHN5c3RlbScsCik7CgpteSAkUXVldWVBZGRTdWNjZXNzID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVF1ZXVlQWRkKAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRDEsCiAgICBRdWV1ZUlEICAgID0+ICRSYXdRdWV1ZUlELAogICAgVXNlcklEICAgICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkUXVldWVBZGRTdWNjZXNzLAogICAgJ1RlbXBsYXRlUXVldWVBZGQoKTogYXNzaWducyB0aGUgdGVtcGxhdGUgdG8gYSBxdWV1ZScsCik7CgojIEFkZGluZyB0aGUgc2FtZSBhc3NpZ25tZW50IGFnYWluIG11c3Qgbm90IGVycm9yIG9yIGR1cGxpY2F0ZS4KbXkgJFF1ZXVlQWRkQWdhaW5TdWNjZXNzID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVF1ZXVlQWRkKAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRDEsCiAgICBRdWV1ZUlEICAgID0+ICRSYXdRdWV1ZUlELAogICAgVXNlcklEICAgICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkUXVldWVBZGRBZ2FpblN1Y2Nlc3MsCiAgICAnVGVtcGxhdGVRdWV1ZUFkZCgpOiByZS1hc3NpZ25pbmcgdGhlIHNhbWUgcXVldWUgaXMgYSBoYXJtbGVzcyBuby1vcCcsCik7CgpteSBAUXVldWVJRHMgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlUXVldWVMaXN0KCBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEMSApOwoKJFNlbGYtPklzKAogICAgc2NhbGFyIEBRdWV1ZUlEcywKICAgIDEsCiAgICAnVGVtcGxhdGVRdWV1ZUxpc3QoKTogZXhhY3RseSAxIHF1ZXVlIGFzc2lnbm1lbnQgZXhpc3RzIChubyBkdXBsaWNhdGUgZnJvbSB0aGUgcmUtYWRkKScsCik7CgpteSAkUXVldWVSZW1vdmVTdWNjZXNzID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZVF1ZXVlUmVtb3ZlKAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRDEsCiAgICBRdWV1ZUlEICAgID0+ICRSYXdRdWV1ZUlELAopOwoKJFNlbGYtPlRydWUoCiAgICAkUXVldWVSZW1vdmVTdWNjZXNzLAogICAgJ1RlbXBsYXRlUXVldWVSZW1vdmUoKTogcmVtb3ZlcyB0aGUgcXVldWUgYXNzaWdubWVudCcsCik7CgpteSBAUXVldWVJRHNBZnRlclJlbW92ZSA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVRdWV1ZUxpc3QoIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQxICk7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQFF1ZXVlSURzQWZ0ZXJSZW1vdmUsCiAgICAwLAogICAgJ1RlbXBsYXRlUXVldWVMaXN0KCk6IG5vIHF1ZXVlIGFzc2lnbm1lbnRzIHJlbWFpbiBhZnRlciBUZW1wbGF0ZVF1ZXVlUmVtb3ZlKCknLAopOwoKbXkgJFF1ZXVlU2V0U3VjY2VzcyA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVRdWV1ZVNldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQxLAogICAgUXVldWVJRHMgICA9PiBbJFJhd1F1ZXVlSURdLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkUXVldWVTZXRTdWNjZXNzLAogICAgJ1RlbXBsYXRlUXVldWVTZXQoKTogcmVwbGFjZXMgcXVldWUgYXNzaWdubWVudHMnLAopOwoKbXkgQFF1ZXVlSURzQWZ0ZXJTZXQgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlUXVldWVMaXN0KCBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEMSApOwoKJFNlbGYtPklzKAogICAgc2NhbGFyIEBRdWV1ZUlEc0FmdGVyU2V0LAogICAgMSwKICAgICdUZW1wbGF0ZVF1ZXVlU2V0KCk6IGV4YWN0bHkgMSBxdWV1ZSBhc3NpZ25tZW50IGV4aXN0cyBhZnRlciBzZXQnLAopOwoKMTsK</File>
        <File Permission="660" Location="scripts/test/Checklist/Checklist.t" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7Cm15ICRDaGVja2xpc3RPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrbGlzdCcpOwpteSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0VGVtcGxhdGUnKTsKbXkgJFRpY2tldE9iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgpteSAkUmFuZG9tSUQgPSAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpOwoKc3ViIF9DcmVhdGVUZXN0VGlja2V0IHsKICAgIG15ICglUGFyYW0pID0gQF87CgogICAgcmV0dXJuICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICBUaXRsZSAgICAgICAgPT4gIkNoZWNrbGlzdC5wbSB0ZXN0IHRpY2tldCAkUmFuZG9tSUQgIiAuICggJFBhcmFte1N1ZmZpeH0gLy8gJycgKSwKICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgIFByaW9yaXR5ICAgICA9PiAnMyBub3JtYWwnLAogICAgICAgIFN0YXRlICAgICAgICA9PiAnbmV3JywKICAgICAgICBDdXN0b21lcklEICAgPT4gJ3VuaXR0ZXN0JywKICAgICAgICBDdXN0b21lclVzZXIgPT4gJ3VuaXR0ZXN0QGxvY2FsaG9zdCcsCiAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwp9CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBhcnQgMTogQ2hlY2tsaXN0QWRkKCkgY29waWVzIHRlbXBsYXRlIGl0ZW1zIG9udG8gdGhlIHRpY2tldCBjaGVja2xpc3QKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCm15ICRUZW1wbGF0ZUlEID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgIE5hbWUgICAgPT4gIlByb2dyZXNzIFRlc3QgVGVtcGxhdGUgJFJhbmRvbUlEIiwKICAgIFZhbGlkSUQgPT4gMSwKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtQWRkKAogICAgVGVtcGxhdGVJRCAgPT4gJFRlbXBsYXRlSUQsCiAgICBUaXRsZSAgICAgICA9PiAnTWFuZGF0b3J5IGl0ZW0gQScsCiAgICBJc01hbmRhdG9yeSA9PiAxLAogICAgVXNlcklEICAgICAgPT4gMSwKKTsKCiRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVJdGVtQWRkKAogICAgVGVtcGxhdGVJRCAgPT4gJFRlbXBsYXRlSUQsCiAgICBUaXRsZSAgICAgICA9PiAnT3B0aW9uYWwgaXRlbSBCJywKICAgIElzTWFuZGF0b3J5ID0+IDAsCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKbXkgJFRpY2tldElEMSA9IF9DcmVhdGVUZXN0VGlja2V0KCBTdWZmaXggPT4gJ0EnICk7CgokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRDEsCiAgICAiVGlja2V0Q3JlYXRlKCk6IHRlc3QgdGlja2V0IDEgY3JlYXRlZCAtIElEOiAkVGlja2V0SUQxIiwKKTsKCm15ICRDaGVja2xpc3RJRDEgPSAkQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3RBZGQoCiAgICBUaWNrZXRJRCAgID0+ICRUaWNrZXRJRDEsCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgVXNlcklEICAgICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkQ2hlY2tsaXN0SUQxLAogICAgIkNoZWNrbGlzdEFkZCgpOiBjaGVja2xpc3QgY3JlYXRlZCBmcm9tIHRlbXBsYXRlIC0gSUQ6ICRDaGVja2xpc3RJRDEiLAopOwoKbXkgQENvcGllZEl0ZW1zID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbUxpc3QoIENoZWNrbGlzdElEID0+ICRDaGVja2xpc3RJRDEgKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBAQ29waWVkSXRlbXMsCiAgICAyLAogICAgJ0NoZWNrbGlzdEFkZCgpOiBib3RoIHRlbXBsYXRlIGl0ZW1zIHdlcmUgY29waWVkIG9udG8gdGhlIHRpY2tldCBjaGVja2xpc3QnLAopOwoKbXkgKCRNYW5kYXRvcnlDb3BpZWQpID0gZ3JlcCB7ICRfLT57VGl0bGV9IGVxICdNYW5kYXRvcnkgaXRlbSBBJyB9IEBDb3BpZWRJdGVtczsKbXkgKCRPcHRpb25hbENvcGllZCkgID0gZ3JlcCB7ICRfLT57VGl0bGV9IGVxICdPcHRpb25hbCBpdGVtIEInIH0gQENvcGllZEl0ZW1zOwoKJFNlbGYtPklzKAogICAgJE1hbmRhdG9yeUNvcGllZC0+e0lzTWFuZGF0b3J5fSwKICAgIDEsCiAgICAnQ2hlY2tsaXN0QWRkKCk6IElzTWFuZGF0b3J5IGZsYWcgd2FzIGNvcGllZCBjb3JyZWN0bHkgZm9yIHRoZSBtYW5kYXRvcnkgaXRlbScsCik7CgokU2VsZi0+SXMoCiAgICAkT3B0aW9uYWxDb3BpZWQtPntJc01hbmRhdG9yeX0sCiAgICAwLAogICAgJ0NoZWNrbGlzdEFkZCgpOiBJc01hbmRhdG9yeSBmbGFnIHdhcyBjb3BpZWQgY29ycmVjdGx5IGZvciB0aGUgb3B0aW9uYWwgaXRlbScsCik7CgokU2VsZi0+SXMoCiAgICAkTWFuZGF0b3J5Q29waWVkLT57U3RhdGV9LAogICAgJ29wZW4nLAogICAgJ0NoZWNrbGlzdEFkZCgpOiBjb3BpZWQgaXRlbXMgc3RhcnQgaW4gdGhlICJvcGVuIiBzdGF0ZScsCik7CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBhcnQgMjogQ2hlY2tsaXN0UHJvZ3Jlc3MoKSAtIG1hbmRhdG9yeSB2cyBvcHRpb25hbCBjb21wbGV0aW9uIG1hdGgKIwojIFRoaXMgaXMgdGhlIGNhbGN1bGF0aW9uIHRoZSBjbG9zZS1sb2NrIEFDTCAoQ2hlY2tsaXN0QUNMLnBtKSBkZXBlbmRzCiMgb24gLSBJc0NvbXBsZXRlIG11c3Qgb25seSBldmVyIGxvb2sgYXQgbWFuZGF0b3J5IGl0ZW1zLCBhbmQgbXVzdAojIGlnbm9yZSBvcHRpb25hbCBvbmVzIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgc3RhdGUuCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpteSAkVGlja2V0SUQyICAgICA9IF9DcmVhdGVUZXN0VGlja2V0KCBTdWZmaXggPT4gJ0InICk7Cm15ICRDaGVja2xpc3RJRDIgID0gJENoZWNrbGlzdE9iamVjdC0+Q2hlY2tsaXN0QWRkKAogICAgVGlja2V0SUQgICA9PiAkVGlja2V0SUQyLAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCm15IEBJdGVtczIgPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtTGlzdCggQ2hlY2tsaXN0SUQgPT4gJENoZWNrbGlzdElEMiApOwpteSAoJE1hbmRhdG9yeTIpID0gZ3JlcCB7ICRfLT57VGl0bGV9IGVxICdNYW5kYXRvcnkgaXRlbSBBJyB9IEBJdGVtczI7Cm15ICgkT3B0aW9uYWwyKSAgPSBncmVwIHsgJF8tPntUaXRsZX0gZXEgJ09wdGlvbmFsIGl0ZW0gQicgfSBASXRlbXMyOwoKbXkgJEV4dHJhTWFuZGF0b3J5SUQgPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtQWRkKAogICAgQ2hlY2tsaXN0SUQgPT4gJENoZWNrbGlzdElEMiwKICAgIFRpdGxlICAgICAgID0+ICdNYW5kYXRvcnkgaXRlbSBDJywKICAgIElzTWFuZGF0b3J5ID0+IDEsCiAgICBTdGF0ZSAgICAgICA9PiAnb3BlbicsCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKbXkgJVByb2dyZXNzQWxsT3BlbiA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdFByb2dyZXNzKCBDaGVja2xpc3RJRCA9PiAkQ2hlY2tsaXN0SUQyICk7CgokU2VsZi0+SXMoCiAgICAkUHJvZ3Jlc3NBbGxPcGVue1RvdGFsSXRlbXN9LAogICAgMywKICAgICdDaGVja2xpc3RQcm9ncmVzcygpOiBUb3RhbEl0ZW1zIGNvdW50cyBhbGwgaXRlbXMgcmVnYXJkbGVzcyBvZiBtYW5kYXRvcnkgZmxhZycsCik7CgokU2VsZi0+SXMoCiAgICAkUHJvZ3Jlc3NBbGxPcGVue01hbmRhdG9yeUl0ZW1zfSwKICAgIDIsCiAgICAnQ2hlY2tsaXN0UHJvZ3Jlc3MoKTogTWFuZGF0b3J5SXRlbXMgb25seSBjb3VudHMgdGhlIDIgbWFuZGF0b3J5IGl0ZW1zJywKKTsKCiRTZWxmLT5JcygKICAgICRQcm9ncmVzc0FsbE9wZW57Q29tcGxldGVkSXRlbXN9LAogICAgMCwKICAgICdDaGVja2xpc3RQcm9ncmVzcygpOiBDb21wbGV0ZWRJdGVtcyBpcyAwIHdoaWxlIGV2ZXJ5dGhpbmcgaXMgb3BlbicsCik7CgokU2VsZi0+SXMoCiAgICAkUHJvZ3Jlc3NBbGxPcGVue01hbmRhdG9yeURvbmV9LAogICAgMCwKICAgICdDaGVja2xpc3RQcm9ncmVzcygpOiBNYW5kYXRvcnlEb25lIGlzIDAgd2hpbGUgZXZlcnl0aGluZyBpcyBvcGVuJywKKTsKCiRTZWxmLT5JcygKICAgICRQcm9ncmVzc0FsbE9wZW57SXNDb21wbGV0ZX0sCiAgICAwLAogICAgJ0NoZWNrbGlzdFByb2dyZXNzKCk6IElzQ29tcGxldGUgaXMgZmFsc2Ugd2hpbGUgbWFuZGF0b3J5IGl0ZW1zIGFyZSBvcGVuJywKKTsKCiMgQ29tcGxldGUgdGhlIG9wdGlvbmFsIGl0ZW0gb25seSAtIG11c3QgTk9UIGFmZmVjdCBJc0NvbXBsZXRlIGF0IGFsbC4KJENoZWNrbGlzdE9iamVjdC0+SXRlbVNldFN0YXRlKAogICAgSUQgICAgID0+ICRPcHRpb25hbDItPntJRH0sCiAgICBTdGF0ZSAgPT4gJ2RvbmUnLAogICAgVXNlcklEID0+IDEsCik7CgpteSAlUHJvZ3Jlc3NPcHRpb25hbERvbmUgPSAkQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3RQcm9ncmVzcyggQ2hlY2tsaXN0SUQgPT4gJENoZWNrbGlzdElEMiApOwoKJFNlbGYtPklzKAogICAgJFByb2dyZXNzT3B0aW9uYWxEb25le0NvbXBsZXRlZEl0ZW1zfSwKICAgIDEsCiAgICAnQ2hlY2tsaXN0UHJvZ3Jlc3MoKTogQ29tcGxldGVkSXRlbXMgcmVmbGVjdHMgdGhlIGNvbXBsZXRlZCBvcHRpb25hbCBpdGVtJywKKTsKCiRTZWxmLT5JcygKICAgICRQcm9ncmVzc09wdGlvbmFsRG9uZXtNYW5kYXRvcnlEb25lfSwKICAgIDAsCiAgICAnQ2hlY2tsaXN0UHJvZ3Jlc3MoKTogTWFuZGF0b3J5RG9uZSBzdGF5cyAwIC0gY29tcGxldGluZyBhbiBvcHRpb25hbCBpdGVtIG11c3Qgbm90IGNvdW50JywKKTsKCiRTZWxmLT5JcygKICAgICRQcm9ncmVzc09wdGlvbmFsRG9uZXtJc0NvbXBsZXRlfSwKICAgIDAsCiAgICAnQ2hlY2tsaXN0UHJvZ3Jlc3MoKTogSXNDb21wbGV0ZSBzdGF5cyBmYWxzZSAtIG9ubHkgdGhlIG9wdGlvbmFsIGl0ZW0gaXMgZG9uZScsCik7CgojIENvbXBsZXRlIG9uZSBvZiB0aGUgdHdvIG1hbmRhdG9yeSBpdGVtcyAtIHN0aWxsIGluY29tcGxldGUgKDEgb2YgMikuCiRDaGVja2xpc3RPYmplY3QtPkl0ZW1TZXRTdGF0ZSgKICAgIElEICAgICA9PiAkTWFuZGF0b3J5Mi0+e0lEfSwKICAgIFN0YXRlICA9PiAnZG9uZScsCiAgICBVc2VySUQgPT4gMSwKKTsKCm15ICVQcm9ncmVzc09uZU1hbmRhdG9yeURvbmUgPSAkQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3RQcm9ncmVzcyggQ2hlY2tsaXN0SUQgPT4gJENoZWNrbGlzdElEMiApOwoKJFNlbGYtPklzKAogICAgJFByb2dyZXNzT25lTWFuZGF0b3J5RG9uZXtNYW5kYXRvcnlEb25lfSwKICAgIDEsCiAgICAnQ2hlY2tsaXN0UHJvZ3Jlc3MoKTogTWFuZGF0b3J5RG9uZSBpcyAxIGFmdGVyIGNvbXBsZXRpbmcgMSBvZiAyIG1hbmRhdG9yeSBpdGVtcycsCik7CgokU2VsZi0+SXMoCiAgICAkUHJvZ3Jlc3NPbmVNYW5kYXRvcnlEb25le0lzQ29tcGxldGV9LAogICAgMCwKICAgICdDaGVja2xpc3RQcm9ncmVzcygpOiBJc0NvbXBsZXRlIGlzIHN0aWxsIGZhbHNlIHdpdGggMSBvZiAyIG1hbmRhdG9yeSBpdGVtcyBkb25lJywKKTsKCiMgQ29tcGxldGUgdGhlIHNlY29uZCBtYW5kYXRvcnkgaXRlbSB2aWEgIm5vdF9hcHBsaWNhYmxlIiAtIHRoaXMgbXVzdAojIGNvdW50IGFzIGNvbXBsZXRlZCB0b28gKG5vdCBqdXN0ICJkb25lIikuCiRDaGVja2xpc3RPYmplY3QtPkl0ZW1TZXRTdGF0ZSgKICAgIElEICAgICA9PiAkRXh0cmFNYW5kYXRvcnlJRCwKICAgIFN0YXRlICA9PiAnbm90X2FwcGxpY2FibGUnLAogICAgVXNlcklEID0+IDEsCik7CgpteSAlUHJvZ3Jlc3NDb21wbGV0ZSA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdFByb2dyZXNzKCBDaGVja2xpc3RJRCA9PiAkQ2hlY2tsaXN0SUQyICk7CgokU2VsZi0+SXMoCiAgICAkUHJvZ3Jlc3NDb21wbGV0ZXtNYW5kYXRvcnlEb25lfSwKICAgIDIsCiAgICAnQ2hlY2tsaXN0UHJvZ3Jlc3MoKTogTWFuZGF0b3J5RG9uZSBjb3VudHMgIm5vdF9hcHBsaWNhYmxlIiBhcyBjb21wbGV0ZWQsIG5vdCBqdXN0ICJkb25lIicsCik7CgokU2VsZi0+SXMoCiAgICAkUHJvZ3Jlc3NDb21wbGV0ZXtJc0NvbXBsZXRlfSwKICAgIDEsCiAgICAnQ2hlY2tsaXN0UHJvZ3Jlc3MoKTogSXNDb21wbGV0ZSBpcyB0cnVlIG9uY2UgYWxsIG1hbmRhdG9yeSBpdGVtcyBhcmUgZG9uZS9ub3RfYXBwbGljYWJsZScsCik7CgokU2VsZi0+SXMoCiAgICAkUHJvZ3Jlc3NDb21wbGV0ZXtDb21wbGV0ZWRJdGVtc30sCiAgICAzLAogICAgJ0NoZWNrbGlzdFByb2dyZXNzKCk6IENvbXBsZXRlZEl0ZW1zIGlzIDMgb2YgMyBvbmNlIGV2ZXJ5dGhpbmcgaXMgY29tcGxldGVkJywKKTsKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCAzOiBUaWNrZXRDYW5DbG9zZSgpIC8gR2V0SW5jb21wbGV0ZUl0ZW1zKCkKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCm15ICRUaWNrZXRJRDMgPSBfQ3JlYXRlVGVzdFRpY2tldCggU3VmZml4ID0+ICdDJyApOwoKJFNlbGYtPlRydWUoCiAgICAkQ2hlY2tsaXN0T2JqZWN0LT5UaWNrZXRDYW5DbG9zZSggVGlja2V0SUQgPT4gJFRpY2tldElEMyApLAogICAgJ1RpY2tldENhbkNsb3NlKCk6IGEgdGlja2V0IHdpdGggbm8gY2hlY2tsaXN0cyBhdCBhbGwgY2FuIGFsd2F5cyBjbG9zZScsCik7CgpteSAkQ2hlY2tsaXN0SUQzID0gJENoZWNrbGlzdE9iamVjdC0+Q2hlY2tsaXN0QWRkKAogICAgVGlja2V0SUQgICA9PiAkVGlja2V0SUQzLAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCm15IEBJbmNvbXBsZXRlQmVmb3JlID0gJENoZWNrbGlzdE9iamVjdC0+R2V0SW5jb21wbGV0ZUl0ZW1zKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQzICk7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEluY29tcGxldGVCZWZvcmUsCiAgICAxLAogICAgJ0dldEluY29tcGxldGVJdGVtcygpOiByZXBvcnRzIGV4YWN0bHkgdGhlIDEgaW5jb21wbGV0ZSBtYW5kYXRvcnkgaXRlbSAob3B0aW9uYWwgaXRlbSBleGNsdWRlZCknLAopOwoKJFNlbGYtPklzKAogICAgJEluY29tcGxldGVCZWZvcmVbMF17SXRlbVRpdGxlfSwKICAgICdNYW5kYXRvcnkgaXRlbSBBJywKICAgICdHZXRJbmNvbXBsZXRlSXRlbXMoKTogcmVwb3J0cyB0aGUgY29ycmVjdCBpdGVtIHRpdGxlJywKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRDaGVja2xpc3RPYmplY3QtPlRpY2tldENhbkNsb3NlKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQzICksCiAgICAnVGlja2V0Q2FuQ2xvc2UoKTogZmFsc2Ugd2hpbGUgYSBtYW5kYXRvcnkgaXRlbSBpcyBpbmNvbXBsZXRlJywKKTsKCm15IEBJdGVtczMgPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtTGlzdCggQ2hlY2tsaXN0SUQgPT4gJENoZWNrbGlzdElEMyApOwpteSAoJE1hbmRhdG9yeTMpID0gZ3JlcCB7ICRfLT57VGl0bGV9IGVxICdNYW5kYXRvcnkgaXRlbSBBJyB9IEBJdGVtczM7CgokQ2hlY2tsaXN0T2JqZWN0LT5JdGVtU2V0U3RhdGUoCiAgICBJRCAgICAgPT4gJE1hbmRhdG9yeTMtPntJRH0sCiAgICBTdGF0ZSAgPT4gJ2RvbmUnLAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRDaGVja2xpc3RPYmplY3QtPlRpY2tldENhbkNsb3NlKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQzICksCiAgICAnVGlja2V0Q2FuQ2xvc2UoKTogdHJ1ZSBvbmNlIHRoZSBvbmx5IG1hbmRhdG9yeSBpdGVtIGlzIGNvbXBsZXRlZCcsCik7CgpteSBASW5jb21wbGV0ZUFmdGVyID0gJENoZWNrbGlzdE9iamVjdC0+R2V0SW5jb21wbGV0ZUl0ZW1zKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQzICk7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEluY29tcGxldGVBZnRlciwKICAgIDAsCiAgICAnR2V0SW5jb21wbGV0ZUl0ZW1zKCk6IGVtcHR5IG9uY2UgYWxsIG1hbmRhdG9yeSBpdGVtcyBhcmUgY29tcGxldGVkJywKKTsKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCA0OiBJdGVtRGVsZXRlKCkgcHJvdGVjdHMgbWFuZGF0b3J5IGl0ZW1zIHVubGVzcyBGb3JjZSA9PiAxCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpteSAkVGlja2V0SUQ0ICAgID0gX0NyZWF0ZVRlc3RUaWNrZXQoIFN1ZmZpeCA9PiAnRCcgKTsKbXkgJENoZWNrbGlzdElENCA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdEFkZCgKICAgIFRpY2tldElEICAgPT4gJFRpY2tldElENCwKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgpteSBASXRlbXM0ID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbUxpc3QoIENoZWNrbGlzdElEID0+ICRDaGVja2xpc3RJRDQgKTsKbXkgKCRNYW5kYXRvcnk0KSA9IGdyZXAgeyAkXy0+e1RpdGxlfSBlcSAnTWFuZGF0b3J5IGl0ZW0gQScgfSBASXRlbXM0OwpteSAoJE9wdGlvbmFsNCkgID0gZ3JlcCB7ICRfLT57VGl0bGV9IGVxICdPcHRpb25hbCBpdGVtIEInIH0gQEl0ZW1zNDsKCm15ICREZWxldGVPcHRpb25hbFJlc3VsdCA9ICRDaGVja2xpc3RPYmplY3QtPkl0ZW1EZWxldGUoCiAgICBJRCAgICAgPT4gJE9wdGlvbmFsNC0+e0lEfSwKICAgIFVzZXJJRCA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkRGVsZXRlT3B0aW9uYWxSZXN1bHQsCiAgICAnSXRlbURlbGV0ZSgpOiBhbiBvcHRpb25hbCBpdGVtIGRlbGV0ZXMgd2l0aG91dCBGb3JjZScsCik7CgpteSAkRGVsZXRlTWFuZGF0b3J5UmVzdWx0ID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbURlbGV0ZSgKICAgIElEICAgICA9PiAkTWFuZGF0b3J5NC0+e0lEfSwKICAgIFVzZXJJRCA9PiAxLAopOwoKJFNlbGYtPkZhbHNlKAogICAgJERlbGV0ZU1hbmRhdG9yeVJlc3VsdCwKICAgICdJdGVtRGVsZXRlKCk6IGEgbWFuZGF0b3J5IGl0ZW0gaXMgcmVmdXNlZCB3aXRob3V0IEZvcmNlID0+IDEnLAopOwoKbXkgJVN0aWxsVGhlcmVJdGVtID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbUdldCggSUQgPT4gJE1hbmRhdG9yeTQtPntJRH0gKTsKCiRTZWxmLT5UcnVlKAogICAgKCBzY2FsYXIgJVN0aWxsVGhlcmVJdGVtID8gMSA6IDAgKSwKICAgICdJdGVtRGVsZXRlKCk6IHRoZSBtYW5kYXRvcnkgaXRlbSBpcyBzdGlsbCB0aGVyZSBhZnRlciBhIHJlZnVzZWQgZGVsZXRlJywKKTsKCm15ICREZWxldGVNYW5kYXRvcnlGb3JjZWQgPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtRGVsZXRlKAogICAgSUQgICAgID0+ICRNYW5kYXRvcnk0LT57SUR9LAogICAgRm9yY2UgID0+IDEsCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJERlbGV0ZU1hbmRhdG9yeUZvcmNlZCwKICAgICdJdGVtRGVsZXRlKCk6IGEgbWFuZGF0b3J5IGl0ZW0gZGVsZXRlcyB3aXRoIEZvcmNlID0+IDEnLAopOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQYXJ0IDU6IEl0ZW1TZXRWYWx1ZSgpIGF1dG8tY29tcGxldGlvbiBmb3Igc3RhdHVzL3ZhbHVlL3JhdGluZyBpdGVtcwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKbXkgJFRpY2tldElENSAgICA9IF9DcmVhdGVUZXN0VGlja2V0KCBTdWZmaXggPT4gJ0UnICk7Cm15ICRDaGVja2xpc3RJRDUgPSAkQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3RBZGQoCiAgICBUaWNrZXRJRCAgID0+ICRUaWNrZXRJRDUsCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgVXNlcklEICAgICA9PiAxLAopOwoKbXkgJFZhbHVlSXRlbUlEID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbUFkZCgKICAgIENoZWNrbGlzdElEID0+ICRDaGVja2xpc3RJRDUsCiAgICBJdGVtVHlwZSAgICA9PiAndmFsdWUnLAogICAgVGl0bGUgICAgICAgPT4gJ01lYXN1cmVkIHRlbXBlcmF0dXJlJywKICAgIElzTWFuZGF0b3J5ID0+IDEsCiAgICBTdGF0ZSAgICAgICA9PiAnb3BlbicsCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKJENoZWNrbGlzdE9iamVjdC0+SXRlbVNldFZhbHVlKAogICAgSUQgICAgICAgID0+ICRWYWx1ZUl0ZW1JRCwKICAgIEl0ZW1WYWx1ZSA9PiAnMjEuNScsCiAgICBVc2VySUQgICAgPT4gMSwKKTsKCm15ICVWYWx1ZUl0ZW1BZnRlclNldCA9ICRDaGVja2xpc3RPYmplY3QtPkl0ZW1HZXQoIElEID0+ICRWYWx1ZUl0ZW1JRCApOwoKJFNlbGYtPklzKAogICAgJFZhbHVlSXRlbUFmdGVyU2V0e1N0YXRlfSwKICAgICdkb25lJywKICAgICdJdGVtU2V0VmFsdWUoKTogYSAidmFsdWUiIGl0ZW0gYXV0by1jb21wbGV0ZXMgdG8gImRvbmUiIG9uY2UgYSB2YWx1ZSBpcyBlbnRlcmVkJywKKTsKCiRDaGVja2xpc3RPYmplY3QtPkl0ZW1TZXRWYWx1ZSgKICAgIElEICAgICAgICA9PiAkVmFsdWVJdGVtSUQsCiAgICBJdGVtVmFsdWUgPT4gJycsCiAgICBVc2VySUQgICAgPT4gMSwKKTsKCm15ICVWYWx1ZUl0ZW1BZnRlckNsZWFyID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbUdldCggSUQgPT4gJFZhbHVlSXRlbUlEICk7CgokU2VsZi0+SXMoCiAgICAkVmFsdWVJdGVtQWZ0ZXJDbGVhcntTdGF0ZX0sCiAgICAnb3BlbicsCiAgICAnSXRlbVNldFZhbHVlKCk6IGEgInZhbHVlIiBpdGVtIHJlc2V0cyB0byAib3BlbiIgb25jZSBpdHMgdmFsdWUgaXMgY2xlYXJlZCcsCik7CgpteSAkUmF0aW5nSXRlbUlEID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbUFkZCgKICAgIENoZWNrbGlzdElEID0+ICRDaGVja2xpc3RJRDUsCiAgICBJdGVtVHlwZSAgICA9PiAncmF0aW5nJywKICAgIFRpdGxlICAgICAgID0+ICdPdmVyYWxsIGNvbmRpdGlvbicsCiAgICBJc01hbmRhdG9yeSA9PiAwLAogICAgU3RhdGUgICAgICAgPT4gJ29wZW4nLAogICAgVXNlcklEICAgICAgPT4gMSwKKTsKCiRDaGVja2xpc3RPYmplY3QtPkl0ZW1TZXRWYWx1ZSgKICAgIElEICAgICAgICA9PiAkUmF0aW5nSXRlbUlELAogICAgSXRlbVZhbHVlID0+IDAsCiAgICBVc2VySUQgICAgPT4gMSwKKTsKCm15ICVSYXRpbmdJdGVtWmVybyA9ICRDaGVja2xpc3RPYmplY3QtPkl0ZW1HZXQoIElEID0+ICRSYXRpbmdJdGVtSUQgKTsKCiRTZWxmLT5JcygKICAgICRSYXRpbmdJdGVtWmVyb3tTdGF0ZX0sCiAgICAnb3BlbicsCiAgICAnSXRlbVNldFZhbHVlKCk6IGEgInJhdGluZyIgaXRlbSBzdGF5cyAib3BlbiIgZm9yIGEgcmF0aW5nIG9mIDAnLAopOwoKJENoZWNrbGlzdE9iamVjdC0+SXRlbVNldFZhbHVlKAogICAgSUQgICAgICAgID0+ICRSYXRpbmdJdGVtSUQsCiAgICBJdGVtVmFsdWUgPT4gNCwKICAgIFVzZXJJRCAgICA9PiAxLAopOwoKbXkgJVJhdGluZ0l0ZW1TZXQgPSAkQ2hlY2tsaXN0T2JqZWN0LT5JdGVtR2V0KCBJRCA9PiAkUmF0aW5nSXRlbUlEICk7CgokU2VsZi0+SXMoCiAgICAkUmF0aW5nSXRlbVNldHtTdGF0ZX0sCiAgICAnZG9uZScsCiAgICAnSXRlbVNldFZhbHVlKCk6IGEgInJhdGluZyIgaXRlbSBhdXRvLWNvbXBsZXRlcyB0byAiZG9uZSIgZm9yIGEgcmF0aW5nID4gMCcsCik7CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBhcnQgNjogQ2hlY2tsaXN0TGlzdCgpIC8gQ2hlY2tsaXN0RGVsZXRlKCkKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCm15IEBDaGVja2xpc3RzRm9yVGlja2V0NSA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdExpc3QoIFRpY2tldElEID0+ICRUaWNrZXRJRDUgKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBAQ2hlY2tsaXN0c0ZvclRpY2tldDUsCiAgICAxLAogICAgJ0NoZWNrbGlzdExpc3QoKTogcmV0dXJucyB0aGUgMSBjaGVja2xpc3QgYXR0YWNoZWQgdG8gdGhlIHRpY2tldCcsCik7CgokU2VsZi0+SXMoCiAgICAkQ2hlY2tsaXN0c0ZvclRpY2tldDVbMF17VG90YWxJdGVtc30sCiAgICA0LAogICAgJ0NoZWNrbGlzdExpc3QoKTogVG90YWxJdGVtcyBpbmNsdWRlcyBib3RoIHRlbXBsYXRlLWNvcGllZCBhbmQgbWFudWFsbHktYWRkZWQgaXRlbXMnLAopOwoKbXkgJENoZWNrbGlzdERlbGV0ZVN1Y2Nlc3MgPSAkQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3REZWxldGUoCiAgICBJRCAgICAgICA9PiAkQ2hlY2tsaXN0SUQ1LAogICAgVGlja2V0SUQgPT4gJFRpY2tldElENSwKICAgIFVzZXJJRCAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRDaGVja2xpc3REZWxldGVTdWNjZXNzLAogICAgJ0NoZWNrbGlzdERlbGV0ZSgpOiBkZWxldGUgc3VjY2VlZHMnLAopOwoKbXkgQENoZWNrbGlzdHNBZnRlckRlbGV0ZSA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdExpc3QoIFRpY2tldElEID0+ICRUaWNrZXRJRDUgKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBAQ2hlY2tsaXN0c0FmdGVyRGVsZXRlLAogICAgMCwKICAgICdDaGVja2xpc3RMaXN0KCk6IG5vIGNoZWNrbGlzdHMgcmVtYWluIGZvciB0aGUgdGlja2V0IGFmdGVyIENoZWNrbGlzdERlbGV0ZSgpJywKKTsKCm15IEBJdGVtc0FmdGVyQ2hlY2tsaXN0RGVsZXRlID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbUxpc3QoIENoZWNrbGlzdElEID0+ICRDaGVja2xpc3RJRDUgKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBASXRlbXNBZnRlckNoZWNrbGlzdERlbGV0ZSwKICAgIDAsCiAgICAnSXRlbUxpc3QoKTogdGhlIGNoZWNrbGlzdFwncyBpdGVtcyBhcmUgZ29uZSB0b28gYWZ0ZXIgQ2hlY2tsaXN0RGVsZXRlKCknLAopOwoKMTsK</File>
        <File Permission="660" Location="scripts/test/Checklist/ChecklistACL.t" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKIyBSZWdyZXNzaW9uIHRlc3QgZm9yIHRoZSBUaWNrZXQ6OkFjbDo6TW9kdWxlIGNvbnRyYWN0IGZpeDogdW5saWtlIGEKIyBkZWNsYXJhdGl2ZSBUaWNrZXRBY2wjIyMgU3lzQ29uZmlnIGVudHJ5LCBhIG1vZHVsZS1zdHlsZSBBQ0wncyByZXR1cm4KIyB2YWx1ZSBpcyBkaXNjYXJkZWQgYnkgdGhlIGZyYW1ld29yayAoc2VlCiMgS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6VGlja2V0QUNMOjpUaWNrZXRBY2woKSkgLSB0aGUgb25seSB3YXkgaXQgY2FuCiMgYWN0dWFsbHkgcmVzdHJpY3QgYW55dGhpbmcgaXMgYnkgbXV0YXRpbmcgdGhlICRQYXJhbXtBY2x9IGhhc2hyZWYgaXQgaXMKIyBnaXZlbi4gVGhpcyBtb2R1bGUgdXNlZCB0byBqdXN0IHJldHVybiBhIHZhbHVlLCB3aGljaCB0aGUgZnJhbWV3b3JrCiMgc2lsZW50bHkgaWdub3JlZCAtIHRoZSBjbG9zZS1sb2NrIG5ldmVyIGFjdHVhbGx5IHRvb2sgZWZmZWN0LiBUaGlzIHRlc3QKIyBjYWxscyBSdW4oKSBkaXJlY3RseSBhbmQgYXNzZXJ0cyBvbiB0aGUgcmVzdWx0aW5nICVBY2wgc3RydWN0dXJlLAojIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgZnVsbCBabnVueSBBQ0wgZnJhbWV3b3JrLgoKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpteSAkQ2hlY2tsaXN0QUNMT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBY2w6OkNoZWNrbGlzdEFDTCcpOwpteSAkQ2hlY2tsaXN0T2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0Jyk7Cm15ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja2xpc3RUZW1wbGF0ZScpOwpteSAkVGlja2V0T2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7Cm15ICRTdGF0ZU9iamVjdCAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpOwoKbXkgJFJhbmRvbUlEID0gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tSUQoKTsKCm15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgIFRpdGxlICAgICAgICA9PiAiQ2hlY2tsaXN0QUNMIHRlc3QgdGlja2V0ICRSYW5kb21JRCIsCiAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgIFN0YXRlICAgICAgICA9PiAnbmV3JywKICAgIEN1c3RvbWVySUQgICA9PiAndW5pdHRlc3QnLAogICAgQ3VzdG9tZXJVc2VyID0+ICd1bml0dGVzdEBsb2NhbGhvc3QnLAogICAgT3duZXJJRCAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFRpY2tldElELAogICAgIlRpY2tldENyZWF0ZSgpOiB0ZXN0IHRpY2tldCBjcmVhdGVkIC0gSUQ6ICRUaWNrZXRJRCIsCik7CgpteSAkVGVtcGxhdGVJRCA9ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICBOYW1lICAgID0+ICJBQ0wgVGVzdCBUZW1wbGF0ZSAkUmFuZG9tSUQiLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUl0ZW1BZGQoCiAgICBUZW1wbGF0ZUlEICA9PiAkVGVtcGxhdGVJRCwKICAgIFRpdGxlICAgICAgID0+ICdNYW5kYXRvcnkgYXBwcm92YWwgc3RlcCcsCiAgICBJc01hbmRhdG9yeSA9PiAxLAogICAgVXNlcklEICAgICAgPT4gMSwKKTsKCm15ICRDaGVja2xpc3RJRCA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdEFkZCgKICAgIFRpY2tldElEICAgPT4gJFRpY2tldElELAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJENoZWNrbGlzdElELAogICAgIkNoZWNrbGlzdEFkZCgpOiBjaGVja2xpc3Qgd2l0aCAxIGluY29tcGxldGUgbWFuZGF0b3J5IGl0ZW0gYXR0YWNoZWQgLSBJRDogJENoZWNrbGlzdElEIiwKKTsKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCAxOiBpbmNvbXBsZXRlIG1hbmRhdG9yeSBpdGVtIC0gQUNMIG11c3QgbXV0YXRlICRQYXJhbXtBY2x9CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpteSAlQWNsSW5jb21wbGV0ZTsKbXkgJFJ1blJlc3VsdEluY29tcGxldGUgPSAkQ2hlY2tsaXN0QUNMT2JqZWN0LT5SdW4oCiAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICBBY2wgICAgICA9PiBcJUFjbEluY29tcGxldGUsCiAgICBDb25maWcgICA9PiB7fSwKICAgIFVzZXJJRCAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRSdW5SZXN1bHRJbmNvbXBsZXRlLAogICAgJ1J1bigpOiByZXR1cm5zIGEgdHJ1ZSB2YWx1ZSAocmV0dXJuIHZhbHVlIGl0c2VsZiBpcyBkaXNjYXJkZWQgYnkgdGhlIHJlYWwgZnJhbWV3b3JrKScsCik7CgokU2VsZi0+VHJ1ZSgKICAgICggZXhpc3RzICRBY2xJbmNvbXBsZXRle0NoZWNrbGlzdEFDTH0gPyAxIDogMCApLAogICAgJ1J1bigpOiBhZGRzIGEgIkNoZWNrbGlzdEFDTCIgZW50cnkgdG8gJFBhcmFte0FjbH0gd2hlbiBhIG1hbmRhdG9yeSBpdGVtIGlzIGluY29tcGxldGUnLAopOwoKJFNlbGYtPklzKAogICAgcmVmICRBY2xJbmNvbXBsZXRle0NoZWNrbGlzdEFDTH0sCiAgICAnSEFTSCcsCiAgICAnUnVuKCk6IHRoZSBhZGRlZCBBQ0wgZW50cnkgaXMgYSBoYXNocmVmJywKKTsKCiRTZWxmLT5JcygKICAgICRBY2xJbmNvbXBsZXRle0NoZWNrbGlzdEFDTH17UHJvcGVydGllc317VGlja2V0fXtUaWNrZXRJRH1bMF0sCiAgICAkVGlja2V0SUQsCiAgICAnUnVuKCk6IHRoZSBBQ0wgZW50cnlcJ3MgUHJvcGVydGllcyBzY29wZSBpdCB0byB0aGlzIHNwZWNpZmljIHRpY2tldCcsCik7CgojIERlZmF1bHQgQ2hlY2tsaXN0OjpCbG9ja0Nsb3NlU3RhdGVzIGlzIFsnY2xvc2VkJywgJ21lcmdlZCddIC0gYm90aAojIHN0YXRlIHR5cGVzIGFyZSBibG9ja2VkLCBub3QganVzdCAiY2xvc2VkIi4KbXkgQEV4cGVjdGVkQmxvY2tlZFN0YXRlcyA9ICRTdGF0ZU9iamVjdC0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICBTdGF0ZVR5cGUgPT4gWyAnY2xvc2VkJywgJ21lcmdlZCcgXSwKICAgIFJlc3VsdCAgICA9PiAnTmFtZScsCik7CgokU2VsZi0+SXNEZWVwbHkoCiAgICBbIHNvcnQgQHsgJEFjbEluY29tcGxldGV7Q2hlY2tsaXN0QUNMfXtQb3NzaWJsZU5vdH17VGlja2V0fXtTdGF0ZX0gfSBdLAogICAgWyBzb3J0IEBFeHBlY3RlZEJsb2NrZWRTdGF0ZXMgXSwKICAgICdSdW4oKTogUG9zc2libGVOb3QgYmxvY2tzIGV4YWN0bHkgdGhlICJjbG9zZWQiKyJtZXJnZWQiLXR5cGUgc3RhdGVzICh0aGUgZGVmYXVsdCBDaGVja2xpc3Q6OkJsb2NrQ2xvc2VTdGF0ZXMpJywKKTsKCiRTZWxmLT5Jc0RlZXBseSgKICAgICRBY2xJbmNvbXBsZXRle0NoZWNrbGlzdEFDTH17UG9zc2libGVOb3R9e0FjdGlvbn0sCiAgICBbJ0FnZW50VGlja2V0Q2xvc2UnXSwKICAgICdSdW4oKTogUG9zc2libGVOb3QgYWxzbyBoaWRlcyB0aGUgQWdlbnRUaWNrZXRDbG9zZSBhY3Rpb24gaXRzZWxmLCBub3QganVzdCB0aGUgc3RhdGVzJywKKTsKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCAyOiBjb21wbGV0ZSBtYW5kYXRvcnkgaXRlbSAtIEFDTCBtdXN0IE5PVCByZXN0cmljdCBhbnl0aGluZwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKbXkgQEl0ZW1zID0gJENoZWNrbGlzdE9iamVjdC0+SXRlbUxpc3QoIENoZWNrbGlzdElEID0+ICRDaGVja2xpc3RJRCApOwokQ2hlY2tsaXN0T2JqZWN0LT5JdGVtU2V0U3RhdGUoCiAgICBJRCAgICAgPT4gJEl0ZW1zWzBde0lEfSwKICAgIFN0YXRlICA9PiAnZG9uZScsCiAgICBVc2VySUQgPT4gMSwKKTsKCm15ICVBY2xDb21wbGV0ZTsKbXkgJFJ1blJlc3VsdENvbXBsZXRlID0gJENoZWNrbGlzdEFDTE9iamVjdC0+UnVuKAogICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgQWNsICAgICAgPT4gXCVBY2xDb21wbGV0ZSwKICAgIENvbmZpZyAgID0+IHt9LAogICAgVXNlcklEICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFJ1blJlc3VsdENvbXBsZXRlLAogICAgJ1J1bigpOiByZXR1cm5zIGEgdHJ1ZSB2YWx1ZSBvbmNlIHRoZSBjaGVja2xpc3QgaXMgY29tcGxldGUnLAopOwoKJFNlbGYtPkZhbHNlKAogICAgKCBleGlzdHMgJEFjbENvbXBsZXRle0NoZWNrbGlzdEFDTH0gPyAxIDogMCApLAogICAgJ1J1bigpOiBkb2VzIE5PVCBhZGQgYW55IEFDTCBlbnRyeSBvbmNlIGFsbCBtYW5kYXRvcnkgaXRlbXMgYXJlIGNvbXBsZXRlJywKKTsKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCAzOiBjb250cmFjdCBlZGdlIGNhc2VzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpteSAlQWNsTm9UaWNrZXRJRDsKbXkgJFJ1blJlc3VsdE5vVGlja2V0SUQgPSAkQ2hlY2tsaXN0QUNMT2JqZWN0LT5SdW4oCiAgICBBY2wgICAgPT4gXCVBY2xOb1RpY2tldElELAogICAgQ29uZmlnID0+IHt9LAogICAgVXNlcklEID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRSdW5SZXN1bHROb1RpY2tldElELAogICAgJ1J1bigpOiByZXR1cm5zIHRydWUgd2hlbiBjYWxsZWQgd2l0aG91dCBhIFRpY2tldElEIChub3RoaW5nIHRvIGNoZWNrKScsCik7CgokU2VsZi0+RmFsc2UoCiAgICAoIGV4aXN0cyAkQWNsTm9UaWNrZXRJRHtDaGVja2xpc3RBQ0x9ID8gMSA6IDAgKSwKICAgICdSdW4oKTogZG9lcyBub3QgbXV0YXRlICRQYXJhbXtBY2x9IHdoZW4gY2FsbGVkIHdpdGhvdXQgYSBUaWNrZXRJRCcsCik7CgpteSAkUnVuUmVzdWx0TWlzc2luZ0NvbmZpZyA9ICRDaGVja2xpc3RBQ0xPYmplY3QtPlJ1bigKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIEFjbCAgICAgID0+IHt9LAogICAgVXNlcklEICAgPT4gMSwKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRSdW5SZXN1bHRNaXNzaW5nQ29uZmlnLAogICAgJ1J1bigpOiByZXR1cm5zIHVuZGVmIHdoZW4gdGhlIHJlcXVpcmVkIENvbmZpZyBwYXJhbWV0ZXIgaXMgbWlzc2luZycsCik7CgpteSAkUnVuUmVzdWx0TWlzc2luZ0FjbCA9ICRDaGVja2xpc3RBQ0xPYmplY3QtPlJ1bigKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIENvbmZpZyAgID0+IHt9LAogICAgVXNlcklEICAgPT4gMSwKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRSdW5SZXN1bHRNaXNzaW5nQWNsLAogICAgJ1J1bigpOiByZXR1cm5zIHVuZGVmIHdoZW4gdGhlIHJlcXVpcmVkIEFjbCBwYXJhbWV0ZXIgaXMgbWlzc2luZycsCik7CgoxOwo=</File>
        <File Permission="660" Location="scripts/test/Checklist/ChecklistAssign.t" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNSBabnVueSBDaGVja2xpc3QgUHJvamVjdAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMy4wLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyT2JqZWN0ICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKbXkgJENoZWNrbGlzdEFzc2lnbk9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbkFjdGlvbjo6Q2hlY2tsaXN0QXNzaWduJyk7Cm15ICRDaGVja2xpc3RPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0Jyk7Cm15ICRDaGVja2xpc3RUZW1wbGF0ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tsaXN0VGVtcGxhdGUnKTsKbXkgJFRpY2tldE9iamVjdCAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCm15ICRSYW5kb21JRCA9ICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCk7CgpteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICBUaXRsZSAgICAgICAgPT4gIkNoZWNrbGlzdEFzc2lnbiB0ZXN0IHRpY2tldCAkUmFuZG9tSUQiLAogICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICBTdGF0ZSAgICAgICAgPT4gJ25ldycsCiAgICBDdXN0b21lcklEICAgPT4gJ3VuaXR0ZXN0JywKICAgIEN1c3RvbWVyVXNlciA9PiAndW5pdHRlc3RAbG9jYWxob3N0JywKICAgIE93bmVySUQgICAgICA9PiAxLAogICAgVXNlcklEICAgICAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRUaWNrZXRJRCwKICAgICJUaWNrZXRDcmVhdGUoKTogdGVzdCB0aWNrZXQgY3JlYXRlZCAtIElEOiAkVGlja2V0SUQiLAopOwoKbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgIFVzZXJJRCAgID0+IDEsCik7CgpteSAkVmFsaWRUZW1wbGF0ZUlEID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgIE5hbWUgICAgPT4gIkFzc2lnbiBUZXN0IFRlbXBsYXRlICRSYW5kb21JRCIsCiAgICBWYWxpZElEID0+IDEsCiAgICBVc2VySUQgID0+IDEsCik7CgpteSAkSW52YWxpZFRlbXBsYXRlSUQgPSAkQ2hlY2tsaXN0VGVtcGxhdGVPYmplY3QtPlRlbXBsYXRlQWRkKAogICAgTmFtZSAgICA9PiAiQXNzaWduIFRlc3QgSW52YWxpZCBUZW1wbGF0ZSAkUmFuZG9tSUQiLAogICAgVmFsaWRJRCA9PiAyLCAgICAjIGludmFsaWQKICAgIFVzZXJJRCAgPT4gMSwKKTsKCiMgQSB0ZW1wbGF0ZSB3aG9zZSBuYW1lIGVtYmVkcyB0aGUgdGlja2V0J3MgcXVldWUsIHRvIHRlc3QgcGxhY2Vob2xkZXIKIyBzdWJzdGl0dXRpb24gaW4gVGVtcGxhdGVOYW1lLgpteSAkUGxhY2Vob2xkZXJUZW1wbGF0ZUlEID0gJENoZWNrbGlzdFRlbXBsYXRlT2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgIE5hbWUgICAgPT4gIlF1ZXVlLSRUaWNrZXR7UXVldWV9LUNoZWNrbGlzdCAkUmFuZG9tSUQiLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQYXJ0IDE6IGFzc2lnbm1lbnQgYnkgVGVtcGxhdGVJRAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKbXkgJFJlc3VsdEJ5SUQgPSAkQ2hlY2tsaXN0QXNzaWduT2JqZWN0LT5SdW4oCiAgICBVc2VySUQgPT4gMSwKICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgIENvbmZpZyA9PiB7CiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVmFsaWRUZW1wbGF0ZUlELAogICAgfSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFJlc3VsdEJ5SUQsCiAgICAnUnVuKCk6IGFzc2lnbm1lbnQgYnkgVGVtcGxhdGVJRCBzdWNjZWVkcycsCik7CgpteSBAQ2hlY2tsaXN0c0FmdGVyQnlJRCA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdExpc3QoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwoKJFNlbGYtPklzKAogICAgc2NhbGFyIEBDaGVja2xpc3RzQWZ0ZXJCeUlELAogICAgMSwKICAgICdSdW4oKTogZXhhY3RseSAxIGNoZWNrbGlzdCBhdHRhY2hlZCB0byB0aGUgdGlja2V0IGFmdGVyIGFzc2lnbm1lbnQgYnkgVGVtcGxhdGVJRCcsCik7CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFBhcnQgMjogZHVwbGljYXRlIGF2b2lkYW5jZSAtIHJ1bm5pbmcgYWdhaW4gd2l0aCB0aGUgc2FtZSBUZW1wbGF0ZUlECiMgbXVzdCBub3QgY3JlYXRlIGEgc2Vjb25kIGNoZWNrbGlzdC4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCm15ICRSZXN1bHREdXBsaWNhdGUgPSAkQ2hlY2tsaXN0QXNzaWduT2JqZWN0LT5SdW4oCiAgICBVc2VySUQgPT4gMSwKICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgIENvbmZpZyA9PiB7CiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVmFsaWRUZW1wbGF0ZUlELAogICAgfSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFJlc3VsdER1cGxpY2F0ZSwKICAgICdSdW4oKTogcmUtcnVubmluZyB3aXRoIHRoZSBzYW1lIFRlbXBsYXRlSUQgc3RpbGwgcmVwb3J0cyBzdWNjZXNzJywKKTsKCm15IEBDaGVja2xpc3RzQWZ0ZXJEdXBsaWNhdGUgPSAkQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3RMaXN0KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBAQ2hlY2tsaXN0c0FmdGVyRHVwbGljYXRlLAogICAgMSwKICAgICdSdW4oKTogc3RpbGwgZXhhY3RseSAxIGNoZWNrbGlzdCBhdHRhY2hlZCAtIHRoZSBkdXBsaWNhdGUgd2FzIG5vdCBjcmVhdGVkJywKKTsKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUGFydCAzOiBhc3NpZ25tZW50IGJ5IFRlbXBsYXRlTmFtZSwgd2l0aCA8T1RSU19USUNLRVRfKj4gcGxhY2Vob2xkZXIKIyBzdWJzdGl0dXRpb24KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCm15ICRSZXN1bHRCeU5hbWUgPSAkQ2hlY2tsaXN0QXNzaWduT2JqZWN0LT5SdW4oCiAgICBVc2VySUQgPT4gMSwKICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgIENvbmZpZyA9PiB7CiAgICAgICAgVGVtcGxhdGVOYW1lID0+ICdRdWV1ZS08T1RSU19USUNLRVRfUXVldWU+LUNoZWNrbGlzdCAnIC4gJFJhbmRvbUlELAogICAgfSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFJlc3VsdEJ5TmFtZSwKICAgICdSdW4oKTogYXNzaWdubWVudCBieSBUZW1wbGF0ZU5hbWUgd2l0aCBhIHBsYWNlaG9sZGVyIHN1Y2NlZWRzJywKKTsKCm15IEBDaGVja2xpc3RzQWZ0ZXJCeU5hbWUgPSAkQ2hlY2tsaXN0T2JqZWN0LT5DaGVja2xpc3RMaXN0KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBAQ2hlY2tsaXN0c0FmdGVyQnlOYW1lLAogICAgMiwKICAgICdSdW4oKTogYSBzZWNvbmQsIGRpZmZlcmVudCBjaGVja2xpc3QgKGZyb20gdGhlIHBsYWNlaG9sZGVyLXJlc29sdmVkIHRlbXBsYXRlKSBpcyBub3cgYXR0YWNoZWQnLAopOwoKbXkgKCRQbGFjZWhvbGRlckNoZWNrbGlzdCkgPSBncmVwIHsgJF8tPntOYW1lfSA9fiAvXlF1ZXVlLVxRJFRpY2tldHtRdWV1ZX1cRS1DaGVja2xpc3QvIH0gQENoZWNrbGlzdHNBZnRlckJ5TmFtZTsKCiRTZWxmLT5UcnVlKAogICAgKCAkUGxhY2Vob2xkZXJDaGVja2xpc3QgPyAxIDogMCApLAogICAgJ1J1bigpOiB0aGUgcGxhY2Vob2xkZXIgaW4gVGVtcGxhdGVOYW1lIHdhcyBjb3JyZWN0bHkgcmVzb2x2ZWQgdG8gdGhlIHRpY2tldFwncyBhY3R1YWwgcXVldWUnLAopOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQYXJ0IDQ6IFZhbGlkSUQgY2hlY2sgLSBhbiBpbnZhbGlkIChkaXNhYmxlZCkgdGVtcGxhdGUgaXMgc2tpcHBlZCwKIyBub3QgYXNzaWduZWQuCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpteSAkUmVzdWx0SW52YWxpZCA9ICRDaGVja2xpc3RBc3NpZ25PYmplY3QtPlJ1bigKICAgIFVzZXJJRCA9PiAxLAogICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgQ29uZmlnID0+IHsKICAgICAgICBUZW1wbGF0ZUlEID0+ICRJbnZhbGlkVGVtcGxhdGVJRCwKICAgIH0sCik7CgokU2VsZi0+VHJ1ZSgKICAgICRSZXN1bHRJbnZhbGlkLAogICAgJ1J1bigpOiBhbiBpbnZhbGlkIChWYWxpZElEICE9IDEpIHRlbXBsYXRlIHN0aWxsIHJlcG9ydHMgc3VjY2VzcyAoc2tpcCwgbm90IGVycm9yKScsCik7CgpteSBAQ2hlY2tsaXN0c0FmdGVySW52YWxpZCA9ICRDaGVja2xpc3RPYmplY3QtPkNoZWNrbGlzdExpc3QoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwoKJFNlbGYtPklzKAogICAgc2NhbGFyIEBDaGVja2xpc3RzQWZ0ZXJJbnZhbGlkLAogICAgMiwKICAgICdSdW4oKTogdGhlIGNoZWNrbGlzdCBjb3VudCBpcyB1bmNoYW5nZWQgLSB0aGUgaW52YWxpZCB0ZW1wbGF0ZSB3YXMgbmV2ZXIgYWN0dWFsbHkgYXNzaWduZWQnLAopOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQYXJ0IDU6IGNvbnRyYWN0IGVkZ2UgY2FzZXMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCm15ICRSZXN1bHRNaXNzaW5nVGlja2V0ID0gJENoZWNrbGlzdEFzc2lnbk9iamVjdC0+UnVuKAogICAgVXNlcklEID0+IDEsCiAgICBDb25maWcgPT4gewogICAgICAgIFRlbXBsYXRlSUQgPT4gJFZhbGlkVGVtcGxhdGVJRCwKICAgIH0sCik7CgokU2VsZi0+RmFsc2UoCiAgICAkUmVzdWx0TWlzc2luZ1RpY2tldCwKICAgICdSdW4oKTogcmV0dXJucyB1bmRlZiB3aGVuIHRoZSByZXF1aXJlZCBUaWNrZXQgcGFyYW1ldGVyIGlzIG1pc3NpbmcnLAopOwoKbXkgJFJlc3VsdE1pc3NpbmdDb25maWcgPSAkQ2hlY2tsaXN0QXNzaWduT2JqZWN0LT5SdW4oCiAgICBVc2VySUQgPT4gMSwKICAgIFRpY2tldCA9PiBcJVRpY2tldCwKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRSZXN1bHRNaXNzaW5nQ29uZmlnLAogICAgJ1J1bigpOiByZXR1cm5zIHVuZGVmIHdoZW4gdGhlIHJlcXVpcmVkIENvbmZpZyBwYXJhbWV0ZXIgaXMgbWlzc2luZycsCik7CgpteSAkUmVzdWx0RW1wdHlDb25maWcgPSAkQ2hlY2tsaXN0QXNzaWduT2JqZWN0LT5SdW4oCiAgICBVc2VySUQgPT4gMSwKICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgIENvbmZpZyA9PiB7fSwKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRSZXN1bHRFbXB0eUNvbmZpZywKICAgICdSdW4oKTogcmV0dXJucyB1bmRlZiB3aGVuIENvbmZpZyBoYXMgbmVpdGhlciBUZW1wbGF0ZUlEIG5vciBUZW1wbGF0ZU5hbWUnLAopOwoKbXkgJFJlc3VsdFVua25vd25UZW1wbGF0ZU5hbWUgPSAkQ2hlY2tsaXN0QXNzaWduT2JqZWN0LT5SdW4oCiAgICBVc2VySUQgPT4gMSwKICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgIENvbmZpZyA9PiB7CiAgICAgICAgVGVtcGxhdGVOYW1lID0+ICJEb2VzIE5vdCBFeGlzdCAkUmFuZG9tSUQiLAogICAgfSwKKTsKCiRTZWxmLT5GYWxzZSgKICAgICRSZXN1bHRVbmtub3duVGVtcGxhdGVOYW1lLAogICAgJ1J1bigpOiByZXR1cm5zIHVuZGVmIHdoZW4gVGVtcGxhdGVOYW1lIGRvZXMgbm90IHJlc29sdmUgdG8gYW55IGV4aXN0aW5nIHRlbXBsYXRlJywKKTsKCjE7Cg==</File>
    </Filelist>

    <!-- Database operations: Install -->
    <DatabaseInstall Type="post">

        <!-- Checklist Template -->
        <TableCreate Name="checklist_template">
            <Column Name="id" Required="true" PrimaryKey="true" AutoIncrement="true" Type="BIGINT"/>
            <Column Name="name" Required="true" Size="200" Type="VARCHAR"/>
            <Column Name="description" Required="false" Size="2000" Type="VARCHAR"/>
            <Column Name="link_url" Required="false" Size="2000" Type="VARCHAR"/>
            <Column Name="link_text" Required="false" Size="250" Type="VARCHAR"/>
            <Column Name="valid_id" Required="true" Type="SMALLINT"/>
            <Column Name="create_time" Required="true" Type="DATE"/>
            <Column Name="create_by" Required="true" Type="INTEGER"/>
            <Column Name="change_time" Required="true" Type="DATE"/>
            <Column Name="change_by" Required="true" Type="INTEGER"/>
            <Index Name="checklist_template_name">
                <IndexColumn Name="name"/>
            </Index>
            <Index Name="checklist_template_valid_id">
                <IndexColumn Name="valid_id"/>
            </Index>
            <ForeignKey ForeignTable="valid">
                <Reference Local="valid_id" Foreign="id"/>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Local="create_by" Foreign="id"/>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Local="change_by" Foreign="id"/>
            </ForeignKey>
        </TableCreate>

        <!-- Checklist Template Items -->
        <TableCreate Name="checklist_template_item">
            <Column Name="id" Required="true" PrimaryKey="true" AutoIncrement="true" Type="BIGINT"/>
            <Column Name="checklist_template_id" Required="true" Type="BIGINT"/>
            <Column Name="item_type" Required="true" Size="20" Type="VARCHAR" Default="checkbox"/>
            <Column Name="title" Required="true" Size="250" Type="VARCHAR"/>
            <Column Name="description" Required="false" Size="2000" Type="VARCHAR"/>
            <Column Name="config" Required="false" Type="LONGBLOB"/>
            <Column Name="link_url" Required="false" Size="2000" Type="VARCHAR"/>
            <Column Name="link_text" Required="false" Size="250" Type="VARCHAR"/>
            <Column Name="is_mandatory" Required="true" Type="SMALLINT"/>
            <Column Name="sort_order" Required="true" Type="INTEGER"/>
            <Column Name="create_time" Required="true" Type="DATE"/>
            <Column Name="create_by" Required="true" Type="INTEGER"/>
            <Column Name="change_time" Required="true" Type="DATE"/>
            <Column Name="change_by" Required="true" Type="INTEGER"/>
            <Index Name="checklist_template_item_template_id">
                <IndexColumn Name="checklist_template_id"/>
            </Index>
            <Index Name="checklist_template_item_sort">
                <IndexColumn Name="checklist_template_id"/>
                <IndexColumn Name="sort_order"/>
            </Index>
            <ForeignKey ForeignTable="checklist_template">
                <Reference Local="checklist_template_id" Foreign="id"/>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Local="create_by" Foreign="id"/>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Local="change_by" Foreign="id"/>
            </ForeignKey>
        </TableCreate>

        <!-- Template-Queue Mapping -->
        <TableCreate Name="checklist_template_queue">
            <Column Name="id" Required="true" PrimaryKey="true" AutoIncrement="true" Type="BIGINT"/>
            <Column Name="checklist_template_id" Required="true" Type="BIGINT"/>
            <Column Name="queue_id" Required="true" Type="INTEGER"/>
            <Column Name="create_time" Required="true" Type="DATE"/>
            <Column Name="create_by" Required="true" Type="INTEGER"/>
            <Index Name="checklist_tpl_queue_template_id">
                <IndexColumn Name="checklist_template_id"/>
            </Index>
            <Index Name="checklist_tpl_queue_queue_id">
                <IndexColumn Name="queue_id"/>
            </Index>
            <Unique Name="checklist_template_queue_unique">
                <UniqueColumn Name="checklist_template_id"/>
                <UniqueColumn Name="queue_id"/>
            </Unique>
            <ForeignKey ForeignTable="checklist_template">
                <Reference Local="checklist_template_id" Foreign="id"/>
            </ForeignKey>
            <ForeignKey ForeignTable="queue">
                <Reference Local="queue_id" Foreign="id"/>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Local="create_by" Foreign="id"/>
            </ForeignKey>
        </TableCreate>

        <!-- Ticket Checklist Instance -->
        <TableCreate Name="ticket_checklist">
            <Column Name="id" Required="true" PrimaryKey="true" AutoIncrement="true" Type="BIGINT"/>
            <Column Name="ticket_id" Required="true" Type="BIGINT"/>
            <Column Name="checklist_template_id" Required="false" Type="BIGINT"/>
            <Column Name="name" Required="true" Size="200" Type="VARCHAR"/>
            <Column Name="description" Required="false" Size="2000" Type="VARCHAR"/>
            <Column Name="link_url" Required="false" Size="2000" Type="VARCHAR"/>
            <Column Name="link_text" Required="false" Size="250" Type="VARCHAR"/>
            <Column Name="create_time" Required="true" Type="DATE"/>
            <Column Name="create_by" Required="true" Type="INTEGER"/>
            <Column Name="change_time" Required="true" Type="DATE"/>
            <Column Name="change_by" Required="true" Type="INTEGER"/>
            <Index Name="ticket_checklist_ticket_id">
                <IndexColumn Name="ticket_id"/>
            </Index>
            <Index Name="ticket_checklist_template_id">
                <IndexColumn Name="checklist_template_id"/>
            </Index>
            <ForeignKey ForeignTable="ticket">
                <Reference Local="ticket_id" Foreign="id"/>
            </ForeignKey>
            <ForeignKey ForeignTable="checklist_template">
                <Reference Local="checklist_template_id" Foreign="id"/>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Local="create_by" Foreign="id"/>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Local="change_by" Foreign="id"/>
            </ForeignKey>
        </TableCreate>

        <!-- Ticket Checklist Items -->
        <TableCreate Name="ticket_checklist_item">
            <Column Name="id" Required="true" PrimaryKey="true" AutoIncrement="true" Type="BIGINT"/>
            <Column Name="ticket_checklist_id" Required="true" Type="BIGINT"/>
            <Column Name="item_type" Required="true" Size="20" Type="VARCHAR" Default="checkbox"/>
            <Column Name="title" Required="true" Size="250" Type="VARCHAR"/>
            <Column Name="description" Required="false" Size="2000" Type="VARCHAR"/>
            <Column Name="config" Required="false" Type="LONGBLOB"/>
            <Column Name="link_url" Required="false" Size="2000" Type="VARCHAR"/>
            <Column Name="link_text" Required="false" Size="250" Type="VARCHAR"/>
            <Column Name="is_mandatory" Required="true" Type="SMALLINT"/>
            <Column Name="state" Required="true" Size="20" Type="VARCHAR"/>
            <Column Name="item_value" Required="false" Type="LONGBLOB"/>
            <Column Name="remarks" Required="false" Type="LONGBLOB"/>
            <Column Name="sort_order" Required="true" Type="INTEGER"/>
            <Column Name="completed_time" Required="false" Type="DATE"/>
            <Column Name="completed_by" Required="false" Type="INTEGER"/>
            <Column Name="create_time" Required="true" Type="DATE"/>
            <Column Name="create_by" Required="true" Type="INTEGER"/>
            <Column Name="change_time" Required="true" Type="DATE"/>
            <Column Name="change_by" Required="true" Type="INTEGER"/>
            <Index Name="ticket_checklist_item_cl_id">
                <IndexColumn Name="ticket_checklist_id"/>
            </Index>
            <Index Name="ticket_checklist_item_state">
                <IndexColumn Name="ticket_checklist_id"/>
                <IndexColumn Name="state"/>
            </Index>
            <Index Name="ticket_checklist_item_sort">
                <IndexColumn Name="ticket_checklist_id"/>
                <IndexColumn Name="sort_order"/>
            </Index>
            <ForeignKey ForeignTable="ticket_checklist">
                <Reference Local="ticket_checklist_id" Foreign="id"/>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Local="completed_by" Foreign="id"/>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Local="create_by" Foreign="id"/>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Local="change_by" Foreign="id"/>
            </ForeignKey>
        </TableCreate>

        <!-- Create ChecklistManager group -->
        <Insert Table="permission_groups">
            <Data Key="name" Type="Quote">ChecklistManager</Data>
            <Data Key="comments" Type="Quote">Group for users who can manage checklist templates</Data>
            <Data Key="valid_id">1</Data>
            <Data Key="create_time">current_timestamp</Data>
            <Data Key="create_by">1</Data>
            <Data Key="change_time">current_timestamp</Data>
            <Data Key="change_by">1</Data>
        </Insert>

    </DatabaseInstall>

    <!--
        Database Uninstall: Tables are NOT dropped on purpose!
        This preserves checklist data for reinstallation scenarios.
        To completely remove all data, manually drop these tables:
        - ticket_checklist_item
        - ticket_checklist
        - checklist_template_queue
        - checklist_template_item
        - checklist_template
        And delete from permission_groups WHERE name = 'ChecklistManager'
    -->

    <!-- Code install/uninstall operations -->
    <CodeInstall Type="post"><![CDATA[
        # Rebuild config cache
        $Kernel::OM->Get('Kernel::System::Cache')->CleanUp();
        $Kernel::OM->Get('Kernel::System::SysConfig')->ConfigurationDeploy(
            Comments => 'Checklist package installed',
            UserID   => 1,
            Force    => 1,
        );
    ]]></CodeInstall>

    <CodeUninstall Type="pre"><![CDATA[
        # Cleanup before uninstall
        $Kernel::OM->Get('Kernel::System::Cache')->CleanUp();
    ]]></CodeUninstall>

    <CodeUpgrade Type="post" Version="7.2.1"><![CDATA[
        my $SysConfigObject = $Kernel::OM->Get('Kernel::System::SysConfig');

        # Alte Settings zuruecksetzen (falls vorhanden)
        for my $SettingName (
            'Frontend::Navigation###AgentTicketChecklist###002-Checklist',
        ) {
            my %Setting = $SysConfigObject->SettingGet( Name => $SettingName );
            if (%Setting) {
                $SysConfigObject->SettingReset( Name => $SettingName, UserID => 1 );
            }
        }

        # Cache leeren und SysConfig neu deployen
        $Kernel::OM->Get('Kernel::System::Cache')->CleanUp();
        $SysConfigObject->ConfigurationDeploy(
            Comments => 'Checklist package upgraded to 7.2.1 - Main menu entry added',
            UserID   => 1,
            Force    => 1,
        );
    ]]></CodeUpgrade>

    <!-- Intro texts -->
    <IntroInstall Type="pre" Title="Install Information" Lang="en"><![CDATA[
        <h1>Checklist Add-on for Znuny</h1>
        <p>This package adds checklist functionality to Znuny tickets.</p>
        <p><strong>Features:</strong></p>
        <ul>
            <li>Create and manage checklist templates</li>
            <li>Assign templates to queues (with sub-queue inheritance)</li>
            <li>Add multiple checklists to tickets</li>
            <li>Mandatory and optional checklist items</li>
            <li>Block ticket closure until mandatory items are complete</li>
            <li>Sidebar widget and dedicated tab view</li>
        </ul>
    ]]></IntroInstall>

    <IntroInstall Type="pre" Title="Installationsinformationen" Lang="de"><![CDATA[
        <h1>Checklisten Add-on fuer Znuny</h1>
        <p>Dieses Paket fuegt Checklisten-Funktionalitaet zu Znuny-Tickets hinzu.</p>
        <p><strong>Funktionen:</strong></p>
        <ul>
            <li>Checklisten-Vorlagen erstellen und verwalten</li>
            <li>Vorlagen zu Queues zuordnen (mit Vererbung an Unter-Queues)</li>
            <li>Mehrere Checklisten pro Ticket</li>
            <li>Pflicht- und optionale Checklistenpunkte</li>
            <li>Ticket-Schliessen blockieren bis Pflichtpunkte erledigt</li>
            <li>Sidebar-Widget und eigener Tab</li>
        </ul>
    ]]></IntroInstall>

    <IntroUpgrade Type="pre" Title="Upgrade Information" Lang="en" Version="7.2.1"><![CDATA[
        <h1>Upgrading to Checklist 7.2.1</h1>
        <p><strong>Menu navigation added:</strong></p>
        <p>The checklist template management is now accessible via the main menu:</p>
        <p><strong>Checklists</strong></p>
    ]]></IntroUpgrade>

    <IntroUpgrade Type="pre" Title="Upgrade-Informationen" Lang="de" Version="7.2.1"><![CDATA[
        <h1>Upgrade auf Checklist 7.2.1</h1>
        <p><strong>Menuefuehrung hinzugefuegt:</strong></p>
        <p>Die Checklisten-Vorlagenverwaltung ist jetzt ueber das Hauptmenue erreichbar:</p>
        <p><strong>Checklisten</strong></p>
    ]]></IntroUpgrade>

    <IntroUninstall Type="pre" Title="Uninstall Information" Lang="en"><![CDATA[
        <h1>Uninstalling Checklist Add-on</h1>
        <p><strong>Note:</strong> Your checklist data will be preserved!</p>
        <p>The following data remains in the database for reinstallation:</p>
        <ul>
            <li>All checklist templates</li>
            <li>All ticket checklists and their items</li>
            <li>Queue assignments</li>
        </ul>
        <p>To completely remove all data, manually delete the database tables after uninstallation.</p>
    ]]></IntroUninstall>

    <IntroUninstall Type="pre" Title="Deinstallationsinformationen" Lang="de"><![CDATA[
        <h1>Deinstallation des Checklisten Add-ons</h1>
        <p><strong>Hinweis:</strong> Ihre Checklisten-Daten bleiben erhalten!</p>
        <p>Folgende Daten verbleiben fuer eine Reinstallation in der Datenbank:</p>
        <ul>
            <li>Alle Checklisten-Vorlagen</li>
            <li>Alle Ticket-Checklisten und deren Eintraege</li>
            <li>Queue-Zuordnungen</li>
        </ul>
        <p>Um alle Daten vollstaendig zu entfernen, loeschen Sie die Datenbank-Tabellen nach der Deinstallation manuell.</p>
    ]]></IntroUninstall>

</otrs_package>
