ITSMIncidentProblemManagement
6.0.9
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 6 patch level 9.
Build for OTRS::ITSM 6 patch level 8.
Build for OTRS::ITSM 6 patch level 7.
Build for OTRS::ITSM 6 patch level 6.
Build for OTRS::ITSM 6 patch level 5.
Build for OTRS::ITSM 6 patch level 4.
Build for OTRS::ITSM 6 patch level 3.
Build for OTRS::ITSM 6 patch level 2.
Build for OTRS::ITSM 6.
Build for OTRS::ITSM 6 rc1.
Build for OTRS::ITSM 6 beta3.
Build for OTRS::ITSM 6 beta2.
Build for OTRS::ITSM 6 beta1.
The OTRS::ITSM Incident and Problem Management package.
Das OTRS::ITSM Incident und Problem Management Paket.
Paquete Incident and Problem Management de OTRS::ITSM.
Az OTRS::ITSM incidens- és problémamenedzsment csomag.
6.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to install the OTRS package ITSMIncidentProblemManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OTRS PACKAGES</strong>
<ul>
<li>ITSMCore 6.0.9</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OTRS-Paket ITSMIncidentProblemManagement zu installieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OTRS-PAKETE</strong>
<ul>
<li>ITSMCore 6.0.9</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>BIENVENIDO</strong>
<br/>
<br/>
Usted esta apunto de instalar el paquete ITSMIncidentProblemManagement de OTRS.<br/>
<br/>
<br/>
<strong>PAQUETES OTRS REQUERIDOS</strong>
<ul>
<li>ITSMCore 6.0.9</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ÜDVÖZÖLJÜK</strong>
<br/>
<br/>
Ön az ITSMIncidentProblemManagement OTRS csomag telepítésére készül.<br/>
<br/>
<br/>
<strong>SZÜKSÉGES OTRS CSOMAGOK</strong>
<ul>
<li>ITSMCore 6.0.9</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
If you uninstall this package, the ticket types and states that were added during installation will be deactivated.
They can be activated again in the admin area.
<br/>
<br/>
The statistics that are associated with this package, will no longer be available if the package is uninstalled.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ACHTUNG</strong>
<br/>
<br/>
Bei der Deinstallation werden die von diesem Paket angelegten Ticket-Typen und -Status deaktiviert.
Diese können jederzeit im Admin-Bereich wieder aktiviert werden.
<br/>
<br/>
Nach der Deinstallation sind die zu diesem Paket zugehörigen Statistiken nicht mehr verfügbar.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
Si usted desinstala este paquete, los tipos de ticket y estados que fueron agregados durante la instalación serán desactivados.
Pueden ser activados de nuevo en el área de admin.
<br/>
<br/>
Las estadísticas asociadas a este paquete no estarán disponibles si desinstala el paquete.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>FIGYELEM</strong>
<br/>
<br/>
Ha eltávolítja ezt a csomagot, akkor a telepítés során hozzáadott jegytípusok és állapotok ki lesznek kapcsolva.
Ezek az adminisztrációs területen kapcsolhatók be ismét.
<br/>
<br/>
Az ehhez a csomaghoz hozzárendelt statisztikák többé nem lesznek elérhetők, ha a csomagot eltávolítják.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to upgrade the OTRS package ITSMIncidentProblemManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OTRS PACKAGES</strong>
<ul>
<li>ITSMCore 6.0.9</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OTRS-Paket ITSMIncidentProblemManagement zu aktualisieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OTRS-PAKETE</strong>
<ul>
<li>ITSMCore 6.0.9</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>BIENVENIDO</strong>
<br/>
<br/>
Usted esta apunto de actualizar el paquete ITSMIncidentProblemManagement de OTRS.<br/>
<br/>
<br/>
<strong>PAQUETES OTRS REQUERIDOS</strong>
<ul>
<li>ITSMCore 6.0.9</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ÜDVÖZÖLJÜK</strong>
<br/>
<br/>
Ön az ITSMIncidentProblemManagement OTRS csomag frissítésére készül.<br/>
<br/>
<br/>
<strong>SZÜKSÉGES OTRS CSOMAGOK</strong>
<ul>
<li>ITSMCore 6.0.9</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
ITSMCore
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeInstall();
# uninstall Feature AddOn OTRSServiceIncidentState that has been integrated in OTRS::ITSM 3.2.91 (OTRS::ITSM 3.3.0 Beta 1)
$Kernel::OM->Get('Kernel::System::Package')->_PackageUninstallMerged(
Name => 'OTRSServiceIncidentState',
);
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgradeFromLowerThan_3_2_91();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgradeFromLowerThan_4_0_2();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgrade();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeUninstall();
{
# cleanup stats list (only stats related to the given stat objects)
$Kernel::OM->Get('Kernel::System::Stats')->StatsCleanUp(
ObjectNames => [
'ITSMTicketFirstLevelSolutionRate',
'ITSMTicketSolutionTimeAverage',
],
UserID => 1,
);
}
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeReinstall();
2018-07-17 13:17:11
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkNvbmZpZyI+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kUmVnaXN0cmF0aW9uIj4KICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXBSbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5BZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5BZGRpdGlvbmFsIElUU00gRmllbGRzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjMDAzLUlUU01UaWNrZXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQWdlbnQuVGlja2V0QWN0aW9uQ29tbW9uLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LlRpY2tldEZvcm1EcmFmdC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudFRpY2tldERlY2lzaW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPlRpY2tldCBkZWNpc2lvbi48L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5EZWNpc2lvbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRUaWNrZXREZWNpc2lvbiMjIzAwMy1JVFNNVGlja2V0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJKYXZhU2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQWdlbnQuVGlja2V0QWN0aW9uLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LlRpY2tldEFjdGlvbkNvbW1vbi5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5UaWNrZXRGb3JtRHJhZnQuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMzE1LUFkZHRsSVRTTUZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRab29tOjpNZW51TW9kdWxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnU6OkdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+QWRkaXRpb25hbCBJVFNNIEZpZWxkczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIHRoZSBJVFNNIGZpZWxkcyE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQ7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQb3B1cFR5cGUiPlRpY2tldEFjdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjNDIwLURlY2lzaW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0Wm9vbTo6TWVudU1vZHVsZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRNZW51OjpHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkRlY2lzaW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5BZGQgYSBkZWNpc2lvbiE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXREZWNpc2lvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0RGVjaXNpb247VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQb3B1cFR5cGUiPlRpY2tldEFjdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0QWRkdGxJVFNNRmllbGQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5ydzwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1JlcXVpcmVkTG9jayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc24ndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1RpY2tldFR5cGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1NlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0QWRkdGxJVFNNRmllbGQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjU2VydmljZU1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIHNlcnZpY2UgbXVzdCBiZSBzZWxlY3RlZCBieSB0aGUgYWdlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1NMQU1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIFNMQSBtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0QWRkdGxJVFNNRmllbGQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjUXVldWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgcXVldWUgaW4gdGhlIHRpY2tldCByZXNwb25zaWJsZSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1F1ZXVlTWFuZGF0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgaWYgcXVldWUgbXVzdCBiZSBzZWxlY3RlZCBieSB0aGUgYWdlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI093bmVyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRBZGR0bElUU01GaWVsZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNPd25lck1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIHRpY2tldCBvd25lciBtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0QWRkdGxJVFNNRmllbGQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjUmVzcG9uc2libGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1Jlc3BvbnNpYmxlTWFuZGF0b3J5IiBVc2VyUHJlZmVyZW5jZXNHcm91cD0iQWR2YW5jZWQiIFVzZXJNb2RpZmljYXRpb25Qb3NzaWJsZT0iMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIHRpY2tldCByZXNwb25zaWJsZSBtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0QWRkdGxJVFNNRmllbGQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjU3RhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRBZGR0bElUU01GaWVsZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdGF0ZU1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIHN0YXRlIG11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRBZGR0bElUU01GaWVsZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdGF0ZVR5cGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRBZGR0bElUU01GaWVsZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtIFRyYW5zbGF0YWJsZT0iMSI+b3BlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFRyYW5zbGF0YWJsZT0iMSI+Y2xvc2VkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVHJhbnNsYXRhYmxlPSIxIj5wZW5kaW5nIHJlbWluZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVHJhbnNsYXRhYmxlPSIxIj5wZW5kaW5nIGF1dG88L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdGF0ZURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iU3RhdGUiIFZhbHVlUmVnZXg9IiI+b3BlbjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI05vdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+QWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRBZGR0bElUU01GaWVsZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNOb3RlTWFuZGF0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgaWYgbm90ZSBtdXN0IGJlIGZpbGxlZCBpbiBieSB0aGUgYWdlbnQuIENhbiBiZSBvdmVyd3JpdHRlbiBieSBUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0QWRkdGxJVFNNRmllbGQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjU3ViamVjdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjQm9keSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJUZXh0YXJlYSI+PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjSW52b2x2ZWRBZ2VudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0luZm9ybUFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRBZGR0bElUU01GaWVsZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNJc1Zpc2libGVGb3JDdXN0b21lckRlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgbm90ZSBpbiB0aGUgdGlja2V0IG5vdGUgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgaXMgdmlzaWJsZSBmb3IgdGhlIGN1c3RvbWVyIGJ5IGRlZmF1bHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1ByaW9yaXR5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRBZGR0bElUU01GaWVsZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNQcmlvcml0eURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0QWRkdGxJVFNNRmllbGQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJQcmlvcml0eSIgVmFsdWVSZWdleD0iIj4zIG5vcm1hbDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1RpdGxlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0QWRkdGxJVFNNRmllbGQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjRm9ybURyYWZ0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbG93cyB0byBzYXZlIGN1cnJlbnQgd29yayBhcyBkcmFmdCBpbiB0aGUgdGlja2V0IG5vdGUgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0hpc3RvcnlUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRBZGR0bElUU01GaWVsZDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPkFkZE5vdGU8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNIaXN0b3J5Q29tbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0QWRkdGxJVFNNRmllbGQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj4lJUZyZWVUZXh0PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEFkZHRsSVRTTUZpZWxkPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj4wIC0gRGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPjEgLSBFbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMiIgVHJhbnNsYXRhYmxlPSIxIj4yIC0gRW5hYmxlZCBhbmQgcmVxdWlyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmVwYWlyU3RhcnRUaW1lIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZWNvdmVyeVN0YXJ0VGltZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRHVlRGF0ZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0QWRkdGxJVFNNRmllbGQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXREZWNpc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPnJ3PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUmVxdWlyZWRMb2NrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXREZWNpc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNUaWNrZXRUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldERlY2lzaW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1NlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXREZWNpc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNTZXJ2aWNlTWFuZGF0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgaWYgc2VydmljZSBtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0RGVjaXNpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU0xBTWFuZGF0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgaWYgU0xBIG11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXREZWNpc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNRdWV1ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBxdWV1ZSBpbiB0aGUgdGlja2V0IG5vdGUgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXREZWNpc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNRdWV1ZU1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIHF1ZXVlIG11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXREZWNpc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNPd25lciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXREZWNpc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNPd25lck1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIHRpY2tldCBvd25lciBtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0RGVjaXNpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUmVzcG9uc2libGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0RGVjaXNpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUmVzcG9uc2libGVNYW5kYXRvcnkiIFVzZXJQcmVmZXJlbmNlc0dyb3VwPSJBZHZhbmNlZCIgVXNlck1vZGlmaWNhdGlvblBvc3NpYmxlPSIxIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgaWYgdGlja2V0IHJlc3BvbnNpYmxlIG11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXREZWNpc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNTdGF0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0RGVjaXNpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3RhdGVNYW5kYXRvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyBpZiBzdGF0ZSBtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0RGVjaXNpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3RhdGVUeXBlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXREZWNpc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtIFRyYW5zbGF0YWJsZT0iMSI+b3BlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFRyYW5zbGF0YWJsZT0iMSI+Y2xvc2VkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVHJhbnNsYXRhYmxlPSIxIj5wZW5kaW5nIHJlbWluZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVHJhbnNsYXRhYmxlPSIxIj5wZW5kaW5nIGF1dG88L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNTdGF0ZURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0RGVjaXNpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkVudGl0eSIgVmFsdWVFbnRpdHlUeXBlPSJTdGF0ZSIgVmFsdWVSZWdleD0iIj5vcGVuPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjTm90ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0RGVjaXNpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjTm90ZU1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIG5vdGUgbXVzdCBiZSBmaWxsZWQgaW4gYnkgdGhlIGFnZW50LiBDYW4gYmUgb3ZlcndyaXR0ZW4gYnkgVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldERlY2lzaW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1N1YmplY3QiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldERlY2lzaW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjQm9keSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0RGVjaXNpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlRleHRhcmVhIj48L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNJbnZvbHZlZEFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXREZWNpc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNJbmZvcm1BZ2VudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXREZWNpc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNJc1Zpc2libGVGb3JDdXN0b21lckRlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgbm90ZSBpbiB0aGUgdGlja2V0IG5vdGUgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgaXMgdmlzaWJsZSBmb3IgdGhlIGN1c3RvbWVyIGJ5IGRlZmF1bHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldERlY2lzaW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1ByaW9yaXR5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldERlY2lzaW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1ByaW9yaXR5RGVmYXVsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldERlY2lzaW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUHJpb3JpdHkiIFZhbHVlUmVnZXg9IiI+MyBub3JtYWw8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNUaXRsZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0RGVjaXNpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjRm9ybURyYWZ0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbG93cyB0byBzYXZlIGN1cnJlbnQgd29yayBhcyBkcmFmdCBpbiB0aGUgdGlja2V0IG5vdGUgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldERlY2lzaW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0hpc3RvcnlUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldERlY2lzaW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+QWRkTm90ZTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0hpc3RvcnlDb21tZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldERlY2lzaW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9IiI+JSVOb3RlPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0RGVjaXNpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPjAgLSBEaXNhYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MSAtIEVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIyIiBUcmFuc2xhdGFibGU9IjEiPjIgLSBFbmFibGVkIGFuZCByZXF1aXJlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EZWNpc2lvblJlc3VsdCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRGVjaXNpb25EYXRlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXREZWNpc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlN0YXRzOjpEeW5hbWljT2JqZWN0UmVnaXN0cmF0aW9uIyMjSVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlN0YXRzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNVGlja2V0Rmlyc3RMZXZlbFNvbHV0aW9uUmF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJTdGF0czo6RHluYW1pY09iamVjdFJlZ2lzdHJhdGlvbiMjI0lUU01UaWNrZXRTb2x1dGlvblRpbWVBdmVyYWdlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6U3RhdHM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01UaWNrZXRTb2x1dGlvblRpbWVBdmVyYWdlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmUjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0UGhvbmVOZXc8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEVtYWlsIyMjU2hvd0luY2lkZW50U3RhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldEVtYWlsTmV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDbG9zZSMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRDbG9zZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RnJlZVRleHQjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0RnJlZVRleHQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldE5vdGUjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0Tm90ZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0T3duZXIjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0T3duZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFBlbmRpbmcjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0UGVuZGluZzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UHJpb3JpdHkjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0UHJpb3JpdHk8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFJlc3BvbnNpYmxlIyMjU2hvd0luY2lkZW50U3RhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldFJlc3BvbnNpYmxlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iQUNMS2V5c0xldmVsMzo6QWN0aW9ucyMjIzEwMC1EZWZhdWx0LUlUU00iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB3aGljaCBpdGVtcyBhcmUgYXZhaWxhYmxlIGZvciAnQWN0aW9uJyBpbiB0aGlyZCBsZXZlbCBvZiB0aGUgQUNMIHN0cnVjdHVyZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlRpY2tldDo6QUNMPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPEl0ZW0+QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkFnZW50VGlja2V0RGVjaXNpb248L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmRSZWdpc3RyYXRpb24iPgogICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPk1vZHVsZSB0byBkeW5hbWljYWxseSBzaG93IHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCB0byBjYWxjdWxhdGUgdGhlIHByaW9yaXR5LjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlNlcnZpY2UgSW5jaWRlbnQgU3RhdGUgYW5kIFByaW9yaXR5IENhbGN1bGF0aW9uPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpPdXRwdXQ6OkZpbHRlckVsZW1lbnRQb3N0IyMjSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TW9kaWZpZXMgdGhlIGRpc3BsYXkgb3JkZXIgb2YgdGhlIGR5bmFtaWMgZmllbGQgSVRTTUltcGFjdCBhbmQgb3RoZXIgdGhpbmdzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6Ok91dHB1dEZpbHRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpGaWx0ZXJFbGVtZW50UG9zdDo6SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlYnVnIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUZW1wbGF0ZXMiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50VGlja2V0UGhvbmUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWdlbnRUaWNrZXRFbWFpbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBZ2VudFRpY2tldENsb3NlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50VGlja2V0RnJlZVRleHQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWdlbnRUaWNrZXROb3RlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50VGlja2V0T3duZXIiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWdlbnRUaWNrZXRQZW5kaW5nIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50VGlja2V0UHJpb3JpdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWdlbnRUaWNrZXRSZXNwb25zaWJsZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFnZW50VGlja2V0RGVjaXNpb24iPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQWdlbnRUaWNrZXRab29tIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3Ryc19jb25maWc+Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6VHlwZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpUaWNrZXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFBob25lIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgcGhvbmUgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldFBob25lTmV3PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj4wIC0gRGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPjEgLSBFbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMiIgVHJhbnNsYXRhYmxlPSIxIj4yIC0gRW5hYmxlZCBhbmQgcmVxdWlyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNSW1wYWN0IiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EdWVEYXRlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRFbWFpbCMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IGVtYWlsIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRFbWFpbE5ldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iU2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjAiIFRyYW5zbGF0YWJsZT0iMSI+MCAtIERpc2FibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj4xIC0gRW5hYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjIiIFRyYW5zbGF0YWJsZT0iMSI+MiAtIEVuYWJsZWQgYW5kIHJlcXVpcmVkPC9JdGVtPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUltcGFjdCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRHVlRGF0ZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0U2VhcmNoIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRTZWFyY2g8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPjAgLSBEaXNhYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MSAtIEVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIyIiBUcmFuc2xhdGFibGU9IjEiPjIgLSBFbmFibGVkIGFuZCByZXF1aXJlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01JbXBhY3QiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTVJldmlld1JlcXVpcmVkIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EZWNpc2lvblJlc3VsdCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmVwYWlyU3RhcnRUaW1lIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZWNvdmVyeVN0YXJ0VGltZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRGVjaXNpb25EYXRlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EdWVEYXRlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRab29tIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0Wm9vbTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iU2VsZWN0IiBTZWxlY3RlZElEPScwJz4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjAiIFRyYW5zbGF0YWJsZT0iMSI+MCAtIERpc2FibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj4xIC0gRW5hYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjIiIFRyYW5zbGF0YWJsZT0iMSI+MiAtIEVuYWJsZWQgYW5kIHJlcXVpcmVkPC9JdGVtPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUltcGFjdCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNQ3JpdGljYWxpdHkiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTVJldmlld1JlcXVpcmVkIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EZWNpc2lvblJlc3VsdCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmVwYWlyU3RhcnRUaW1lIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZWNvdmVyeVN0YXJ0VGltZSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRGVjaXNpb25EYXRlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EdWVEYXRlIiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQcmlvcml0eSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRQcmlvcml0eTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iU2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjAiIFRyYW5zbGF0YWJsZT0iMSI+MCAtIERpc2FibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj4xIC0gRW5hYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjIiIFRyYW5zbGF0YWJsZT0iMSI+MiAtIEVuYWJsZWQgYW5kIHJlcXVpcmVkPC9JdGVtPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUltcGFjdCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q2xvc2UjIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBjbG9zZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0Q2xvc2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPjAgLSBEaXNhYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MSAtIEVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIyIiBUcmFuc2xhdGFibGU9IjEiPjIgLSBFbmFibGVkIGFuZCByZXF1aXJlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZXZpZXdSZXF1aXJlZCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IGNvbXBvc2Ugc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldENvbXBvc2U8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPjAgLSBEaXNhYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MSAtIEVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIyIiBUcmFuc2xhdGFibGU9IjEiPjIgLSBFbmFibGVkIGFuZCByZXF1aXJlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZXZpZXdSZXF1aXJlZCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UHJpb3JpdHkjIyNUaWNrZXRUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0UHJpb3JpdHk8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFByaW9yaXR5IyMjU2VydmljZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6VGlja2V0UHJpb3JpdHk8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldFpvb20jIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkN1c3RvbWVyOjpWaWV3OjpUaWNrZXRab29tPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj4wIC0gRGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPjEgLSBFbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMiIgVHJhbnNsYXRhYmxlPSIxIj4yIC0gRW5hYmxlZCBhbmQgcmVxdWlyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNSW1wYWN0IiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01Dcml0aWNhbGl0eSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudFRpY2tldENsb3NlIyMjMDAyLVRpY2tldElUU01UaWNrZXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudFRpY2tldEZyZWVUZXh0IyMjMDAyLVRpY2tldElUU01UaWNrZXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkphdmFTY3JpcHQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+SVRTTS5BZ2VudC5JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudFRpY2tldE5vdGUjIyMwMDItVGlja2V0SVRTTVRpY2tldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50VGlja2V0T3duZXIjIyMwMDItVGlja2V0SVRTTVRpY2tldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFnZW50LklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkFnZW50VGlja2V0UGVuZGluZyMjIzAwMi1UaWNrZXRJVFNNVGlja2V0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJKYXZhU2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRUaWNrZXRQcmlvcml0eSMjIzAwMi1UaWNrZXRJVFNNVGlja2V0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJKYXZhU2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRUaWNrZXRSZXNwb25zaWJsZSMjIzAwMi1UaWNrZXRJVFNNVGlja2V0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJKYXZhU2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRUaWNrZXRQaG9uZSMjIzAwMi1UaWNrZXRJVFNNVGlja2V0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJKYXZhU2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWdlbnRUaWNrZXRFbWFpbCMjIzAwMi1UaWNrZXRJVFNNVGlja2V0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJKYXZhU2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPklUU00uQWdlbnQuSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFByaW50IyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgcHJpbnQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OlRpY2tldFByaW50PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8RGVmYXVsdEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMCIgVHJhbnNsYXRhYmxlPSIxIj4wIC0gRGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIxIiBUcmFuc2xhdGFibGU9IjEiPjEgLSBFbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMiIgVHJhbnNsYXRhYmxlPSIxIj4yIC0gRW5hYmxlZCBhbmQgcmVxdWlyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNQ3JpdGljYWxpdHkiIFNlbGVjdGVkSUQ9IjEiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUltcGFjdCIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0UHJpbnQjIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBwcmludCBzY3JlZW4gb2YgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpDdXN0b21lcjo6Vmlldzo6VGlja2V0UHJpbnQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIwIiBUcmFuc2xhdGFibGU9IjEiPjAgLSBEaXNhYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjEiIFRyYW5zbGF0YWJsZT0iMSI+MSAtIEVuYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSIyIiBUcmFuc2xhdGFibGU9IjEiPjIgLSBFbmFibGVkIGFuZCByZXF1aXJlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDwvRGVmYXVsdEl0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01Dcml0aWNhbGl0eSIgU2VsZWN0ZWRJRD0iMSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNSW1wYWN0IiBTZWxlY3RlZElEPSIxIj48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgo8L290cnNfY29uZmlnPgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6YmdfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ9Ca0YDQuNGC0LjRh9C90L7RgdGCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ9CS0LvQuNGP0L3QuNC1JzsKCiAgICAjIEpTIFRlbXBsYXRlOiBTZXJ2aWNlSW5jaWRlbnRTdGF0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0ZpbHRlckVsZW1lbnRQb3N0L0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgJXMlcyVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiAlcyVzJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ9CY0LfQuNGB0LrQstCwINC/0YDQtdCz0LvQtdC20LTQsNC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAn0KDQtdC30YPQu9GC0LDRgiDQvtGCINGA0LXRiNC10L3QuNC10YLQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAn0JLRgNC10LzQtSDQvdCwINGB0YLQsNGA0YLQuNGA0LDQvdC1INC90LAg0YDQtdC80L7QvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ9CS0YDQtdC80LUg0L3QsCDRgdGC0LDRgNGC0LjRgNCw0L3QtSDQvdCwINCy0YrQt9GB0YLQsNC90L7QstGP0LLQsNC90LXRgtC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICfQlNCw0YLQsCDQt9CwINGA0LXRiNCw0LLQsNC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfQmtGA0LDQudC90LAg0LTQsNGC0LAnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfQv9GA0LjQutC70Y7Rh9C10L0g0YEg0L7QsdGF0L7QtNC90L4g0YDQtdGI0LXQvdC40LUnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ9CU0L7Qv9GK0LvQvdC40YLQtdC70L3QuCBJVFNNINC/0L7Qu9C10YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ9Cg0LXRiNC10L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RpZmllcyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgZHluYW1pYyBmaWVsZCBJVFNNSW1wYWN0IGFuZCBvdGhlciB0aGluZ3MuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlIGFuZCBQcmlvcml0eSBDYWxjdWxhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICcnOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICdTZXJ2aWNlIEluY2lkZW50IFN0YXRlJywKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6Y3NfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpxI1ub3N0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ1ZsaXYnOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRmlsdGVyRWxlbWVudFBvc3QvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiAlcyVzJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mICVzJXMlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnVnnFvmFkdWplIFDFmWVobGVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1bDvXNsZWRlayDFmGXFoWVuw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ8SMYXMgemFow6FqZW7DrSBvcHJhdnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ8SMYXMgemFow6FqZW7DrSBvYm5vdmVuw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0RhdHVtIMWYZcWhZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJyc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ3V6YXbFmWVubyBkb8SNYXNuw71tIMWZZcWhZW7DrW0nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdEb3BsxYh0ZSDFmWXFoWVuw60hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdEb3BsxYhrb3bDoSBJVFNNIHBvbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdabcSbxYh0ZSBJVE1TIHBvbGUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnxZhlxaFlbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RpZmllcyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgZHluYW1pYyBmaWVsZCBJVFNNSW1wYWN0IGFuZCBvdGhlciB0aGluZ3MuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlIGFuZCBQcmlvcml0eSBDYWxjdWxhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICcnOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICdTZXJ2aWNlIEluY2lkZW50IFN0YXRlJywKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGFfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpa2FsaXRldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdQw6V2aXJrbmluZyc7CgogICAgIyBKUyBUZW1wbGF0ZTogU2VydmljZUluY2lkZW50U3RhdGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9GaWx0ZXJFbGVtZW50UG9zdC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mICVzJXMlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgJXMlcyVzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdBbm1lbGRlbHNlIGtyw6Z2ZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnQmVzbHV0bmluZ3NyZXN1bHRhdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnU3RhcnR0aWQgZm9yIHJlcGVyYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ1N0YXJ0dGlkIGZvciBnZW5ldGFibGVyaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdCZXNsdXRuaW5nc2RhdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdGb3JmYWxkc2RhdG8nOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdMdWtrZXQgbWVkIHdvcmthcm91bmQnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdUaWxmw7hqIGVuIGJlc2x1dG5pbmchJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdZZGVybGlnZSBJVFNNIGZlbHRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ1JldCBJVFNNIGZlbHRlciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdCZXNsdXRuaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RpZmllcyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgZHluYW1pYyBmaWVsZCBJVFNNSW1wYWN0IGFuZCBvdGhlciB0aGluZ3MuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlIGFuZCBQcmlvcml0eSBDYWxjdWxhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICcnOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICdTZXJ2aWNlIEluY2lkZW50IFN0YXRlJywKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpa2FsaXTDpHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnQXVzd2lya3VuZyc7CgogICAgIyBKUyBUZW1wbGF0ZTogU2VydmljZUluY2lkZW50U3RhdGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICdTZXJ2aWNlIFZvcmZhbGxzc3RhdHVzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRmlsdGVyRWxlbWVudFBvc3QvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnVGlja2V0IHZlcmtuw7xwZmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiAlcyVzJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mICVzJXMlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnTmFjaGJlYXJiZWl0dW5nIGVyZm9yZGVybGljaCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdFbnRzY2hlaWR1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdHZW5laG1pZ3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ1JlcGFyYXR1ciBTdGFydHplaXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ1dpZWRlcmhlcnN0ZWxsdW5nIFN0YXJ0emVpdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRW50c2NoZWlkdW5nc2RhdHVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRsOkbGxpZ2tlaXRzZGF0dW0nOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdwcm92aXNvcmlzY2ggZ2VzY2hsb3NzZW4nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdIaW56dWbDvGdlbiBlaW5lciBFbnRzY2hlaWR1bmchJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdadXPDpHR6bGljaGUgSVRTTSBGZWxkZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnWnVzw6R0emxpY2hlIElUU00gVGlja2V0ZmVsZGVyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFcmxhdWJ0IGRhcyBIaW56dWbDvGdlbiB2b24gTm90aXplbiBpbiBkZXIgenVzw6R0emxpY2hlbiBJVFNNLU9iZXJmbMOkY2hlIGltIEFnZW50ZW4tSW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0VybGF1YnQgZGFzIEhpbnp1ZsO8Z2VuIHZvbiBOb3RpemVuIGltIEVudHNjaGVpZHVuZ3MtQmlsZHNjaGlybSBpbSBBZ2VudGVuLUludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLid9ID0KICAgICAgICAnRXJtw7ZnbGljaHQgZGllIERlZmluaXRpb24gbmV1ZXIgVGlja2V0LVR5cGVuICAod2VubiBUaWNrZXQtVHlwLUZ1bmt0aW9uIGFrdGl2aWVydCBpc3QpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ8OEbmRlcm4gZGVyIElUU00tRmVsZGVyISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0VudHNjaGVpZHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnQmVzdGltbXQsIG9iIGRpZXNlciBTY3JlZW4gaW0gQWdlbnRlbi1JbnRlcmZhY2UgZGFzIFNwZXJyZW4gZGVzIFRpY2tldHMgdm9yYXVzc2V0enQuIERhcyBUaWNrZXQgd2lyZCAoZmFsbHMgbsO2dGlnKSBnZXNwZXJydCB1bmQgZGVyIGFrdHVlbGxlIEFnZW50IHdpcmQgYWxzIEJlc2l0emVyIGdlc2V0enQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0Jlc3RpbW10LCBvYiBkaWVzZXIgU2NyZWVuIGltIEFnZW50ZW4tSW50ZXJmYWNlIGRhcyBTcGVycmVuIGRlcyBUaWNrZXRzIHZvcmF1c3NldHp0LiBEYXMgVGlja2V0IHdpcmQgKGZhbGxzIG7DtnRpZykgZ2VzcGVycnQgdW5kIGRlciBha3R1ZWxsZSBBZ2VudCB3aXJkIGFscyBCZXNpdHplciBnZXNldHp0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Jlc3RpbW10LCBvYiBkZXIgU2VydmljZSBJbmNpZGVudCBTdGF0dXMgd8OkaHJlbmQgZGVyIFNlcnZpY2UtQXVzd2FobCBpbSBBZ2VudGVuLUludGVyZmFjZSBhbmdlemVpZ3Qgd2VyZGVuIHNvbGwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluaWVydCBkZW4gU3RhbmRhcmQtSW5oYWx0IGVpbmVyIE5vdGl6IGluIGRlciB6dXPDpHR6bGljaGUgSVRTTSBGZWxkZXItT2JlcmZsw6RjaGUgaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRlbiBTdGFuZGFyZC1JbmhhbHQgZWluZXIgTm90aXogaW4gZGVyIEVudHNjaGVpZHVuZ3MtT2JlcmZsw6RjaGUgaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQmVzdGltbXQgZGVuIEZvbGdlc3RhdHVzIGbDvHIgVGlja2V0cywgZsO8ciBkaWUgw7xiZXIgZGllIHp1c8OkdHpsaWNoZW4gSVRTTSBGZWxkZXIgaW0gQWdlbnRlbi1JbnRlcmZhY2UgZWluZSBOb3RpeiBoaW56dWdlZsO8Z3Qgd3VyZGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdCZXN0aW1tdCBkZW4gRm9sZ2VzdGF0dXMgZsO8ciBUaWNrZXRzLCBmw7xyIGRpZSBpbiBkZXIgRW50c2NoZWlkdW5zLU9iZXJmbMOkY2hlIGltIEFnZW50ZW4tSW50ZXJmYWNlIGVpbmUgTm90aXogaGluenVnZWbDvGd0IHd1cmRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGVuIFN0YW5kYXJkLUJldHJlZmYgZWluZXIgTm90aXogaW4gZGVyIHp1c8OkdHpsaWNoZSBJVFNNIEZlbGRlci1PYmVyZmzDpGNoZSBpbSBBZ2VudGVuLUludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGVuIFN0YW5kYXJkLUJldHJlZmYgZWluZXIgTm90aXogaW4gZGVyIEVudHNjaGVpZHVuZ3MtT2JlcmZsw6RjaGUgaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmllcnQgZGllIFN0YW5kYXJkLVByaW9yaXTDpHQgaW4gZGVyIHp1c8OkdHpsaWNoZSBJVFNNIEZlbGRlci1PYmVyZmzDpGNoZSBpbSBBZ2VudGVuLUludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5pZXJ0IGRpZSBTdGFuZGFyZC1Qcmlvcml0w6R0IGluIGRlciBFbnRzY2hlaWR1bmdzLU9iZXJmbMOkY2hlIGltIEFnZW50ZW4tSW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ1N0ZXVlcnQgZGVuIEhpc3Rvcmllbi1Lb21tZW50YXIgZsO8ciBkaWUgQWt0aW9uZW4gaW4gZGVyIE9iZXJmbMOkY2hlIHp1c8OkdHpsaWNoZSBJVFNNLUZlbGRlciBpbSBBZ2VudGVuYmVyZWljaC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ1N0ZXVlcnQgZGVuIEhpc3Rvcmllbi1Lb21tZW50YXIgZsO8ciBkaWUgRW50c2NoZWlkdW5ncy1Ba3Rpb24gaW0gQWdlbnRlbmJlcmVpY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RpZmllcyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgZHluYW1pYyBmaWVsZCBJVFNNSW1wYWN0IGFuZCBvdGhlciB0aGluZ3MuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlIGFuZCBQcmlvcml0eSBDYWxjdWxhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnU2V0enQgZGVuIFNlcnZpY2UgaW4gZGVyIHp1c8OkdHpsaWNoZSBJVFNNLUZlbGRlci1PYmVyZmzDpGNoZSBmw7xyIFRpY2tldHMgaW0gQWdlbnRlbmJlcmVpY2ggKFRpY2tldDo6VHlwZSBtdXNzIGFrdGl2aWVydCBzZWluKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnU2V0enQgZGVuIFNlcnZpY2UgaW4gZGVyIEVudHNjaGVpZHVuZ3MtT2JlcmZsw6RjaGUgZsO8ciBUaWNrZXRzIGltIEFnZW50ZW5iZXJlaWNoIChUaWNrZXQ6OlNlcnZpY2UgbXVzcyBha3RpdmllcnQgc2VpbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnU2V0enQgZGVuIFNlcnZpY2UgaW0gUHJpb3JpdMOkdC1CaWxkc2NoaXJtIGbDvHIgVGlja2V0cyBpbSBBZ2VudGVuYmVyZWljaCAoVGlja2V0OjpTZXJ2aWNlIG11c3MgYWt0aXZpZXJ0IHNlaW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NldHp0IGRlbiBUaWNrZXQtQmVzaXR6ZXIgaW4gZGVyIHp1c8OkdHpsaWNoZSBJVFNNIEZlbGRlci1PYmVyZmzDpGNoZSBpbSBBZ2VudGVuLUludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NldHp0IGRlbiBCZXNpdHplciBpbiBkZXIgRW50c2NoZWlkdW5ncy1PYmVyZmzDpGNoZSBmw7xyIFRpY2tldHMgaW0gQWdlbnRlbmJlcmVpY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2V0enQgZGVuIFRpY2tldC1WZXJhbnR3b3J0bGljaGVuIGluIGRlciB6dXPDpHR6bGljaGUgSVRTTSBGZWxkZXItT2JlcmZsw6RjaGUgaW0gQWdlbnRlbi1JbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZXR6dCBkZW4gVGlja2V0LVZlcmFudHdvcnRsaWNoZW4gaW4gZGVyIEVudHNjaGVpZHVuZ3MtT2JlcmZsw6RjaGUgZsO8ciBUaWNrZXRzIGltIEFnZW50ZW5iZXJlaWNoLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1NldHp0IGRlbiBUaWNrZXQtVHlwIGluIGRlciB6dXPDpHR6bGljaGUgSVRTTS1GZWxkZXItT2JlcmZsw6RjaGUgZsO8ciBUaWNrZXRzIGltIEFnZW50ZW5iZXJlaWNoIChUaWNrZXQ6OlR5cGUgbXVzcyBha3RpdmllcnQgc2VpbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdTZXR6dCBkZW4gVGlja2V0LVR5cCBpbiBkZXIgRW50c2NoZWlkdW5ncy1PYmVyZmzDpGNoZSBmw7xyIFRpY2tldHMgaW0gQWdlbnRlbmJlcmVpY2ggKFRpY2tldDo6VHlwZSBtdXNzIGFrdGl2aWVydCBzZWluKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnU2V0enQgZGVuIFRpY2tldC1UeXAgaW0gUHJpb3JpdMOkdC1CaWxkc2NoaXJtIGbDvHIgVGlja2V0cyBpbSBBZ2VudGVuYmVyZWljaCAoVGlja2V0OjpUeXBlIG11c3MgYWt0aXZpZXJ0IHNlaW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdaZWlndCBpbiBkZXIgQWdlbnRlbi1PYmVyZmzDpGNoZSBpbVRpY2tldC1NZW7DvCBlaW5lbiBMaW5rIGFuIHVtIGRpZSBFbnRzY2hlaWR1bmcgYW4gZWluZW0gVGlja2V0IHp1IMOkbmRlcm4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdaZWlndCBlaW5lbiBMaW5rIGluIGRlciBNZW51LUxlaXN0ZSBpbiBkZXIgWm9vbS1BbnNpY2h0IGltIEFnZW50ZW4tSW50ZXJmYWNlIGFuLCBkZXIgZXMgZXJtw7ZnbGljaHQgZGllIHp1c8OkdHpsaWNoZW4gSVRTTS1GZWxkZXIgenUgYmVhcmJlaXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnWmVpZ3QgaW4gZGVyIE9iZXJmbMOkY2hlIHp1c8OkdHpsaWNoZSBJVFNNLUZlbGRlciBkZXIgQWdlbnRlbi1PYmVyZmzDpGNoZSBlaW5lIExpc3RlIGFsbGVyIGFtIFRpY2tldCBiZXRlaWxpZ3RlbiBBZ2VudGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1plaWd0IGluIGRlciBPYmVyZmzDpGNoZSBFbnRzY2hlaWR1bmcgZGVyIEFnZW50ZW4tT2JlcmZsw6RjaGUgZWluZSBMaXN0ZSBhbGxlciBhbSBUaWNrZXQgYmV0ZWlsaWd0ZW4gQWdlbnRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1plaWd0IGRpZSBUaWNrZXQtUHJpb3JpdMOkdCBpbiBkZXIgenVzw6R0emxpY2hlIElUU00tRmVsZGVyLU9iZXJmbMOkY2hlIGltIEFnZW50ZW4tSW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnWmVpZ3QgZGllIFRpY2tldC1Qcmlvcml0w6R0IGluIGRlciBFbnRzY2hlaWR1bmdzLU9iZXJmbMOkY2hlIGltIEFnZW50ZW4tSW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdaZWlndCBkZW4gVGlja2V0LVRpdGVsIGluIGRlciB6dXPDpHR6bGljaGUgSVRTTS1GZWxkZXItT2JlcmZsw6RjaGUgZsO8ciBUaWNrZXRzIGltIEFnZW50ZW5iZXJlaWNoLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1plaWd0IGRlbiBUaWNrZXQtVGl0ZWwgaW4gZGVyIEVudHNjaGVpZHVuZ3MtT2JlcmZsw6RjaGUgZsO8ciBUaWNrZXRzIGltIEFnZW50ZW5iZXJlaWNoLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAnU2VydmljZSBJbmNpZGVudCBTdGF0ZScsCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ1VyZ2VuY2lhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ0ltcGFjdG8nOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRlIEluY2lkZW50ZSBkZWwgU2VydmljaW8nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9GaWx0ZXJFbGVtZW50UG9zdC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdWaW5jdWxhciB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mICVzJXMlcyd9ID0gJ0NhbWJpYXIgZGVjaXNpw7NuIGRlICVzJXMlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgJXMlcyVzJ30gPSAnQ2FtYmlhciBsb3MgY2FtcG9zIGRlIElUU00gZGUgJXMlcyVzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdSZXZpc2nDs24gUmVxdWVyaWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1Jlc3VsdGFkbyBkZSBEZWNpc2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdBcHJvYmFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICdQb3NwdWVzdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnUHJlLWFwcm9iYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnUmVjaGF6YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnRmVjaGEgSW5pY2lhbCBkZSBSZXBhcmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnRmVjaGEgSW5pY2lhbCBkZSBSZWN1cGVyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdGZWNoYSBkZSBEZWNpc2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdGZWNoYSBkZSB2ZW5jaW1pZW50byc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ0NlcnJhZG8gY29uIHNvbHVjacOzbiBwcm92aXNpb25hbCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ8KhQWdyZWd1ZSB1bmEgZGVjaXNpw7NuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnQ2FtcG9zIElUU00gQWRpY2lvbmFsZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnQ2FtcG9zIGFkaWNpb25hbGVzIGRlbCB0aWNrZXQgZW4gSVRTTS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWl0ZSBhZ3JlZ2FyIG5vdGFzIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFncmVnYXIgbm90YXMgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLid9ID0KICAgICAgICAnUGVybWl0ZSBkZWZpbmlyIG51ZXZvcyB0aXBvcyBwYXJhIHRpY2tldCAoc2kgbGEgZnVuY2nDs24gdGlwbyBkZSB0aWNrZXQgZXN0w6EgaGFiaWxpdGFkYSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnTW9kaWZpY2FyIGxvcyBjYW1wb3MgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0RlY2lzacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGV0ZXJtaW5hIHNpIGVzIG5lY2VzYXJpbyBxdWUgZWwgdGlja2V0IGVzdMOpIGJsb3F1ZWFkbyBwYXJhIGFjY2VkZXIgYSBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUgKHNpIGVsIHRpY2tldCBubyBlc3TDoSBibG9xdWVhZG8gYcO6biwgc2UgYmxvcXVlYSB5IGVsIGFnZW50ZSBhY3R1YWwgc2UgY29udmVydGlyw6EgYXV0b23DoXRpY2FtZW50ZSBlbiBzdSBwcm9waWV0YXJpbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0RldGVybWluYSBzaSBlcyBuZWNlc2FyaW8gcXVlIGVsIHRpY2tldCBlc3TDqSBibG9xdWVhZG8gcGFyYSBhY2NlZGVyIGEgbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZSAoc2kgZWwgdGlja2V0IG5vIGVzdMOhIGJsb3F1ZWFkbyBhw7puLCBzZSBibG9xdWVhIHkgZWwgYWdlbnRlIGFjdHVhbCBzZSBjb252ZXJ0aXLDoSBhdXRvbcOhdGljYW1lbnRlIGVuIHN1IHByb3BpZXRhcmlvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgc2kgZWwgZXN0YWRvIGRlIGxhIGluY2lkZW5jaWEgZW4gZWwgc2VydmljaW8gZGViZSBzZXIgbW9zdHJhZG8gZHVyYW50ZSBsYSBzZWxlY2Npw7NuIGRlbCBzZXJ2aWNpbyBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGV4dG8gcG9yIGRlZmF1bHQgZGUgdW5hIG5vdGEsIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGV4dG8gcG9yIGRlZmF1bHQgZGUgdW5hIG5vdGEsIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHNpZ3VpZW50ZSBlc3RhZG8gZGUgdW4gdGlja2V0IHBvciBkZWZhdWx0LCBsdWVnbyBkZSBhZ3JlZ2FyIHVuYSBub3RhIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCBzaWd1aWVudGUgZXN0YWRvIGRlIHVuIHRpY2tldCBwb3IgZGVmYXVsdCwgbHVlZ28gZGUgYWdyZWdhciB1bmEgbm90YSBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgYXN1bnRvIHBvciBkZWZhdWx0IGRlIHVuYSBub3RhLCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGVsIGFzdW50byBwb3IgZGVmYXVsdCBkZSB1bmEgbm90YSwgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBsYSBwcmlvcmlkYWQgZGVmYXVsdCBkZWwgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGxhIHByaW9yaWRhZCBkZWZhdWx0IGRlbCB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgZWwgY29tZW50YXJpbyBkZWwgaGlzdG9yaWFsIHBhcmEgbGEgYWNjacOzbiBkZSBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzLCBtaXNtYSBxdWUgZXMgdXNhZGEgcG9yIGVsIGhpc3RvcmlhbCBkZWwgdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIGVsIGNvbWVudGFyaW8gZGVsIGhpc3RvcmlhbCwgcGFyYSBsYSBhY2Npw7NuIGRlIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuLCBtaXNtYSBxdWUgZXMgdXNhZGEgcG9yIGVsIGhpc3RvcmlhbCBkZWwgdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGhpc3RvcmlhbCBwYXJhIGxhIGFjY2nDs24gZGUgbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcywgbWlzbWEgcXVlIGVzIHVzYWRhIHBvciBlbCBoaXN0b3JpYWwgZGVsIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlIGhpc3RvcmlhbCwgcGFyYSBsYSBhY2Npw7NuIGRlIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuLCBtaXNtYSBxdWUgZXMgdXNhZGEgcG9yIGVsIGhpc3RvcmlhbCBkZWwgdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgc2lndWllbnRlIGVzdGFkbyBkZSB1biB0aWNrZXQsIGx1ZWdvIGRlIGFncmVnYXIgdW5hIG5vdGEgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCBzaWd1aWVudGUgZXN0YWRvIGRlIHVuIHRpY2tldCwgbHVlZ28gZGUgYWdyZWdhciB1bmEgbm90YSBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOhbWljb3MgcXVlIHNlIG11ZXN0cmFuIGVuIGxhIHBhbnRhbGxhIGRlIGNhbXBvIElUU00gYWRpY2lvbmFsIGRlIGxhIGludGVyZmF6IGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOhbWljb3MgcXVlIHNlIG11ZXN0cmFuIGVuIGxhIHBhbnRhbGxhIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZSBhZ2VudGUuICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdDYW1wb3MgZGluw6FtaWNvcyBxdWUgc2UgbXVlc3RyYW4gZW4gbGEgcGFudGFsbGEgZGUgem9vbSBkZWwgdGlja2V0IGRlIGxhIGludGVyZmF6IGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ0hhYmlsaXRhLCBlbiBlbCBtw7NkdWxvIGRlIGVzdGFkw61zdGljYXMsIGxhIGdlbmVyYWNpw7NuIGRlIGVzdGFkw61zdGljYXMgYWNlcmNhIGRlbCB0YXNhIHByb21lZGlvIGRlIHNvbHVjacOzbiBkZSBwcmltZXIgbml2ZWwgZGUgdGlja2V0cyBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJ0hhYmlsaXRhLCBlbiBlbCBtw7NkdWxvIGRlIGVzdGFkw61zdGljYXMsIGxhIGdlbmVyYWNpw7NuIGRlIGVzdGFkw61zdGljYXMgYWNlcmNhIGRlbCBwcm9tZWRpbyBkZSBzb2x1Y2nDs24gZGUgdGlja2V0cyBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTaSB1bmEgbm90YSBlcyBhZ3JlZ2FkYSBwb3IgdW4gYWdlbnRlLCBkZWZpbmUgZWwgZXN0YWRvIGRlIHVuIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NpIHVuYSBub3RhIGVzIGFncmVnYWRhIHBvciB1biBhZ2VudGUsIGRlZmluZSBlbCBlc3RhZG8gZGUgdW4gdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RpZmllcyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgZHluYW1pYyBmaWVsZCBJVFNNSW1wYWN0IGFuZCBvdGhlciB0aGluZ3MuJ30gPQogICAgICAgICdNb2RpZmljYSBlbCBvcmRlbiBkZSB2aXN1YWxpemFjacOzbiBkZWwgY2FtcG8gZGluw6FtaWNvIElUU01JbXBhY3QgeSBvdHJhcyBjb3Nhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICdNw7NkdWxvIHBhcmEgbW9zdHJhciBkaW7DoW1pY2FtZW50ZSBlbCBlc3RhZG8gZGVsIGluY2lkZW50ZSBkZWwgc2VydmljaW8geSBjYWxjdWxhciBsYSBwcmlvcmlkYWQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzb3MgbmVjZXNhcmlvcyBwYXJhIHVzYXIgbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcywgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc29zIG5lY2VzYXJpb3MgcGFyYSB1c2FyIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlIGFuZCBQcmlvcml0eSBDYWxjdWxhdGlvbid9ID0gJ0VzdGFkbyBkZWwgaW5jaWRlbnRlIGRlbCBzZXJ2aWNpbyB5IGPDoWxjdWxvIGRlIHByaW9yaWRhZC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCBzZXJ2aWNpbyBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUgKFRpY2tldDo6U2VydmljZSB0aWVuZSBxdWUgZXN0YXIgaGFiaWxpdGFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCBzZXJ2aWNpbyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlIChUaWNrZXQ6OlNlcnZpY2UgdGllbmUgcXVlIGVzdGFyIGhhYmlsaXRhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0VzdGFibGUgZWwgc2VydmljaW8gZW4gbGEgcGFudGFsbGEgZGUgcHJpb3JpZGFkIGRlIHRpY2tldCBkZSB1biB0aWNrZXQgYW1wbGlhZG8gZW4gbGEgaW50ZXJmYXogZGUgYWdlbnRlIChUaWNrZXQ6OlNlcnZpY2UgbmVjZXNpdGEgZXN0YXIgYWN0aXZhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCBwcm9waWV0YXJpbyBkZWwgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGRlZmluaXIgZWwgcHJvcGlldGFyaW8gZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiwgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGRlZmluaXIgZWwgcmVzcG9uc2FibGUgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWl0ZSBkZWZpbmlyIGVsIHJlc3BvbnNhYmxlIGRlbCB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24sIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnUGVybWl0ZSBkZWZpbmlyIGVsIHRpcG8gZGUgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZSAoVGlja2V0OjpUeXBlIHRpZW5lIHF1ZSBlc3RhciBoYWJpbGl0YWRvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCB0aXBvIGRlIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlIChUaWNrZXQ6OlR5cGUgdGllbmUgcXVlIGVzdGFyIGhhYmlsaXRhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdFc3RhYmxlY2UgZWwgdGlwbyBkZSB0aWNrZXQgZW4gbGEgcGFudGFsbGEgZGUgcHJpb3JpZGFkIGRlIHRpY2tldCBkZSB1biB0aWNrZXQgYW1wbGlhZG8gZW4gbGEgaW50ZXJmYXogZGUgYWdlbnRlIChUaWNrZXQ6OlR5cGUgZGViZSBlc3RhciBhY3RpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0YSB1biB2w61uY3VsbyBlbiBlbCBtZW7DuiBwYXJhIG1vZGlmaWNhciBsYSBkZWNpc2nDs24gZGUgdW4gdGlja2V0LCBlbiBlbCBkZXRhbGxlIGRlIGRpY2hvIHRpY2tldCwgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdGEgdW4gdsOtbmN1bG8gZW4gZWwgbWVuw7ogcGFyYSBtb2RpZmljYXIgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGVsIGRldGFsbGUgZGVsIHRpY2tldCBjb3JyZXNwb25kaWVudGUsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0YSB1bmEgbGlzdGEgZGUgdG9kb3MgbG9zIGFnZW50ZXMgaW52b2x1Y3JhZG9zIGVuIGVzdGUgdGlja2V0LCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTXVlc3RhIHVuYSBsaXN0YSBkZSB0b2RvcyBsb3MgYWdlbnRlcyBpbnZvbHVjcmFkb3MgZW4gZXN0ZSB0aWNrZXQsIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTXVlc3RyYSB1bmEgbGlzdGEgZGUgdG9kb3MgbG9zIGFnZW50ZXMgcG9zaWJsZXMgKGFxdWVsbG9zIGNvbiBwZXJtaXNvcyBwYXJhIGFncmVnYXIgbm90YXMgZW4gbGEgZmlsYSBvIHRpY2tldCksIHBhcmEgZGV0ZXJtaW5hciBxdWnDqW4vcXVpw6luZXMgZGViZW4gc2VyIGluZm9ybWFkb3MgYWNlcmNhIGRlIMOpc3RhIG5vdGEsIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgdW5hIGxpc3RhIGRlIHRvZG9zIGxvcyBhZ2VudGVzIHBvc2libGVzIChhcXVlbGxvcyBjb24gcGVybWlzb3MgcGFyYSBhZ3JlZ2FyIG5vdGFzIGVuIGxhIGZpbGEgbyB0aWNrZXQpLCBwYXJhIGRldGVybWluYXIgcXVpw6luL3F1acOpbmVzIGRlYmVuIHNlciBpbmZvcm1hZG9zIGFjZXJjYSBkZSDDqXN0YSBub3RhLCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgbGFzIG9wY2lvbmVzIGRlIHByaW9yaWRhZCBkZWwgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgbGFzIG9wY2lvbmVzIGRlIHByaW9yaWRhZCBkZWwgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgbG9zIGNhbXBvcyBkZWwgdMOtdHVsbyBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTXVlc3RyYSBsb3MgY2FtcG9zIGRlbCB0w610dWxvIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICdEZWNpc2nDs24gZGVsIFRpY2tldC4nOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICdTZXJ2aWNlIEluY2lkZW50IFN0YXRlJywKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZW5fR0JfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0NyaXRpY2FsaXR5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ0ltcGFjdCc7CgogICAgIyBKUyBUZW1wbGF0ZTogU2VydmljZUluY2lkZW50U3RhdGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICdTZXJ2aWNlIEluY2lkZW50IFN0YXRlJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRmlsdGVyRWxlbWVudFBvc3QvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnTGluayB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mICVzJXMlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgJXMlcyVzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdSZXZpZXcgUmVxdWlyZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnRGVjaXNpb24gUmVzdWx0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAnQXBwcm92ZWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ1JlcGFpciBTdGFydCBUaW1lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICdSZWNvdmVyeSBTdGFydCBUaW1lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdEZWNpc2lvbiBEYXRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRHVlIERhdGUnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnQWRkIGEgZGVjaXNpb24hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdBZGRpdGlvbmFsIElUU00gRmllbGRzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJ0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJ0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdDaGFuZ2UgdGhlIElUU00gZmllbGRzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0RlY2lzaW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICdFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RpZmllcyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgZHluYW1pYyBmaWVsZCBJVFNNSW1wYWN0IGFuZCBvdGhlciB0aGluZ3MuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUgYW5kIFByaW9yaXR5IENhbGN1bGF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnVGlja2V0IGRlY2lzaW9uLic7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgJ1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnLAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZmFfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ9in2YfZhduM2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAn2KfYq9ixJzsKCiAgICAjIEpTIFRlbXBsYXRlOiBTZXJ2aWNlSW5jaWRlbnRTdGF0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0ZpbHRlckVsZW1lbnRQb3N0L0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ9in2LHYqtio2KfYtyDYr9ix2K7ZiNin2LPYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgJXMlcyVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiAlcyVzJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ9mG24zYp9iyINio2Ycg2KjYp9iy2KjbjNmG24wg2K/Yp9ix2K8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAn2YbYqtuM2KzZhyDYqti12YXbjNmFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVqZWN0ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICfYstmF2KfZhiDYtNix2YjYuSDYqti52YXbjNixJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfYstmF2KfZhiDYtNix2YjYuSDYqNmH2KjZiNivJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICfYqtin2LHbjNiuINiq2LXZhduM2YUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfYqtin2LHbjNiuINin2YbYrNin2YUnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfZhdmI2YLYqtinINio2LPYqtmHINi02K8nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfbjNqpINiq2LXZhduM2YUg2KfYttin2YHZhyDaqdmG24zYryEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ9mB24zZhNiv2YfYp9uMINin2LbYp9mB2YcgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJ9in2KzYp9iy2Ycg2KrYudix24zZgSDYrNiv24zYryDYqNix2KfbjCDYp9mG2YjYp9i5ICDYr9ix2K7ZiNin2LPYqiAg2YXbjCDYr9mH2K8o2Kfar9ixINmI24zamNqv24wg2YbZiNi5INiv2LHYrtmI2KfYs9iqINmB2LnYp9mEINio2KfYtNivKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICfZgduM2YTYr9mH2KfbjCBJVFNNINix2Kcg2KrYutuM24zYsSDYr9mH24zYryEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICfYqti12YXbjNmFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RpZmllcyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgZHluYW1pYyBmaWVsZCBJVFNNSW1wYWN0IGFuZCBvdGhlciB0aGluZ3MuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlIGFuZCBQcmlvcml0eSBDYWxjdWxhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9mF2KzZhdmI2LnZhyDYrtiv2YXYp9iqINiv2LEg2LHZiNuMINi12YHYrdmHINmG2YXYp9uM2LQg2KfZiNmE2YjbjNiqINio2YTbjNi3INuM2qkg2KjZhNuM2Lcg2KjYstix2q/ZhtmF2KfbjNuMINiv2LEg2LHYp9io2Lcg2LnYp9mF2YQg2KfYsiAo2KjZhNuM2LcgOjog2K7Yr9mF2KfYqiDZhtuM2KfYsiDYqNmHINmB2LnYp9mEINi02YjYrykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9mF2KzZhdmI2LnZhyDZhtmI2Lkg2KjZhNuM2Lcg2K/YsSDYtdmB2K3ZhyDZhtmF2KfbjNi0INin2YjZhNmI24zYqiDYqNmE24zYtyDbjNqpINio2YTbjNi3INio2LLYsdqv2YbZhdin24zbjCDYr9ixINix2KfYqNi3INi52KfZhdmEINin2LIgKNio2YTbjNi3IDo6INmG2YjYuSDZhtuM2KfYsiDYqNmHINmB2LnYp9mEINi02YjYrykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAnU2VydmljZSBJbmNpZGVudCBTdGF0ZScsCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZnJfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0NyaXRpY2l0w6knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnSW1wYWN0JzsKCiAgICAjIEpTIFRlbXBsYXRlOiBTZXJ2aWNlSW5jaWRlbnRTdGF0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ8OJdGF0IGRcJ2luY2lkZW50IGR1IHNlcnZpY2UnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9GaWx0ZXJFbGVtZW50UG9zdC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdMaWVyIGxlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgJXMlcyVzJ30gPSAnTW9kaWZpZXIgbGEgZMOpY2lzaW9uIGRlICVzICVzICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiAlcyVzJXMnfSA9ICdNb2RpZmllciBsZXMgY2hhbXBzIElUU00gZGUgJXMgJXMgJXMnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ1JldnVlIHJlcXVpc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnUsOpc3VsdGF0IGRlIGxhIGTDqWNpc2lvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJ0FwcHJvdXbDqSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICdSZXBvcnTDqSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICdQcsOpLWFwcHJvdXbDqSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJ1JlamV0w6knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdEYXRlIGRlIGTDqWJ1dCBkZSByw6lwYXJhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnRGF0ZSBkZSBkw6lidXQgZGUgcmV0b3VyIMOgIGxhIG5vcm1hbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0RhdGUgZGUgZMOpY2lzaW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnw4ljaMOpYW5jZSc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ0Zlcm3DqSBhdmVjIGNvbnRvdXJuZW1lbnQnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdBam91dGVyIHVuZSBkw6ljaXNpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0NoYW1wcyBJVFNNIGFkZGl0aW9ubmVscyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICdDaGFtcHMgSVRTTSBhZGRpdGlvbm5lbHMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0F1dG9yaXNlciBsXCdham91dCBkZSBub3RlcyBkYW5zIGxlcyBjaGFtcHMgSVRTTSBhZGRpdGlvbm5lbHMgc3VyIGxcJ2ludGVyZmFjZSBvcMOpcmF0ZXVyLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0F1dG9yaXNlciBsXCdham91dCBkZSBub3RlcyBkYW5zIGxlcyBjaGFtcHMgSVRTTSBhZGRpdGlvbm5lbHMgc3VyIGxcJ2ludGVyZmFjZSBkZSBkw6ljaXNpb24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJ0F1dG9yaXNlciBsYSBtb2RpZmljYXRpb24gZHUgdHlwZSBkZSB0aWNrZXQgKHNpIGxhIGZvbmN0aW9ubmFsaXTDqSBlc3QgYWN0aXbDqWUpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ01vZGlmaWV6IGxlcyBjaGFtcHMgSVRTTSAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnRMOpY2lzaW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RpZmllcyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgZHluYW1pYyBmaWVsZCBJVFNNSW1wYWN0IGFuZCBvdGhlciB0aGluZ3MuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlIGFuZCBQcmlvcml0eSBDYWxjdWxhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICdEw6ljaXNpb24gZHUgdGlja2V0Lic7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgJ1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnLAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6Z2xfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0NyaXRpY2lkYWQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnSW1wYWN0byc7CgogICAgIyBKUyBUZW1wbGF0ZTogU2VydmljZUluY2lkZW50U3RhdGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICdFc3RhZG8gZGUgSW5jaWRlbnRlIGRlIFNlcnZpem8nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9GaWx0ZXJFbGVtZW50UG9zdC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdWaW5jdWxlIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgJXMlcyVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiAlcyVzJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ1ByZWNpc2EgcmV2aXNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1Jlc3VsdGFkbyBkYSBkZWNpc2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ0hvcmEgZGUgaW5pY2lvIGRhIHJlcGFyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICdUZW1wbyBkZSBJbmljaW8gZGUgUmVjdXBlcmFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0YSBkYSBkZWNpc2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdEYXRhIGRlIHZlbmNlbWVudG8nOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdwZWNoYWRvIGNvbiBhcGHDsW8nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdFbmdhZGEgdW5oYSBkZWNpc2nDs24hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdDYW1wb3MgSVRTTSBBZGljaW9uw6Fpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWl0ZSBlbmdhZGlyIG5vdGFzIG5hIHBhbnRhbGxhIGNhbXBvIGFkaWNpb25hbCBJVFNNIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWl0ZSBlbmdhZGlyIG5vdGFzIG5hIHBhbnRhbGxhIGRlY2lzacOzbiBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCkuJ30gPQogICAgICAgICdQZXJtaXRpciDDoSBkZWZpbmljacOzbiBkZSBub3ZvcyB0aXBvcyBkZSB0aWNrZXQgKHNlIGEgZnVuY2nDs24gdGlwbyBkZSB0aWNrZXQgZXN0w6EgaGFiaWxpdGFkYSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnQ2FtYmllIG9zIGNhbXBvcyBJVFNNISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0RlY2lzacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5lIHNlIHVuIGJsb3F1ZW8gZGUgdGlja2V0IMOpIHJlcXVpcmlkbyBuYSBwYW50YWxsYSBkZSBjYW1wbyBhZGljaW9uYWwgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlIChzZSBvIHRpY2tldCBhw61uZGEgbm9uIGVzdMOhIGJsb3F1ZWFkbywgbyB0aWNrZXQgYmxvcXXDqWFzZSBlIG8gYXhlbnRlIGFjdHVhbCB2YWkgc2VyIGF1dG9tYXRpY2FtZW50ZSBvIHNldSBwcm9waWV0YXJpbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0RlZmluZSBzZSB1biBibG9xdWVvIGRlIHRpY2tldCDDqSByZXF1aXJpZG8gbmEgcGFudGFsbGEgZGUgc2RlY2lzacOzbiBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlIChzZSBvIHRpY2tldCBhw61uZGEgbm9uIGVzdMOhIGJsb3F1ZWFkbywgbyB0aWNrZXQgYmxvcXXDqWFzZSBlIG8gYXhlbnRlIGFjdHVhbCB2YWkgc2VyIGF1dG9tYXRpY2FtZW50ZSBvIHNldSBwcm9waWV0YXJpbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIHNlIG8gZXN0YWRvIGRlIGluY2lkZW50ZSBkZSBzZXJ2aXpvIGRlYmUgc2VyIG1vc3RyYWRvIGR1cmFudGUgYSBzZWxlY2Npw7NuIGRlIHNlcnZpem8gbmEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gY29ycG8gcG9yIGRlZmVjdG8gZHVuaGEgbm90YSBuYSBwYW50YWxsYSBjYW1wbyBJVFNNIGFkaWNpb25hbCBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGNvcnBvIHBvciBkZWZlY3RvIGR1bmhhIG5vdGEgbmEgcGFudGFsbGEgZGVkZWNpc2nDs24gZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gcG9yIGRlZmVjdG8gZHVuIHRpY2tldCBkZXNwb2lzIGRlIGVuZ2FkaXIgdW5oYSBub3RhLCBuYSBwYW50YWxsYSBjYW1wbyBJVFNNIGFkaWNpb25hbCBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHLDs3hpbW8gZXN0YWRvIHBvciBkZWZlY3RvIGR1biB0aWNrZXQgZGVzcG9pcyBkZSBlbmdhZGlyIHVuaGEgbm90YSwgbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NuIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRlbWEgcG9yIGRlZmVjdG8gZHVuaGEgbm90YSBuYSBwYW50YWxsYSBjYW1wbyBJVFNNIGFkaWNpb25hbCBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRlbWEgcG9yIGRlZmVjdG8gZHVuaGEgbm90YSBuYSBwYW50YWxsYSBkZSBkZWNpc2nDs24gZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhIHByaW9yaWRhZGUgZG8gdGlja2V0IHBvciBkZWZlY3RvIG5hIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhIHByaW9yaWRhZGUgZG8gdGlja2V0IHBvciBkZWZlY3RvIG5hIHBhbnRhbGxhIGRlIGRlY2lzacOzbiBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGhpc3TDs3JpY28gZG9zIGNvbWVudGFyaW9zIHBhcmEgYSBhY2Npw7NuIGRhIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsLCBvIGNhbCDDqSB1c2FkbyBwYXJhIG8gaGlzdMOzcmljbyBkbyB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyBoaXN0w7NyaWNvIGRvcyBjb21lbnRhcmlvcyBwYXJhIGEgYWNjacOzbiBkYSBwYW50YWxsYSBkZSBkZWNpc2nDs24sIG8gY2FsIMOpIHVzYWRvIHBhcmEgbyBoaXN0w7NyaWNvIGRvIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyBoaXN0w7NyaWNvIGRvcyB0aXBvcyBwYXJhIGEgYWNjacOzbiBkYSBwYW50YWxsYSBjYW1wbyBJVFNNIGFkaWNpb25hbCwgbyBjYWwgw6kgdXNhZG8gcGFyYSBvIGhpc3TDs3JpY28gZG8gdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIG8gaGlzdMOzcmljbyBkb3MgdGlwb3MgcGFyYSBhIGFjY2nDs24gZGEgcGFudGFsbGEgZGUgZGVjaXNpw7NuLCBvIGNhbCDDqSB1c2FkbyBwYXJhIG8gaGlzdMOzcmljbyBkbyB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHNlZ3VpbnRlIGVzdGFkbyBkdW4gdGlja2V0IGRlc3BvaXMgZGUgZW5nYWRpciB1bmhhIG5vdGEsIG5hIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gc2VndWludGUgZXN0YWRvIGR1biB0aWNrZXQgZGVzcG9pcyBkZSBlbmdhZGlyIHVuaGEgbm90YSwgbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NuIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnQWN0aXZhciBtw7NkdWxvIGVzdGF0w61zdGljbyBwYXJhIHhlcmFyIGVzdGF0w61zdGljYXMgc29icmUgYSBtZWRpYSBkYSB0YXhhIGRlIHJlc29sdWNpw7NuIGVuIHByaW1laXJvIG5pdmVsIGRlIHRpY2tldHMgSVRTTS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICdBY3RpdmFyIG3Ds2R1bG8gZXN0YXTDrXN0aWNvIHBhcmEgeGVyYXIgZXN0YXTDrXN0aWNhcyBzb2JyZSBhIG1lZGlhIGRhIHJlc29sdWNpw7NuIGRlIHRpY2tldHMgSVRTTS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2UgdW5oYSBub3RhIMOpIGVuZ2FkaWRhIHBvciB1biBheGVudGUsIGVzdGFibGVjZSBvIGVzdGFkbyBkdW4gdGlja2V0IG5hIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2UgdW5oYSBub3RhIMOpIGVuZ2FkaWRhIHBvciB1biBheGVudGUsIGVzdGFibGVjZSBvIGVzdGFkbyBkdW4gdGlja2V0IG5hIHBhbnRhbGxhIGRlIGRlY2lzacOzbiBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RpZmllcyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgZHluYW1pYyBmaWVsZCBJVFNNSW1wYWN0IGFuZCBvdGhlciB0aGluZ3MuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNvcyByZXF1aXJpZG9zIHBhcmEgdXNhciBhIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsIG5hIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNvcyByZXF1aXJpZG9zIHBhcmEgdXNhciBhIHBhbnRhbGxhIGRlIGRlY2lzacOzbiBuYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlIGFuZCBQcmlvcml0eSBDYWxjdWxhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRXN0YWJsZWNlIG8gc2Vydml6byBuYSBwYW50YWxsYSBkZSBjYW1wbyBJVFNNIGFkaWNpb25hbCBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlIChUaWNrZXQ6OlNlcnZpem8gZGViZSBzZXIgYWN0aXZhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdFc3RhYmxlY2UgbyBzZXJ2aXpvIG5hIHBhbnRhbGxhIGRlIGRlY2lzacOzbiBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlIChUaWNrZXQ6OlNlcnZpem8gZGViZSBzZXIgYWN0aXZhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0VzdGFibGVjZSBvIHNlcnZpem8gbmEgcGFudGFsbGEgcHJpb3JpZGFkZSBkZSB0aWNrZXRkdW4gdGlja2V0IHpvb20gbmEgaW50ZXJmYWNlIGRlIGF4ZW50ZSAoVGlja2V0OjpTZXJ2aWNlIG5lY2VzaXRhIHNlciBhY3RpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRXN0YWJsZWNlIG8gcHJvcGlldGFyaW8gZGUgdGlja2V0IG5hIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFc3RhYmxlY2UgbyBwcm9waWV0YXJpbyBkZSB0aWNrZXQgbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NuIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRXN0YWJsZWNlIG8gcmVzcG9uc2FibGUgZGUgdGlja2V0IG5hIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFc3RhYmxlY2UgbyBwcm9waWV0YXJpbyBkZSB0aWNrZXQgbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NuIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRXN0YWJsZWNlIG8gdGlwbyBkZSB0aWNrZXQgbmEgcGFudGFsbGEgY2FtcG8gSVRTTSBhZGljaW9uYWwgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZSAoVGlja2V0OjpUaXBvIHRlbiBxdWUgc2VyIGFjdGl2YWRvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0VzdGFibGVjZSBvIHRpcG8gZGUgdGlja2V0IG5hIHBhbnRhbGxhIGRlIGRlY2lzacOzbiBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlIChUaWNrZXQ6OlRpcG8gdGVuIHF1ZSBzZXIgYWN0aXZhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdFc3RhYmxlY2UgbyB0aXBvIGRlIHRpY2tldCBuYSBwYW50YWxsYSBwcmlvcmlkYWRlIGRlIHRpY2tldCBkdW4gdGlja2V0IHpvb20gbmEgaW50ZXJmYWNlIGRlIGF4ZW50ZSAoVGlja2V0OjpUeXBlIG5lY2VzaXRhIGVzdGFyIGFjdGl2bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1biBlbmxhY2Ugbm8gbWVudSBwYXJhIGNhbWJpYXIgYSBkZWNpc2nDs24gZHVuIHRpY2tldCBuYSBzw7phIHZpc3RhIHpvb20gZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW4gZW5sYWNlIG5vIG1lbnUgcGFyYSBjYW1iaWFyIGNhbXBvcyBJVFNNIGFkaWNpb27DoWlzIG5hIHZpc3RhIHpvb20gZGUgdGlja2V0IGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bmhhIGxpc3RhIGRlIHTDs2RvbG9zIGF4ZW50ZXMgaW1wbGljYWRvcyBuZXN0ZSB0aWNrZXQsIG5hIHBhbnRhbGxhIGNhbXBvIElUU00gYWRpY2lvbmFsIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVuaGEgbGlzdGEgZGUgdMOzZG9sb3MgYXhlbnRlcyBpbXBsaWNhZG9zIG5lc3RlIHRpY2tldCwgbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NuIGRhIGludGVyZmFjZSBkZSBheGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVuaGEgbGlzdGEgZGUgdMOzZG9sb3MgcG9zaWJsZXMgYXhlbnRlcyAodMOzZG9sb3MgYXhlbnRlcyBjb24gcGVybWlzb3MgZGUgbm90YSBuZXN0YSBjb2xhL3RpY2tldCkgcGFyYSBkZXRlcm1pbmFyIHF1ZW4gZGViZSBzZXIgaW5mb3JtYWRvIHNvYnJlIGVzdGEgbm90YSwgbmEgcGFudGFsbGEgY2FtcG8gSVRTTSBhZGljaW9uYWwgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bmhhIGxpc3RhIGRlIHTDs2RvbG9zIHBvc2libGVzIGF4ZW50ZXMgKHTDs2RvbG9zIGF4ZW50ZXMgY29uIHBlcm1pc29zIGRlIG5vdGEgbmVzdGEgY29sYS90aWNrZXQpIHBhcmEgZGV0ZXJtaW5hciBxdWVuIGRlYmUgc2VyIGluZm9ybWFkbyBzb2JyZSBlc3RhIG5vdGEsIG5hIHBhbnRhbGxhIGRlIGRlY2lzacOzbiBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBhcyBvcGNpw7NucyBkZSBwcmlvcmlkYWRlIGRlIHRpY2tldCBuYSBwYW50YWxsYSBjYW1wbyBJVFNNIGFkaWNpb25hbCBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIGFzIG9wY2nDs25zIGRlIHByaW9yaWRhZGUgZGUgdGlja2V0IG5hIHBhbnRhbGxhIGRlIGRlY2lzacOzbiBkYSBpbnRlcmZhY2UgZGUgYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgY2FtcG9zIGRlIHTDrXR1bG8gbmEgcGFudGFsbGEgY2FtcG8gSVRTTSBhZGljaW9uYWwgZGEgaW50ZXJmYWNlIGRlIGF4ZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgb3MgY2FtcG9zIGRlIHTDrXR1bG8gbmEgcGFudGFsbGEgZGUgZGVjaXNpw7NucyBkYSBpbnRlcmZhY2UgZG8gYXhlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAnU2VydmljZSBJbmNpZGVudCBTdGF0ZScsCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6aHVfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpa3Vzc8OhZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdIYXTDoXMnOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnU3pvbGfDoWx0YXTDoXMgaW5jaWRlbnPDoWxsYXBvdCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0ZpbHRlckVsZW1lbnRQb3N0L0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ0plZ3kgw7Zzc3pla2FwY3NvbMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mICVzJXMlcyd9ID0gJyVzJXMlcyBkw7ZudMOpc8OpbmVrIG1lZ3bDoWx0b3p0YXTDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiAlcyVzJXMnfSA9ICclcyVzJXMgSVRTTSBtZXrFkWluZWsgbWVndsOhbHRvenRhdMOhc2EnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ8OBdHRla2ludMOpcyBzesO8a3PDqWdlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdEw7ZudMOpcyBlcmVkbcOpbnllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAnSsOzdsOhaGFneXZhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJ0VsaGFsYXN6dHZhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJ0VsxZF6ZXRlc2VuIGrDs3bDoWhhZ3l2YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJ0VsdXRhc8OtdHZhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnSmF2w610w6FzIGluZMOtdMOhc2kgaWRlamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ1Zpc3N6YcOhbGzDrXTDoXMgaW5kw610w6FzaSBpZGVqZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRMO2bnTDqXMgZMOhdHVtYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ0hhdMOhcmlkxZEnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdsZXrDoXJ2YSBrZXLDvGzFkSBtZWdvbGTDoXNzYWwnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdBZGpvbiBob3p6w6EgZWd5IGTDtm50w6lzdCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ1RvdsOhYmJpIElUU00gbWV6xZFrJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJ1RvdsOhYmJpIElUU00gamVneW1lesWRay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTGVoZXTFkXbDqSB0ZXN6aSBqZWd5emV0ZWsgaG96esOhYWTDoXPDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0xlaGV0xZF2w6kgdGVzemkgamVneXpldGVrIGhvenrDoWFkw6Fzw6F0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgZMO2bnTDqXNpIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCkuJ30gPQogICAgICAgICdMZWhldMWRdsOpIHRlc3ppIMO6aiB0w61wdXNvayBtZWdoYXTDoXJvesOhc8OhdCBhIGplZ3lla2hleiAoaGEgYSBqZWd5dMOtcHVzIHN6b2xnw6FsdGF0w6FzIGVuZ2Vkw6lseWV6dmUgdmFuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdWw6FsdG96dGFzc2EgbWVnIGF6IElUU00gbWV6xZFrZXQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnRMO2bnTDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEsIGhvZ3kgc3rDvGtzw6lnZXMtZSBqZWd5esOhcm9sw6FzIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbiAoaGEgYSBqZWd5IG3DqWcgbmluY3MgesOhcm9sdmEsIGFra29yIGEgamVneSB6w6Fyb2x2YSBsZXN6LCDDqXMgYXogYWt0dcOhbGlzIMO8Z3lpbnTDqXrFkSBhdXRvbWF0aWt1c2FuIGFubmFrIHR1bGFqZG9ub3Nha8OpbnQgbGVzeiBiZcOhbGzDrXR2YSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEsIGhvZ3kgc3rDvGtzw6lnZXMtZSBqZWd5esOhcm9sw6FzIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgZMO2bnTDqXNpIGvDqXBlcm55xZFqw6luIChoYSBhIGplZ3kgbcOpZyBuaW5jcyB6w6Fyb2x2YSwgYWtrb3IgYSBqZWd5IHrDoXJvbHZhIGxlc3osIMOpcyBheiBha3R1w6FsaXMgw7xneWludMOpesWRIGF1dG9tYXRpa3VzYW4gYW5uYWsgdHVsYWpkb25vc2Frw6ludCBsZXN6IGJlw6FsbMOtdHZhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphLCBob2d5IGEgc3pvbGfDoWx0YXTDoXMgaW5jaWRlbnPDoWxsYXBvdMOhdCBtZWcga2VsbC1lIGplbGVuw610ZW5pIGEgc3pvbGfDoWx0YXTDoXMga2l2w6FsYXN6dMOhc2Ega8O2emJlbiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgZWd5IGplZ3l6ZXQgYWxhcMOpcnRlbG1lemV0dCB0w7ZyenPDqXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2hhdMOhcm96emEgZWd5IGplZ3l6ZXQgYWxhcMOpcnRlbG1lemV0dCB0w7ZyenPDqXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBlZ3kgamVneSBhbGFww6lydGVsbWV6ZXR0IGvDtnZldGtlesWRIMOhbGxhcG90w6F0IGVneSBqZWd5emV0IGhvenrDoWFkw6FzYSB1dMOhbiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IHRvdsOhYmJpIElUU00gbWV6xZEga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGVneSBqZWd5IGFsYXDDqXJ0ZWxtZXpldHQga8O2dmV0a2V6xZEgw6FsbGFwb3TDoXQgZWd5IGplZ3l6ZXQgaG96esOhYWTDoXNhIHV0w6FuIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgZMO2bnTDqXNpIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGVneSBqZWd5emV0IGFsYXDDqXJ0ZWxtZXpldHQgdMOhcmd5w6F0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGVneSBqZWd5emV0IGFsYXDDqXJ0ZWxtZXpldHQgdMOhcmd5w6F0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgZMO2bnTDqXNpIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBheiBhbGFww6lydGVsbWV6ZXR0IGplZ3kgcHJpb3JpdMOhc3QgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGF6IGFsYXDDqXJ0ZWxtZXpldHQgamVneXByaW9yaXTDoXN0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgZMO2bnTDqXNpIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0F6dCBheiBlbMWRem3DqW55IG1lZ2plZ3l6w6lzdCBoYXTDoXJvenphIG1lZyBhIHRvdsOhYmJpIElUU00gbWV6xZEga8OpcGVybnnFkSBtxbF2ZWxldMOpbsOpbCwgYW1lbHlldCBhIGplZ3kgZWzFkXptw6lueWVpbsOpbCBzem9rdGFrIGhhc3puw6FsbmkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdBenQgYXogZWzFkXptw6lueSBtZWdqZWd5esOpc3QgaGF0w6Fyb3p6YSBtZWcgYSBkw7ZudMOpc2kga8OpcGVybnnFkSBtxbF2ZWxldMOpbsOpbCwgYW1lbHlldCBhIGplZ3kgZWzFkXptw6lueWVpbsOpbCBzem9rdGFrIGhhc3puw6FsbmkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnQXp0IGF6IGVsxZF6bcOpbnkgdMOtcHVzdCBoYXTDoXJvenphIG1lZyBhIHRvdsOhYmJpIElUU00gbWV6xZEga8OpcGVybnnFkSBtxbF2ZWxldMOpbsOpbCwgYW1lbHlldCBhIGplZ3kgZWzFkXptw6lueWVpbsOpbCBzem9rdGFrIGhhc3puw6FsbmkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdBenQgYXogZWzFkXptw6lueSB0w61wdXN0IGhhdMOhcm96emEgbWVnIGEgZMO2bnTDqXNpIGvDqXBlcm55xZEgbcWxdmVsZXTDqW7DqWwsIGFtZWx5ZXQgYSBqZWd5IGVsxZF6bcOpbnllaW7DqWwgc3pva3RhayBoYXN6bsOhbG5pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdoYXTDoXJvenphIGVneSBqZWd5IGvDtnZldGtlesWRIMOhbGxhcG90w6F0IGVneSBqZWd5emV0IGhvenrDoWFkw6FzYSB1dMOhbiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IHRvdsOhYmJpIElUU00gbWV6xZEga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBlZ3kgamVneSBrw7Z2ZXRrZXrFkSDDoWxsYXBvdMOhdCBlZ3kgamVneXpldCBob3p6w6FhZMOhc2EgdXTDoW4gYXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBeiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IHRvdsOhYmJpIElUU00gbWV6xZEga8OpcGVybnnFkWrDqW4gbWVnamVsZW7DrXRldHQgZGluYW1pa3VzIG1lesWRay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4gbWVnamVsZW7DrXRldHQgZGluYW1pa3VzIG1lesWRay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQXogw7xneWludMOpesWRaSBmZWzDvGxldCBqZWd5bmFnecOtdMOhcyBrw6lwZXJuecWRasOpbiBtZWdqZWxlbsOtdGV0dCBkaW5hbWlrdXMgbWV6xZFrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnRW5nZWTDqWx5ZXppIGEgc3RhdGlzenRpa8OhayBtb2R1bHQgYXogSVRTTSBqZWd5IGVsc8WRIHN6aW50xbEgbWVnb2xkw6FzaSBhcsOhbnnDoW5hayDDoXRsYWfDoXZhbCBrYXBjc29sYXRvcyBzdGF0aXN6dGlrw6FrIGVsxZHDoWxsw610w6Fzw6Fob3ouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnRW5nZWTDqWx5ZXppIGEgc3RhdGlzenRpa8OhayBtb2R1bHQgYXogSVRTTSBqZWd5IG1lZ29sZMOhc8OhbmFrIMOhdGxhZ8OhdmFsIGthcGNzb2xhdG9zIHN0YXRpc3p0aWvDoWsgZWzFkcOhbGzDrXTDoXPDoWhvei4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSGEgZWd5IMO8Z3lpbnTDqXrFkSBob3p6w6FhZG90dCBlZ3kgbWVnamVneXrDqXN0LCBha2tvciBiZcOhbGzDrXRqYSBlZ3kgamVneSDDoWxsYXBvdMOhdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IHRvdsOhYmJpIElUU00gbWV6xZEga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSGEgZWd5IMO8Z3lpbnTDqXrFkSBob3p6w6FhZG90dCBlZ3kgbWVnamVneXrDqXN0LCBha2tvciBiZcOhbGzDrXRqYSBlZ3kgamVneSDDoWxsYXBvdMOhdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGTDtm50w6lzaSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kaWZpZXMgdGhlIGRpc3BsYXkgb3JkZXIgb2YgdGhlIGR5bmFtaWMgZmllbGQgSVRTTUltcGFjdCBhbmQgb3RoZXIgdGhpbmdzLid9ID0KICAgICAgICAnTcOzZG9zw610amEgYXogSVRTTSBoYXTDoXMgZGluYW1pa3VzIG1lesWRIMOpcyBlZ3nDqWIgZG9sZ29rIG1lZ2plbGVuw610w6lzaSBzb3JyZW5kasOpdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICdFZ3kgbW9kdWwgYSBzem9sZ8OhbHRhdMOhcyBpbmNpZGVuc8OhbGxhcG90w6FuYWsgZGluYW1pa3VzIG1lZ2plbGVuw610w6lzw6loZXogw6lzIGEgcHJpb3JpdMOhcyBraXN6w6Ftw610w6Fzw6Fob3ouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQSBzesO8a3PDqWdlcyBqb2dvc3VsdHPDoWdvayBhIHRvdsOhYmJpIElUU00gbWV6xZEga8OpcGVybnnFkWrDqW5layBoYXN6bsOhbGF0w6Fob3ogYXogw7xneWludMOpesWRaSBmZWzDvGxldGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQSBzesO8a3PDqWdlcyBqb2dvc3VsdHPDoWdvayBhIGTDtm50w6lzaSBrw6lwZXJuecWRIGhhc3puw6FsYXTDoWhveiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUgYW5kIFByaW9yaXR5IENhbGN1bGF0aW9uJ30gPSAnU3pvbGfDoWx0YXTDoXMgaW5jaWRlbnPDoWxsYXBvdCDDqXMgcHJpb3JpdMOhcyBzesOhbcOtdMOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnQmXDoWxsw610amEgYSBzem9sZ8OhbHRhdMOhc3QgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luIChhIFRpY2tldDo6U2VydmljZSBsZWhldMWRc8OpZ25layBiZWthcGNzb2x2YSBrZWxsIGxlbm5pZSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0Jlw6FsbMOtdGphIGEgc3pvbGfDoWx0YXTDoXN0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgZMO2bnTDqXNpIGvDqXBlcm55xZFqw6luIChhIFRpY2tldDo6U2VydmljZSBsZWhldMWRc8OpZ25layBiZWthcGNzb2x2YSBrZWxsIGxlbm5pZSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnQmXDoWxsw610amEgYSBzem9sZ8OhbHRhdMOhc3QgZWd5IG5hZ3nDrXRvdHQgamVneW5layBhIGplZ3lwcmlvcml0w6FzIGvDqXBlcm55xZFqw6luIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbiAoYSBUaWNrZXQ6OlNlcnZpY2UgbW9kdWxuYWsgYWt0aXbDoWx2YSBrZWxsIGxlbm5pZSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQmXDoWxsw610amEgYSBqZWd5IHR1bGFqZG9ub3PDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQmXDoWxsw610amEgYSBqZWd5IHR1bGFqZG9ub3PDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQmXDoWxsw610amEgYSBqZWd5IGZlbGVsxZFzw6l0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0Jlw6FsbMOtdGphIGEgamVneSBmZWxlbMWRc8OpdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGTDtm50w6lzaSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdCZcOhbGzDrXRqYSBhIGplZ3kgdMOtcHVzw6F0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbiAoYSBUaWNrZXQ6OlR5cGUgbGVoZXTFkXPDqWduZWsgYmVrYXBjc29sdmEga2VsbCBsZW5uaWUpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnQmXDoWxsw610amEgYSBqZWd5IHTDrXB1c8OhdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGTDtm50w6lzaSBrw6lwZXJuecWRasOpbiAoYSBUaWNrZXQ6OlR5cGUgbGVoZXTFkXPDqWduZWsgYmVrYXBjc29sdmEga2VsbCBsZW5uaWUpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdCZcOhbGzDrXRqYSBhIGplZ3kgdMOtcHVzw6F0IGVneSBuYWd5w610b3R0IGplZ3luZWsgYSBqZWd5IHByaW9yaXTDoXMga8OpcGVybnnFkWrDqW4gYXogw7xneWludMOpesWRaSBmZWzDvGxldGVuIChhIFRpY2tldDo6VHlwZSBtb2R1bG5hayBha3RpdsOhbHZhIGtlbGwgbGVubmllKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRWd5IGhpdmF0a296w6FzdCBqZWxlbsOtdCBtZWcgYSBtZW7DvGJlbiBlZ3kgamVneSBkw7ZudMOpc8OpbmVrIG1lZ3bDoWx0b3p0YXTDoXPDoWhveiBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4gYXogZWxlbSBuYWd5w610w6FzaSBuw6l6ZXTDqWJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFZ3kgaGl2YXRrb3rDoXN0IGplbGVuw610IG1lZyBhIG1lbsO8YmVuIGEgdG92w6FiYmkgSVRTTSBtZXrFkWsgbcOzZG9zw610w6Fzw6Fob3ogYXogw7xneWludMOpesWRaSBmZWzDvGxldCBqZWd5bmFnecOtdMOhcyBuw6l6ZXTDqWJlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnamVsZW7DrXRpIGEgamVneWVuIHLDqXN6dCB2ZXbFkSDDtnNzemVzIMO8Z3lpbnTDqXrFkSBsaXN0w6Fqw6F0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdqZWxlbsOtdGkgYSBqZWd5ZW4gcsOpc3p0IHZldsWRIMO2c3N6ZXMgw7xneWludMOpesWRIGxpc3TDoWrDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCBkw7ZudMOpc2kga8OpcGVybnnFkWrDqW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnamVsZW7DrXRpIGF6IMO2c3N6ZXMgbGVoZXRzw6lnZXMgw7xneWludMOpesWRIChhIHbDoXLDs2xpc3TDoW4gdmFneSBqZWd5ZW4gamVneXpldCBqb2dvc3VsdHPDoWdnYWwgcmVuZGVsa2V6xZEgw7Zzc3plcyDDvGd5aW50w6l6xZEpIGxpc3TDoWrDoXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luIGFubmFrIG1lZ2hhdMOhcm96w6Fzw6Fob3osIGhvZ3kga2l0IGtlbGwgdMOhasOpa296dGF0bmkgZXJyxZFsIGEgamVneXpldHLFkWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdqZWxlbsOtdGkgYXogw7Zzc3plcyBsZWhldHPDqWdlcyDDvGd5aW50w6l6xZEgKGEgdsOhcsOzbGlzdMOhbiB2YWd5IGplZ3llbiBqZWd5emV0IGpvZ29zdWx0c8OhZ2dhbCByZW5kZWxrZXrFkSDDtnNzemVzIMO8Z3lpbnTDqXrFkSkgbGlzdMOhasOhdCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGTDtm50w6lzaSBrw6lwZXJuecWRasOpbiBhbm5hayBtZWdoYXTDoXJvesOhc8OhaG96LCBob2d5IGtpdCBrZWxsIHTDoWrDqWtvenRhdG5pIGVycsWRbCBhIGplZ3l6ZXRyxZFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2plbGVuw610aSBhIGplZ3kgcHJpb3JpdMOhc2kgbGVoZXTFkXPDqWdla2V0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgdG92w6FiYmkgSVRTTSBtZXrFkSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2plbGVuw610aSBhIGplZ3kgcHJpb3JpdMOhc2kgbGVoZXTFkXPDqWdla2V0IGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXQgZMO2bnTDqXNpIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZWdqZWxlbsOtdGkgYSBjw61tbWV6xZFrZXQgYXogw7xneWludMOpesWRaSBmZWzDvGxldCB0b3bDoWJiaSBJVFNNIG1lesWRIGvDqXBlcm55xZFqw6luLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lZ2plbGVuw610aSBhIGPDrW1tZXrFkWtldCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGTDtm50w6lzaSBrw6lwZXJuecWRasOpbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IGRlY2lzaW9uLid9ID0gJ0plZ3lkw7ZudMOpcy4nOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICdTZXJ2aWNlIEluY2lkZW50IFN0YXRlJywKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6aWRfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpa2FsaXRhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdEYW1wYWsnOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnU3RhdHVzIGxheWFuYW4gaW5zaWRlbic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0ZpbHRlckVsZW1lbnRQb3N0L0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ3Rpa2V0IHRhdXRhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgJXMlcyVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiAlcyVzJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ01lbWVybHVrYW4gcGVuaW5qYXVhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdIYXNpbCBrZXB1dHVzYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdEaXNldHVqdWknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ1dha3R1IG11bGFpIHBlcmJhaWthbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnV2FrdHUgYXdhbCBwZW11bGloYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ1RhbmdnYWwga2VwdXR1c2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAndGFuZ2dhbCBqYXR1aCB0ZW1wbyc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ0RpdHV0dXAgZGVuZ2FuIHNvbHVzaSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0JlcmlrYW4gc2VidWFoIGtlcHV0dXNhbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0JpZGFuZyBJVFNNIHRhbWJhaGFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJ2JpZGFuZyB0aWtldCBJVFNNIHRhbWJhaGFuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJemlua2FuIG1lbmFtYmFoa2FuIGNhdGF0YW4gZGkgZGFsYW0gbGF5YXIgYmlkYW5nIElUUyB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ2l6aW5rYW4gbWVuYW1iYWhrYW4gY2F0YXRhbiBkaSBkYWxhbSBsYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCkuJ30gPQogICAgICAgICdNZW11bmdraW5rYW4gbWVuZGVmaW5pc2lrYW4gamVuaXMgYmFydSB1bnR1ayB0aWtldCAoamlrYSBmaXR1ciBqZW5pcyB0aWtldCBkaWFrdGlma2FuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdVYmFoIGJpZGFuZyBJVFNNISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0tlcHV0dXNhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4gamlrYSBrdW5jaSB0aWtldCBkaXBlcmx1a2FuIHBhZGEgbGF5YXIgYmlkYW5nIElUU00gdGFtYmFoYW4gcGFkYSBhbnRhcm11a2EgYWdlbiAoamlrYSB0aWtldCBiZWx1bSB0ZXJrdW5jaSwgdGlrZXQgYWthbiB0ZXJrdW5jaSBkYW4gYWdlbiBzYWF0IGl0dSBzZWNhcmEgb3RvbWF0aXMgYWthbiBtZW5qYWRpIHBlbWlsaWtueWEpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBqaWthIGt1bmNpIHRpa2V0IGRpcGVybHVrYW4gZGkgbGF5YXIga2VwdXR1c2FuIHBhZGEgYW50YXJtdWthIGFnZW4gKGppa2EgdGlrZXQgYmVsdW0gdGVya3VuY2ksIHRpa2V0IGFrYW4gdGVya3VuY2kgZGFuIGFnZW4gc2FhdCBpdHUgYWthbiBtZW5qYWRpIHBlbWlsaWtueWEgc2VjYXJhIG90b21hdGlzKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBqaWthIHN0YXR1cyBsYXlhbmFuIGluc2lkZW4gaGFydXMgZGkgdGFtcGlsa2FuIGtldGlrYSBwZW1pbGloYW4gbGF5YW5hbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBpc2kgZGVmYXVsdCBjYXRhdGFuIGRhbGFtIGxheWFyIGJpZGFuZyBJVFNNIHRhbWJhaGFuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4gaXNpIGRlZmF1bHQgY2F0YXRhbiBkaSBsYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBzdGF0dXMgZGVmYXVsdCBiZXJpa3V0bnlhIGRhcmkgc2VidWFoIHRpa2V0IHNldGVsYWggbWVuYW1iYWhrYW4gY2F0YXRhbiwgZGFsYW0gbGF5YXIgYmlkYW5nIElUU00gdGFtYmFoYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIHN0YXR1cyBkZWZhdWx0IGJlcmlrdXRueWEgZGFyaSBzZWJ1YWggdGlrZXQgc2V0ZWxhaCBtZW5hbWJhaGthbiBjYXRhdGFuLCBkYWxhbSBMYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4gc3ViamVrIGRlZmF1bHQgZGFyaSBzZWJ1YWggY2FjYXRhbiBkYWxhbSBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIHN1YmplayBkZWZhdWx0IGRhcmkgc2VidWFoIGNhY2F0YW4gZGFsYW0gbGF5YXIgS2VwdXR1c2FuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBwcmlvcml0YXMgZGVmYXVsdCB0aWtldCBkYWxhbSBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBwcmlvcml0YXMgZGVmYXVsdCB0aWtldCBkYWxhbSBsYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiByaXdheWF0IGtvbWVudGFyIHVudHVrIHRpbmRha2FuIGxheWFyIGJpZGFuZyBJVFNNIHRhbWJhaGFuLCB5YW5nIGRpZ3VuYWthbiBwYWRhIHJpd2F5YXQgdGlrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiByaXdheWF0IGtvbWVudGFyIHVudHVrIHRpbmRha2FuIGxheWFyIGtlcHV0dXNhbiwgeWFuZyBkaWd1bmFrYW4gcGFkYSByaXdheWF0IHRpa2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluaXNpa2FuIHRpcGUgcml3YXlhdCB1bnR1ayB0aW5kYWthbiBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiwgeWFuZyBkaWd1bmFrYW4gcGFkYSByaXdheWF0IHRpa2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5pc2lrYW4gdGlwZSByaXdheWF0IHVudHVrIHRpbmRha2FuIGxheWFyIGtlcHV0dXNhbiwgeWFuZyBkaWd1bmFrYW4gcGFkYSByaXdheWF0IHRpa2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBzdGF0dXMgdGlrZXQgYmVyaWt1dG55YSBzZXRlbGFoIG1lbmFtYmFoa2FuIGNhdGF0YW4sIGRpZGFsYW0gbGF5YXIgYmlkYW5nIElUU00gdGFtYmFoYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmlzaWthbiBzdGF0dXMgdGlrZXQgYmVyaWt1dG55YXNldGFsYWggbWVuYW1iYWhrYW4gY2F0YXRhbiwgZGkgZGFsYW0gbGF5YXIga2VwdXR1c2FuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnYWt0aWZrYW4gbW9kdWwgc3RhdHMgdW50dWsgbWVuZ2hhc2lsa2FuIHN0YXRpc3RpayB0ZW50YW5nIHJhdGEtcmF0YSB0aW5na2F0IHBlbnllbGVzYWlhbiBsZXZlbCBwZXJ0YW1hIHRpa2V0IElUU00uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnYWt0aWZrYW4gbW9kdWwgc3RhdHMgdW50dWsgbWVuZ2hhc2lsa2FuIHN0YXRpc3RpayB0ZW50YW5nIHJhdGEtcmF0YSBwZW55ZWxlc2FpYW4gdGlrZXQgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdKaWthIHNlYnVhaCBjYXRhdGFuIHlhbmcgZGkgdGFtYmFoa2FuIG9sZWggYWdlbiwgdGVudHVrYW4gc3RhdHVzIHRpa2V0IGRpZGFsYW0gbGF5YXIgYmlkYW5nIElUU00gdGFtYmFoYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdKaWthIHNlYnVhaCBjYXRhdGFuIGRpdGFtYmFoa2FuIG9sZWggYWdlbiwgdGVudHVrYW4gc3RhdHVzIHRpa2V0IGRpZGFsYW0gbGF5YXIga2VwdXR1c2FuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGlmaWVzIHRoZSBkaXNwbGF5IG9yZGVyIG9mIHRoZSBkeW5hbWljIGZpZWxkIElUU01JbXBhY3QgYW5kIG90aGVyIHRoaW5ncy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gZHluYW1pY2FsbHkgc2hvdyB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgdG8gY2FsY3VsYXRlIHRoZSBwcmlvcml0eS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbWVybHVrYW4gaXppbiB1bnR1ayBtZW5nZ3VuYWthbiBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVtZXJsdWthbiBpemluIHVudHVrIG1lbmdndW5ha2FuIGxheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlIGFuZCBQcmlvcml0eSBDYWxjdWxhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnVGVudHVrYW4gbGF5YW5hbiBkaSBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuIChUaWNrZXQ6OlNlcnZpY2UgcGVybHUgZGkgYWt0aWZrYW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdUZW50dWthbiBsYXlhbmFuIGRpIGxheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuIChUaWNrZXQ6OlNlcnZpY2UgcGVybHUgZGkgYWt0aWZrYW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1NldCBsYXlhbmFuIGRpIGxheWFyIHByaW9yaXRhcyB0aWtldCBkYXJpIHRpa2V0IHlhbmcgZGlwZXJiZXNhciBkaSBhbnRhcm11a2EgYWdlbiAoVGlja2V0IDo6IExheWFuYW4gaGFydXMgZGlha3RpZmthbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVGVudHVrYW4gcGVtaWxpayB0aWtldCBkaSBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVGVudHVrYW4gcGVtaWxpayB0aWtldCBkaSBsYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdUZW50dWthbiBwZW5hbmdndW5nIGphd2FiIHRpa2V0IGRpIGxheWFyIGJpZGFuZyBJVFNNIHRhbWJhaGFuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdUZW50dWthbiBwZW5hbmdndW5nIGphd2FiIHRpa2V0IGRpIGxheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1RlbnR1a2FuIHRpcGUgdGlrZXQgZGkgbGF5YXIgYmlkYW5nIElUU00gdGFtYmFoYW4gcGFkYSBhbnRhcm11a2EgYWdlbiAoVGlja2V0OjpUeXBlIHBlcmx1IGRpIGFrdGlma2FuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1RlbnR1a2FuIHRpcGUgdGlrZXQgZGkgbGF5YXIga2VwdXR1c2FuIHBhZGEgYW50YXJtdWthIGFnZW4gKFRpY2tldDo6VHlwZSBwZXJsdSBkaSBha3RpZmthbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ01lbmV0YXBrYW4gamVuaXMgdGlrZXQgZGkgbGF5YXIgcHJpb3JpdGFzIHRpa2V0IGRhcmkgdGlrZXQgeWFuZyBkaXBlcmJlc2FyIGRpIGFudGFybXVrYSBhZ2VuIChUaWNrZXQgOjogVHlwZSBoYXJ1cyBkaWFrdGlma2FuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVHVuanVrYW4gdGF1dGFuIGRpIG1lbnUgdW50dWttZW5ndWJhaCBrZXB1dHVzYW4gc2VidWFoIHRpa2V0IHBhZGEgdGFtcGlsYW4gcGVtYmVzYXJhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1R1bmp1a2FuIHRhdXRhbiBkaSBtZW51IHVudHVrIG1lbW9kaWZpa2FzaSBiaWRhbmcgSVRTTSB0YW1iYWhhbiBkaSB0YW1waWxhbiBwZW1iZXNhcmFuIHRpa2V0IHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1R1bmp1a2FuIGRhZnRhciBkYXJpIHNlbXVhIGFnZW4geWFuZyB0ZXJsaWJhdCBwYWRhIHRpa2V0IGluaSwgZGlkYWxhbSBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1R1bmp1a2FuIGRhZnRhciBkYXJpIHNlbXVhIGFnZW4geWFuZyB0ZXJsaWJhdCBwYWRhIHRpa2V0IGluaSwgZGlkYWxhbSBsYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdUdW5qdWthbiBkYWZ0YXIgc2VtdWEgYWdlbiB5YW5nIG1lbXVuZ2tpbmthbiAoc2VtdWEgYWdlbiBkZW5nYW4gaXppbiBjYXRhdGFuIHBhZGEgYW50cmlhbi90aWtldCkgdW50dWsgbWVuZW50dWthbiBzaWFwYSB5YW5nIGhhcnVzIGRpIGluZm9ybWFzaWthbiB0ZW50YW5nIGNhdGF0YW4gaW5pLCBkaSBkYWxhbSBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFyIG11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1R1bmp1a2FuIGRhZnRhciBzZW11YSBhZ2VuIHlhbmcgbWVtdW5na2lua2FuIChzZW11YSBhZ2VuIGRlbmdhbiBpemluIGNhdGF0YW4gcGFkYSBhbnRyaWFuL3Rpa2V0KSB1bnR1ayBtZW5lbnR1a2FuIHNpYXBhIHlhbmcgaGFydXMgZGkgaW5mb3JtYXNpa2FuIHRlbnRhbmcgY2F0YXRhbiBpbmksIGRpIGRhbGFtIGxheWFyIGtlcHV0dXNhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1R1bmp1a2FuIHBpbGloYW4gcHJpb3JpdGFzIHRpa2V0IGRpZGFsYW0gbGF5YXIgYmlkYW5nIElUU00gdGFtYmFoYW4gcGFkYSBhbnRhcm11a2EgYWdlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1R1bmp1a2FuIHBpbGloYW4gcHJpb3JpdGFzIHRpa2V0IGRpZGFsYW0gbGF5YXIga2VwdXR1c2FuIHBhZGEgYW50YXJtdWthIGFnZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1R1bmp1a2FuIGJpZGFuZyBqdWR1bCBkaSBsYXlhciBiaWRhbmcgSVRTTSB0YW1iYWhhbiBwYWRhIGFudGFybXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1R1bmp1a2FuIGJpZGFuZyBqdWR1bCBkaSBsYXlhciBrZXB1dHVzYW4gcGFkYSBhbnRhcm11a2EgYWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnS2VwdXR1c2FuIHRpa2V0Lic7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgJ1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnLAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6aXRfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ1VyZ2VuemlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ0ltcGF0dG8nOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRmlsdGVyRWxlbWVudFBvc3QvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnQ29sbGVnYSB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mICVzJXMlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgJXMlcyVzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdSaWNoaWVzdGEgcmV2aXNpb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1Jpc3VsdGF0byBhcHByb3ZhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdBcHByb3ZhdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ0RhdGEgaW5pemlhbGUgZGkgcmlwYXJhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0RhdGEgaW5pemlhbGUgZGkgcmVjdXBlcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0RhdGEgZGkgYXBwcm92YXppb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRGF0YSBkaSBzY2FkZW56YSc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ2NoaXVzbyBjb24gc29sdXppb25lIHRhbXBvbmUgKHdvcmthcm91bmQpJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnQWdnaXVuZ2kgdW5hIHJpc29sdXppb25lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnQ2FtcGkgSVRTTSBhZ2dpdW50aXZpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdDb25zZW50ZSBkaSBhZ2dpdW5nZXJlIG5vdGUgbmVsbGEgc2NoZXJtYXRhIGRpIGRlY2lzaW9uZSBkZWxsXCdpbnRlcmZhY2NpYSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJ1Blcm1ldHRlIGRpIGRlZmluaXJlIG51b3ZpIHRpcGkgZGkgdGlja2V0IChzZSDDqCBhYmlsaXRhdGEgbGEgZnVuemlvbmUgdGlja2V0IHR5cGUpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnQ2FtYmlhIGkgY2FtcGkgSVRTTSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdBcHByb3ZhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGlmaWVzIHRoZSBkaXNwbGF5IG9yZGVyIG9mIHRoZSBkeW5hbWljIGZpZWxkIElUU01JbXBhY3QgYW5kIG90aGVyIHRoaW5ncy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gZHluYW1pY2FsbHkgc2hvdyB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgdG8gY2FsY3VsYXRlIHRoZSBwcmlvcml0eS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUgYW5kIFByaW9yaXR5IENhbGN1bGF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IGRlY2lzaW9uLid9ID0gJyc7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgJ1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnLAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6amFfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ+mHjeimgeW6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICflvbHpn7/luqYnOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAn44K144O844OT44K544Kk44Oz44K344OH44Oz44OI54q25rOBJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRmlsdGVyRWxlbWVudFBvc3QvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAn44OB44Kx44OD44OI44KS44Oq44Oz44Kv44GZ44KLJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiAlcyVzJXMnfSA9ICclcyVzJXPjga7msbrlrprjgpLlpInmm7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mICVzJXMlcyd9ID0gJyVzJXMlc+OBrklUU03jg5XjgqPjg7zjg6vjg4njgpLlpInmm7QnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ+ODrOODk+ODpeODvOW/hemgiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICfmsbrlrprntZDmnpwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICfmib/oqo0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAn5bu25pyfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJ+S6i+WJjeaJv+iqjea4iOOBvyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJ+aLkuWQpic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ+S/rueQhumWi+Wni+aZgumWkyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAn5Zue5b6p6ZaL5aeL5pmC6ZaTJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICfmsbrlrprml6Xku5gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICflr77lv5zmnJ/pmZAnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfjg6/jg7zjgq/jgqLjg6njgqbjg7Pjg4njgaflrozkuoYnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfmsbrlrprjgpLov73liqDjgZnjgovvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ+i/veWKoOOBrklUU03poIXnm64nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAn6L+95Yqg44GuIElUU00g44OB44Kx44OD44OI772l44OV44Kj44O844Or44OJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+OCqOODvOOCuOOCp+ODs+ODiOOCpOODs+OCv+ODvOODleOCp+OCpOOCueOBruOCouODh+OCo+OCt+ODp+ODiuODq0lUU03poIXnm67nlLvpnaLjgafov73liqDjga7jg47jg7zjg4jjgpLoqLHlj6/jgZnjgosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjga7msbrlrpog55S76Z2i44Gn44CB44Oh44Oi44Gu6L+95Yqg44KS6Kix5Y+v44GX44G+44GZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJ+ODgeOCseODg+ODiOOBq+mWouOBl+OBpuaWsOimj+OCv+OCpOODl+OCkuWumue+qeOBmeOCi+OBk+OBqOOCkuioseWPr+OBl+OBvuOBme+8iOODgeOCseODg+ODiOiyrOS7u+iAheapn+iDveOBjOacieWKueOBqOOBquOBo+OBpuOBhOOCi+WgtOWQiO+8ieOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ0lUU03poIXnm67jgpLlpInmm7TjgZnjgovvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICfmsbrlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrnjgafjgrXjg7zjg5Pjgrnpgbjmip7mmYLjgavjgrXjg7zjg5PjgrnjgqTjg7Pjgrfjg4fjg7Pjg4jnirbms4HjgpLooajnpLrjgZnjgovjgYvlrprnvqnjgZnjgovjgZnjgosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5ouF5b2T6ICF44Kk44Oz44K/44OV44Kn44O844K544Gu6L+95Yqg44GuSVRTTeOBruODleOCo+ODvOODq+ODieeUu+mdouOBp+eUqOOBhOOCi+ODh+ODleOCqeODq+ODiOOBruODoeODouacrOaWh+OCkuWumue+qeOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+aLheW9k+iAheOCpOODs+OCv+ODleOCp+ODvOOCueOBruaxuuWumueUu+mdouOBp+eUqOOBhOOCi+ODh+ODleOCqeODq+ODiOOBruODoeODouacrOaWh+OCkuWumue+qeOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+aLheW9k+iAheOCpOODs+OCv+ODleOCp+ODvOOCueOBrui/veWKoOOBrklUU03jga7jg5XjgqPjg7zjg6vjg4nnlLvpnaLjgafjgIHjg6Hjg6Lov73liqDlvozjga7jgIzmrKHjga7nirbmhYvjgI3jgavjgaTjgYTjgabjg4fjg5Xjgqnjg6vjg4jjga7pgbjmip7ogqLjgpLlrprnvqnjgZfjgb7jgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+aLheW9k+iAheOCpOODs+OCv+ODleOCp+ODvOOCueOBruaxuuWumueUu+mdouOBp+OAgeODoeODoui/veWKoOW+jOOBruOAjOasoeOBrueKtuaFi+OAjeOBq+OBpOOBhOOBpuODh+ODleOCqeODq+ODiOOBrumBuOaKnuiCouOCkuWumue+qeOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrnjga7ov73liqAgSVRTTeODleOCo+ODvOODq+ODieeUu+mdouOBp+eUqOOBhOOCi+ODh+ODleOCqeODq+ODiOOBruODoeODouOBruS7tuWQjeOCkuWumue+qeOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5ouF5b2T6ICF44Kk44Oz44K/44O844OV44Kn44Kk44K544Gu6L+95YqgIElUU03jg5XjgqPjg7zjg6vjg4nnlLvpnaLjgafjgIHjg6Hjg6Lov73liqDlvozjga7jg4HjgrHjg4Pjg4jjga7mrKHjga7nirbmhYvjgavjgaTjgYTjgabpgbjmip7ogqLjgpLlrprnvqnjgZfjgb7jgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrnjga7msbrlrprnlLvpnaLjgafjgIHjg6Hjg6Lov73liqDlvozjga7jg4HjgrHjg4Pjg4jjga7mrKHjga7nirbmhYvjgavjgaTjgYTjgabpgbjmip7ogqLjgpLlrprnvqnjgZfjgb7jgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+aLheW9k+iAheOCpOODs+OCv+ODvOODleOCp+OCpOOCueOBrui/veWKoCBJVFNN44OV44Kj44O844Or44OJ55S76Z2i44Gr6KGo56S644GZ44KL44OA44Kk44OK44Of44OD44Kv44O744OV44Kj44O844Or44OJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+aLheW9k+iAheOCpOODs+OCv+ODvOODleOCp+OCpOOCueOBruaxuuWumueUu+mdouOBq+ihqOekuuOBmeOCi+ODgOOCpOODiuODn+ODg+OCr+ODu+ODleOCo+ODvOODq+ODiSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrnjga7jg4HjgrHjg4Pjg4jjgrrjg7zjg6DnlLvpnaLjgavooajnpLrjgZnjgovjg4DjgqTjg4rjg5/jg4Pjgq/jg7vjg5XjgqPjg7zjg6vjg4knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kaWZpZXMgdGhlIGRpc3BsYXkgb3JkZXIgb2YgdGhlIGR5bmFtaWMgZmllbGQgSVRTTUltcGFjdCBhbmQgb3RoZXIgdGhpbmdzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBkeW5hbWljYWxseSBzaG93IHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCB0byBjYWxjdWxhdGUgdGhlIHByaW9yaXR5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSBhbmQgUHJpb3JpdHkgQ2FsY3VsYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrnjga7ov73liqAgSVRTTeODleOCo+ODvOODq+ODieeUu+mdouOBp+OAgeOBneOBruODgeOCseODg+ODiOOBq+mWouS4juOBmeOCi+WFqOaLheW9k+iAheOBruODquOCueODiOOBp+OBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+aLheW9k+iAheOCpOODs+OCv+ODvOODleOCp+OCpOOCueOBruaxuuWumueUu+mdouOBp+OAgeOBneOBruODgeOCseODg+ODiOOBq+mWouS4juOBmeOCi+WFqOOBpuOBruaLheW9k+iAheOBruODquOCueODiOOCkuihqOekuuOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5ouF5b2T6ICFV2Vi44Kk44Oz44K/44O844OV44Kn44Kk44K544Gu6L+95YqgSVRTTeODleOCo+ODvOODq+ODieeUu+mdouOBq+ODgeOCseODg+ODiOOBruWEquWFiOW6puOCquODl+OCt+ODp+ODs+OCkuihqOekuuOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5ouF5b2T6ICFV2Vi44Kk44Oz44K/44O844OV44Kn44Kk44K544Gu5rG65a6a55S76Z2i44Gr44OB44Kx44OD44OI5YSq5YWI5bqm44Kq44OX44K344On44Oz44KS6KGo56S644GX44G+44GZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAn44OB44Kx44OD44OI44Gu5rG65a6aJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAnU2VydmljZSBJbmNpZGVudCBTdGF0ZScsCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bXNfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpa2FsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ0tlc2FuJzsKCiAgICAjIEpTIFRlbXBsYXRlOiBTZXJ2aWNlSW5jaWRlbnRTdGF0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ0tlYWRhYW4gSW5zaWRlbiBQZXJraGlkbWF0YW4nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9GaWx0ZXJFbGVtZW50UG9zdC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdQYXV0YW4gdGlrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mICVzJXMlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgJXMlcyVzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdrZXJqYSBzZW11bGEgZGlwZXJsdWthbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdLZXB1dHVzYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdEaWx1bHVza2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVqZWN0ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdQZXJiYWlraSBNYXNhIE11bGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ1BlbXVsaWhhbiBNYXNhIE11bGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ1RhcmlraCBLZXB1dHVzYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdUYXJpa2ggZGlzZWJhYmthbic7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ2RpdHV0dXAgZGVuZ2FuIGtlcmphIGRpIHNla2l0YXInOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdUYW1iYWgga2VwdXR1c2FuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnVGFtYmFoYW4gSVRTTSBNZWRhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICd0YW1iYWhhbiBrYXdhc2FuLWthd2FzYW4gdGlrZXQgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW1iZW5hcmthbiBwZW5hbWJhaGFuIGNhdGF0YW4gZGFsYW0gc2tyaW4gbWVkYW4gSVRTTSB0YW1iYWhhbiBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbWJlbmFya2FuIHBlbmFtYmFoYW4gbm90YSBkYWxhbSBza3JpbiBrZXB1dHVzYW4gYmFnaSBydWFuZyBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCkuJ30gPQogICAgICAgICdNZW1ib2xlaGthbiBqZW5pcyB0aWtldCB5YW5nIGJhcnUgZGlkZWZpbmFzaWthbiAoamlrYSBmdW5nc2kgamVuaXMgdGlrZXQgZGlha3RpZmthbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnw4RuZGVybiBkZXIgSVRTTS1GZWxkZXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnRW50c2NoZWlkdW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdNZW5lbnR1a2FuIGppa2Ega3VuY2kgdGlrZXQgZGlwZXJsdWthbiBkaSBza3JpbiBtZWRhbiBJVFNNIHRhbWJhaGFuIGFudGFyYSBtdWthIGVqZW4gKGppa2EgdGlrZXQgdGlkYWsgZGlrdW5jaSBsYWdpLCB0aWtldCBtZW5qYWRpIGJlcmt1bmNpIGRhbiBlamVuIHNlbWFzYSBha2FuIGRpc2V0a2FuIHNlY2FyYSBhdXRvbWF0aWsgc2ViYWdhaSBwZW1pbGlrbnlhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnTWVuZW50dWthbiBqaWthIGt1bmNpIHRpa2V0IGRpcGVybHVrYW4gZGkgc2tyaW4ga2VwdXR1c2FuIGFudGFyYSBtdWthIGVqZW4gKGppa2EgdGlrZXQgdGlkYWsgZGlrdW5jaSBsYWdpLCB0aWtldCBtZW5qYWRpIGJlcmt1bmNpIGRhbiBlamVuIHNlbWFzYSBha2FuIGRpc2V0a2FuIHNlY2FyYSBhdXRvbWF0aWsgc2ViYWdhaSBwZW1pbGlrbnlhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4gamlrYSBrZWFkYWFuIGluc2lkZW4gcGVya2hpZG1hdGFuIGhlbmRha2xhaCBkaXR1bmp1a2thbiBzZW1hc2EgcGVtaWxpaGFuIHBlcmtoaWRtYXRhbiBkYWxhbSBydWFuZyBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW5lbnR1a2FuIGJhZGFuIGxhbGFpIG5vdGEgZGkgc2tyaW4gbWVkYW4gSVRTTSB0YW1iYWhhbiBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbmVudHVrYW4gYmFkYW4gbGFsYWkgbm90YSBkaSBza3JpbiBrZXB1dHVzYW4gYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4ga2VhZGFhbiBsYWxhaSBzZXRlcnVzbnlhIGRhcmkgdGlrZXQgc2VsZXBhcyBtZW5hbWJhaCBub3RhLCBkYWxhbSBza3JpbiBiaWRhbmcgSVRTTSB0YW1iYWhhbiBkYXJpIHBhcGFyYW4gZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnRha3JpZmthbiBhc2FsIGtlYWRhYW4gc2V0ZXJ1c255YSBkYXJpIHRpa2V0IHNlbGVwYXMgbWVuYW1iYWggbm90YSwgZGFsYW0gc2tyaW4ga2VwdXR1c2FuIGRhcmkgcGFwYXJhbiBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW5lbnR1a2FuIHN1YmplayBsYWxhaSBub3RhIGRpIHNrcmluIG1lZGFuIElUU00gdGFtYmFoYW4gYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW5lbnR1a2FuIHN1YmplayBsYWxhaSBub3RhIGRpIHNrcmluIGtlcHV0dXNhbiBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIGtldXRhbWFhbiB0aWtldCBkZWZhdWx0IGRpIHNrcmluIG1lZGFuIElUU00gdGFtYmFoYW4gYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIGtldXRhbWFhbiB0aWtldCBkZWZhdWx0IGRpIHNrcmluIGtlcHV0dXNhbiBhbnRhcmEgbXVrYSBhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ01lbmVudHVrYW4ga29tZW4gc2VqYXJhaCB1bnR1ayBtZWRhbiBza3JpbiB0aW5kYWthbiBJVFNNIHRhbWJhaGFuLCAgeWFuZyBkYXBhdCBkaWd1bmFrYW4gdW50dWsgc2VqYXJhaCB0aWtldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ01lbnRha3JpZmthbiBrb21lbiBzZWphcmFoIGJhZ2kgdGluZGFrYW4gc2tyaW4ga2VwdXR1c2FuLCB5YW5nIGFrYW4gZGlndW5ha2FuIHVudHVrIHNlamFyYWggdGlrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIGplbmlzIHNlamFyYWggYmFnaSB0aW5kYWthbiBza3JpbiBiaWRhbmcgSVRTTSB0YW1iYWhhbiwgeWFuZyBha2FuIGRpZ3VuYWthbiB1bnR1ayBzZWphcmFoIHRpa2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIGplbmlzIHNlamFyYWggYmFnaSB0aW5kYWthbiBza3JpbiBrZXB1dHVzYW4sIHlhbmcgYWthbiBkaWd1bmFrYW4gdW50dWsgc2VqYXJhaCB0aWtldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudGFrcmlma2FuIGtlYWRhYW4gc2V0ZXJ1c255YSB0aWtldCBzZWxlcGFzIG1lbmFtYmFoIG5vdGEsIGRhbGFtIHNrcmluIGJpZGFuZyBJVFNNIHRhbWJhaGFuIGJhZ2kgYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW50YWtyaWZrYW4ga2VhZGFhbiBzZXRlcnVzbnlhIHRpa2V0IHNlbGVwYXMgbWVuYW1iYWggbm90YSwgZGFsYW0gc2tyaW4ga2VwdXR1c2FuIGJhZ2kgYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICdNZW1ib2xlaGthbiBtb2R1bCBzdGF0aXN0aWsgdW50dWsgbWVuamFuYSBzdGF0aXN0aWsgdGVudGFuZyBwdXJhdGEgdGlrZXQgSVRTTSBwZXJpbmdrYXQgcGVydGFtYSBrYWRhciBwZW55ZWxlc2FpYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnTWVtYm9sZWhrYW4gbW9kdWwgc3RhdGlzdGlrIHVudHVrIG1lbmphbmEgc3RhdGlzdGlrIHRlbnRhbmcgcHVyYXRhIHBlbnllbGVzYWlhbiB0aWtldCBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdKaWthIG5vdGEgZGl0YW1iYWggb2xlaCBlamVuLCB0ZXRhcGthbiBrZWFkYWFuIHRpa2V0IGRhbGFtIHNrcmluIGJpZGFuZyBJVFNNIHRhbWJhaGFuIGJhZ2kgYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdKaWthIG5vdGEgZGl0YW1iYWggb2xlaCBlamVuLCB0ZXRhcGthbiBrZWFkYWFuIHRpa2V0IGRhbGFtIHNrcmluIGtlcHV0dXNhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGlmaWVzIHRoZSBkaXNwbGF5IG9yZGVyIG9mIHRoZSBkeW5hbWljIGZpZWxkIElUU01JbXBhY3QgYW5kIG90aGVyIHRoaW5ncy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gZHluYW1pY2FsbHkgc2hvdyB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgdG8gY2FsY3VsYXRlIHRoZSBwcmlvcml0eS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0tlYmVuYXJhbiB5YW5nIGRpcGVybHVrYW4gdW50dWsgbWVuZ2d1bmFrYW4gc2tyaW4gYmlkYW5nIElUU00gdGFtYmFoYW4gZGFsYW0gYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0tlYmVuYXJhbiB5YW5nIGRpcGVybHVrYW4gdW50dWsgbWVuZ2d1bmFrYW4gc2tyaW4ga2VwdXR1c2FuIGRhbGFtIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUgYW5kIFByaW9yaXR5IENhbGN1bGF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdTZXQgcGVya2hpZG1hdGFuIGRhbGFtIHNrcmluIGJpZGFuZyBJVFNNIHRhbWJhaGFuIGJhZ2kgYW50YXJhIG11a2EgZWplbiAoVGlrZXQ6OlBlcmtoaWRtYXRhbiBwZXJsdSBkaWFrdGlma2FuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnU2V0IHBlcmtoaWRtYXRhbiBkYWxhbSBza3JpbiBrZXB1dHVzYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuIChUaWtldDo6UGVya2hpZG1hdGFuIHBlcmx1IGRpYWt0aWZrYW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1RldGFwa2FuIHBlcmtoaWRtYXRhbiBkYWxhbSBza3JpbiBrZXV0YW1hYW4gdGlrZXQgZGFyaSB0aWtldCBkaXp1bSBkYWxhbSBwYXBhcmFuIGVqZW4gKFRpY2tldDo6U2VydmljZSBwZXJsdSBkaWFrdGlma2FuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZXQgcGVtaWxpayB0aWtldCBkYWxhbSBza3JpbiBiaWRhbmcgSVRTTSB0YW1iYWhhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZXQgcGVtaWxpayB0aWtldCBkYWxhbSBza3JpbiBrZXB1dHVzYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NldCB0aWtldCB5YW5nIGJlcnRhbmdndW5namF3YWIgZGFsYW0gc2tyaW4gYmlkYW5nIElUU00gdGFtYmFoYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2V0IHRpa2V0IHlhbmcgYmVydGFuZ2d1bmdqYXdhYiBkYWxhbSBza3JpbiBrZXB1dHVzYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ01lbmV0YXBrYW4gamVuaXMgdGlrZXQgZGFsYW0gc2tyaW4gYmlkYW5nIElUU00gdGFtYmFoYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuIChUaWtldDo6SmVuaXMgcGVybHUgZGlha3RpZmthbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdNZW5ldGFwa2FuIGplbmlzIHRpa2V0IGRhbGFtIHNrcmluIGtlcHV0dXNhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4gKFRpa2V0OjpKZW5pcyBwZXJsdSBkaWFrdGlma2FuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnVGV0YXBrYW4gamVuaXMgdGlrZXQgZGFsYW0gc2tyaW4ga2V1dGFtYWFuIHRpa2V0IGRhcmkgdGlrZXQgZGl6dW0gZGFsYW0gcGFwYXJhbiBlamVuIChUaWNrZXQ6OlR5cGUgcGVybHUgZGlha3RpZmthbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnVuanVra2FuIHBhdXRhbiBkYWxhbSBtZW51IHVudHVrIG1lbmd1YmFoIGtlcHV0dXNhbiB0aWtldCBkYWxhbSBwYW5kYW5nYW4genVtIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudW5qdWtrYW4gcGF1dGFuIGRhbGFtIG1lbnUgdW50dWsgbWVuZ3ViYWggc3VhaSBiaWRhbmcgSVRTTSB0YW1iYWhhbiBkYWxhbSBwYW5kYW5nYW4genVtIHRpa2V0IGJhZ2kgYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVtYXBhcmthbiBzZW5hcmFpIHNlbXVhIGVqZW4geWFuZyB0ZXJsaWJhdCBkYWxhbSB0aWtldCBpbmksIGRhbGFtIHNrcmluIGJpZGFuZyBJVFNNIHRhbWJhaGFuIGJhZ2kgYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW1hcGFya2FuIHNlbmFyYWkgc2VtdWEgZWplbiB5YW5nIHRlcmxpYmF0IGRhbGFtIHRpa2V0IGluaSwgZGFsYW0gc2tyaW4ga2VwdXR1c2FuIGJhZ2kgYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNZW1hcGFya2FuIHNlbmFyYWkgc2VtdWEga2VtdW5na2luYW4gZWplbiAoIHNlbXVhIGVqZW4gZGVuZ2FuIGtlYmVuYXJhbiBub3RhIG1lbmdlbmFpIGJhcmlzYW4gLyB0aWtldCkgdW50dWsgbWVuZW50dWthbiBzaWFwYSB5YW5nIHBlcmx1IGRpYmVyaXRhaHUgdGVudGFuZyBub3RhIGluaSAsIGRhbGFtIHNrcmluIGJpZGFuZyBJVFNNIHRhbWJhaGFuIGJhZ2kgYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbWFwYXJrYW4gc2VuYXJhaSBzZW11YSBrZW11bmdraW5hbiBlamVuIChzZW11YSBlamVuIGRlbmdhbiBrZWJlbmFyYW4gbm90YSBtZW5nZW5haSBiYXJpc2FuL3Rpa2V0KSB1bnR1ayBtZW5lbnR1a2FuIHNpYXBhIHlhbmcgcGVybHUgZGliZXJpdGFodSB0ZW50YW5nIG5vdGEgaW5pLCBkYWxhbSBza3JpbiBrZXB1dHVzYW4gYmFnaSBhbnRhcmEgbXVrYSBlamVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnVuanVra2FuIHBpbGloYW4ga2V1dGFtYWFuIHRpa2V0IGRhbGFtIHNrcmluIGJpZGFuZyBJVFNNIHRhbWJhaGFuIGJhZ2kgYW50YXJhIG11a2EgZWplbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnVuanVra2FuIHBpbGloYW4ga2V1dGFtYWFuIHRpa2V0IGRhbGFtIHNrcmluIGtlcHV0dXNhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01lbnVuanVra2FuIGJpZGFuZyB0YWp1ayBkYWxhbSBza3JpbiBiaWRhbmcgSVRTTSB0YW1iYWhhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVudW5qdWtrYW4gYmlkYW5nIHRhanVrIGRhbGFtIHNrcmluIGtlcHV0dXNhbiBiYWdpIGFudGFyYSBtdWthIGVqZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICdrZXB1dHVzYW4gdGlrZXQnOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICdTZXJ2aWNlIEluY2lkZW50IFN0YXRlJywKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bmJfTk9fSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpa2FsaXRldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdPbWZhbmcnOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnSGVuZGVsc2VzdGlsc3RhbmQgZm9yIHRqZW5lc3Rlbic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0ZpbHRlckVsZW1lbnRQb3N0L0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ0tvYmxlIHNhayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgJXMlcyVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiAlcyVzJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ0V2YWx1ZXJpbmcga3JldmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ0Jlc2x1dG5pbmdzcmVzdWx0YXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdHb2RramVudCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnU3RhcnR0aWQgZm9yIHJlcGFyYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ1N0YXJ0dGlkIGZvciBnamVub3BwcmV0dGluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnQmVzbHV0bmluZ3NkYXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRm9yZmFsbHNkYXRvJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAnTHVra2V0IG1lZCBtaWRsZXJ0aWRpZyBsw7hzbmluZyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0xlZ2cgdGlsIGVuIGJlc2x1dG5pbmchJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdFa3N0cmEgSVRTTS1mZWx0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJ0Vrc3RyYSBJVFNNLWZlbHQgZm9yIHNha2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdUaWxsYXRlciDDpSBsZWdnZSB0aWwgbm90aXNlciBpIGRlIGVrc3RyYSBJVFNNLWZlbHRlbmUgaSBzYWtzYmVoYW5kbGVyZGVsZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLid9ID0KICAgICAgICAnVGlsbGF0ZXIgw6UgZGVmaW5lcmUgbnllIHR5cGVyIHNha2VyIChkZXJzb20gc2Frc3R5cGUtZnVua3Nqb25hbGl0ZXRlbiBlciBzbMOldHQgcMOlKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdFbmRyZSBJVFNNLWZlbHRlbmUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnQmVzbHV0bmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kaWZpZXMgdGhlIGRpc3BsYXkgb3JkZXIgb2YgdGhlIGR5bmFtaWMgZmllbGQgSVRTTUltcGFjdCBhbmQgb3RoZXIgdGhpbmdzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBkeW5hbWljYWxseSBzaG93IHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCB0byBjYWxjdWxhdGUgdGhlIHByaW9yaXR5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSBhbmQgUHJpb3JpdHkgQ2FsY3VsYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnQmVzbHV0bmluZyBmb3Igc2FrZW4uJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAnU2VydmljZSBJbmNpZGVudCBTdGF0ZScsCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bmxfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ1VyZ2VudGllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ0ltcGFjdCc7CgogICAgIyBKUyBUZW1wbGF0ZTogU2VydmljZUluY2lkZW50U3RhdGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9GaWx0ZXJFbGVtZW50UG9zdC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mICVzJXMlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgJXMlcyVzJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdSZXZpZXcgYmVub2RpZ2QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnUmVzdWx0YWF0IGJlc2xpc3NpbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdBYW5nZW5vbWVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVqZWN0ZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdCZWdpbnRpamQgcmVwYXJhdGllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICdCZWdpbnRpamQgaGVyc3RlbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnQmVzbGlzc2luZ3NkYXR1bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ1ZlcnZhbGRhdHVtJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAnZ2VzbG90ZW4gbWV0IHdvcmthcm91bmQnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdCZXNsaXNzaW5nIHRvZXZvZWdlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0V4dHJhIElUU00gdmVsZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLid9ID0KICAgICAgICAnU3RhYXQgaGV0IHRvZSBvbSBuaWV1d2UgdHlwZXMgdGUgZGVmaW5pZXJlbiB2b29yIHRpY2tldHMgKGFscyB0aWNrZXQgdHlwZSBmZWF0dXJlIGFhbiBzdGFhdCkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnVmVyYW5kZXJlbiB2YW4gSVRTTSB2ZWxkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnQmVzbGlzc2luZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kaWZpZXMgdGhlIGRpc3BsYXkgb3JkZXIgb2YgdGhlIGR5bmFtaWMgZmllbGQgSVRTTUltcGFjdCBhbmQgb3RoZXIgdGhpbmdzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBkeW5hbWljYWxseSBzaG93IHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCB0byBjYWxjdWxhdGUgdGhlIHByaW9yaXR5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSBhbmQgUHJpb3JpdHkgQ2FsY3VsYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAnU2VydmljZSBJbmNpZGVudCBTdGF0ZScsCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyeXR5Y3pub8WbxIcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnV3DFgnl3JzsKCiAgICAjIEpTIFRlbXBsYXRlOiBTZXJ2aWNlSW5jaWRlbnRTdGF0ZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0ZpbHRlckVsZW1lbnRQb3N0L0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ1BvxYLEhWN6IHpnxYJvc3plbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiAlcyVzJXMnfSA9ICdabWllxYQgZGVjeXpqxJkgJXMlcyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiAlcyVzJXMnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IHZhci9wYWNrYWdlc2V0dXAvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ1d5bWFnYW55IHByemVnbMSFZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdSZXp1bHRhdCBkZWN5emppJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAnWmF0d2llcmR6b25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJ09kxYJvxbxvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnV3N0xJlwbmllIHphdHdpZXJkem9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJ09kcnp1Y29uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ0N6YXMgcm96cG9jesSZY2lhIG5hcHJhd3knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0N6YXMgcm96cG9jesSZY2lhIG9kenlza2l3YW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0YSBkZWN5emppJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnQ3phcyB6YWtvxYRjemVuaWEnOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdyb3p3acSFemFuZSB6IG9iZWrFm2NpZW0nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdEb2RhaiBkZWN5emrEmSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0RvZGF0a293ZSBwb2xhIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIHRpY2tldCBmaWVsZHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1BvendhbGEgbmEgZG9kYXdhbmllIG5vdGF0ZWsgbmEgZWtyYW5pZSB6IGRvZGF0a293eW1pIHBvbGFtaSBJVFNNIHcgcGFuZWx1IGFnZW50YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQb3p3YWxhIG5hIGRvZGF3YW5pZSBub3RhdGVrIG5hIGVrcmFuaWUgZGVjeXpqaSB3IHBhbmVsdSBhZ2VudGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJ1BvendhbGEgbmEgZGVmaW5pb3dhbmllIG5vd3ljaCB0eXDDs3cgZGxhIHpnxYJvc3plbmlhIChqZcWbbGkgZnVua2Nqb25hbG5vxZvEhyB0eXB1IHpnxYJvc3plbmlhIHpvc3RhxYJhIHfFgsSFY3pvbmEpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ1ptaWXFhCBwb2xhIElUU00hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnRGVjeXpqYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kaWZpZXMgdGhlIGRpc3BsYXkgb3JkZXIgb2YgdGhlIGR5bmFtaWMgZmllbGQgSVRTTUltcGFjdCBhbmQgb3RoZXIgdGhpbmdzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBkeW5hbWljYWxseSBzaG93IHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCB0byBjYWxjdWxhdGUgdGhlIHByaW9yaXR5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSBhbmQgUHJpb3JpdHkgQ2FsY3VsYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdVc3Rhd2lhIHNlcndpcyB3IG9rbmllIHByaW9yeXRldHUgemfFgm9zemVuaWEgaW50ZXJmZWpzdSBhZ2VudGEgKFRpY2tldDo6U2VydmljZSBtdXNpIGJ5xIcgYWt0eXdvd2FueSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1VzdGF3aWEgdHlwIHpnxYJvc3plbmlhIHcgb2tuaWUgcHJpb3J5dGV0dSB6Z8WCb3N6ZW5pYSBpbnRlcmZlanN1IGFnZW50YSAoVGlja2V0OjpUeXBlIG11c2kgYnnEhyBha3R5d293YW55KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICcnOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICdTZXJ2aWNlIEluY2lkZW50IFN0YXRlJywKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0NyaXRpY2FsaWRhZGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnSW1wYWN0byc7CgogICAgIyBKUyBUZW1wbGF0ZTogU2VydmljZUluY2lkZW50U3RhdGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICdFc3RhZG8gZGUgSW5jaWRlbnRlIGRvIFNlcnZpw6dvJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRmlsdGVyRWxlbWVudFBvc3QvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnQXNzb2NpYXIgY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgJXMlcyVzJ30gPSAnTXVkYXIgZGVjaXPDo28gZGUgJXMlcyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiAlcyVzJXMnfSA9ICdBbHRlcmFyIGNhbXBvcyBJVFNNIGRlICVzJXMlcyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnUmV2aXPDo28gUmVxdWlzaXRhZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnRGVjaXPDo28gUmVzdWx0YW50ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJ0Fwcm92YWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJ1Byb3Jyb2dhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnUHLDqS1hcHJvdmFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWplY3RlZCd9ID0gJ1JlamVpdGFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ0hvcsOhcmlvIEluaWNpYWwgZGUgUmVwYXJvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICdIb3LDoXJpbyBJbmljaWFsIGRlIFJlY3VwZXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0RhdGEgZGUgRGVjaXPDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdEYXRhIGRlIHZlbmNpbWVudG8nOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdmZWNoYWRvIGNvbSBzb2x1w6fDo28gZGUgY29udG9ybm8nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdBZGljaW9uYXIgdW1hIGRlY2lzw6NvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnQ2FtcG9zIGFkaWNpb25haXMgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICdDYW1wb3MgYWRpY2lvbmFpcyBkZSBUaWNrZXQgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFkaWNpb25hciBub3RhcyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFkaWNpb25hciBub3RhcyBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBub3ZvcyB0aXBvcyBkZSBjaGFtYWRvIChjYXNvIGEgZnVuY2lvbmFsaWRhZGUgdGlwbyBkbyBjaGFtYWRvIGVzdGVqYSBoYWJpbGl0YWRhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdBbHRlcmFyIGNhbXBvcyBJVFNNISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0RlY2lzw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdEZWZpbmUgc2UgdW0gYmxvcXVlaW8gZGUgY2hhbWFkbyDDqSBleGlnaWRvIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlIChzZSBvIGNoYW1hZG8gbsOjbyBlc3RpdmVyIGJsb3F1ZWFkbyBhaW5kYSwgbyBjaGFtYWRvIHNlcsOhIGJsb3F1ZWFkb2UgbyBhdGVuZGVudGUgYXR1YWwgc2Vyw6EgYXV0b21hdGljYW1lbnRlIGRlZmluaWRvIGNvbW8gc2V1IHByb3ByaWV0w6FyaW8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdEZWZpbmUgc2UgdW0gYmxvcXVlaW8gZGUgY2hhbWFkbyDDqSBleGlnaWRvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZSAoc2UgbyBjaGFtYWRvIG7Do28gZXN0aXZlciBibG9xdWVhZG8gYWluZGEsIG8gY2hhbWFkbyBzZXLDoSBibG9xdWVhZG9lIG8gYXRlbmRlbnRlIGF0dWFsIHNlcsOhIGF1dG9tYXRpY2FtZW50ZSBkZWZpbmlkbyBjb21vIHNldSBwcm9wcmlldMOhcmlvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgc2UgbyBlc3RhZG8gZGUgaW5jaWRlbnRlIGRvIHNlcnZpw6dvIGRldmUgc2VyIG1vc3RyYWRvIGR1cmFudGUgYSBzZWxlw6fDo28gZGUgc2VydmnDp28gbmEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gY29ycG8gcGFkcsOjbyBkZSB1bWEgbm90YSBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBjb3JwbyBwYWRyw6NvIGRlIHVtYSBub3RhIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gcGFkcsOjbyBkZSB1bSBjaGFtYWRvIGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHLDs3hpbW8gZXN0YWRvIHBhZHLDo28gZGUgdW0gY2hhbWFkbyBhcMOzcyBhIGFkacOnw6NvIGRlIHVtYSBub3RhLCBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGFzc3VudG8gcGFkcsOjbyBkZSB1bWEgbm90YSBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBhc3N1bnRvIHBhZHLDo28gZGUgdW1hIG5vdGEgbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGEgcHJpb3JpZGFkZSBwYWRyw6NvIGRlIGNoYW1hZG8gbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhIHByaW9yaWRhZGUgcGFkcsOjbyBkZSBjaGFtYWRvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyBjb21lbnTDoXJpbyBkZSBoaXN0w7NyaWNvIHBhcmEgYSBhw6fDo28gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSwgcXVlIMOpIHVzYWRvIG5vIGhpc3TDs3JpY28gZG8gY2hhbWFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGNvbWVudMOhcmlvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBkZWNpc8OjbywgcXVlIMOpIHVzYWRvIG5vIGhpc3TDs3JpY28gZG8gY2hhbWFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNLCBxdWUgw6kgdXNhZG8gbm8gaGlzdMOzcmljbyBkbyBjaGFtYWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBkZSBoaXN0w7NyaWNvIHBhcmEgYSBhw6fDo28gZGUgZGVjaXPDo28sIHF1ZSDDqSB1c2FkbyBubyBoaXN0w7NyaWNvIGRvIGNoYW1hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBkZSB1bSBjaGFtYWRvIGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBkZSB1bSBjaGFtYWRvIGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7Dom1pY29zIG1vc3RyYWRvcyBubyBjYW1wbyBkZSB0ZWxhIElUU00gYWRpY2lvbmFsIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7Dom1pY29zIG1vc3RyYWRvcyBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7Dom1pY29zIG1vc3RyYWRvcyBuYSB0ZWxhIGRlIHpvb20gZG8gdGlja2V0IGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICdQZXJtaXRlIHF1ZSBvIG3Ds2R1bG8gZGUgZXN0YXTDrXN0aWNhcyBnZXJlIGVzdGF0w61zdGljYXMgc29icmUgbyBuw612ZWwgbcOpZGlvIGRlIGNoYW1hZG9zIElUU00gbm8gcHJpbWVpcm8gbsOtdmVsIGRlIHNvbHXDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICdQZXJtaXRlIHF1ZSBvIG3Ds2R1bG8gZGUgZXN0YXTDrXN0aWNhcyBnZXJlIGVzdGF0w61zdGljYXMgc29icmUgbyBuw612ZWwgbcOpZGlvIGRlIGNoYW1hZG9zIElUU00gbm8gcHJpbWVpcm8gbsOtdmVsIGRlIHNvbHXDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2UgdW1hIG5vdGEgw6kgYWRpY2lvbmFkYSBwb3IgdW0gYXRlbmRlbnRlLCBkZWZpbmUgbyBlc3RhZG8gZGUgdW0gY2hhbWFkbyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZSB1bWEgbm90YSDDqSBhZGljaW9uYWRhIHBvciB1bSBhdGVuZGVudGUsIGRlZmluZSBvIGVzdGFkbyBkZSB1bSBjaGFtYWRvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRkIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kaWZpZXMgdGhlIGRpc3BsYXkgb3JkZXIgb2YgdGhlIGR5bmFtaWMgZmllbGQgSVRTTUltcGFjdCBhbmQgb3RoZXIgdGhpbmdzLid9ID0KICAgICAgICAnTW9kaWZpY2EgYSBvcmRlbSBkZSBleGliacOnw6NvIGRvIGNhbXBvIGRpbsOibWljbyBJVFNNSW1wYWN0IGUgb3V0cmFzIGNvaXNhcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICdNw7NkdWxvIHBhcmEgbW9zdHJhciBkaW5hbWljYW1lbnRlIG8gZXN0YWRvIGRvIGluY2lkZW50ZSBkZSBzZXJ2acOnbyBlIHBhcmEgY2FsY3VsYXIgYSBwcmlvcmlkYWRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc3PDtWVzIG5lY2Vzc8OhcmlhcyBwYXJhIHVzYXIgYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gbmEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc3PDtWVzIG5lY2Vzc8OhcmlhcyBwYXJhIHVzYXIgYSB0ZWxhIGRlIGRlY2lzw6NvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUgYW5kIFByaW9yaXR5IENhbGN1bGF0aW9uJ30gPSAnRXN0YWRvIGRlIEluY2lkZW50ZSBkZSBTZXJ2acOnbyBlIEPDoWxjdWxvIGRlIHByaW9yaWRhZGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyBzZXJ2acOnbyBhZGljaW9uYWwgbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRlIGludGVyZmFjZSBkbyBhdGVuZGVudGUgKENoYW1hZG86OlNlcnZpw6dvIHByZWNpc2EgZXN0YXIgYXRpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHNlcnZpw6dvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZSAoQ2hhbWFkbzo6U2VydmnDp28gcHJlY2lzYSBlc3RhciBhdGl2YWRvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyBzZXJ2acOnbyBuYSB0ZWxhIGRlIHByaW9yaWRhZGUgZGUgdGlja2V0IGRlIHVtIHRpY2tldCBlbSB6b29tIG5hIGludGVyZmFjZSBkZSBhZ2VudGUgKFRpY2tldDo6U2VydmljZSBwcmVjaXNhIGVzdGFyIGF0aXZvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcm9wcmlldMOhcmlvIGRvIGNoYW1hZG8gbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcm9wcmlldMOhcmlvIGRvIGNoYW1hZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHJlc3BvbnPDoXZlbCBwZWxvIGNoYW1hZG8gZGUgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyByZXNwb25zw6F2ZWwgcGVsbyBjaGFtYWRvIG5hIHRlbGEgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGNoYW1hZG8gbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuIChDaGFtYWRvOjpUaXBvIHByZWNpc2EgZXN0YXIgYXRpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGNoYW1hZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlIChDaGFtYWRvOjpUaXBvIHByZWNpc2EgZXN0YXIgYXRpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gZGUgc2VydmnDp28gbmEgdGVsYSBkZSBwcmlvcmlkYWRlIGRvIHRpY2tldCBkZSB1bSB0aWNrZXQgZW0gem9vbSBuYSBpbnRlcmZhY2UgZGUgYWdlbnRlIChUaWNrZXQ6OlR5cGUgcHJlY2lzYSBlc3RhciBhdGl2bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bSBsaW5rIG5vIG1lbnUgcGFyYSBhbHRlcmFyIGEgZGVjaXPDo28gZGUgdW0gY2hhbWFkbyBuYSBzdWEgdmlzw6NvIGVtIGRldGFsaGVzIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtIGxpbmsgbm8gbWVudSBwYXJhIG1vZGlmaWNhciBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIG5hIHZpc8OjbyBlbSBkZXRhbGhlcyBkZSB1bSBjaGFtYWRvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bWEgbGlzdGEgZGUgdG9kb3Mgb3MgYXRlbmRlbnRlcyBlbnZvbHZpZG9zIG5lc3RlIGNoYW1hZG8sIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bWEgbGlzdGEgZGUgdG9kb3Mgb3MgYXRlbmRlbnRlcyBlbnZvbHZpZG9zIG5lc3RlIGNoYW1hZG8sIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW1hIGxpc3RhIGRlIHRvZG9zIG9zIGF0ZW5kZW50ZXMgcG9zc8OtdmVpcyAodG9kb3Mgb3MgYXRlbmRlbnRlcyBjb20gcGVybWlzc8O1ZXMgZGUgbm90YSBuYSBmaWxhL2NoYW1hZG8pIHBhcmEgZGV0ZXJtaW5hciBxdWVtIGRldmUgc2VyIGluZm9ybWFkbyBzb2JyZSBlc3RhIG5vdGEsIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtYSBsaXN0YSBkZSB0b2RvcyBvcyBhdGVuZGVudGVzIHBvc3PDrXZlaXMgKHRvZG9zIG9zIGF0ZW5kZW50ZXMgY29tIHBlcm1pc3PDtWVzIG5vdGEgbmEgZmlsYS9jaGFtYWRvKSBwYXJhIGRldGVybWluYXIgcXVlbSBkZXZlIHNlciBpbmZvcm1hZG8gc29icmUgZXN0YSBub3RhLCBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIGFzIG9ww6fDtWVzIGRlIHByaW9yaWRhZGUgZGUgY2hhbWFkbyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBhcyBvcMOnw7VlcyBkZSBwcmlvcmlkYWRlIGRlIGNoYW1hZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgb3MgY2FtcG9zIGRlIHTDrXR1bG8gbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIG9zIGNhbXBvcyBkZSB0w610dWxvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IGRlY2lzaW9uLid9ID0gJ0RlY2lzw6NvIGRlIENoYW1hZG8uJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAnU2VydmljZSBJbmNpZGVudCBTdGF0ZScsCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0NyaXRpY2lkYWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ0ltcGFjdG8nOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRlIEluY2lkZW50ZSBkbyBTZXJ2acOnbyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0ZpbHRlckVsZW1lbnRQb3N0L0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ0Fzc29jaWFyIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgJXMlcyVzJ30gPSAnQWx0ZXJhciBhIERlY2lzw6NvIGRlJXMlcyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiAlcyVzJXMnfSA9ICdBbHRlcmEgY2FtcG9zIElUU00gZGUgJXMlcyVzJzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdBdmFsaWHDp8OjbyBuZWNlc3PDoXJpYSAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnUmVzdWx0YWRvIGRhIGRlY2lzw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAnQXByb3ZhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAnQWRpYWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1ByZS1hcHByb3ZlZCd9ID0gJ1Byw6ktYXByb3ZhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVqZWN0ZWQnfSA9ICdSZWplaXRhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdIb3LDoXJpbyBJbmljaWFsIGRlIFJlcGFyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICdIb3LDoXJpbyBJbmljaWFsIGRhIFJlY3VwZXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0RhdGEgZGEgRGVjaXPDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdEYXRhIHZlbmNpbWVudG8nOwoKICAgICMgRGF0YWJhc2UgWE1MIERlZmluaXRpb246IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnNvcG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdmZWNoYWRvIGNvbSBzb2x1w6fDo28gZGUgY29udG9ybm8nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdBZGljaW9uYXIgdW1hIGRlY2lzw6NvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnQ2FtcG9zIElUU00gYWRpY2lvbmFpcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICdDYW1wb3MgYWRpY2lvbmFpcyBkZSB0aWNrZXQgSVRTTS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWl0ZSBhZGljaW9uYXIgbm90YXMgYW8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgYWRpY2lvbmFyIG5vdGFzIGFvIGZvcm11bMOhcmlvZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLid9ID0KICAgICAgICAnUGVybWl0ZSBkZWZpbmlyIG5vdm9zIHRpcG9zIGRlIHRpY2tldHMgKHNlIGEgZnVuY2lvbmFsaWRhZGUgZGUgdGlwbyBkZSB0aWNrZXQgZXN0aXZlciBhdGl2YSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnQWx0ZXJhciBjYW1wb3MgSVRTTSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdEZWNpc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5lIHNlIG8gYmxvcXVlaW8gZG8gdGlja2V0IMOpIG9icmlnYXTDs3JpbyBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUgKHNlIG8gdGlja2V0IG7Do28gZXN0aXZlciBibG9xdWVhZG8sIHNlcsOhIGJsb3F1ZWFkbyBlIG8gYWdlbnRlIGF0dWFsIHNlcsOhIGF1dG9tYXRpY2FtZW50ZSBkZWZpbmlkbyBjb21vIHNldSBwcm9wcmlldMOhcmlvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5lIHNlIG8gYmxvcXVlaW8gZG8gdGlja2V0IMOpIG9icmlnYXTDs3JpbyBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlIChzZSBvIHRpY2tldCBuw6NvIGVzdGl2ZXIgYmxvcXVlYWRvLCBzZXLDoSBibG9xdWVhZG8gZSBvIGFnZW50ZSBhdHVhbCBzZXLDoSBhdXRvbWF0aWNhbWVudGUgZGVmaW5pZG8gY29tbyBzZXUgcHJvcHJpZXTDoXJpbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIHNlIG8gZXN0YWRvIGRlIGluY2lkZW50ZSBkbyBzZXJ2acOnbyBkZXZlIHNlciBtb3N0cmFkbyBkdXJhbnRlIGEgc2VsZcOnw6NvIGRlIHNlcnZpw6dvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRleHRvIHBvciBvbWlzc8OjbyBkZSB1bWEgbm90YSBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGV4dG8gcG9yIG9taXNzw6NvIGRlIHVtYSBub3RhIG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHLDs3hpbW8gZXN0YWRvIHBvciBvbWlzc8OjbyBkZSB1bSB0aWNrZXQgYXDDs3MgYSBhZGnDp8OjbyBkZSB1bWEgbm90YSwgbm8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gcG9yIG9taXNzw6NvIGRlIHVtIHRpY2tldCBhcMOzcyBhIGFkacOnw6NvIGRlIHVtYSBub3RhLCBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBhc3N1bnRvIHBvciBvbWlzc8OjbyBkZSB1bWEgbm90YSBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gYXNzdW50byBwb3Igb21pc3PDo28gZGUgdW1hIG5vdGEgbm8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhIFByaW9yaWRhZGUgcG9yIG9taXNzw6NvIGRlIHRpY2tldCBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhIFByaW9yaWRhZGUgcG9yIG9taXNzw6NvIGRlIHRpY2tldCBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGNvbWVudMOhcmlvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNLCB1dGlsaXphZG8gbm8gaGlzdMOzcmljbyBkbyB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyBjb21lbnTDoXJpbyBkZSBoaXN0w7NyaWNvIHBhcmEgYSBhw6fDo28gZGUgZGVjaXPDo28sIHV0aWxpemFkbyBubyBoaXN0w7NyaWNvIGRvIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNLCB1dGlsaXphZG8gbm8gaGlzdMOzcmljbyBkbyB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBkZWNpc8OjbywgdXRpbGl6YWRvIG5vIGhpc3TDs3JpY28gZG8gdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gZGUgdW0gdGlja2V0IGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gZGUgdW0gdGlja2V0IGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdDYW1wb3MgZGluw6JtaWNvcyBtb3N0cmFkb3Mgbm8gZWNyw6IgYWRpY2lvbmFsIElUU00gZGEgaW50ZXJmYWNlIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOibWljb3MgbW9zdHJhZG9zIG5vIGVjcsOiIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7Dom1pY29zIG1vc3RyYWRvcyBubyBlY3LDoiBkZSB6b29tIGRvIHBlZGlkbyBkYSBpbnRlcmZhY2UgZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnUGVybWl0ZSBxdWUgbyBtw7NkdWxvIGRlIGVzdGF0w61zdGljYXMgZ2VyZSBlc3RhdMOtc3RpY2FzIHNvYnJlIG8gbsOtdmVsIG3DqWRpbyBkZSB0aWNrZXRzIElUU00gbm8gcHJpbWVpcm8gbsOtdmVsIGRlIHNvbHXDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICdQZXJtaXRlIHF1ZSBvIG3Ds2R1bG8gZGUgZXN0YXTDrXN0aWNhcyBnZXJlIGVzdGF0w61zdGljYXMgc29icmUgbyBuw612ZWwgbcOpZGlvIGRlIHRpY2tldHMgSVRTTSBubyBwcmltZWlybyBuw612ZWwgZGUgc29sdcOnw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZSB1bWEgbm90YSDDqSBhZGljaW9uYWRhIHBvciB1bSBhZ2VudGUsIGRlZmluZSBvIGVzdGFkbyBkbyB0aWNrZXQgbm8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NlIHVtYSBub3RhIMOpIGFkaWNpb25hZGEgcG9yIHVtIGFnZW50ZSwgZGVmaW5lIG8gZXN0YWRvIGRvIHRpY2tldCBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RpZmllcyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgZHluYW1pYyBmaWVsZCBJVFNNSW1wYWN0IGFuZCBvdGhlciB0aGluZ3MuJ30gPQogICAgICAgICdNb2RpZmljYSBhIG9yZGVtIGRlIGV4aWJpw6fDo28gZG8gY2FtcG8gZGluw6JtaWNvIElUU01JbXBhY3QgZSBvdXRyYXMgY29pc2FzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gZHluYW1pY2FsbHkgc2hvdyB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgdG8gY2FsY3VsYXRlIHRoZSBwcmlvcml0eS4nfSA9CiAgICAgICAgJ03Ds2R1bG8gcGFyYSBtb3N0cmFyIGRpbmFtaWNhbWVudGUgbyBlc3RhZG8gZG8gaW5jaWRlbnRlIGRvIHNlcnZpw6dvIGUgY2FsY3VsYXIgYSBwcmlvcmlkYWRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc3PDtWVzIG5lY2Vzc8OhcmlhcyBwYXJhIHV0aWxpemFyIG8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNzw7VlcyBuZWNlc3PDoXJpYXMgcGFyYSB1dGlsaXphciBvIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSBhbmQgUHJpb3JpdHkgQ2FsY3VsYXRpb24nfSA9ICdFc3RhZG8gZGUgSW5jaWRlbnRlIGRlIFNlcnZpw6dvIGUgQ8OhbGN1bG8gZGUgUHJpb3JpZGFkZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRGVmaW5lIG8gc2VydmnDp28gYWRpY2lvbmFsIGFvIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGUgaW50ZXJmYWNlIGRvIGFnZW50ZSAodGlja2V0OjpTZXJ2acOnbyBuZWNlc3NpdGEgZGUgZXN0YXIgYXRpdm8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyBzZXJ2acOnbyBkbyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUgKHRpY2tldDo6U2VydmnDp28gbmVjZXNzaXRhIGRlIGVzdGFyIGF0aXZvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyBzZXJ2acOnbyBubyBlY3JhbiBkZSBwcmlvcmlkYWRlIGRvIHRpY2tldCwgbm8gZGV0YWxoZSBkZSB0aWNrZXQgbm8gaW50ZXJmYWNlIGRlIGFnZW50ZSAoVGlja2V0OjpTZXJ2aWNlIG5lY2Vzc2l0YSBkZSBzZXIgYXRpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHJvcHJpZXTDoXJpbyBkbyB0aWNrZXQgZG8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcm9wcmlldMOhcmlvIGRvIHRpY2tldCBkbyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcmVzcG9uc8OhdmVsIHBlbG8gdGlja2V0IG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZDAgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcmVzcG9uc8OhdmVsIHBlbG8gdGlja2V0IGRvIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIHRpY2tldCBkbyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRvIGFnZW50ZS4gKHRpY2tldDo6VGlwbyBuZWNlc3NpdGEgZGUgZXN0YXIgYXRpdm8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBkZSB0aWNrZXQgZG8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZG8gYWdlbnRlICh0aWNrZXQ6OlRpcG8gbmVjZXNzaXRhIGRlIGVzdGFyIGF0aXZvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBkZSB0aWNrZXQgbm8gZWNyYW4gZGUgcHJpb3JpZGFkZSBkZSB0aWNrZXQgZG8gZGV0YWxoZSBkZSB1bSB0aWNrZXQgbm8gaW50ZXJmYWNlIGRlIGFnZW50ZSAoVGlja2V0OjpUeXBlIG5lY2Vzc2l0YSBkZSBzZXIgYXRpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bSBsaW5rIG5vIG1lbnUgcGFyYSBhbHRlcmFyIGEgZGVjaXPDo28gZGUgdW0gdGlja2V0IG5hIHZpc3RhIGRlIGRldGFsaGVzIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHBhcmEgbW9kaWZpY2FyIGNhbXBvcyBhZGljaW9uYWlzIElUU00gbmEgdmlzdGEgZGUgZGV0YWxoZXMgZG8gdGlja2V0IGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtYSBsaXN0YSBkZSB0b2RvcyBvcyBhZ2VudGVzIGVudm9sdmlkb3MgbmVzdGUgdGlja2V0LCBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW1hIGxpc3RhIGRlIHRvZG9zIG9zIGFnZW50ZXMgZW52b2x2aWRvcyBuZXN0ZSB0aWNrZXQsIG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW1hIGxpc3RhIGRvcyBhZ2VudGVzIHBvc3PDrXZlaXMgKHRvZG9zIG9zIGFnZW50ZXMgY29tIHBlcm1pc3PDtWVzIGRlIG5vdGEgbmEgZmlsYS90aWNrZXQpIHBhcmEgZGV0ZXJtaW5hciBxdWVtIGRldmUgc2VyIGluZm9ybWFkbyBzb2JyZSBlc3RhIG5vdGEsIG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtYSBsaXN0YSBkb3MgYWdlbnRlcyBwb3Nzw612ZWlzICh0b2RvcyBvcyBhZ2VudGVzIGNvbSBwZXJtaXNzw7VlcyBub3RhIG5hIGZpbGEvdGlja2V0KSBwYXJhIGRldGVybWluYXIgcXVlbSBkZXZlIHNlciBpbmZvcm1hZG8gc29icmUgZXN0YSBub3RhLCBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIGFzIG9ww6fDtWVzIGRlIFByaW9yaWRhZGUgZG8gdGlja2V0IG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIGFzIG9ww6fDtWVzIGRlIFByaW9yaWRhZGUgZGUgdGlja2V0IG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIG9zIGNhbXBvcyBkZSB0w610dWxvIG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBvcyBjYW1wb3MgZGUgdMOtdHVsbyBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICdEZWNpc8OjbyBkZSB0aWNrZXQuJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAnU2VydmljZSBJbmNpZGVudCBTdGF0ZScsCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ9Ca0YDQuNGC0LjRh9C90L7RgdGC0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAn0KHRgtC10L/QtdC90Ywg0LLQu9C40Y/QvdC40Y8nOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAn0KHQvtGB0YLQvtGP0L3QuNC1INCh0LXRgNCy0LjRgdCwJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRmlsdGVyRWxlbWVudFBvc3QvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAn0KHQstGP0LfQsNGC0Ywg0LfQsNGP0LLQutGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiAlcyVzJXMnfSA9ICfQmNC30LzQtdC90LjRgtGMINGA0LXRiNC10L3QuNC1ICVzJXMlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgJXMlcyVzJ30gPSAn0JjQt9C80LXQvdC40YLRjCDQv9C+0LvRjyBJVFNNICVzJXMlcyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAn0J3QtdC+0LHRhdC+0LTQuNC8INC/0YDQvtGB0LzQvtGC0YAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAn0KDQtdC30YPQu9GM0YLQsNGCINGA0LXRiNC10L3QuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAn0KPRgtCy0LXRgNC20LTQtdC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAn0J7RgtC70L7QttC10L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICfQn9GA0LXQtNCy0LDRgNC40YLQtdC70YzQvdC+INC+0LTQvtCx0YDQtdC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVqZWN0ZWQnfSA9ICfQntGC0LrQu9C+0L3QtdC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICfQlNCw0YLQsCDQvdCw0YfQsNC70LAg0YDQsNCx0L7Rgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAn0JTQsNGC0LAg0LLQvtGB0YHRgtCw0L3QvtCy0LvQtdC90LjRjyDRgdC10YDQstC40YHQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAn0JTQsNGC0LAg0YDQtdGI0LXQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfQlNCw0YLQsCDQuNGB0L/QvtC70L3QtdC90LjRjyc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ9C30LDQutGA0YvRgtC+INGBINC+0LHRhdC+0LTQvdGL0Lwg0YDQtdGI0LXQvdC40LXQvCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ9CU0L7QsdCw0LLQuNGC0Ywg0YDQtdGI0LXQvdC40LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ9CU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICfQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LfQsNGP0LLQutC4Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQoNCw0LfRgNC10YjQsNC10YIg0LTQvtCx0LDQstC40YLRjCDQt9Cw0LzQtdGC0LrRgyDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0KDQsNC30YDQtdGI0LDQtdGCINC00L7QsdCw0LLQuNGC0Ywg0LfQsNC80LXRgtC60YMg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQvtC/0YDQtdC00LXQu9C40YLRjCDQvdC+0LLRi9C1INCi0LjQv9GLINC00LvRjyDQt9Cw0Y/QstC+0LogKNC10YHQu9C4INCy0LrQu9GO0YfQtdC90L4g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40LUg0KLQuNC/0LApLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ9CY0LfQvNC10L3QuNGC0YwgSVRTTSDQv9C+0LvRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ9Cg0LXRiNC10L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICfQntC/0YDQtdC00LXQu9GP0LXRgiDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLRjCDQsdC70L7QutC40YDQvtCy0LrQuCDQt9Cw0Y/QstC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAo0LXRgdC70Lgg0LfQsNGP0LLQutCwINC10YnQtSDQvdC1INCx0LvQvtC60LjRgNC+0LLQsNC90LAsINC+0L3QsCDQsdC70L7QutC40YDRg9C10YLRgdGPINC4INGC0LXQutGD0YnQuNC5INCw0LPQtdC90YIg0LDQstGC0L7QvNCw0YLQuNGH0LXRgdC60Lgg0L3QsNC30L3QsNGH0LDQtdGC0YHRjyDQtdC1INCy0LvQsNC00LXQu9GM0YbQtdC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ9Ce0L/RgNC10LTQtdC70Y/QtdGCINC90LXQvtCx0YXQvtC00LjQvNC+0YHRgtGMINCx0LvQvtC60LjRgNC+0LLQutC4INC30LDRj9Cy0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAgKNC10YHQu9C4INC30LDRj9Cy0LrQsCDQtdGJ0LUg0L3QtSDQsdC70L7QutC40YDQvtCy0LDQvdCwLCDQvtC90LAg0LHQu9C+0LrQuNGA0YPQtdGC0YHRjyDQuCDRgtC10LrRg9GJ0LjQuSDQsNCz0LXQvdGCINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC4INC90LDQt9C90LDRh9Cw0LXRgtGB0Y8g0LXQtSDQstC70LDQtNC10LvRjNGG0LXQvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0L/RgNC10LTQtdC70Y/QtdGCLCDQv9C+0LrQsNC30YvQstCw0YLRjCDQu9C4INGB0L7RgdGC0L7Rj9C90LjQtSDQodC10YDQstC40YHQsCDQv9GA0Lgg0LXQs9C+INCy0YvQsdC+0YDQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0YLQsNC90LTQsNGA0YLQvdGL0Lkg0YLQtdC60YHRgiDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwICjQtdGB0LvQuCDQvdC10L7QsdGF0L7QtNC40LzQviknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHRgtCw0L3QtNCw0YDRgtC90YvQuSDRgtC10LrRgdGCINC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAo0LXRgdC70Lgg0L3QtdC+0LHRhdC+0LTQuNC80L4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0LvQtdC00YPRjtGJ0LXQtSDRgdC+0YHRgtC+0Y/QvdC40LUg0LfQsNGP0LLQutC4INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC/0L7RgdC70LUg0LTQvtCx0LDQstC70LXQvdC40Y8g0LfQsNC80LXRgtC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0LvQtdC00YPRjtGJ0LXQtSDRgdC+0YHRgtC+0Y/QvdC40LUg0LfQsNGP0LLQutC4INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC/0L7RgdC70LUg0LTQvtCx0LDQstC70LXQvdC40Y8g0LfQsNC80LXRgtC60Lgg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdGC0LDQvdC00LDRgNGC0L3Rg9GOINGC0LXQvNGDINC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHRgtCw0L3QtNCw0YDRgtC90YPRjiDRgtC10LzRgyDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdGC0LDQvdC00LDRgNGC0L3Ri9C5INC/0YDQuNC+0YDQuNGC0LXRgiDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdGC0LDQvdC00LDRgNGC0L3Ri9C5INC/0YDQuNC+0YDQuNGC0LXRgiDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0LrQvtC80LzQtdC90YLQsNGA0LjQuSDQsiDQuNGB0YLQvtGA0LjQuCDQtNC70Y8g0LTQtdC50YHRgtCy0LjQuSDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0LrQvtC80LzQtdC90YLQsNGA0LjQuSDQsiDQuNGB0YLQvtGA0LjQuCDQtNC70Y8g0LTQtdC50YHRgtCy0LjQuSDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YLQuNC/INC60L7QvNC80LXQvdGC0LDRgNC40Y8g0LIg0LjRgdGC0L7RgNC40Lgg0LTQu9GPINC00LXQudGB0YLQstC40Lkg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGC0LjQvyDQutC+0LzQvNC10L3RgtCw0YDQuNGPINCyINC40YHRgtC+0YDQuNC4INC00LvRjyDQtNC10LnRgdGC0LLQuNC5INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHQu9C10LTRg9GO0YnQtdC1INGB0L7RgdGC0L7Rj9C90LjQtSDQt9Cw0Y/QstC60Lgg0L/QvtGB0LvQtSDQtNC+0LHQsNCy0LvQtdC90LjRjyDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0LvQtdC00YPRjtGJ0LXQtSDRgdC+0YHRgtC+0Y/QvdC40LUg0LfQsNGP0LLQutC4INC/0L7RgdC70LUg0LTQvtCx0LDQstC70LXQvdC40Y8g0LfQsNC80LXRgtC60Lgg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQlNC40L3QsNC80LjRh9C10YHQutC40LUg0L/QvtC70Y8sINC/0L7QutCw0LfQsNC90L3Ri9C1INC90LAg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90L7QvCDRjdC60YDQsNC90LUg0L/QvtC70Y8gSVRTTSDQuNC90YLQtdGA0YTQtdC50YHQsCDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CU0LjQvdCw0LzQuNGH0LXRgdC60LjQtSDQv9C+0LvRjywg0L7RgtC+0LHRgNCw0LbQsNC10LzRi9C1INC90LAg0Y3QutGA0LDQvdC1INGA0LXRiNC10L3QuNGPINC40L3RgtC10YDRhNC10LnRgdCwINCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JTQuNC90LDQvNC40YfQtdGB0LrQuNC1INC/0L7Qu9GPLCDQvtGC0L7QsdGA0LDQttCw0LXQvNGL0LUg0LIg0L7QutC90LUg0L/RgNC+0YHQvNC+0YLRgNCwINC30LDRj9Cy0LrQuCDQuNC90YLQtdGA0YTQtdC50YHQsCDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICfQktC60LvRjtGH0LDQtdGCINC80L7QtNGD0LvRjCDQvtGC0YfQtdGC0L7QsiDQtNC70Y8g0YTQvtGA0LzQuNGA0L7QstCw0L3QuNGPINC+0YLRh9C10YLQvtCyINC+INGB0YDQtdC00L3QtdC8IElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAn0JLQutC70Y7Rh9Cw0LXRgiDQvNC+0LTRg9C70Ywg0L7RgtGH0LXRgtC+0LIg0LTQu9GPINGE0L7RgNC80LjRgNC+0LLQsNC90LjRjyDQvtGC0YfQtdGC0L7QsiDQviDRgdGA0LXQtNC90LXQvCBJVFNNIHRpY2tldCBzb2x1dGlvbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JLQvtC30LzQvtC20L3QvtGB0YLRjCDRg9GB0YLQsNC90L7QstC40YLRjCDQvdC+0LLQvtC1INGB0L7RgdGC0L7Rj9C90LjQtSDQt9Cw0LLQutC4INC/0YDQuCDQtNC+0LHQsNCy0LvQtdC90LjQuCDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CS0L7Qt9C80L7QttC90L7RgdGC0Ywg0YPRgdGC0LDQvdC+0LLQuNGC0Ywg0L3QvtCy0L7QtSDRgdC+0YHRgtC+0Y/QvdC40LUg0LfQsNCy0LrQuCDQv9GA0Lgg0LTQvtCx0LDQstC70LXQvdC40Lgg0LfQsNC80LXRgtC60Lgg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RpZmllcyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgZHluYW1pYyBmaWVsZCBJVFNNSW1wYWN0IGFuZCBvdGhlciB0aGluZ3MuJ30gPQogICAgICAgICfQmNC30LzQtdC90Y/QtdGCINC/0L7RgNGP0LTQvtC6INC+0YLQvtCx0YDQsNC20LXQvdC40Y8g0LTQuNC90LDQvNC40YfQtdGB0LrQvtCz0L4g0L/QvtC70Y8gSVRTTUltcGFjdCDQuCDQtNGA0YPQs9C40LUg0LLQtdGJ0LguJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBkeW5hbWljYWxseSBzaG93IHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCB0byBjYWxjdWxhdGUgdGhlIHByaW9yaXR5Lid9ID0KICAgICAgICAn0JzQvtC00YPQu9GMINC00LvRjyDQtNC40L3QsNC80LjRh9C10YHQutC+0LPQviDQvtGC0L7QsdGA0LDQttC10L3QuNGPINGB0L7RgdGC0L7Rj9C90LjRjyDRgdC10YDQstC40YHQvdC+0LPQviDQuNC90YbQuNC00LXQvdGC0LAg0Lgg0LLRi9GH0LjRgdC70LXQvdC40Y8g0L/RgNC40L7RgNC40YLQtdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGC0YDQtdCx0YPQtdC80YvQtSDQv9GA0LDQstCwINC00LvRjyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDQv9GD0L3QutGC0LAg0LzQtdC90Y4g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgtGA0LXQsdGD0LXQvNGL0LUg0L/RgNCw0LLQsCDQtNC70Y8g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0L/Rg9C90LrRgtCwINC80LXQvdGOINCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSBhbmQgUHJpb3JpdHkgQ2FsY3VsYXRpb24nfSA9ICfQodC+0YHRgtC+0Y/QvdC40LUg0YHQtdGA0LLQuNGB0L3QvtCz0L4g0LjQvdGG0LjQtNC10L3RgtCwINC4INGA0LDRgdGH0LXRgiDQv9GA0LjQvtGA0LjRgtC10YLQvtCyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICfQn9C+0LfQstC+0LvRj9C10YIg0LfQsNC00LDRgtGMINCh0LXRgNCy0LjRgSDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwIChUaWNrZXQ6OlNlcnZpY2Ug0LTQvtC70LbQtdC9INCx0YvRgtGMINCw0LrRgtC40LLQuNGA0L7QstCw0L0pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICfQn9C+0LfQstC+0LvRj9C10YIg0LfQsNC00LDRgtGMINCh0LXRgNCy0LjRgSDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAgKFRpY2tldDo6U2VydmljZSDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0LDQutGC0LjQstC40YDQvtCy0LDQvSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINCh0LXRgNCy0LjRgSDQv9GA0Lgg0LjQt9C80LXQvdC10L3QuNC4INC/0YDQuNC+0YDQuNGC0LXRgtCwINC30LDRj9Cy0LrQuCDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuIChUaWNrZXQ6OlNlcnZpY2Ug0LTQvtC70LbQtdC9INCx0YvRgtGMINCy0LrQu9GO0YfQtdC9KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LfQstC+0LvRj9C10YIg0LfQsNC00LDRgtGMINCS0LvQsNC00LXQu9GM0YbQsCDQt9Cw0Y/QstC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0JLQu9Cw0LTQtdC70YzRhtCwINC30LDRj9Cy0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC30LLQvtC70Y/QtdGCINC30LDQtNCw0YLRjCDQntGC0LLQtdGC0YHRgtCy0LXQvdC90L7Qs9C+INC30LAg0LfQsNGP0LLQutGDINC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LfQstC+0LvRj9C10YIg0LfQsNC00LDRgtGMINCe0YLQstC10YLRgdGC0LLQtdC90L3QvtCz0L4g0LfQsCDQt9Cw0Y/QstC60YMg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0KLQuNC/INC30LDRj9Cy0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwIChUaWNrZXQ6OlR5cGUg0LTQvtC70LbQtdC9INCx0YvRgtGMINCw0LrRgtC40LLQuNGA0L7QstCw0L0pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn0J/QvtC30LLQvtC70Y/QtdGCINC30LDQtNCw0YLRjCDQotC40L8g0LfQsNGP0LLQutC4INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAoVGlja2V0OjpUeXBlINC00L7Qu9C20LXQvSDQsdGL0YLRjCDQsNC60YLQuNCy0LjRgNC+0LLQsNC9KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINCi0LjQvyDQt9Cw0Y/QstC60Lgg0L/RgNC4INC40LfQvNC10L3QtdC90LjQuCDQv9GA0LjQvtGA0LjRgtC10YLQsCDQt9Cw0Y/QstC60Lgg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLiAoVGlja2V0OjpUeXBlINC00L7Qu9C20LXQvSDQsdGL0YLRjCDQsNC60YLQuNCy0LjRgNC+0LLQsNC9KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0YHRgdGL0LvQutGDINC90LAg0L/Rg9C90LrRgiDQvNC10L3RjiDQtNC70Y8g0LjQt9C80LXQvdC10L3QuNGPINCg0LXRiNC10L3QuNGPINC/0L4g0LfQsNGP0LLQutC1INCyINC+0LrQvdC1INC/0L7QtNGA0L7QsdC90L7Qs9C+INC/0YDQvtGB0LzQvtGC0YDQsCAoVGlja2V0Wm9vbSkg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7QutCw0LfRi9Cy0LDQtdGCINGB0YHRi9C70LrRgyDQvdCwINC/0YPQvdC60YIg0LzQtdC90Y4g0LTQu9GPINC40LfQvNC10L3QtdC90LjRjyDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9GFIElUU00g0L/QvtC70LXQuSDQt9Cw0Y/QstC60Lgg0LIg0L7QutC90LUg0L/QvtC00YDQvtCx0L3QvtCz0L4g0L/RgNC+0YHQvNC+0YLRgNCwIChUaWNrZXRab29tKSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7QutCw0LfRi9Cy0LDQtdGCINGB0L/QuNGB0L7QuiDQtNC70Y8g0LLRi9Cx0L7RgNCwINCy0YHQtdGFINCy0L7QstC70LXRh9C10L3QvdGL0YUg0LDQs9C10L3RgtC+0LIg0L/QviDRjdGC0L7QuSDQt9Cw0Y/QstC60LUg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LrQsNC30YvQstCw0LXRgiDRgdC/0LjRgdC+0Log0LTQu9GPINCy0YvQsdC+0YDQsCDQstGB0LXRhSDQstC+0LLQu9C10YfQtdC90L3Ri9GFINCw0LPQtdC90YLQvtCyINC/0L4g0Y3RgtC+0Lkg0LfQsNGP0LLQutC1INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LrQsNC30YvQstCw0LXRgiDRgdC/0LjRgdC+0Log0LTQu9GPINCy0YvQsdC+0YDQsCDQstGB0LXRhSDQstC+0LfQvNC+0LbQvdGL0YUg0LDQs9C10L3RgtC+0LIgKCDRgSDQv9GA0LDQstCw0LzQuCDQvdCwINGB0L7Qt9C00LDQvdC40LUg0LfQsNC80LXRgtC+0LogKG5vdGUpINC00LvRjyDQvtGH0LXRgNC10LTQuC/Qt9Cw0Y/QstC60LggKSwg0LrQvtGC0L7RgNGL0YUg0L3QsNC00L4g0LjQvdGE0L7RgNC80LjRgNC+0LLQsNGC0Ywg0L7QsSDRjdGC0L7QuSDQt9Cw0LzQtdGC0LrQtSDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0YHQv9C40YHQvtC6INC00LvRjyDQstGL0LHQvtGA0LAg0LLRgdC10YUg0LLQvtC30LzQvtC20L3Ri9GFINCw0LPQtdC90YLQvtCyICgg0YEg0L/RgNCw0LLQsNC80Lgg0L3QsCDRgdC+0LfQtNCw0L3QuNC1INC30LDQvNC10YLQvtC6IChub3RlKSDQtNC70Y8g0L7Rh9C10YDQtdC00Lgv0LfQsNGP0LLQutC4ICksINC60L7RgtC+0YDRi9GFINC90LDQtNC+INC40L3RhNC+0YDQvNC40YDQvtCy0LDRgtGMINC+0LEg0Y3RgtC+0Lkg0LfQsNC80LXRgtC60LUg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7QutCw0LfRi9Cy0LDQtdGCINC/0L7Qu9C1INCy0YvQsdC+0YDQsCDQv9GA0LjQvtGA0LjRgtC10YLQsCDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0L/QvtC70LUg0LLRi9Cx0L7RgNCwINC/0YDQuNC+0YDQuNGC0LXRgtCwINC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC60LDQt9GL0LLQsNC10YIg0L/QvtC70LUg0KLQtdC80LAg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LrQsNC30YvQstCw0LXRgiDQv9C+0LvQtSDQotC10LzQsCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICfQoNC10YjQtdC90LjQtSDQv9C+INC30LDRj9Cy0LrQtS4nOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICdTZXJ2aWNlIEluY2lkZW50IFN0YXRlJywKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3JfQ3lybF9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAn0JfQvdCw0YfQsNGYJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ9Cj0YLQuNGG0LDRmCc7CgogICAgIyBKUyBUZW1wbGF0ZTogU2VydmljZUluY2lkZW50U3RhdGUKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICfQodGC0LDRmtC1INC40L3RhtC40LTQtdC90YLQsCDRgdC10YDQstC40YHQsCc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL091dHB1dC9IVE1ML0ZpbHRlckVsZW1lbnRQb3N0L0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ9Cf0L7QstC10LbQuCDRgtC40LrQtdGCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiAlcyVzJXMnfSA9ICfQmNC30LzQtdC90LAg0L7QtNC70YPQutC1INC30LAgJXMlcyVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiAlcyVzJXMnfSA9ICfQmNC30LzQtdC90LAgSVRTTSDQv9C+0ZnQsCDQt9CwICVzJXMlcyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAn0J7QsdCw0LLQtdC30L3QsCDRgNC10YbQtdC90LfQuNGY0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAn0KDQtdC30YPQu9GC0LDRgiBv0LTQu9GD0LrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJ9Ce0LTQvtCx0YDQtdC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUG9zdHBvbmVkJ30gPSAn0J7QtNC70L7QttC10L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICfQo9C90LDQv9GA0LXQtCDQvtC00L7QsdGA0LXQvdC+JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAn0J7QtNCx0LjRmNC10L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ9CS0YDQtdC80LUg0L/QvtGH0LXRgtC60LAg0L/QvtC/0YDQsNCy0LrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAn0JLRgNC10LzQtSDQv9C+0YfQtdGC0LrQsCDQvtC/0L7RgNCw0LLQutCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICfQlNCw0YLRg9C8INCe0LTQu9GD0LrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ9Cg0L7Quic7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ9C30LDRgtCy0L7RgNC10L3QviDRgdCwINCw0LvRgtC10YDQvdCw0YLQuNCy0L3QuNC8INGA0LXRiNC10ZrQtdC8JzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAn0JTQvtC00LDRmCDQvtC00LvRg9C60YMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICfQlNC+0LTQsNGC0L3QsCBJVFNNINC/0L7RmdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJ9CU0L7QtNCw0YLQvdCwIElUU00g0L/QvtGZ0LAg0YLQuNC60LXRgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQlNC+0LfQstC+0ZnQsNCy0LAg0LTQvtC00LDQstCw0ZrQtSDQvdCw0L/QvtC80LXQvdCwINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC40YUgSVRTTSDQv9C+0ZnQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JTQvtC30LLQvtGZ0LDQstCwINC00L7QtNCw0LLQsNGa0LUg0L3QsNC/0L7QvNC10L3QsCDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0LjQvdGC0LXRgNGE0LXRmNGB0LAg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCkuJ30gPQogICAgICAgICfQlNC+0LfQstC+0ZnQsNCy0LAg0LTQtdGE0LjQvdC40YHQsNGa0LUg0L3QvtCy0L7QsyDRgtC40L/QsCDRgtC40LrQtdGC0LAgKNCw0LrQviDRmNC1INC+0L/RhtC40ZjQsCDRgtC40L/QsCDRgtC40LrQtdGC0LAg0LDQutGC0LjQstC40YDQsNC90LApLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ9CY0LfQvNC10L3QuNGC0LUgSVRTTSDQv9C+0ZnQsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICfQntC00LvRg9C60LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0LTQsCDQu9C4INGY0LUg0L3QtdC+0L/RhdC+0LTQvdC+INC30LDQutGZ0YPRh9Cw0LLQsNGa0LUg0YLQuNC60LXRgtCwINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC40YUgSVRTTSDQv9C+0ZnQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAgKNCw0LrQviDRgtC40LrQtdGCINGY0L7RiCDRg9Cy0LXQuiDQvdC40ZjQtSDQt9Cw0LrRmdGD0YfQsNC9LCDRgtC40LrQtdGCINGb0LUg0LTQvtCx0LjRgtC4INGB0YLQsNGC0YPRgSDQt9Cw0LrRmdGD0YfQsNC9INC4INGC0YDQtdC90YPRgtC90Lgg0L7Qv9C10YDQsNGC0LXRgCDRm9C1INCx0LjRgtC4INCw0YPRgtC+0LzQsNGC0YHQutC4INC/0L7RgdGC0LDQstGZ0LXQvSDQutCw0L4g0LLQu9Cw0YHQvdC40LopLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC00LAg0LvQuCDRmNC1INC90LXQvtC/0YXQvtC00L3QviDQt9Cw0LrRmdGD0YfQsNCy0LDRmtC1INGC0LjQutC10YLQsCDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwICjQsNC60L4g0YLQuNC60LXRgiDRmNC+0Ygg0YPQstC10Log0L3QuNGY0LUg0LfQsNC60ZnRg9GH0LDQvSwg0YLQuNC60LXRgiDRm9C1INC00L7QsdC40YLQuCDRgdGC0LDRgtGD0YEg0LfQsNC60ZnRg9GH0LDQvSDQuCDRgtGA0LXQvdGD0YLQvdC4INC+0L/QtdGA0LDRgtC10YAg0ZvQtSDQsdC40YLQuCDQsNGD0YLQvtC80LDRgtGB0LrQuCDQv9C+0YHRgtCw0LLRmdC10L0g0LrQsNC+INCy0LvQsNGB0L3QuNC6KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC00LAg0LvQuCDRm9C1INGB0YLQsNGC0YPRgSDQuNC90YbQuNC00LXQvdGC0LAg0YHQtdGA0LLQuNGB0LAg0LHQuNGC0Lgg0L/RgNC40LrQsNC30LDQvSDRgtC+0LrQvtC8INC40LfQsdC+0YDQsCDRgdC10YDQstC40YHQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0L/QvtC00YDQsNC30YPQvNC10LLQsNC90Lgg0YHQsNC00YDQttCw0Zgg0L3QsNC/0L7QvNC10L3QtSDQvdCwINC10LrRgNCw0L3RgyDQtNC+0LTQsNGC0L3QuNGFIElUU00g0L/QvtGZ0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0L/QvtC00YDQsNC30YPQvNC10LLQsNC90Lgg0YHQsNC00YDQttCw0Zgg0L3QsNC/0L7QvNC10L3QtSDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0L/QvtC00YDQsNC30YPQvNC10LLQsNC90Lgg0L3QsNGA0LXQtNC90Lgg0YHRgtCw0YLRg9GBINGC0LjQutC10YLQsCDQv9C+0YHQu9C1INC00L7QtNCw0LLQsNGa0LAg0L3QsNC/0L7QvNC10L3QtSwg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90LjRhSBJVFNNINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0L/QvtC00YDQsNC30YPQvNC10LLQsNC90Lgg0L3QsNGA0LXQtNC90Lgg0YHRgtCw0YLRg9GBINGC0LjQutC10YLQsCDQv9C+0YHQu9C1INC00L7QtNCw0LLQsNGa0LAg0L3QsNC/0L7QvNC10L3QtSwg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDQv9C+0LTRgNCw0LfRg9C80LXQstCw0L3QuCDQv9GA0LXQtNC80LXRgiDQvdCw0L/QvtC80LXQvdC1LCDQvdCwINC10LrRgNCw0L3RgyDQtNC+0LTQsNGC0L3QuNGFIElUU00g0L/QvtGZ0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0L/QvtC00YDQsNC30YPQvNC10LLQsNC90Lgg0L/RgNC10LTQvNC10YIg0L3QsNC/0L7QvNC10L3QtSwg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0L/QvtC00YDQsNC30YPQvNC10LLQsNC90Lgg0L/RgNC40L7RgNC40YLQtdGCINGC0LjQutC10YLQsCwg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90LjRhSBJVFNNINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDQv9C+0LTRgNCw0LfRg9C80LXQstCw0L3QuCDQv9GA0LjQvtGA0LjRgtC10YIg0YLQuNC60LXRgtCwINC90LAg0LXQutGA0LDQvdGDINC+0LTQu9GD0LrQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDQutC+0LzQtdC90YLQsNGAINC30LAg0LjRgdGC0L7RgNC40ZjQsNGCINC30LAg0LDQutGG0LjRmNGDINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC40YUgSVRTTSDQv9C+0ZnQsCDQutC+0ZjQtSDRm9C1INGB0LUg0LrQvtGA0LjRgdGC0LjRgtC4INC30LAg0LjRgdGC0L7RgNC40ZjQsNGCINGC0LjQutC10YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0LrQvtC80LXQvdGC0LDRgCDQt9CwINC40YHRgtC+0YDQuNGY0LDRgiDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0LrQvtGY0Lgg0ZvQtSDRgdC1INC60L7RgNC40YHRgtC40YLQuCDQt9CwINC40YHRgtC+0YDQuNGY0LDRgiDRgtC40LrQtdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDRgtC40L8g0LjRgdGC0L7RgNC40ZjQsNGC0LAg0LfQsCDQsNC60YbQuNGY0YMg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90LjRhSBJVFNNINC/0L7RmdCwINC60L7RmNC1INGb0LUg0YHQtSDQutC+0YDQuNGB0YLQuNGC0Lgg0LfQsCDQuNGB0YLQvtGA0LjRmNCw0YIg0YLQuNC60LXRgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDRgtC40L8g0LjRgdGC0L7RgNC40ZjQsNGC0LAg0L3QsCDQsNC60YbQuNGY0YMg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INC60L7RmNC4INGb0LUg0YHQtSDQutC+0YDQuNGB0YLQuNGC0Lgg0LfQsCDQuNGB0YLQvtGA0LjRmNCw0YIg0YLQuNC60LXRgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQlNC10YTQuNC90LjRiNC1INGB0LvQtdC00LXRm9C4INGB0YLQsNGC0YPRgSDRgtC40LrQtdGC0LAg0L3QsNC60L7QvSDQtNC+0LTQsNCy0LDRmtCwINC90LDQv9C+0LzQtdC90LUg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90LjRhSBJVFNNINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CU0LXRhNC40L3QuNGI0LUg0YHQu9C10LTQtdGb0Lgg0YHRgtCw0YLRg9GBINGC0LjQutC10YLQsCDQvdCw0LrQvtC9INC00L7QtNCw0LLQsNGa0LAg0L3QsNC/0L7QvNC10L3QtSDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JTQuNC90LDQvNC40YfQutCwINC/0L7RmdCwINC/0YDQuNC60LDQt9Cw0L3QsCDRgyDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90LjRhSBJVFNNINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JTQuNC90LDQvNC40YfQutCwINC/0L7RmdCwINC/0YDQuNC60LDQt9Cw0L3QsCDRgyDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JTQuNC90LDQvNC40YfQutCwINC/0L7RmdCwINC/0YDQuNC60LDQt9Cw0L3QsCDRgyDQtNC10YLQsNGZ0L3QvtC8INC/0YDQtdCz0LvQtdC00YMg0YLQuNC60LXRgtCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ9CQ0LrRgtC40LLQuNGA0LAg0YHRgtCw0YLQuNGB0YLQuNGH0LrQuCDQvNC+0LTRg9C7INC30LAg0LPQtdC90LXRgNC40YHQsNGa0LUg0YHRgtCw0YLQuNGB0YLQuNC60LUg0L4g0L/RgNC+0YHQtdC60YMg0YDQtdGI0LDQstCw0ZrQsCBJVFNNINGC0LjQutC10YLQsCDQvdCwINC/0YDQstC+0Lwg0L3QuNCy0L7Rgy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICfQkNC60YLQuNCy0LjRgNCwINGB0YLQsNGC0LjRgdGC0LjRh9C60Lgg0LzQvtC00YPQuyDQt9CwINCz0LXQvdC10YDQuNGB0LDRmtC1INGB0YLQsNGC0LjRgdGC0LjQutC1INC+INC/0YDQvtGB0LXQutGDINGA0LXRiNCw0LLQsNGa0LAgSVRTTSDRgtC40LrQtdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CQ0LrQviDRmNC1INC+0L/QtdGA0LDRgtC10YAg0LTQvtC00LDQviDQvdCw0L/QvtC80LXQvdGDLCDQv9C+0LTQtdGI0LDQstCwINGB0YLQsNGC0YPRgSDRgtC40LrQtdGC0LAg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90LjRhSBJVFNNINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQkNC60L4g0ZjQtSDQvtC/0LXRgNCw0YLQtdGAINC00L7QtNCw0L4g0L3QsNC/0L7QvNC10L3Rgywg0L/QvtC00LXRiNCw0LLQsCDRgdGC0LDRgtGD0YEg0YLQuNC60LXRgtCwINC90LAg0LXQutGA0LDQvdGDINC+0LTQu9GD0LrQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGlmaWVzIHRoZSBkaXNwbGF5IG9yZGVyIG9mIHRoZSBkeW5hbWljIGZpZWxkIElUU01JbXBhY3QgYW5kIG90aGVyIHRoaW5ncy4nfSA9CiAgICAgICAgJ9Cc0LXRmtCwINGA0LXQtNC+0YHQu9C10LQg0L/RgNC40LrQsNC30LAg0LTQuNC90LDQvNC40YfQutC+0LMg0L/QvtGZ0LAgSVRTTUltcGFjdCDQuCDQtNGA0YPQs9C1INGB0YLQstCw0YDQuC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICfQnNC+0LTRg9C7INC30LAg0LTQuNC90LDQvNC40YfQutC4INC/0YDQuNC60LDQtyDRgdGC0LDRmtCwINC40L3RhtC40LTQtdC90YLQsCDRgdC10YDQstC40YHQsCDQuCDQuNC30YDQsNGH0YPQvdCw0LLQsNGa0LUg0L/RgNC40L7RgNC40YLQtdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtGC0YDQtdCx0L3QtSDQtNC+0LfQstC+0LvQtSDQt9CwINGD0L/QvtGC0YDQtdCx0YMg0LXQutGA0LDQvdCwINC00L7QtNCw0YLQvdC40YUgSVRTTSDQv9C+0ZnQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0YLRgNC10LHQvdC1INC00L7Qt9Cy0L7Qu9C1INC30LAg0YPQv9C+0YLRgNC10LHRgyDQtdC60YDQsNC90LAg0L7QtNC70YPQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSBhbmQgUHJpb3JpdHkgQ2FsY3VsYXRpb24nfSA9ICfQn9GA0L7RgNCw0YfRg9C9INC/0YDQuNC+0YDQuNGC0LXRgtCwINC4INGB0YLQsNGa0LAg0LjQvdGG0LjQtNC10L3RgtCwINGB0LXRgNCy0LjRgdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICfQn9C+0LTQtdGI0LDQstCwINGB0LXRgNCy0LjRgSDQvdCwINC10LrRgNCw0L3RgyDQtNC+0LTQsNGC0L3QuNGFIElUU00g0L/QvtGZ0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwIChUaWNrZXQ6OlNlcnZpY2Ug0LzQvtGA0LAg0LHQuNGC0Lgg0LDQutGC0LjQstC40YDQsNC9KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn0J/QvtC00LXRiNCw0LLQsCDRgdC10YDQstC40YEg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsCAoVGlja2V0OjpTZXJ2aWNlINC80L7RgNCwINCx0LjRgtC4INCw0LrRgtC40LLQuNGA0LDQvSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn0J/QvtC00LXRiNCw0LLQsCDRgdC10YDQstC40YEg0L3QsCDQtdC60YDQsNC90YMg0L/RgNC40L7RgNC40YLQtdGC0LAg0YLQuNC60LXRgtCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsCAo0L3QtdC+0L/RhdC+0LTQvdC+INGY0LUg0YPQutGZ0YPRh9C40YLQuCBUaWNrZXQ6OlNlcnZpY2UpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0LLQu9Cw0YHQvdC40LrQsCDRgtC40LrQtdGC0LAg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90LjRhSBJVFNNINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0LLQu9Cw0YHQvdC40LrQsCDRgtC40LrQtdGC0LAg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQntC00YDQtdGS0YPRmNC1INC+0LTQs9C+0LLQvtGA0L3QvtCzINC30LAg0YLQuNC60LXRgiDQvdCwINC10LrRgNCw0L3RgyDQtNC+0LTQsNGC0L3QuNGFIElUU00g0L/QvtGZ0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J7QtNGA0LXRktGD0ZjQtSDQvtC00LPQvtCy0L7RgNC90L7QsyDQt9CwINGC0LjQutC10YIg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICfQn9C+0LTQtdGI0LDQstCwINGC0LjQvyDRgtC40LrQtdGC0LAg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90LjRhSBJVFNNINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsCAoVGlja2V0OjpUeXBlINC80L7RgNCwINCx0LjRgtC4INCw0LrRgtC40LLQuNGA0LDQvSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICfQn9C+0LTQtdGI0LDQstCwINGC0LjQvyDRgtC40LrQtdGC0LAg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsCAoVGlja2V0OjpUeXBlINC80L7RgNCwINCx0LjRgtC4INCw0LrRgtC40LLQuNGA0LDQvSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9Ce0LTRgNC10ZLRg9GY0LUg0YLQuNC/INGC0LjQutC10YLQsCDQvdCwINC10LrRgNCw0L3RgyDQv9GA0LjQvtGA0LjRgtC10YLQsCDRgtC40LrQtdGC0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwIChUaWNrZXQ6OlR5cGUg0YLRgNC10LHQsCDQtNCwINCx0YPQtNC1INGD0LrRmdGD0YfQtdC90L4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQoyDQvNC10L3QuNGY0YMg0L/RgNC40LrQsNC30YPRmNC1INCy0LXQt9GDINC30LAg0L/RgNC+0LzQtdC90YMg0L7QtNC70YPQutC1INGC0LjQutC10YLQsCDQvdCwINC00LXRgtCw0ZnQvdC+0Lwg0L/RgNC40LrQsNC30YMg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CjINC80LXQvdC40ZjRgyDQv9GA0LjQutCw0LfRg9GY0LUg0LLQtdC30YMg0LfQsCDQv9GA0L7QvNC10L3RgyDQtNC+0LTQsNGC0L3QuNGFIElUU00g0L/QvtGZ0LAg0L3QsCDQtNC10YLQsNGZ0L3QvtC8INC/0YDQuNC60LDQt9GDINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/RgNC40LrQsNC30YPRmNC1INC70LjRgdGC0YMg0YHQstC40YUg0YPQutGZ0YPRh9C10L3QuNGFINC+0L/QtdGA0LDRgtC10YDQsCDQvdCwINC+0LLQsNGYINGC0LjQutC10YIg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90LjRhSBJVFNNINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9GA0LjQutCw0LfRg9GY0LUg0LvQuNGB0YLRgyDRgdCy0LjRhSDRg9C60ZnRg9GH0LXQvdC40YUg0L7Qv9C10YDQsNGC0LXRgNCwINC90LAg0L7QstCw0Zgg0YLQuNC60LXRgiDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0YDQuNC60LDQt9GD0ZjQtSDQu9C40YHRgtGDINGB0LLQuNGFINC80L7Qs9GD0ZvQuNGFINC+0L/QtdGA0LDRgtC10YDQsCAo0YHQstC4INC+0L/QtdGA0LDRgtC10YDQuCDRgdCwINC00L7Qt9Cy0L7Qu9C+0Lwg0LfQsCDQvdCw0L/QvtC80LXQvdGDINC30LAg0YDQtdC0L9GC0LjQutC10YIpINGA0LDQtNC4INGD0YLQstGA0ZLQuNCy0LDRmtCwINC60L4g0YLRgNC10LHQsCDQtNCwINCx0YPQtNC1INC40L3RhNC+0YDQvNC40YHQsNC9INC+INC+0LLQvtGYINC90LDQv9C+0LzQtdC90LgsINC90LAg0LXQutGA0LDQvdGDINC00L7QtNCw0YLQvdC40YUgSVRTTSDQv9C+0ZnQsCDRgtC40LrQtdGC0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/RgNC40LrQsNC30YPRmNC1INC70LjRgdGC0YMg0YHQstC40YUg0LzQvtCz0YPRm9C40YUg0L7Qv9C10YDQsNGC0LXRgNCwICjRgdCy0Lgg0L7Qv9C10YDQsNGC0LXRgNC4INGB0LAg0LTQvtC30LLQvtC70L7QvCDQt9CwINC90LDQv9C+0LzQtdC90YMg0LfQsCDRgNC10LQv0YLQuNC60LXRgikg0YDQsNC00Lgg0YPRgtCy0YDRktC40LLQsNGa0LAg0LrQviDRgtGA0LXQsdCwINC00LAg0LHRg9C00LUg0LjQvdGE0L7RgNC80LjRgdCw0L0g0L4g0L7QstC+0Zgg0L3QsNC/0L7QvNC10L3QuCwg0L3QsCDQtdC60YDQsNC90YMg0L7QtNC70YPQutC1INGC0LjQutC10YLQsCDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/RgNC40LrQsNC30YPRmNC1INC+0L/RhtC40ZjQtSDQv9GA0LjQvtGA0LjRgtC10YLQsCDQt9CwINGC0LjQutC10YIg0L3QsCDQtdC60YDQsNC90YMg0LTQvtC00LDRgtC90LjRhSBJVFNNINC/0L7RmdCwINGDINC40L3RgtC10YDRhNC10ZjRgdGDINC+0L/QtdGA0LDRgtC10YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0YDQuNC60LDQt9GD0ZjQtSDQvtC/0YbQuNGY0LUg0L/RgNC40L7RgNC40YLQtdGC0LAg0LfQsCDRgtC40LrQtdGCINC90LAg0LXQutGA0LDQvdGDINC+0LTQu9GD0LrQtSDRgyDQuNC90YLQtdGA0YTQtdGY0YHRgyDQvtC/0LXRgNCw0YLQtdGA0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0YDQuNC60LDQt9GD0ZjQtSDQv9C+0ZnQsCDQvdCw0YHQu9C+0LLQsCDQvdCwINC10LrRgNCw0L3RgyDQtNC+0LTQsNGC0L3QuNGFIElUU00g0L/QvtGZ0LAg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0YDQuNC60LDQt9GD0ZjQtSDQv9C+0ZnQsCDQvdCw0YHQu9C+0LLQsCDQvdCwINC10LrRgNCw0L3RgyDQvtC00LvRg9C60LUg0YMg0LjQvdGC0LXRgNGE0LXRmNGB0YMg0L7Qv9C10YDQsNGC0LXRgNCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAn0J7QtNC70YPQutCwINGC0LjQutC10YLQsC4nOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICdTZXJ2aWNlIEluY2lkZW50IFN0YXRlJywKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3JfTGF0bl9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnWm5hxI1haic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdVdGljYWonOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnU3RhbmplIGluY2lkZW50YSBzZXJ2aXNhJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRmlsdGVyRWxlbWVudFBvc3QvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnUG92ZcW+aSB0aWtldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgJXMlcyVzJ30gPSAnSXptZW5hIG9kbHVrZSB6YSAlcyVzJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mICVzJXMlcyd9ID0gJ0l6bWVuYSBJVFNNIHBvbGphIHphICVzJXMlcyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnT2JhdmV6bmEgcmVjZW56aWphJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1JlenVsdGF0IG9kbHVrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJ09kb2JyZW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJ09kbG/FvmVubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICdVbmFwcmVkIG9kb2JyZW5vJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnT2RiaWplbm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdWcmVtZSBwb8SNZXRrYSBwb3ByYXZrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnVnJlbWUgcG/EjWV0a2Egb3BvcmF2a2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0RhdHVtIE9kbHVrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ1Jvayc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ3phdHZvcmVubyBzYSBhbHRlcm5hdGl2bmltIHJlxaFlbmplbSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0RvZGFqIG9kbHVrdSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0RvZGF0bmEgSVRTTSBwb2xqYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICdEb2RhdG5hIElUU00gcG9samEgdGlrZXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEb3p2b2xqYXZhIGRvZGF2YW5qZSBuYXBvbWVuYSBuYSBla3JhbnUgZG9kYXRuaWggSVRTTSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RvenZvbGphdmEgZG9kYXZhbmplIG5hcG9tZW5hIG5hIGVrcmFudSBvZGx1a2UgaW50ZXJmZWpzYSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJ0RvenZvbGphdmEgZGVmaW5pc2FuamUgbm92b2cgdGlwYSB0aWtldGEgKGFrbyBqZSBvcGNpamEgdGlwYSB0aWtldGEgYWt0aXZpcmFuYSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnSXptZW5pdGUgSVRTTSBwb2xqYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdPZGx1a2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBkYSBsaSBqZSBuZW9waG9kbm8gemFrbGp1xI1hdmFuamUgdGlrZXRhIG5hIGVrcmFudSBkb2RhdG5paCBJVFNNIHBvbGphIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEgKGFrbyB0aWtldCBqb8WhIHV2ZWsgbmlqZSB6YWtsanXEjWFuLCB0aWtldCDEh2UgZG9iaXRpIHN0YXR1cyB6YWtsanXEjWFuIGkgdHJlbnV0bmkgb3BlcmF0ZXIgxIdlIGJpdGkgYXV0b21hdHNraSBwb3N0YXZsamVuIGthbyB2bGFzbmlrKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnT2RyZcSRdWplIGRhIGxpIGplIG5lb3Bob2RubyB6YWtsanXEjWF2YW5qZSB0aWtldGEgbmEgZWtyYW51IG9kbHVrZSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhIChha28gdGlrZXQgam/FoSB1dmVrIG5pamUgemFrbGp1xI1hbiwgdGlrZXQgxIdlIGRvYml0aSBzdGF0dXMgemFrbGp1xI1hbiBpIHRyZW51dG5pIG9wZXJhdGVyIMSHZSBiaXRpIGF1dG9tYXRza2kgcG9zdGF2bGplbiBrYW8gdmxhc25paykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIGRhIGxpIMSHZSBzdGF0dXMgaW5jaWRlbnRhIHNlcnZpc2EgYml0aSBwcmlrYXphbiB0b2tvbSBpemJvcmEgc2VydmlzYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdPZHJlxJF1amUgcG9kcmF6dW1ldmFuaSBzYWRyxb5haiBuYXBvbWVuZSBuYSBla3JhbnUgZG9kYXRuaWggSVRTTSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBwb2RyYXp1bWV2YW5pIHNhZHLFvmFqIG5hcG9tZW5lIG5hIGVrcmFudSBvZGx1a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdPZHJlxJF1amUgcG9kcmF6dW1ldmFuaSBuYXJlZG5pIHN0YXR1cyB0aWtldGEgcG9zbGUgZG9kYXZhbmphIG5hcG9tZW5lLCBuYSBla3JhbnUgZG9kYXRuaWggSVRTTSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIHBvZHJhenVtZXZhbmkgbmFyZWRuaSBzdGF0dXMgdGlrZXRhIHBvc2xlIGRvZGF2YW5qYSBuYXBvbWVuZSwgbmEgZWtyYW51IG9kbHVrZSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdPZHJlxJF1amUgcG9kcmF6dW1ldmFuaSBwcmVkbWV0IG5hcG9tZW5lLCBuYSBla3JhbnUgZG9kYXRuaWggSVRTTSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBwb2RyYXp1bWV2YW5pIHByZWRtZXQgbmFwb21lbmUsIG5hIGVrcmFudSBvZGx1a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBwb2RyYXp1bWV2YW5pIHByaW9yaXRldCB0aWtldGEsIG5hIGVrcmFudSBkb2RhdG5paCBJVFNNIHBvbGphIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBwb2RyYXp1bWV2YW5pIHByaW9yaXRldCB0aWtldGEgbmEgZWtyYW51IG9kbHVrZSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBrb21lbnRhciB6YSBpc3RvcmlqYXQgemEgYWtjaWp1IG5hIGVrcmFudSBkb2RhdG5paCBJVFNNIHBvbGphIGtvamUgxIdlIHNlIGtvcmlzdGl0aSB6YSBpc3RvcmlqYXQgdGlrZXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnT2RyZcSRdWplIGtvbWVudGFyIHphIGlzdG9yaWphdCBuYSBla3JhbnUgb2RsdWtlIGtvamkgxIdlIHNlIGtvcmlzdGl0aSB6YSBpc3RvcmlqYXQgdGlrZXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSB0aXAgaXN0b3JpamF0YSB6YSBha2NpanUgbmEgZWtyYW51IGRvZGF0bmloIElUU00gcG9samEga29qZSDEh2Ugc2Uga29yaXN0aXRpIHphIGlzdG9yaWphdCB0aWtldGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdPZHJlxJF1amUgdGlwIGlzdG9yaWphdGEgbmEgYWtjaWp1IG5hIGVrcmFudSBvZGx1a2Uga29qaSDEh2Ugc2Uga29yaXN0aXRpIHphIGlzdG9yaWphdCB0aWtldGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluacWhZSBzbGVkZcSHaSBzdGF0dXMgdGlrZXRhIG5ha29uIGRvZGF2YW5qYSBuYXBvbWVuZSBuYSBla3JhbnUgZG9kYXRuaWggSVRTTSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5pxaFlIHNsZWRlxIdpIHN0YXR1cyB0aWtldGEgbmFrb24gZG9kYXZhbmphIG5hcG9tZW5lIG5hIGVrcmFudSBvZGx1a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RpbmFtacSNa2EgcG9samEgcHJpa2F6YW5hIHUgZWtyYW51IGRvZGF0bmloIElUU00gcG9samEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGluYW1pxI1rYSBwb2xqYSBwcmlrYXphbmEgdSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RpbmFtacSNa2EgcG9samEgcHJpa2F6YW5hIHUgZGV0YWxqbm9tIHByZWdsZWR1IHRpa2V0YSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnQWt0aXZpcmEgc3RhdGlzdGnEjWtpIG1vZHVsIHphIGdlbmVyaXNhbmplIHN0YXRpc3Rpa2UgbyBwcm9zZWt1IHJlxaFhdmFuamEgSVRTTSB0aWtldGEgbmEgcHJ2b20gbml2b3UuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnQWt0aXZpcmEgc3RhdGlzdGnEjWtpIG1vZHVsIHphIGdlbmVyaXNhbmplIHN0YXRpc3Rpa2UgbyBwcm9zZWt1IHJlxaFhdmFuamEgSVRTTSB0aWtldGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0FrbyBqZSBvcGVyYXRlciBkb2RhbyBuYXBvbWVudSwgcG9kZcWhYXZhIHN0YXR1cyB0aWtldGEgbmEgZWtyYW51IGRvZGF0bmloIElUU00gcG9samEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBa28gamUgb3BlcmF0ZXIgZG9kYW8gbmFwb21lbnUsIHBvZGXFoWF2YSBzdGF0dXMgdGlrZXRhIG5hIGVrcmFudSBvZGx1a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kaWZpZXMgdGhlIGRpc3BsYXkgb3JkZXIgb2YgdGhlIGR5bmFtaWMgZmllbGQgSVRTTUltcGFjdCBhbmQgb3RoZXIgdGhpbmdzLid9ID0KICAgICAgICAnTWVuamEgcmVkb3NsZWQgcHJpa2F6YSBkaW5hbWnEjWtvZyBwb2xqYSBJVFNNSW1wYWN0IGkgZHJ1Z2Ugc3R2YXJpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gZHluYW1pY2FsbHkgc2hvdyB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgdG8gY2FsY3VsYXRlIHRoZSBwcmlvcml0eS4nfSA9CiAgICAgICAgJ01vZHVsIHphIGRpbmFtacSNa2kgcHJpa2F6IHN0YW5qYSBpbmNpZGVudGEgc2VydmlzYSBpIGl6cmHEjXVuYXZhbmplIHByaW9yaXRldGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUG90cmVibmUgZG96dm9sZSB6YSB1cG90cmVidSBla3JhbmEgZG9kYXRuaWggSVRTTSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUG90cmVibmUgZG96dm9sZSB6YSB1cG90cmVidSBla3JhbmEgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUgYW5kIFByaW9yaXR5IENhbGN1bGF0aW9uJ30gPSAnUHJvcmHEjXVuIHByaW9yaXRldGEgaSBzdGFuamEgaW5jaWRlbnRhIHNlcnZpc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1BvZGXFoWF2YSBzZXJ2aXMgbmEgZWtyYW51IGRvZGF0bmloIElUU00gcG9samEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYSAoVGlja2V0OjpTZXJ2aWNlIG1vcmEgYml0aSBha3RpdmlyYW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdQb2RlxaFhdmEgc2VydmlzIG5hIGVrcmFudSBvZGx1a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYSAoVGlja2V0OjpTZXJ2aWNlIG1vcmEgYml0aSBha3RpdmlyYW4pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1BvZGXFoWF2YSBzZXJ2aXMgbmEgZWtyYW51IHByaW9yaXRldGEgdGlrZXRhIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEgKG5lb3Bob2RubyBqZSB1a2xqdcSNaXRpIFRpY2tldDo6U2VydmljZSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIHZsYXNuaWthIHRpa2V0YSBuYSBla3JhbnUgZG9kYXRuaWggSVRTTSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIHZsYXNuaWthIHRpa2V0YSBuYSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnT2RyZcSRdWplIG9kZ292b3Jub2cgemEgdGlrZXQgbmEgZWtyYW51IGRvZGF0bmloIElUU00gcG9samEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ09kcmXEkXVqZSBvZGdvdm9ybm9nIHphIHRpa2V0IG5hIGVrcmFudSBvZGx1a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdQb2RlxaFhdmEgdGlwIHRpa2V0YSBuYSBla3JhbnUgZG9kYXRuaWggSVRTTSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhIChUaWNrZXQ6OlR5cGUgbW9yYSBiaXRpIGFrdGl2aXJhbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdQb2RlxaFhdmEgdGlwIHRpa2V0YSBuYSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEgKFRpY2tldDo6VHlwZSBtb3JhIGJpdGkgYWt0aXZpcmFuKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnT2RyZcSRdWplIHRpcCB0aWtldGEgbmEgZWtyYW51IHByaW9yaXRldGEgdGlrZXRhIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEgKFRpY2tldDo6VHlwZSB0cmViYSBkYSBidWRlIHVrbGp1xI1lbm8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdVIG1lbmlqdSBwcmlrYXp1amUgdmV6dSB6YSBwcm9tZW51IG9kbHVrZSB0aWtldGEgbmEgZGV0YWxqbm9tIHByaWthenUgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdVIG1lbmlqdSBwcmlrYXp1amUgdmV6dSB6YSBwcm9tZW51IGRvZGF0bmloIElUU00gcG9samEgbmEgZGV0YWxqbm9tIHByaWthenUgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUHJpa2F6dWplIGxpc3R1IHN2aWggdWtsanXEjWVuaWggb3BlcmF0ZXJhIG5hIG92YWogdGlrZXQgbmEgZWtyYW51IGRvZGF0bmloIElUU00gcG9samEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQcmlrYXp1amUgbGlzdHUgc3ZpaCB1a2xqdcSNZW5paCBvcGVyYXRlcmEgbmEgb3ZhaiB0aWtldCBuYSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUHJpa2F6dWplIGxpc3R1IHN2aWggbW9ndcSHaWggb3BlcmF0ZXJhIChzdmkgb3BlcmF0ZXJpIHNhIGRvenZvbG9tIHphIG5hcG9tZW51IHphIHJlZC90aWtldCkgcmFkaSB1dHZyxJFpdmFuamEga28gdHJlYmEgZGEgYnVkZSBpbmZvcm1pc2FuIG8gb3ZvaiBuYXBvbWVuaSwgbmEgZWtyYW51IGRvZGF0bmloIElUU00gcG9samEgdGlrZXRhIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQcmlrYXp1amUgbGlzdHUgc3ZpaCBtb2d1xIdpaCBvcGVyYXRlcmEgKHN2aSBvcGVyYXRlcmkgc2EgZG96dm9sb20gemEgbmFwb21lbnUgemEgcmVkL3Rpa2V0KSByYWRpIHV0dnLEkWl2YW5qYSBrbyB0cmViYSBkYSBidWRlIGluZm9ybWlzYW4gbyBvdm9qIG5hcG9tZW5pLCBuYSBla3JhbnUgb2RsdWtlIHRpa2V0YSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1ByaWthenVqZSBvcGNpamUgcHJpb3JpdGV0YSB6YSB0aWtldCBuYSBla3JhbnUgZG9kYXRuaWggSVRTTSBwb2xqYSB1IGludGVyZmVqc3Ugb3BlcmF0ZXJhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUHJpa2F6dWplIG9wY2lqZSBwcmlvcml0ZXRhIHphIHRpa2V0IG5hIGVrcmFudSBvZGx1a2UgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUHJpa2F6dWplIHBvbGphIG5hc2xvdmEgbmEgZWtyYW51IGRvZGF0bmloIElUU00gcG9samEgdSBpbnRlcmZlanN1IG9wZXJhdGVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQcmlrYXp1amUgcG9samEgbmFzbG92YSBuYSBla3JhbnUgb2RsdWtlIHUgaW50ZXJmZWpzdSBvcGVyYXRlcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICdPZGx1a2EgdGlrZXRhLic7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgJ1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnLAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3dfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0t3YSBraW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ01hZGhhcmEnOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnSGFsaSB5YSB0dWtpbyB5YSBodWR1bWEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9PdXRwdXQvSFRNTC9GaWx0ZXJFbGVtZW50UG9zdC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdUaWtldGkga2l1bmdvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiAlcyVzJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mICVzJXMlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnbWFwaXRpbyB5YW5haGl0YWppa2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnTWF0b2tlbyB5YSB1YW11emknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwcm92ZWQnfSA9ICdLdWlkaGluaXNoYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnTXVkYSB3YSBrdWFuemEgd2EgbWF0ZW5nZW5lem8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ011ZGEgd2Ega3VhbnphIHdhIHVyZWplc2hpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdUYXJlaGUgeWEgdWFtdXppJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnVGFyZWhlIHVrb21vJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAnRnVuZ3dhIG5hIG1rdXNhbnlpa28ga2F6aSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ09uZ2V6YSB1YW11emkhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdVZ2EgemlsaXpvb25nZXp3YSBaYSBJVFNNJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSB0aWNrZXQgZmllbGRzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdSdWh1c3Uga3VvbmdlemEgdmlkb2tlem8ga2F0aWthIHNrcmluaSB5YSB1Z2EgbnlvbmdlemEgeWEgSVRTTSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdSdWh1c3Uga3VvbmdlemEgdmlkb2tlem8ga2F0aWthIHNrcmluaSB5YSBtYWFtdXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCkuJ30gPQogICAgICAgICdJbmFydWh1c3Uga3VmYWZhbnVhIGFpbmEgbXB5YSBrd2EgYWppbGkgeWEgdGlrZXRpIChLYW1hIGtpcGVuZ2VsZSBjaGEgYWluYSB5YSB0aWtldGkga2ltZXdlemVzaHdhICkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnQmFkaWxpIHVnYSB3YSBJVFNNISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ1VhbXV6aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBrYW1hIGt1ZnVuZ3dhIGt3YSB0aWtldGkga3VuYXRha2l3YSBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9vbmdlendhIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhIChrYW1hIHRpa2V0aSBoYWlqYWZ1bmd3YSBiYWRvLCB0aWtldGkgaW5hZnVuZ3dhIG5hIHdha2FsYSB3YSBzYXNhIGF0YXdla3dhIG90b21hdGlraSBrYW1hIG1taWxpa2kgd2FrZSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEga2FtYSBrdWZ1bmd3YSBrd2EgdGlrZXRpIGt1bmF0YWtpd2Ega2F0aWthIHNrcmluaSB5YSBtYWFtdXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhIChrYW1hIHRpa2V0aSBoYWlqYWZ1bmd3YSBiYWRvLCB0aWtldGkgaW5hZnVuZ3dhIG5hIHdha2FsYSB3YSBzYXNhIGF0YXdla3dhIG90b21hdGlraSBrYW1hIG1taWxpa2kgd2FrZSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSAga2FtYSBoYWxpIHlhIHR1a2lvIHlhIGh1ZHVtYSBpb255ZXNod2Ugd2FrYXRpIHdhIGNoYWd1byBsYSBodWR1bWEga2F0aWthIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIGtpaW5pIGNoYSBjaGFndW8tbXNpbmdpIGNoYSBraWRva2V6byBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9vbmdlendhIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEga2lpbmkgY2hhIGNoYWd1by1tc2luZ2kgY2hhIGtpZG9rZXpvIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIGhhbGkgbmF5b2Z1YXRhIHlhIGNoYWd1by1tc2luZ2kgYmFhZGEgeWEga3VvbmdlemEga2lkb2tlem8sIGthdGlrYSBza3JpbmkgeWEgdWdhIHdhIElUU00gdWxpb29uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIGhhbGkgaW5heW9mdWF0YSBjaGFndW8tbXNpbmdpIHlhIHRpa2V0aSBiYWFkYSB5YSBrdW9uZ2V6YSBraWRva2V6bywga2F0aWthIHNrcmluaSB5YSBtYWFtdXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIHNvbW8gY2hhZ3VvLW1zaW5naSBsYSBraWRva2V6byBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaWlvbmdlendhIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEgc29tbyBjaGFndW8tbXNpbmdpIGxhIGtpZG9rZXpvIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEga2lwYXVtYmVsZSBjaGEgdGlrZXRpIGNoYWd1byBtc2luZ2kga2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlpb25nZXp3YSB3YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBraXBhdW1iZWxlIGNoYSB0aWtldGkgY2hhZ3VvIG1zaW5naSBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnSW5hZWxlemVhIG1hb25pIHlhIGhpc3RvcmlhIGt3YSBhamlsaSB5YSBraXRlbmRvIGNoYSBza3JpbmkgeWEgdWdhIHdhIElUU00gdWxpb29uZ2V6d2EsIGFtYmFjaG8ga2luYXR1bWlrYSBrd2EgYWppbGkgeWEgaGlzdG9yaWEgeWEgdGlrZXRpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnSW5hZWxlemVhIG1hb25pIHlhIGhpc3RvcmlhIGt3YSBhaWppbGkgeWEga2l0ZW5kbyBjaGEgc2tyaW5pIHlhIG1hYW11emksIGFtYmFjaG8ga2luYXR1bWlrYSBrd2EgYWppbGkgeWEgaGlzdG9yaWEgeWEgdGlrZXRpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0luYWVsZXplYSBhaW5hIHlhIGhpc3RvcmlhIGt3YSBhamlsaSB5YSBraXRlbmRvIGNoYSBza3JpbmkgeWEgdWdhIHdhIElUU00gdWxpb29uZ2V6d2EgLCBhbWJhY2hvIGtpbmF0dW1pa2Ega3dhIGFqaWxpIHlhIGhpc3RvcmlhIHlhIHRpa2V0aS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0luYWVsZXplYSBhaW5hIHlhIGhpc3RvcmlhIGt3YSBhamlsaSB5YSBraXRlbmRvIGNoYSBza3JpbmkgeWEgbWFhbXV6aSwgYW1iYWNobyBraW5hdHVtaWthIGt3YSBhamlsaSB5YSBoaXN0b3JpYSB5YSB0aWtldGkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWVsZXplYSBoYWxpIGlmdWF0YXlvIHlhIHRpa2V0aSBiYWFkYSB5YSBrdW9uZ2V6YSBraWRva2V6bywga2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvbmdlendhIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWVsZXplYSBoYWxpIGlmdWF0YXlvIHlhIHRpa2V0aSBiYWFkYSB5YSBrdW9uZ2V6YSBraWRva2V6bywga2F0aWthIHNrcmluaSB5YSBtYWFtdXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ1dlemVzaGEgbW9kdWxpIHphIHRha3dpbXUga3V0ZW5nZW5lemEgdGFrd2ltdSBrdWh1c3Ugd2FzdGFuaSB3YSBraXdhbmdvIGNoYSB1ZnVtYnV6aSBjaGEgbmdhemkgeWEga3dhbnphIHlhIHRpa2V0aSB5YSBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJ1dlemVzaGEgbW9kdWxpIHphIHRha3dpbXUga3V0ZW5nZW5lemEgdGFrd2ltdSBrdWh1c3Ugd2FzdGFuaSB3YSB1ZnVtYnV6aSB3YSB0aWtldGkgeWEgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdLYW1hIGtpZG9rZXpvIGtpbWVvbmdlendhIG5hIHdha2FsYSwgaW5hd2VrYSBoYWxpIHlhIHRpa2V0aSBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9vbmdlendhIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0thbWEga2lkb2tlem8ga2ltZW9uZ2V6d2EgbmEgd2FrYWxhLCBpbmF3ZWthIGhhbGkgeWEgdGlrZXRpIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kaWZpZXMgdGhlIGRpc3BsYXkgb3JkZXIgb2YgdGhlIGR5bmFtaWMgZmllbGQgSVRTTUltcGFjdCBhbmQgb3RoZXIgdGhpbmdzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZHVsZSB0byBkeW5hbWljYWxseSBzaG93IHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCB0byBjYWxjdWxhdGUgdGhlIHByaW9yaXR5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5haGl0YWppIHJ1aHVzYSBrdXR1bWlhIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlpb25nZXp3YSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFoaXRhamkgcnVodXNhIGt1dHVtaWEgc2tyaW5pIHlhIG1hYW11emkga2F0aWthIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlIGFuZCBQcmlvcml0eSBDYWxjdWxhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnSW5hd2Vrd2Ega2F0aWthIGh1ZHVtYSBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaWlvbmdlendhIGthdGlrYSBraW9lbGVzdXJhIGNoYSB3YWthbGEgKFRpa2V0aTo6IEh1ZHVtYSBpbmFoaXRhamkga3VhbWlsaXNod2EpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdJbmF3ZWthIGh1ZHVtYSBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGV1c3VyYSBjaGEgd2FrYWxhIChUaWtldGk6OiBIdWR1bWEgaW5haGl0YWppIGt1YW1pbGlzaHdhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdJbmF3ZWthIGh1ZHVtYSBrYXRpa2Egc2tyaW5pIHlhIGtpcGF1bWJlbGUgY2hhIHRpa2V0aSB5YSB0aWtldGkgaWxpeW9rdXp3YSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuIChUaWtldGk6OiBBaW5hIGluYWhpdGFqaSBrdWFtaWxpc2h3YSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hd2VrYSBtbWlsaWtpIHdhIHRpa2V0aSBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIGlsaXlvb25nZXp3YSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYXdla2EgbW1pbGlraSB3YSB0aWt3dGkga2F0aWthIHNrcmluaSB5YSBtYWFtdXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYXdla2EgdGlrZXRpIGluYXlvaHVzaWthIGthdGlrYSBza3JpbmkgeWEgdWdhIHdhIElUU00gdWxpb29uZ2V6d2EgIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hd2VrYSB0aWtldGkgaW5heW9odXNpa2Ega2F0aWthIHNrcmluaSB5YSBtYWFtdXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0luYXdla2EgYWluYSB5YSB0aWtldGkga2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEgKFRpa2V0aTo6QWluYSBpbmF5b2hpdGFqaSBrdWFtaWxpc2h3YSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdJbmF3ZWthIGFpbmEgeWEgdGlrZXRpIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYSAoVGlrZXRpOjogQWluYSBpbmF5b2hpdGFqaSBrdWFtaWxpc2h3YSApLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdJbmF3ZWthIGFpbmEgeWEgdGlrZXRpIGthdGlrYSBza3JpbmkgeWEga2lwYXVtYmVsZSBjaGEgdGlrZXRpIHlhIHRpa2V0aSBpbGl5b2t1endhIGthdGlrYSBraW9sZXN1cmEgY2hhIHdha2FsYSAoVGlrZXRpOjogYWluYSBpbmFoaXRhamkga3VhbWlsaXNod2EpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIGtpdW5nbyBrYXRpa2EgbWVueXUgY2hhIGt1YmFkaWxpc2hhIG1hYW11emkgeWEgdGlrZXRpIGthdGlrYSBtYW5kaGFyaSB5YWtlIGlsaXlva3V6d2EgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hb255ZXNoYSBraXVuZ28ga2F0aWthIG1lbnl1IGNoYSBrdXJla2ViaXNoYSB1Z2EgemEgSVRTTSB6aWxpem9vbmdlendhIGthdGlrYSBtYW5kaGFyaSB5YSBpbGl5b2t1endhIHlhIHRpa2V0aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hb255ZXNoYSBvcm9kaGEgeWEgbWF3YWthbGEgd290ZSB3YWxpb2h1c2lrYSBrYXRpa2EgdGlrZXRpIGhpaSwga2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSB3YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIG9yb2RoYSB5YSBtYXdha2FsYSB3b3RlIHdhbGlvaHVzaWthIGthdGlrYSB0aWtldGkgaGlpLCBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hb255ZXNoYSBvcm9kaGEgeWEgbWF3YWthbGEgd290ZSggTWF3YWthbGEgd290ZSB3ZW55ZSBraWRva2V6byBjaGEgcnVodXNhIGthdGlrYSBmb2xlbmkvdGlrZXRpKSB3YW5hb3dlemEga3VndW5kdWEgbmFuaSBhdGFhcmlmaXdlIGt1aHVzdSBraWRva2V6byBoaWtpLCBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9vbmdlendhIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hb255ZXNoYSBvcm9kaGEgeWEgbWF3YWthbGEgd290ZSggTWF3YWthbGEgd290ZSB3ZW55ZSBraWRva2V6byBjaGEgcnVodXNhIGthdGlrYSBmb2xlbmkvdGlrZXRpKSB3YW5hb3dlemEga3VndW5kdWEgbmFuaSBhdGFhcmlmaXdlIGt1aHVzdSBraWRva2V6byBoaWtpLCBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hb255ZXNoYSBtaWNoYWd1byB5ZW55ZSBraXBhdW1iZWxlIHlhIHRpa2V0aSBrYXRpa2Egc2tyaW5pIHVnYSB3YSBJVFNNIHVsaW9vbmdlendhIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hb3llc2hhICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbnllc2hhIHVnYSB6YSBraWNod2EgY2hhIGhhYmFyaSBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9vbmdlendhIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0lueWVzaGEgdWdhIHdhIGtpY2h3YSBjaGEgaGFiYXJpIGthdGlrYSBza3JpbmkgeWEgbWFhbXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAnU2VydmljZSBJbmNpZGVudCBTdGF0ZScsCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6dGhfVEhfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ+C4p+C4tOC4geC4pOC4lSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICfguJzguKXguIHguKPguLDguJfguJonOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAn4LiB4Liy4Lij4Lia4Lij4Li04LiB4Liy4Lij4Liq4LiW4Liy4LiZ4Lig4Liy4Lie4LiC4Lit4LiH4LmA4Lir4LiV4Li44LiB4Liy4Lij4LiT4LmMJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRmlsdGVyRWxlbWVudFBvc3QvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAn4Lil4Li04LiH4LiE4LmM4LiV4Lix4LmL4LinJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiAlcyVzJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mICVzJXMlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAn4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LiB4Liy4Lij4Lin4Li04LinJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ+C4nOC4peC4guC4reC4h+C4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJ+C4reC4meC4uOC4oeC4seC4leC4tOC5geC4peC5ieC4pyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAn4LiB4Liy4Lij4LiL4LmI4Lit4Lih4LmB4LiL4Lih4LmA4Lin4Lil4Liy4LmA4Lij4Li04LmI4Lih4LiV4LmJ4LiZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfguIHguLLguKPguIHguLnguYnguITguLfguJnguYDguKfguKXguLLguYDguKPguLTguYjguKHguJXguYnguJknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ+C4p+C4seC4meC4l+C4teC5iOC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ+C4p+C4seC4meC4l+C4teC5iOC4geC4s+C4q+C4meC4lCc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ+C4m+C4tOC4lOC4lOC5ieC4p+C4ouC4p+C4tOC4mOC4teC5geC4geC5ieC4m+C4seC4jeC4q+C4sic7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ+C5gOC4nuC4tOC5iOC4oeC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ+C4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNNICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4Lit4LiZ4Li44LiN4Liy4LiV4Li04LmD4Lir4LmJ4LmA4Lie4Li04LmI4Lih4LmC4LiZ4LmJ4LiV4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU00g4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4Lit4LiZ4Li44LiN4Liy4LiV4Li04LmD4Lir4LmJ4LmA4Lie4Li04LmI4Lih4LmC4LiZ4LmJ4LiV4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJ+C4reC4meC4uOC4jeC4suC4leC5g+C4q+C5ieC4geC4s+C4q+C4meC4lOC4m+C4o+C4sOC5gOC4oOC4l+C5g+C4q+C4oeC5iOC4quC4s+C4q+C4o+C4seC4muC4leC4seC5i+C4pyAo4LiW4LmJ4Liy4LiE4Li44LiT4Lil4Lix4LiB4Lip4LiT4Liw4Lib4Lij4Liw4LmA4Lig4LiX4LiV4Lix4LmL4Lin4LiW4Li54LiB4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ+C5gOC4m+C4peC4teC5iOC4ouC4meC4n+C4tOC4peC4lOC5jElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICfguIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4hOC5iOC4suC4luC5ieC4suC4q+C4suC4geC4iOC4s+C5gOC4m+C5h+C4meC4leC5ieC4reC4h+C5g+C4iuC5ieC4leC4seC5i+C4p+C4peC5h+C4reC4hOC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNNIOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCAo4LiX4Liz4LiB4Liy4Lij4Lil4LmH4Lit4LiE4LiV4Lix4LmL4Lin4LiW4LmJ4Liy4LiV4Lix4LmL4Lin4Lir4Liy4LiB4Lii4Lix4LiH4LmE4Lih4LmI4LmE4LiU4LmJ4Lil4LmH4Lit4LiE4LmB4Lil4Liw4LmA4LiL4LiV4LmD4Lir4LmJ4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmM4Lib4Lix4LiI4LiI4Li44Lia4Lix4LiZ4LmA4Lib4LmH4LiZ4LmA4LiI4LmJ4Liy4LiC4Lit4LiH4Lit4Lix4LiV4LmC4LiZ4Lih4Lix4LiV4Li0KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguITguYjguLLguJbguYnguLLguKvguLLguIHguIjguLPguYDguJvguYfguJnguJXguYnguK3guIfguYPguIrguYnguJXguLHguYvguKfguKXguYfguK3guITguYPguJnguKvguJnguYnguLLguIjguK3guIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIgg4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMICjguJfguLPguIHguLLguKPguKXguYfguK3guITguJXguLHguYvguKfguJbguYnguLLguJXguLHguYvguKfguKvguLLguIHguKLguLHguIfguYTguKHguYjguYTguJTguYnguKXguYfguK3guITguYHguKXguLDguYDguIvguJXguYPguKvguYnguYDguK3guYDguKLguYjguJnguJXguYzguJvguLHguIjguIjguLjguJrguLHguJnguYDguJvguYfguJnguYDguIjguYnguLLguILguK3guIfguK3guLHguJXguYLguJnguKHguLHguJXguLQpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4LiW4LmJ4Liy4Lir4Liy4LiB4Liq4LiW4Liy4LiZ4Lig4Liy4Lie4LmA4Lir4LiV4LiB4Liy4Lij4LiT4LmM4Lia4Lij4Li04LiB4Liy4Lij4LiE4Lin4Lij4LmB4Liq4LiU4LiH4LmD4LiZ4Lij4Liw4Lir4Lin4LmI4Liy4LiH4LiB4Liy4Lij4LmA4Lil4Li34Lit4LiB4LiB4Liy4Lij4Lia4Lij4Li04LiB4Liy4Lij4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4hOC5iOC4suC5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC4guC4reC4h+C5gOC4meC4t+C5ieC4reC5gOC4o+C4t+C5iOC4reC4h+C4guC4reC4h+C5guC4meC5ieC4leC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNN4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4LiE4LmI4Liy4LmA4Lij4Li04LmI4Lih4LiV4LmJ4LiZ4LiC4Lit4LiH4LmA4LiZ4Li34LmJ4Lit4LmA4Lij4Li34LmI4Lit4LiH4LiC4Lit4LiH4LmC4LiZ4LmJ4LiV4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4LiE4LmI4Liy4LmA4Lij4Li04LmI4Lih4LiV4LmJ4LiZ4LiC4Lit4LiH4Liq4LiW4Liy4LiZ4Lig4Liy4Lie4LiW4Lix4LiU4LmE4Lib4LiC4Lit4LiH4LiV4Lix4LmL4Lin4Lir4Lil4Lix4LiH4LiI4Liy4LiB4LmA4Lie4Li04LmI4Lih4LmC4LiZ4LmJ4LiV4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU03guYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4hOC5iOC4suC5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC4guC4reC4h+C4quC4luC4suC4meC4oOC4suC4nuC4luC4seC4lOC5hOC4m+C4guC4reC4h+C4leC4seC5i+C4p+C4q+C4peC4seC4h+C4iOC4suC4geC5gOC4nuC4tOC5iOC4oeC5guC4meC5ieC4leC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguKvguLHguKfguILguYnguK3guYDguKPguLTguYjguKHguJXguYnguJnguILguK3guIfguYLguJnguYnguJXguYPguJnguKvguJnguYnguLLguIjguK3guJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTeC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4q+C4seC4p+C4guC5ieC4reC5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC4guC4reC4h+C5guC4meC5ieC4leC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4Lil4Liz4LiU4Lix4Lia4LiE4Lin4Liy4Lih4Liq4Liz4LiE4Lix4LiN4LmA4Lij4Li04LmI4Lih4LiV4LmJ4LiZ4LiC4Lit4LiH4LiV4Lix4LmL4Lin4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU03guYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4Lil4Liz4LiU4Lix4Lia4LiE4Lin4Liy4Lih4Liq4Liz4LiE4Lix4LiN4LmA4Lij4Li04LmI4Lih4LiV4LmJ4LiZ4LiC4Lit4LiH4LiV4Lix4LmL4Lin4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4Lib4Lij4Liw4Lin4Lix4LiV4Li04LiB4Liy4Lij4LmB4Liq4LiU4LiH4LiE4Lin4Liy4Lih4LmA4Lir4LmH4LiZ4Liq4Liz4Lir4Lij4Lix4Lia4LiB4Liy4Lij4LiB4Lij4Liw4LiX4Liz4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU00g4LiL4Li24LmI4LiH4LiX4Liz4LmD4Lir4LmJ4LmA4LiB4Li04LiU4LiE4Lin4Liy4Lih4LiE4Li44LmJ4LiZ4LmA4LiE4Lii4LmD4LiZ4Lib4Lij4Liw4Lin4Lix4LiV4Li04LiC4Lit4LiH4LiV4Lix4LmL4LinJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguJvguKPguLDguKfguLHguJXguLTguIHguLLguKPguYHguKrguJTguIfguITguKfguLLguKHguYDguKvguYfguJnguKrguLPguKvguKPguLHguJrguIHguLLguKPguIHguKPguLDguJfguLPguYPguJnguKvguJnguYnguLLguIjguK3guIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIgg4LiL4Li24LmI4LiH4LiX4Liz4LmD4Lir4LmJ4LmA4LiB4Li04LiU4LiE4Lin4Liy4Lih4LiE4Li44LmJ4LiZ4LmA4LiE4Lii4LmD4LiZ4Lib4Lij4Liw4Lin4Lix4LiV4Li04LiC4Lit4LiH4LiV4Lix4LmL4LinJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4Lib4Lij4Liw4LmA4Lig4LiX4Lib4Lij4Liw4Lin4Lix4LiV4Li04Liq4Liz4Lir4Lij4Lix4Lia4LiB4Liy4Lij4LiB4Lij4Liw4LiX4Liz4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU00g4LiL4Li24LmI4LiH4LiX4Liz4LmD4Lir4LmJ4LmA4LiB4Li04LiU4LiE4Lin4Liy4Lih4LiE4Li44LmJ4LiZ4LmA4LiE4Lii4LmD4LiZ4Lib4Lij4Liw4Lin4Lix4LiV4Li04LiC4Lit4LiH4LiV4Lix4LmL4LinJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICfguIHguLPguKvguJnguJTguJvguKPguLDguYDguKDguJfguJvguKPguLDguKfguLHguJXguLTguKrguLPguKvguKPguLHguJrguIHguLLguKPguIHguKPguLDguJfguLPguYPguJnguKvguJnguYnguLLguIjguK3guIHguLLguKPguJXguLHguJTguKrguLTguJnguYPguIgg4LiL4Li24LmI4LiH4LiX4Liz4LmD4Lir4LmJ4LmA4LiB4Li04LiU4LiE4Lin4Liy4Lih4LiE4Li44LmJ4LiZ4LmA4LiE4Lii4LmD4LiZ4Lib4Lij4Liw4Lin4Lix4LiV4Li04LiC4Lit4LiH4LiV4Lix4LmL4LinJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4geC4s+C4q+C4meC4lOC4hOC5iOC4suC5gOC4o+C4tOC5iOC4oeC4leC5ieC4meC4guC4reC4h+C4quC4luC4suC4meC4oOC4suC4nuC4luC4seC4lOC5hOC4m+C4guC4reC4h+C4leC4seC5i+C4p+C4q+C4peC4seC4h+C4iOC4suC4geC5gOC4nuC4tOC5iOC4oeC5guC4meC5ieC4leC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNN4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiB4Liz4Lir4LiZ4LiU4LiE4LmI4Liy4LmA4Lij4Li04LmI4Lih4LiV4LmJ4LiZ4LiC4Lit4LiH4Liq4LiW4Liy4LiZ4Lig4Liy4Lie4LiW4Lix4LiU4LmE4Lib4LiC4Lit4LiH4LiV4Lix4LmL4Lin4Lir4Lil4Lix4LiH4LiI4Liy4LiB4LmA4Lie4Li04LmI4Lih4LmC4LiZ4LmJ4LiV4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAn4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZ4Liq4LiW4Liy4LiZ4Lig4Liy4Lie4LiC4Lit4LiH4LmC4Lih4LiU4Li54Lil4LmA4Lie4Li34LmI4Lit4Liq4Lij4LmJ4Liy4LiH4Liq4LiW4Li04LiV4Li04LmA4LiB4Li14LmI4Lii4Lin4LiB4Lix4Lia4LiE4LmI4Liy4LmA4LiJ4Lil4Li14LmI4Lii4LiB4Liy4Lij4LmB4LiB4LmJ4Lib4Lix4LiN4Lir4Liy4LiC4Lix4LmJ4LiZ4LmB4Lij4LiB4LiC4Lit4LiH4LiV4Lix4LmL4LinIElUU00gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAn4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZ4Liq4LiW4Liy4LiZ4Lig4Liy4Lie4LiC4Lit4LiH4LmC4Lih4LiU4Li54Lil4LmA4Lie4Li34LmI4Lit4Liq4Lij4LmJ4Liy4LiH4Liq4LiW4Li04LiV4Li04LmA4LiB4Li14LmI4Lii4Lin4LiB4Lix4Lia4LiE4LmI4Liy4LmA4LiJ4Lil4Li14LmI4Lii4LiC4Lit4LiH4LiB4Liy4Lij4LmB4LiB4LmJ4Lib4Lix4LiN4Lir4Liy4LiV4Lix4LmL4LinIElUU00gJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5gOC4i+C4leC4quC4luC4suC4meC4oOC4suC4nuC4guC4reC4h+C4leC4seC5i+C4p+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNN4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmM4Lir4Liy4LiB4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmM4LmE4LiU4LmJ4LmA4Lie4Li04LmI4Lih4LmC4LiZ4LmJ4LiVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmA4LiL4LiV4Liq4LiW4Liy4LiZ4Lig4Liy4Lie4LiC4Lit4LiH4LiV4Lix4LmL4Lin4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmM4Lir4Liy4LiB4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmM4LmE4LiU4LmJ4LmA4Lie4Li04LmI4Lih4LmC4LiZ4LmJ4LiVJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGlmaWVzIHRoZSBkaXNwbGF5IG9yZGVyIG9mIHRoZSBkeW5hbWljIGZpZWxkIElUU01JbXBhY3QgYW5kIG90aGVyIHRoaW5ncy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2R1bGUgdG8gZHluYW1pY2FsbHkgc2hvdyB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgdG8gY2FsY3VsYXRlIHRoZSBwcmlvcml0eS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C4iOC4s+C5gOC4m+C5h+C4meC4leC5ieC4reC4h+C4oeC4teC4geC4suC4o+C4reC4meC4jeC4suC4leC4tOC4geC4suC4o+C5g+C4iuC5ieC4h+C4suC4meC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNNIOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LiI4Liz4LmA4Lib4LmH4LiZ4LiV4LmJ4Lit4LiH4Lih4Li14LiB4Liy4Lij4Lit4LiZ4LiN4Liy4LiV4Li04LiB4Liy4Lij4LmD4LiK4LmJ4LiH4Liy4LiZ4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiIIOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlIGFuZCBQcmlvcml0eSBDYWxjdWxhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn4LmA4LiL4LiV4LiB4Liy4Lij4Lia4Lij4Li04LiB4Liy4Lij4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU03guYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwo4LiV4Lix4LmL4LinOjrguJXguYnguK3guIfguKHguLXguIHguLLguKPguYDguJvguLTguJTguYPguIrguYnguIfguLLguJnguIHguLLguKPguJrguKPguLTguIHguLLguKMpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ+C5gOC4i+C4leC4geC4suC4o+C4muC4o+C4tOC4geC4suC4o+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCjguJXguLHguYvguKc6OuC4leC5ieC4reC4h+C4oeC4teC4geC4suC4o+C5gOC4m+C4tOC4lOC5g+C4iuC5ieC4h+C4suC4meC4geC4suC4o+C4muC4o+C4tOC4geC4suC4oyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYDguIvguJXguYDguIjguYnguLLguILguK3guIfguJXguLHguYvguKfguYPguJnguKvguJnguYnguLLguIjguK3guJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTeC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmA4LiL4LiV4LmA4LiI4LmJ4Liy4LiC4Lit4LiH4LiV4Lix4LmL4Lin4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmA4LiL4LiV4LiE4Lin4Liy4Lih4Lij4Lix4Lia4Lic4Li04LiU4LiK4Lit4Lia4LiC4Lit4LiH4LiV4Lix4LmL4Lin4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU03guYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5gOC4i+C4leC4hOC4p+C4suC4oeC4o+C4seC4muC4nOC4tOC4lOC4iuC4reC4muC4guC4reC4h+C4leC4seC5i+C4p+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ+C5gOC4i+C4leC4m+C4o+C4sOC5gOC4oOC4l+C4guC4reC4h+C4leC4seC5i+C4p+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNN4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMKOC4leC4seC5i+C4pzo64LiV4LmJ4Lit4LiH4Lih4Li14LiB4Liy4Lij4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZ4LiB4Liy4Lij4Lia4Lij4Li04LiB4Liy4LijKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn4LmA4LiL4LiV4Lib4Lij4Liw4LmA4Lig4LiX4LiC4Lit4LiH4LiV4Lix4LmL4Lin4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMKOC4leC4seC5i+C4pzo64LiV4LmJ4Lit4LiH4Lih4Li14LiB4Liy4Lij4LmA4Lib4Li04LiU4LmD4LiK4LmJ4LiH4Liy4LiZ4LiB4Liy4Lij4Lia4Lij4Li04LiB4Liy4LijKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmB4Liq4LiU4LiH4Lil4Li04LiH4LiE4LmM4LmD4LiZ4LmA4Lih4LiZ4Li54LmA4Lie4Li34LmI4Lit4LmA4Lib4Lil4Li14LmI4Lii4LiZ4LmB4Lib4Lil4LiH4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LiC4Lit4LiH4LiV4Lix4LmL4Lin4LmD4LiZ4Lih4Li44Lih4Lih4Lit4LiH4LiB4Liy4Lij4LiL4Li54Lih4LiC4Lit4LiH4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmB4Liq4LiU4LiH4Lil4Li04LiH4LiE4LmM4LmD4LiZ4LmA4Lih4LiZ4Li54LmA4Lie4Li34Lit4LmB4LiB4LmJ4LmE4LiC4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU00g4LmD4LiZ4Lih4Li44Lih4Lih4Lit4LiH4LiB4Liy4Lij4LiL4Li54Lih4LiC4Lit4LiH4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5geC4quC4lOC4h+C4o+C4suC4ouC4iuC4t+C5iOC4reC5gOC4reC5gOC4ouC5iOC4meC4leC5jOC4l+C4teC5iOC5gOC4geC4teC5iOC4ouC4p+C4guC5ieC4reC4h+C4geC4seC4muC4leC4seC5i+C4p+C4meC4teC5ieC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4n+C4tOC4peC4lOC5jOC5gOC4nuC4tOC5iOC4oeC5gOC4leC4tOC4oeC4guC4reC4hyBJVFNN4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmB4Liq4LiU4LiH4Lij4Liy4Lii4LiK4Li34LmI4Lit4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmM4LiX4Li14LmI4LmA4LiB4Li14LmI4Lii4Lin4LiC4LmJ4Lit4LiH4LiB4Lix4Lia4LiV4Lix4LmL4Lin4LiZ4Li14LmJ4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmB4Liq4LiU4LiH4Lij4Liy4Lii4LiK4Li34LmI4Lit4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmM4LiX4Lix4LmJ4LiH4Lir4Lih4LiU4LiX4Li14LmI4LmA4Lib4LmH4LiZ4LmE4Lib4LmE4LiU4LmJICjguYDguK3guYDguKLguYjguJnguJXguYzguJfguLHguYnguIfguKvguKHguJTguJfguLXguYjguYTguJTguYnguKPguLHguJrguYLguJnguYnguJXguK3guJnguLjguI3guLLguJXguLTguYPguJnguITguLTguKcv4LiV4Lix4LmL4LinKSDguYDguJ7guLfguYjguK3guIHguLPguKvguJnguJTguKfguYjguLLguYPguITguKPguITguKfguKPguKPguLLguKLguIfguLLguJnguYDguIHguLXguYjguKLguKfguIHguLHguJrguYLguJnguYnguJXguJnguLXguYnguYPguJnguYPguJnguKvguJnguYnguLLguIjguK3guJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTeC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5geC4quC4lOC4h+C4o+C4suC4ouC4iuC4t+C5iOC4reC5gOC4reC5gOC4ouC5iOC4meC4leC5jOC4l+C4seC5ieC4h+C4q+C4oeC4lOC4l+C4teC5iOC5gOC4m+C5h+C4meC5hOC4m+C5hOC4lOC5iSAo4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmM4LiX4Lix4LmJ4LiH4Lir4Lih4LiU4LiX4Li14LmI4LmE4LiU4LmJ4Lij4Lix4Lia4LmC4LiZ4LmJ4LiV4Lit4LiZ4Li44LiN4Liy4LiV4Li04LmD4LiZ4LiE4Li04LinL+C4leC4seC5i+C4pykg4LmA4Lie4Li34LmI4Lit4LiB4Liz4Lir4LiZ4LiU4Lin4LmI4Liy4LmD4LiE4Lij4LiE4Lin4Lij4Lij4Liy4Lii4LiH4Liy4LiZ4LmA4LiB4Li14LmI4Lii4Lin4LiB4Lix4Lia4LmC4LiZ4LmJ4LiV4LiZ4Li14LmJ4LmD4LiZ4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LiB4Liy4Lij4LiV4Lix4LiU4Liq4Li04LiZ4LmD4LiI4LmD4LiZ4Lit4Li04LiZ4LmA4LiV4Lit4Lij4LmM4LmA4Lif4LiL4LiC4Lit4LiH4LmA4Lit4LmA4Lii4LmI4LiZ4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn4LmB4Liq4LiU4LiH4LiV4Lix4Lin4LmA4Lil4Li34Lit4LiB4LiC4Lit4LiH4Lil4Liz4LiU4Lix4Lia4LiE4Lin4Liy4Lih4Liq4Liz4LiE4Lix4LiN4LiC4Lit4LiH4LiV4Lix4LmL4Lin4LmD4LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4Lif4Li04Lil4LiU4LmM4LmA4Lie4Li04LmI4Lih4LmA4LiV4Li04Lih4LiC4Lit4LiHIElUU03guYPguJnguK3guLTguJnguYDguJXguK3guKPguYzguYDguJ/guIvguILguK3guIfguYDguK3guYDguKLguYjguJnguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5geC4quC4lOC4h+C4leC4seC4p+C5gOC4peC4t+C4reC4geC4guC4reC4h+C4peC4s+C4lOC4seC4muC4hOC4p+C4suC4oeC4quC4s+C4hOC4seC4jeC4guC4reC4h+C4leC4seC5i+C4p+C5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4meC5g+C4iOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfguYHguKrguJTguIfguKvguLHguKfguILguYnguK3guJ/guLTguKXguJTguYzguYPguJnguKvguJnguYnguLLguIjguK3guJ/guLTguKXguJTguYzguYDguJ7guLTguYjguKHguYDguJXguLTguKHguILguK3guIcgSVRTTeC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+C5geC4quC4lOC4h+C4q+C4seC4p+C4guC5ieC4reC4n+C4tOC4peC4lOC5jOC5g+C4meC4q+C4meC5ieC4suC4iOC4reC4geC4suC4o+C4leC4seC4lOC4quC4tOC4lOC5g+C4iOC5g+C4meC4reC4tOC4meC5gOC4leC4reC4o+C5jOC5gOC4n+C4i+C4guC4reC4h+C5gOC4reC5gOC4ouC5iOC4meC4leC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAnJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAnU2VydmljZSBJbmNpZGVudCBTdGF0ZScsCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfQ05fSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ+e0p+aApeW6pic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICflvbHlk43luqYnOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAn5pyN5Yqh5pWF6Zqc54q25oCBJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRmlsdGVyRWxlbWVudFBvc3QvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAn6ZO+5o6l5bel5Y2VJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiAlcyVzJXMnfSA9ICflt6XljZUgJXMlcyVz55qE5Y+Y5pu05Yaz5a6aJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiAlcyVzJXMnfSA9ICfkv67mlLklcyVzJXPnmoRJVFNN5a2X5q61JzsKCiAgICAjIFBlcmwgTW9kdWxlOiB2YXIvcGFja2FnZXNldHVwL0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICfpnIDopoHlpI3lrqEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAn5Yaz5a6a57uT5p6cJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcHJvdmVkJ30gPSAn6YCa6L+H5a6h5om5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Bvc3Rwb25lZCd9ID0gJ+aOqOi/nyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmUtYXBwcm92ZWQnfSA9ICfpooTlhYjmibnlh4YnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVqZWN0ZWQnfSA9ICfpqbPlm54nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICfkv67lpI3lvIDlp4vml7bpl7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ+aBouWkjeW8gOWni+aXtumXtCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAn5Yaz5a6a5pel5pyfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAn5Yiw5pyf5pelJzsKCiAgICAjIERhdGFiYXNlIFhNTCBEZWZpbml0aW9uOiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5zb3BtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAn6YCa6L+H5p2D5Y+Y5o6q5pa95YWz6ZetJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAn5re75Yqg5Yaz5a6aISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAn6aKd5aSW55qESVRTTeWtl+autSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICfpop3lpJbnmoRJVFNN5bel5Y2V5a2X5q6144CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+acjeWKoeS6uuWRmOeVjOmdoumineWklueahElUU03lrZfmrrXnqpflj6PlhYHorrjmt7vliqDlpIfms6jjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLlhrPlrprnqpflj6PlhYHorrjmt7vliqDlpIfms6jjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLid9ID0KICAgICAgICAn5YWB6K645a6a5LmJ5paw55qE5bel5Y2V57G75Z6L77yI5aaC5p6c5ZCv55So5LqG5bel5Y2V57G75Z6L5Yqf6IO977yJ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAn5L+u5pS5SVRTTeWtl+autSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICflhrPlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ+WumuS5ieacjeWKoeS6uuWRmOeVjOmdouWcqOW3peWNlemineWklueahElUU03lrZfmrrXnqpflj6PmmK/lkKbpnIDopoHlt6XljZXplIHlrprvvIjlpoLmnpzlt6XljZXov5jmsqHmnInplIHlrprvvIzliJnlt6XljZXooqvplIHlrprkuJTlvZPliY3mnI3liqHkurrlkZjooqvoh6rliqjorr7nva7kuLrlt6XljZXmiYDmnInogIXvvInjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAn5a6a5LmJ5pyN5Yqh5Lq65ZGY55WM6Z2i5Zyo5bel5Y2V5Yaz5a6a56qX5Y+j5piv5ZCm6ZyA6KaB5bel5Y2V6ZSB5a6a77yI5aaC5p6c5bel5Y2V6L+Y5rKh5pyJ6ZSB5a6a77yM5YiZ5bel5Y2V6KKr6ZSB5a6a5LiU5b2T5YmN5pyN5Yqh5Lq65ZGY6KKr6Ieq5Yqo6K6+572u5Li65bel5Y2V5omA5pyJ6ICF77yJ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5pyN5Yqh5Lq65ZGY55WM6Z2i5Zyo6YCJ5oup5pyN5Yqh5pyf6Ze05piv5ZCm5pi+56S65pyN5Yqh5pWF6Zqc54q25oCB44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WumuS5ieacjeWKoeS6uuWRmOeVjOmdouWcqOW3peWNlemineWklueahElUU03lrZfmrrXnqpflj6PlpIfms6jnmoTpu5jorqTmraPmloflhoXlrrnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflrprkuYnmnI3liqHkurrlkZjnlYzpnaLlnKjlt6XljZXlhrPlrprnqpflj6PlpIfms6jnmoTpu5jorqTmraPmloflhoXlrrnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflrprkuYnmnI3liqHkurrlkZjnlYzpnaLlnKjlt6XljZXpop3lpJbnmoRJVFNN5a2X5q6156qX5Y+j5re75Yqg5aSH5rOo5ZCO55qE6buY6K6k5LiL5LiA5Liq5bel5Y2V54q25oCB44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflrprkuYnmnI3liqHkurrlkZjnlYzpnaLlnKjlt6XljZXlhrPlrprnqpflj6Pmt7vliqDlpIfms6jlkI7nmoTpu5jorqTkuIvkuIDkuKrlt6XljZXnirbmgIHjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5pyN5Yqh5Lq65ZGY55WM6Z2i5Zyo5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+W3peWNleWkh+azqOeahOm7mOiupOS4u+mimOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WumuS5ieacjeWKoeS6uuWRmOeVjOmdouWcqOW3peWNleWGs+Wumueql+WPo+W3peWNleWkh+azqOeahOm7mOiupOS4u+mimOOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5pyN5Yqh5Lq65ZGY55WM6Z2i5Zyo5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+m7mOiupOeahOW3peWNleS8mOWFiOe6p+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflrprkuYnmnI3liqHkurrlkZjnlYzpnaLlnKjlt6XljZXlhrPlrprnqpflj6Ppu5jorqTnmoTlt6XljZXkvJjlhYjnuqfjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICflrprkuYnlt6XljZXpop3lpJbnmoRJVFNN5a2X5q6156qX5Y+j5pON5L2c55qE5Y6G5Y+y5rOo6YeK77yM55So5LqO5bel5Y2V5Y6G5Y+y44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICflrprkuYnlt6XljZXlhrPlrprnqpflj6Pmk43kvZznmoTljoblj7Lms6jph4rvvIznlKjkuo7lt6XljZXljoblj7LjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICflrprkuYnlt6XljZXpop3lpJbnmoRJVFNN5a2X5q6156qX5Y+j5pON5L2c55qE5Y6G5Y+y57G75Z6L77yM55So5LqO5bel5Y2V5Y6G5Y+y44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICflrprkuYnlt6XljZXlhrPlrprnqpflj6Pmk43kvZznmoTljoblj7LnsbvlnovvvIznlKjkuo7lt6XljZXljoblj7LjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5a6a5LmJ5pyN5Yqh5Lq65ZGY55WM6Z2i5Zyo5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+a3u+WKoOWkh+azqOWQjueahOS4i+S4gOS4quW3peWNleeKtuaAgeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WumuS5ieacjeWKoeS6uuWRmOeVjOmdouWcqOW3peWNleWGs+Wumueql+WPo+a3u+WKoOWkh+azqOWQjueahOS4i+S4gOS4quW3peWNleeKtuaAgeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5Zyo5pyN5Yqh5Lq65ZGY55WM6Z2i55qE6ZmE5YqgSVRTTeWtl+auteeql+WPo+S4reaYvuekuueahOWKqOaAgeWtl+auteOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLlhrPlrprnqpflj6PkuK3mmL7npLrnmoTliqjmgIHlrZfmrrXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6K+m5oOF56qX5Y+j5Lit5pi+56S655qE5Yqo5oCB5a2X5q6144CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICfkvb/nu5/orqHmqKHlnZfog73lpJ/nlJ/miJBJVFNN5bel5Y2V5LiA57q/5bmz5Z2H6Kej5Yaz546H55qE57uf6K6h5pWw5o2u44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAn5L2/57uf6K6h5qih5Z2X6IO95aSf55Sf5oiQSVRTTeW3peWNleW5s+Wdh+ino+WGs+eOh+eahOe7n+iuoeaVsOaNruOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLpop3lpJbnmoRJVFNN5a2X5q6156qX5Y+j77yM5aaC5p6c5pyN5Yqh5Lq65ZGY5re75Yqg5LqG5LiA5Liq5aSH5rOo77yM6K6+572u5bel5Y2V55qE54q25oCB44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5Zyo5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V5Yaz5a6a56qX5Y+j77yM5aaC5p6c5pyN5Yqh5Lq65ZGY5re75Yqg5LqG5LiA5Liq5aSH5rOo77yM6K6+572u5bel5Y2V55qE54q25oCB44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01vZGlmaWVzIHRoZSBkaXNwbGF5IG9yZGVyIG9mIHRoZSBkeW5hbWljIGZpZWxkIElUU01JbXBhY3QgYW5kIG90aGVyIHRoaW5ncy4nfSA9CiAgICAgICAgJ+S/ruaUuUlUU03lvbHlk43luqbnrYnliqjmgIHlrZfmrrXnmoTmmL7npLrpobrluo/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICfliqjmgIHmmL7npLrmnI3liqHmlYXpmpznirbmgIHlubborqHnrpfkvJjlhYjnuqfnmoTmqKHlnZfjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLkvb/nlKjlt6XljZXpop3lpJbnmoRJVFNN5a2X5q6156qX5Y+j6ZyA6KaB55qE5p2D6ZmQ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLkvb/nlKjlt6XljZXlhrPlrprnqpflj6PpnIDopoHnmoTmnYPpmZDjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSBhbmQgUHJpb3JpdHkgQ2FsY3VsYXRpb24nfSA9ICfmnI3liqHmlYXpmpznirbmgIHlkozkvJjlhYjnuqforqHnrpcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ+iuvue9ruacjeWKoeS6uuWRmOeVjOmdouW3peWNlemineWklueahElUU03lrZfmrrXnqpflj6PnmoTmnI3liqHvvIjlt6XljZU6OuacjeWKoemcgOimgeiiq+a/gOa0u++8ieOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICforr7nva7mnI3liqHkurrlkZjnlYzpnaLlt6XljZXlhrPlrprnqpflj6PnmoTmnI3liqHvvIjlt6XljZU6OuacjeWKoemcgOimgeiiq+a/gOa0u++8ieOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ+iuvue9ruacjeWKoeS6uuWRmOeVjOmdouW3peWNleS8mOWFiOe6p+Wxj+W5leeahOacjeWKoe+8iOmcgOimgea/gOa0u+W3peWNlTo65pyN5Yqh77yJ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn6K6+572u5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+eahOW3peWNleaJgOacieiAheOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn6K6+572u5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V5Yaz5a6a56qX5Y+j55qE5bel5Y2V5omA5pyJ6ICF44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn6K6+572u5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+eahOW3peWNlei0n+i0o+S6uuOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn6K6+572u5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V5Yaz5a6a56qX5Y+j55qE5bel5Y2V6LSf6LSj5Lq644CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn6K6+572u5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+eahOW3peWNleexu+Wei++8iOW3peWNlTo657G75Z6L6ZyA6KaB6KKr5r+A5rS777yJ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICforr7nva7mnI3liqHkurrlkZjnlYzpnaLlt6XljZXlhrPlrprnqpflj6PnmoTlt6XljZXnsbvlnovvvIjlt6XljZU6Ouexu+Wei+mcgOimgeiiq+a/gOa0u++8ieOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICforr7nva7mnI3liqHkurrlkZjnlYzpnaLlt6XljZXkvJjlhYjnuqflsY/luZXnmoTlt6XljZXnsbvlnovvvIjpnIDopoHmv4DmtLvlt6XljZU6Ouexu+Wei++8ieOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLlt6XljZXor6bmg4Xop4blm77vvIzlnKjoj5zljZXkuK3mmL7npLrkuIDkuKrlj5jmm7Tlt6XljZXlhrPlrprnmoTpk77mjqXjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmnI3liqHkurrlkZjnlYzpnaLlt6XljZXor6bmg4Xop4blm77vvIzlnKjoj5zljZXkuK3mmL7npLrkuIDkuKrkv67mlLnlt6XljZXpop3lpJbnmoRJVFNN5a2X5q6155qE6ZO+5o6l44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WcqOacjeWKoeS6uuWRmOeVjOmdouW3peWNlemineWklueahElUU03lrZfmrrXnqpflj6PvvIzmmL7npLrov5nkuKrlt6XljZXmtonlj4rnmoTmiYDmnInmnI3liqHkurrlkZjliJfooajjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLlt6XljZXlhrPlrprnqpflj6PvvIzmmL7npLrov5nkuKrlt6XljZXmtonlj4rnmoTmiYDmnInmnI3liqHkurrlkZjliJfooajjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLlt6XljZXpop3lpJbnmoRJVFNN5a2X5q6156qX5Y+j77yM5pi+56S66L+Z5Liq5bel5Y2V5omA5pyJ5Y+v6IO955qE5pyN5Yqh5Lq65ZGY77yI6ZyA6KaB5YW35pyJ6L+Z5Liq6Zif5YiX5oiW5bel5Y2V55qE5aSH5rOo5p2D6ZmQ77yJ5YiX6KGo55So5LqO56Gu5a6a6LCB5bCG5pS25Yiw5YWz5LqO6L+Z5Liq5aSH5rOo55qE6YCa55+l44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLlt6XljZXlhrPlrprnqpflj6PvvIzmmL7npLrov5nkuKrlt6XljZXmiYDmnInlj6/og73nmoTmnI3liqHkurrlkZjvvIjpnIDopoHlhbfmnInov5nkuKrpmJ/liJfmiJblt6XljZXnmoTlpIfms6jmnYPpmZDvvInliJfooajnlKjkuo7noa7lrprosIHlsIbmlLbliLDlhbPkuo7ov5nkuKrlpIfms6jnmoTpgJrnn6XjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLlt6XljZXpop3lpJbnmoRJVFNN5a2X5q6156qX5Y+j5piv5ZCm5pi+56S65bel5Y2V5LyY5YWI57qn55qE6YCJ6aG544CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICflnKjmnI3liqHkurrlkZjnlYzpnaLlt6XljZXlhrPlrprnqpflj6PmmK/lkKbmmL7npLrlt6XljZXkvJjlhYjnuqfnmoTpgInpobnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn5Zyo5pyN5Yqh5Lq65ZGY55WM6Z2i5bel5Y2V6aKd5aSW55qESVRTTeWtl+auteeql+WPo+aYvuekuuW3peWNleagh+mimOWtl+auteOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+WcqOacjeWKoeS6uuWRmOeVjOmdouW3peWNleWGs+Wumueql+WPo+aYvuekuuW3peWNleagh+mimOWtl+auteOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaWNrZXQgZGVjaXNpb24uJ30gPSAn5bel5Y2V5Yaz5a6a44CCJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICAnU2VydmljZSBJbmNpZGVudCBTdGF0ZScsCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfVFdfSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ+mHjeimgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICflvbHpn78nOwoKICAgICMgSlMgVGVtcGxhdGU6IFNlcnZpY2VJbmNpZGVudFN0YXRlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAn5pyN5YuZ5pWF6Zqc54uA5oWLJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvT3V0cHV0L0hUTUwvRmlsdGVyRWxlbWVudFBvc3QvSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAn6Y+I5o6l5bel5ZauJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiAlcyVzJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mICVzJXMlcyd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogdmFyL3BhY2thZ2VzZXR1cC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAn6ZyA6KaB6KSH5a+pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ+axuuWumue7k+aenCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcHByb3ZlZCd9ID0gJ+W3sumAmumBjuWvqeaJuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQb3N0cG9uZWQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUHJlLWFwcHJvdmVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlamVjdGVkJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAn5L+u5b6p6ZaL5aeL5pmC6ZaTJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfmgaLlvqnplovlp4vmmYLplpMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ+axuuWumuaXpeacnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ+aIquatouaXpeacnyc7CgogICAgIyBEYXRhYmFzZSBYTUwgRGVmaW5pdGlvbjogSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQuc29wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ+mXnOmWiSjororpgJopJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAn5re75Yqg5rG65a6aISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnSVRTTeWtl+autSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gdGlja2V0IGZpZWxkcy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ+S/ruaUuUlUU03lrZfmrrUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAn5rG65a6aJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNb2RpZmllcyB0aGUgZGlzcGxheSBvcmRlciBvZiB0aGUgZHluYW1pYyBmaWVsZCBJVFNNSW1wYWN0IGFuZCBvdGhlciB0aGluZ3MuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9kdWxlIHRvIGR5bmFtaWNhbGx5IHNob3cgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHRvIGNhbGN1bGF0ZSB0aGUgcHJpb3JpdHkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlIGFuZCBQcmlvcml0eSBDYWxjdWxhdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpY2tldCBkZWNpc2lvbi4nfSA9ICcnOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICdTZXJ2aWNlIEluY2lkZW50IFN0YXRlJywKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIG15ICRKU09OOwoKICAgICMgU2hvdyB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsLgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0dldFNlcnZpY2VJbmNpZGVudFN0YXRlJyApIHsKCiAgICAgICAgIyBnZXQgdGhlIHNlbGVjdGVkIHNlcnZpY2UgaWQKICAgICAgICBteSAkU2VydmljZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKSB8fCAnJzsKCiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgIG15ICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICBJbmNpZGVudFN0YXRlID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgZW1wdHkgcmVzcG9uc2UgaGFzaAogICAgICAgIG15ICVSZXNwb25zZSA9ICgKICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAnJywKICAgICAgICAgICAgQ3VySW5jaVN0YXRlICA9PiAnJm5ic3AnLAogICAgICAgICk7CgogICAgICAgICMgb25seSBpZiBzZXJ2aWNlIGlkIGlzIHNlbGVjdGVkIGFuZCBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gaW4gdGhpcyBzY3JlZW4KICAgICAgICBpZiAoICRTZXJ2aWNle0N1ckluY2lTdGF0ZVR5cGV9ICYmICRTZXJ2aWNle0N1ckluY2lTdGF0ZX0gKSB7CgogICAgICAgICAgICAjIHNldCBpbmNpZGVudCBzaWduYWwKICAgICAgICAgICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICAgICAgICAgIHdhcm5pbmcgICAgID0+ICd5ZWxsb3dsZWQnLAogICAgICAgICAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIHRoZSByZXNwb25zZQogICAgICAgICAgICAlUmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJFNlcnZpY2V7Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkU2VydmljZXtDdXJJbmNpU3RhdGV9ICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGVuY29kZSByZXNwb25zZSB0byBKU09OCiAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IFwlUmVzcG9uc2UsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSBlOTBhZDdkODRmZTg3YzgzOTdmZmRmNjg4ZDY3OTIzNTBlYmVmMWY2IC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRBY3Rpb25Db21tb24ucG0KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEFjdGlvbkNvbW1vbjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBUcnkgdG8gbG9hZCBkcmFmdCBpZiByZXF1ZXN0ZWQuCiAgICBpZiAoCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKS0+e0Zvcm1EcmFmdH0KICAgICAgICAmJiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKCBQYXJhbSA9PiAnTG9hZEZvcm1EcmFmdCcgKQogICAgICAgICYmICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRJRCcgKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+TG9hZEZvcm1EcmFmdCgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdElEJyApLAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBhcnRpY2xlIGZvciB3aG9tIHRoaXMgc2hvdWxkIGJlIGEgcmVwbHksIGlmIGF2YWlsYWJsZQogICAgbXkgJFJlcGx5VG9BcnRpY2xlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ1JlcGx5VG9BcnRpY2xlJyApIHx8ICcnOwogICAgbXkgJFRpY2tldElEICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApICAgICAgIHx8ICcnOwoKICAgICMgY2hlY2sgaWYgUmVwbHlUb0FydGljbGUgcmVhbGx5IGJlbG9uZ3MgdG8gdGhlIHRpY2tldAogICAgbXkgJVJlcGx5VG9BcnRpY2xlQ29udGVudDsKICAgIG15IEBSZXBseVRvQWRyZXNzZXM7CiAgICBpZiAoJFJlcGx5VG9BcnRpY2xlKSB7CgogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkUmVwbHlUb0FydGljbGUsCiAgICAgICAgKTsKICAgICAgICAlUmVwbHlUb0FydGljbGVDb250ZW50ID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkUmVwbHlUb0FydGljbGUsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSAgICAgICAgPSAkUmVwbHlUb0FydGljbGU7CiAgICAgICAgJFNlbGYtPntSZXBseVRvQXJ0aWNsZUNvbnRlbnR9ID0gXCVSZXBseVRvQXJ0aWNsZUNvbnRlbnQ7CgogICAgICAgICMgZ2V0IHNlbmRlciBvZiBvcmlnaW5hbCBub3RlICh0byBpbmZvcm0gc2VuZGVyIGFib3V0IGFuc3dlcikKICAgICAgICBpZiAoICRSZXBseVRvQXJ0aWNsZUNvbnRlbnR7Q3JlYXRlQnl9ICkgewogICAgICAgICAgICBteSBAUmVwbHlUb1NlbmRlcklEID0gKCAkUmVwbHlUb0FydGljbGVDb250ZW50e0NyZWF0ZUJ5fSApOwogICAgICAgICAgICAkU2VsZi0+e1JlcGx5VG9TZW5kZXJVc2VySUR9ID0gXEBSZXBseVRvU2VuZGVySUQ7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGFydGljbGUgYmVsb25ncyB0byBvdGhlciB0aWNrZXQsIGRvbid0IHVzZSBpdCBhcyByZXBseQogICAgICAgIGlmICggJFJlcGx5VG9BcnRpY2xlQ29udGVudHtUaWNrZXRJRH0gbmUgJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57UmVwbHlUb0FydGljbGV9ID0gIiI7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGFydGljbGUgaXMgbm90IG9mIHR5cGUgbm90ZS1pbnRlcm5hbCwgZG9uJ3QgdXNlIGl0IGFzIHJlcGx5CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkNoYW5uZWxOYW1lR2V0KCkgbmUgJ0ludGVybmFsJwogICAgICAgICAgICB8fCAoCiAgICAgICAgICAgICAgICAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkNoYW5uZWxOYW1lR2V0KCkgZXEgJ0ludGVybmFsJwogICAgICAgICAgICAgICAgJiYgJFJlcGx5VG9BcnRpY2xlQ29udGVudHtTZW5kZXJUeXBlfSBuZSAnYWdlbnQnCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gPSAiIjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KCiAgICAjIENoZWNrIGlmIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50IGlzIHVzZWQuCiAgICBteSAkT3V0cHV0RmlsdGVyQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UG9zdCcpOwogICAgaWYgKCAkT3V0cHV0RmlsdGVyQ29uZmlnLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9ICkgewogICAgICAgICRTZWxmLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9ID0gMTsKICAgIH0KIyAtLS0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFRpY2tldElEIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1lvdSBuZWVkICVzIHBlcm1pc3Npb25zIScsICRDb25maWctPntQZXJtaXNzaW9ufSApLAogICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9ucyA9ICggMSA9PiAkU2VsZi0+e0FjdGlvbn0gKTsKCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICBpZiAoICRBQ0wgfHwgSXNIYXNoUmVmV2l0aERhdGEoIFwlQWNsQWN0aW9uICkgKSB7CgogICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7ICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgfQogICAgfQoKICAgICMgQ2hlY2sgZm9yIGZhaWxlZCBkcmFmdCBsb2FkaW5nIHJlcXVlc3QuCiAgICBpZiAoCiAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0xvYWRGb3JtRHJhZnQnICkKICAgICAgICAmJiAhJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0KICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTG9hZGluZyBkcmFmdCBmYWlsZWQhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgIG15ICRMb2FkZWRGb3JtRHJhZnQ7CiAgICBpZiAoICRTZWxmLT57TG9hZGVkRm9ybURyYWZ0SUR9ICkgewogICAgICAgICRMb2FkZWRGb3JtRHJhZnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdEdldCgKICAgICAgICAgICAgRm9ybURyYWZ0SUQgPT4gJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0sCiAgICAgICAgICAgIEdldENvbnRlbnQgID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSBAQXJ0aWNsZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkFydGljbGVMaXN0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgT25seUxhc3QgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoQEFydGljbGVzKSB7CiAgICAgICAgICAgIG15ICRMYXN0QXJ0aWNsZSA9ICRBcnRpY2xlc1swXTsKCiAgICAgICAgICAgIG15ICRMYXN0QXJ0aWNsZVN5c3RlbVRpbWU7CiAgICAgICAgICAgIGlmICggJExhc3RBcnRpY2xlLT57Q3JlYXRlVGltZX0gKSB7CiAgICAgICAgICAgICAgICBteSAkTGFzdEFydGljbGVTeXN0ZW1UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExhc3RBcnRpY2xlLT57Q3JlYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGFzdEFydGljbGVTeXN0ZW1UaW1lID0gJExhc3RBcnRpY2xlU3lzdGVtVGltZU9iamVjdC0+VG9FcG9jaCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRm9ybURyYWZ0U3lzdGVtVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRMb2FkZWRGb3JtRHJhZnQtPntDaGFuZ2VUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRGb3JtRHJhZnRTeXN0ZW1UaW1lID0gJEZvcm1EcmFmdFN5c3RlbVRpbWVPYmplY3QtPlRvRXBvY2goKTsKCiAgICAgICAgICAgIGlmICggISRMYXN0QXJ0aWNsZVN5c3RlbVRpbWUgfHwgJEZvcm1EcmFmdFN5c3RlbVRpbWUgPD0gJExhc3RBcnRpY2xlU3lzdGVtVGltZSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtGb3JtRHJhZnRPdXRkYXRlZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJExvYWRlZEZvcm1EcmFmdCkgKSB7CgogICAgICAgICRMb2FkZWRGb3JtRHJhZnQtPntDaGFuZ2VCeU5hbWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlck5hbWUoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkTG9hZGVkRm9ybURyYWZ0LT57Q2hhbmdlQnl9LAogICAgICAgICk7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllcycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1EcmFmdCAgICAgID0+ICRDb25maWctPntGb3JtRHJhZnR9LAogICAgICAgICAgICBGb3JtRHJhZnRJRCAgICA9PiAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSwKICAgICAgICAgICAgRm9ybURyYWZ0VGl0bGUgPT4gJExvYWRlZEZvcm1EcmFmdCA/ICRMb2FkZWRGb3JtRHJhZnQtPntUaXRsZX0gOiAnJywKICAgICAgICAgICAgRm9ybURyYWZ0TWV0YSAgPT4gJExvYWRlZEZvcm1EcmFmdCwKICAgICAgICAgICAgRm9ybUlEICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBSZXBseVRvQXJ0aWNsZSA9PiAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgc2hvdyByaWdodCBoZWFkZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0hlYWRlcicgLiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgbG9jayBzdGF0ZQogICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrR2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApICkgewoKICAgICAgICAgICAgbXkgJExvY2sgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2V0IG5ldyBvd25lciBpZiB0aWNrZXQgb3duZXIgaXMgZGlmZmVyZW50IHRoZW4gbG9nZ2VkIHVzZXIuCiAgICAgICAgICAgIGlmICggJExvY2sgJiYgKCAkVGlja2V0e093bmVySUR9ICE9ICRTZWxmLT57VXNlcklEfSApICkgewoKICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgcHJldmlvdXMgb3duZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXN0b3JlIHRpY2tldCBvd25lciBvbiB1bmRvIGFjdGlvbi4KICAgICAgICAgICAgICAgICRQYXJhbXtQcmV2aW91c093bmVyfSA9ICRUaWNrZXR7T3duZXJJRH07CgogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFNob3cgbG9jayBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFRpY2tldE9iamVjdC0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVGlja2V0e051bWJlcn0sCiAgICAgICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdTb3JyeSwgeW91IG5lZWQgdG8gYmUgdGhlIHRpY2tldCBvd25lciB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLicpLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBiYWNrIGxpbmsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEJhY2snLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdygKICAgICAgICBOZXdTdGF0ZUlEIE5ld1ByaW9yaXR5SUQgVGltZVVuaXRzIElzVmlzaWJsZUZvckN1c3RvbWVyIFRpdGxlIEJvZHkgU3ViamVjdCBOZXdRdWV1ZUlECiAgICAgICAgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgTmV3T3duZXJJRCBOZXdSZXNwb25zaWJsZUlEIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQKICAgICAgICBFeHBhbmQgUmVwbHlUb0FydGljbGUgU3RhbmRhcmRUZW1wbGF0ZUlEIENyZWF0ZUFydGljbGUgRm9ybURyYWZ0SUQgVGl0bGUKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KCiAgICAjIEFDTCBjb21wYXRpYmlsaXR5IHRyYW5zbGF0aW9uCiAgICBteSAlQUNMQ29tcGF0R2V0UGFyYW0gPSAoCiAgICAgICAgU3RhdGVJRCAgICAgICA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgUXVldWVJRCAgICAgICA9PiAkR2V0UGFyYW17TmV3UXVldWVJRH0sCiAgICAgICAgT3duZXJJRCAgICAgICA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgUmVzcG9uc2libGVJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICApOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGZvcm0gaHR0cCByZXF1ZXN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAjIHRvIHN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGR5bmFtaWMgZmllbGQgZm9yIHRoZSBpbXBhY3QKICAgIG15ICRJbXBhY3REeW5hbWljRmllbGRDb25maWc7CiMgLS0tCgogICAgIyBkZWZpbmUgdGhlIGR5bmFtaWMgZmllbGRzIHRvIHNob3cgYmFzZWQgb24gdGhlIG9iamVjdCB0eXBlCiAgICBteSAkT2JqZWN0VHlwZSA9IFsnVGlja2V0J107CgogICAgIyBvbmx5IHNjcmVlbnMgdGhhdCBhZGQgbm90ZXMgY2FuIG1vZGlmeSBBcnRpY2xlIGR5bmFtaWMgZmllbGRzCiAgICBpZiAoICRDb25maWctPntOb3RlfSApIHsKICAgICAgICAkT2JqZWN0VHlwZSA9IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdOwogICAgfQoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiAkT2JqZWN0VHlwZSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQoKICAgICAgICAjIGltcGFjdCBmaWVsZCB3YXMgZm91bmQKICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSBlcSAnSVRTTUltcGFjdCcgKSB7CgogICAgICAgICAgICAjIHN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGltcGFjdCBmaWVsZAogICAgICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnID0gJER5bmFtaWNGaWVsZENvbmZpZzsKICAgICAgICB9CiMgLS0tCiAgICB9CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgIG15ICVTZXJ2aWNlOwogICAgaWYgKCAkU2VsZi0+e0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50fSApIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gJ0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0Jyk7CiAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ICAgICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gJ1ByaW9yaXR5UkMnKTsKICAgICAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnKSB8fCAnJzsKCiAgICAgICAgIyBjaGVjayBpZiBwcmlvcml0eSBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcgfHwgKCAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICYmICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0JyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgc2VydmljZSBpZCBmcm9tIHRpY2tldAogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFRpY2tldHtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICRUaWNrZXR7U2VydmljZUlEfTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGltcGFjdCBmcm9tIHRpY2tldAogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICRUaWNrZXR7RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9OwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAgICAgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gJENvbmZpZy0+e1Nob3dJbmNpZGVudFN0YXRlfSB8fCAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlY2FsY3VsYXRlIGltcGFjdCBpZiBpbXBhY3QgaXMgbm90IHNldCB1bnRpbCBub3cKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAmJiAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IG5lICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCBzZWxlY3Rpb24KICAgICAgICAgICAgICAgIG15ICREZWZhdWx0U2VsZWN0aW9uID0gJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9OwoKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdFNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBkZWZhdWx0IGltcGFjdAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAkRGVmYXVsdFNlbGVjdGlvbjsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICYmICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gJiYgJENvbmZpZy0+e1ByaW9yaXR5fSApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUnKS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkU2VydmljZXtDcml0aWNhbGl0eX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG5vIHNlcnZpY2Ugd2FzIHNlbGVjdGVkCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGRvIG5vdCBzaG93IHRoZSBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gPSAnJzsKCiAgICAgICAgICAgICMgc2hvdyBvbmx5IHRoZSBlbXB0eSBzZWxlY3Rpb24KICAgICAgICAgICAgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30gPSB7fTsKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgdGhlIHNlbGVjdGVkIGltcGFjdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7SVRTTUltcGFjdH0gPSAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9OwogICAgfQojIC0tLQoKICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICBteSAlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkSXRlbSAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkSXRlbTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhZGVmaW5lZCAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRJdGVtfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRJdGVtIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRJdGVtfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwoKICAgICMgdHJhbnNmb3JtIHBlbmRpbmcgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgaWYgKAogICAgICAgIGRlZmluZWQgJEdldFBhcmFte1llYXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TW9udGh9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RGF5fQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0hvdXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TWludXRlfQogICAgICAgICkKICAgIHsKICAgICAgICAlR2V0UGFyYW0gPSAkTGF5b3V0T2JqZWN0LT5UcmFuc2Zvcm1EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJld3JhcCBib2R5IGlmIG5vIHJpY2ggdGV4dCBpcyB1c2VkCiAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSAmJiAhJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+V3JhcFBsYWluVGV4dCgKICAgICAgICAgICAgTWF4Q2hhcmFjdGVycyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpLAogICAgICAgICAgICBQbGFpblRleHQgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHVwbG9hZCBjYWNoZSBvYmplY3QKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgaWYgKAogICAgICAgICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmUnCiAgICAgICAgfHwgJFNlbGYtPntMb2FkZWRGb3JtRHJhZnRJRH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmUnICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CiAgICAgICAgfQoKICAgICAgICAkR2V0UGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9IC8vPSAwOwoKICAgICAgICAjIHN0b3JlIGFjdGlvbgogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgR2V0IGFuZCB2YWxpZGF0ZSBkcmFmdCBhY3Rpb24uCiAgICAgICAgbXkgJEZvcm1EcmFmdEFjdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtRHJhZnRBY3Rpb24nICk7CiAgICAgICAgaWYgKCAkRm9ybURyYWZ0QWN0aW9uICYmICEkQ29uZmlnLT57Rm9ybURyYWZ0fSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0Zvcm1EcmFmdCBmdW5jdGlvbmFsaXR5IGRpc2FibGVkIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUZvcm1EcmFmdFJlc3BvbnNlOwoKICAgICAgICAjIENoZWNrIGRyYWZ0IG5hbWUuCiAgICAgICAgaWYgKAogICAgICAgICAgICAkRm9ybURyYWZ0QWN0aW9uCiAgICAgICAgICAgICYmICggJEZvcm1EcmFmdEFjdGlvbiBlcSAnQWRkJyB8fCAkRm9ybURyYWZ0QWN0aW9uIGVxICdVcGRhdGUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJFRpdGxlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1EcmFmdFRpdGxlJyApOwoKICAgICAgICAgICAgIyBBIGRyYWZ0IG5hbWUgaXMgcmVxdWlyZWQuCiAgICAgICAgICAgIGlmICggISRUaXRsZSApIHsKCiAgICAgICAgICAgICAgICAlRm9ybURyYWZ0UmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCJEcmFmdCBuYW1lIGlzIHJlcXVpcmVkISIpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDaG9zZW4gZHJhZnQgbmFtZSBtdXN0IGJlIHVuaXF1ZS4KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkRm9ybURyYWZ0TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGb3JtRHJhZnQnKS0+Rm9ybURyYWZ0TGlzdEdldCgKICAgICAgICAgICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgRFJBRlQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEZvcm1EcmFmdCAoIEB7JEZvcm1EcmFmdExpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIE5vIGV4aXN0aW5nIGRyYWZ0IHdpdGggc2FtZSBuYW1lLgogICAgICAgICAgICAgICAgICAgIG5leHQgRFJBRlQgaWYgJFRpdGxlIG5lICRGb3JtRHJhZnQtPntUaXRsZX07CgogICAgICAgICAgICAgICAgICAgICMgU2FtZSBuYW1lIGZvciB1cGRhdGUgb24gZXhpc3RpbmcgZHJhZnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRGb3JtRHJhZnRBY3Rpb24gZXEgJ1VwZGF0ZScKICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSBlcSAkRm9ybURyYWZ0LT57Rm9ybURyYWZ0SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRFJBRlQ7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIEFub3RoZXIgZHJhZnQgd2l0aCB0aGUgY2hvc2VuIG5hbWUgYWxyZWFkeSBleGlzdHMuCiAgICAgICAgICAgICAgICAgICAgJUZvcm1EcmFmdFJlc3BvbnNlID0gKAogICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICJGb3JtRHJhZnQgbmFtZSAlcyBpcyBhbHJlYWR5IGluIHVzZSEiLCAkVGl0bGUgKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGxhc3QgRFJBRlQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgUGVyZm9ybSBkcmFmdCBhY3Rpb24gaW5zdGVhZCBvZiBzYXZpbmcgZm9ybSBkYXRhIGluIHRpY2tldC9hcnRpY2xlLgogICAgICAgIGlmICggJEZvcm1EcmFmdEFjdGlvbiAmJiAhJUZvcm1EcmFmdFJlc3BvbnNlICkgewoKICAgICAgICAgICAgIyBSZXNldCBGb3JtRHJhZnRJRCB0byBwcmV2ZW50IHVwZGF0aW5nIGV4aXN0aW5nIGRyYWZ0LgogICAgICAgICAgICBpZiAoICRGb3JtRHJhZnRBY3Rpb24gZXEgJ0FkZCcgJiYgJEdldFBhcmFte0Zvcm1EcmFmdElEfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbU9iamVjdC0+e1F1ZXJ5fS0+cGFyYW0oCiAgICAgICAgICAgICAgICAgICAgLW5hbWUgID0+ICdGb3JtRHJhZnRJRCcsCiAgICAgICAgICAgICAgICAgICAgLXZhbHVlID0+ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEZvcm1EcmFmdEFjdGlvbk9rOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkRm9ybURyYWZ0QWN0aW9uIGVxICdBZGQnCiAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgKCAkRm9ybURyYWZ0QWN0aW9uIGVxICdVcGRhdGUnICYmICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRm9ybURyYWZ0QWN0aW9uT2sgPSAkUGFyYW1PYmplY3QtPlNhdmVGb3JtRHJhZnQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIE92ZXJyaWRlUGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUmVwbHlUb0FydGljbGUgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkRm9ybURyYWZ0QWN0aW9uT2spIHsKICAgICAgICAgICAgICAgICRGb3JtRHJhZnRSZXNwb25zZXtTdWNjZXNzfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAlRm9ybURyYWZ0UmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICdDb3VsZCBub3QgcGVyZm9ybSByZXF1ZXN0ZWQgZHJhZnQgYWN0aW9uIScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJUZvcm1EcmFmdFJlc3BvbnNlKSB7CgogICAgICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVGb3JtRHJhZnRSZXNwb25zZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc3RhdGUgb2JqZWN0CiAgICAgICAgbXkgJFN0YXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyk7CgogICAgICAgICMgY2hlY2sgcGVuZGluZyB0aW1lCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU3RhdGVPYmplY3QtPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBzdGF0ZSB0eXBlCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgICAgICAgICAgICAgIGZvciBteSAkTmVlZGVkIChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgZGF0ZXRpbWUgb2JqZWN0CiAgICAgICAgICAgICAgICBteSAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZCA9PiAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IGN1cnJlbnQgc3lzdGVtIGVwb2NoCiAgICAgICAgICAgICAgICBteSAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGRhdGUKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAhJFBlbmRpbmdEYXRlVGltZU9iamVjdAogICAgICAgICAgICAgICAgICAgIHx8ICRQZW5kaW5nRGF0ZVRpbWVPYmplY3QgPCAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ29uZmlnLT57Tm90ZX0gJiYgJENvbmZpZy0+e05vdGVNYW5kYXRvcnl9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBzdWJqZWN0CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdEludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgYm9keQogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0JvZHlJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG93bmVyCiAgICAgICAgaWYgKCAkQ29uZmlnLT57T3duZXJ9ICYmICRDb25maWctPntPd25lck1hbmRhdG9yeX0gKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtOZXdPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnTmV3T3duZXJJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHJlc3BvbnNpYmxlCiAgICAgICAgaWYgKCAkQ29uZmlnLT57UmVzcG9uc2libGV9ICYmICRDb25maWctPntSZXNwb25zaWJsZU1hbmRhdG9yeX0gKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnTmV3UmVzcG9uc2libGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRpdGxlCiAgICAgICAgaWYgKCAkQ29uZmlnLT57VGl0bGV9ICYmICEkR2V0UGFyYW17VGl0bGV9ICkgewogICAgICAgICAgICAkRXJyb3J7J1RpdGxlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdHlwZQogICAgICAgIGlmICgKICAgICAgICAgICAgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICkKICAgICAgICAgICAgJiYKICAgICAgICAgICAgKCAkQ29uZmlnLT57VGlja2V0VHlwZX0gKSAmJgogICAgICAgICAgICAoICEkR2V0UGFyYW17VHlwZUlEfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnsnVHlwZUlESW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHNlcnZpY2UKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NlcnZpY2V9CiAgICAgICAgICAgICYmICRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBtYW5kYXRvcnkgc2VydmljZQogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U2VydmljZX0KICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NlcnZpY2VNYW5kYXRvcnl9CiAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNsYQogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U2VydmljZX0KICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NMQU1hbmRhdG9yeX0KICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydTTEFJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHF1ZXVlCiAgICAgICAgaWYgKCAkQ29uZmlnLT57UXVldWV9ICYmICRDb25maWctPntRdWV1ZU1hbmRhdG9yeX0gKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtOZXdRdWV1ZUlEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnTmV3UXVldWVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzdGF0ZQogICAgICAgIGlmICggJENvbmZpZy0+e1N0YXRlfSAmJiAkQ29uZmlnLT57U3RhdGVNYW5kYXRvcnl9ICkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J05ld1N0YXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aW1lIHVuaXRzLCBidXQgb25seSBpZiB0aGUgY3VycmVudCBzY3JlZW4gaGFzIGEgbm90ZQogICAgICAgICMgICAoYWNjb3VudGVkIHRpbWUgY2FuIG9ubHkgYmUgc3RvcmVkIGlmIGFuZCBhcnRpY2xlIGlzIGdlbmVyYXRlZCkKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAmJiAkQ29uZmlnLT57Tm90ZX0KICAgICAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yeydUaW1lVW5pdHNJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZXhwYW5kCiAgICAgICAgaWYgKCAkR2V0UGFyYW17RXhwYW5kfSApIHsKICAgICAgICAgICAgJUVycm9yID0gKCk7CiAgICAgICAgICAgICRFcnJvcntFeHBhbmR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGh0bWwgc3RyaW5ncyBmb3IgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgQFRpY2tldFR5cGVEeW5hbWljRmllbGRzOwogICAgICAgIG15IEBBcnRpY2xlVHlwZUR5bmFtaWNGaWVsZHM7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdDsKCiAgICAgICAgICAgICMgRG8gbm90IHZhbGlkYXRlIG9ubHkgaWYgb2JqZWN0IHR5cGUgaXMgQXJ0aWNsZSBhbmQgQ3JlYXRlQXJ0aWNsZSB2YWx1ZSBpcyBub3QgZGVmaW5lZC4KICAgICAgICAgICAgaWYgKCAhKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnICYmICEkR2V0UGFyYW17Q3JlYXRlQXJ0aWNsZX0gKSApIHsKCiAgICAgICAgICAgICAgICAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJXMhJywgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBQcm9wYWdhdGUgdmFsaWRhdGlvbiBlcnJvciB0byB0aGUgRXJyb3IgdmFyaWFibGUgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlIGZyb250ZW5kLgogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyApIHsKCiAgICAgICAgICAgICAgICAjIEdldCBmaWVsZCBodG1sLgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFNlcnZlckVycm9yICAgICAgICAgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSAgICAgICAgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIEFKQVhVcGRhdGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzICAgICAgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBUaWNrZXRUeXBlRHluYW1pY0ZpZWxkcywgewogICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnICkgewogICAgICAgICAgICAgICAgbXkgJENsYXNzICAgICAgICAgICAgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRNYW5kYXRvcnlUb29sdGlwID0gMDsKCiAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnLT57Tm90ZU1hbmRhdG9yeX0gfHwKICAgICAgICAgICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDbGFzcyA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkQ2xhc3MgICAgICAgICAgICA9ICdWYWxpZGF0ZV9EZXBlbmRpbmdSZXF1aXJlZEFORCBWYWxpZGF0ZV9EZXBlbmRpbmdfQ3JlYXRlQXJ0aWNsZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICRNYW5kYXRvcnlUb29sdGlwID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBHZXQgZmllbGQgaHRtbC4KICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJFcnJvciAgICAgICAgICA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgICAgICAgICA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e0Vycm9yTWVzc2FnZX0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgICAgPT4gKCAkQ2xhc3MgZXEgJ1ZhbGlkYXRlX1JlcXVpcmVkJyApID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIEFKQVhVcGRhdGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzICAgICAgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBBcnRpY2xlVHlwZUR5bmFtaWNGaWVsZHMsIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgICAgIEZpZWxkICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5VG9vbHRpcCA9PiAkTWFuZGF0b3J5VG9vbHRpcCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgTWFrZSBzdXJlIHdlIGRvbid0IHNhdmUgZm9ybSBpZiBhIGRyYWZ0IHdhcyBsb2FkZWQuCiAgICAgICAgaWYgKCAkU2VsZi0+e0xvYWRlZEZvcm1EcmFmdElEfSApIHsKICAgICAgICAgICAgJUVycm9yID0gKCBMb2FkZWRGb3JtRHJhZnQgPT4gMSApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBlcnJvcnMKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICAgICA/ICdWYWxpZGF0ZV9SZXF1aXJlZCcKICAgICAgICAgICAgICAgICAgICA6ICcnCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgIFRpY2tldFR5cGVEeW5hbWljRmllbGRzICA9PiBcQFRpY2tldFR5cGVEeW5hbWljRmllbGRzLAogICAgICAgICAgICAgICAgQXJ0aWNsZVR5cGVEeW5hbWljRmllbGRzID0+IFxAQXJ0aWNsZVR5cGVEeW5hbWljRmllbGRzLAoKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHRpdGxlCiAgICAgICAgaWYgKCAkQ29uZmlnLT57VGl0bGV9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1RpdGxlfSApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFRpdGxlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHR5cGUKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJENvbmZpZy0+e1RpY2tldFR5cGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0VHlwZVNldCgKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgc2VydmljZQogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkQ29uZmlnLT57U2VydmljZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFNlcnZpY2VTZXQoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U0xBSUR9ICkgewogICAgICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U0xBU2V0KAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFVubG9ja09uQXdheSA9IDE7CgogICAgICAgICMgbW92ZSB0aWNrZXQgdG8gYSBuZXcgcXVldWUsIGJ1dCBvbmx5IGlmIHRoZSBxdWV1ZSB3YXMgY2hhbmdlZAogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZy0+e1F1ZXVlfQogICAgICAgICAgICAmJiAkR2V0UGFyYW17TmV3UXVldWVJRH0KICAgICAgICAgICAgJiYgJEdldFBhcmFte05ld1F1ZXVlSUR9IG5lICRUaWNrZXR7UXVldWVJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgbW92ZSB0aWNrZXQgKHNlbmQgbm90aWZpY2F0aW9uIGlmIG5vIG5ldyBvd25lciBpcyBzZWxlY3RlZCkKICAgICAgICAgICAgbXkgJEJvZHlBc1RleHQgPSAnJzsKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRCb2R5QXNUZXh0ID0gJExheW91dE9iamVjdC0+UmljaFRleHQyQXNjaWkoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRCb2R5QXNUZXh0ID0gJEdldFBhcmFte0JvZHl9IHx8IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE1vdmUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRRdWV1ZVNldCgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgICAgICA9PiAkR2V0UGFyYW17TmV3UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZE5vTm90aWZpY2F0aW9uID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgID0+ICRCb2R5QXNUZXh0LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkTW92ZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgb3duZXIKICAgICAgICBteSBATm90aWZ5RG9uZTsKICAgICAgICBpZiAoICRDb25maWctPntPd25lcn0gKSB7CiAgICAgICAgICAgIG15ICRCb2R5VGV4dCA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0MkFzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkQm9keVRleHQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFVubG9ja09uQXdheSA9IDA7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld093bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgcmVzcG9uc2libGUKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICYmICRDb25maWctPntSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9ICkgewogICAgICAgICAgICAgICAgbXkgJEJvZHlUZXh0ID0gJExheW91dE9iamVjdC0+UmljaFRleHQyQXNjaWkoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IHJlc3BvbnNpYmxlIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBub3RlCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgIG15ICRSZXR1cm5VUkw7CgogICAgICAgICMgc2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UHJpb3JpdHl9ICYmICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgaWYgKCAkQ29uZmlnLT57U3RhdGV9ICYmICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZCA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdW5sb2NrIHRoZSB0aWNrZXQgYWZ0ZXIgY2xvc2UKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTdGF0ZU9iamVjdC0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCB1bmxvY2sgb24gY2xvc2Ugc3RhdGUKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZSBvbiBwZW5kaW5nIHN0YXRlCiAgICAgICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWRpcmVjdCBwYXJlbnQgd2luZG93IHRvIGxhc3Qgc2NyZWVuIG92ZXJ2aWV3IG9uIGNsb3NlZCB0aWNrZXRzCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaQogICAgICAgICAgICAgICAgJiYgISRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UmVkaXJlY3RBZnRlckNsb3NlRGlzYWJsZWQnKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUmV0dXJuVVJMID0gJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9IHx8ICdBY3Rpb249QWdlbnREYXNoYm9hcmQnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtDcmVhdGVBcnRpY2xlfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57Tm90ZX0KICAgICAgICAgICAgJiYgKCAkR2V0UGFyYW17U3ViamVjdH0gfHwgJEdldFBhcmFte0JvZHl9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRTdWJqZWN0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQ29uZmlnLT57U3ViamVjdH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkU3ViamVjdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRHZXRQYXJhbXtTdWJqZWN0fQogICAgICAgICAgICAgICAgICAgIHx8ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTm8gc3ViamVjdCcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnRzLCBcJVVwbG9hZFN0dWZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICAgICAjIHJlbW92ZSB1bnVzZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICAgICAgbXkgQE5ld0F0dGFjaG1lbnREYXRhOwogICAgICAgICAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBhdHRhY2htZW50IGlmIG5vdCBsaW5rZWQgaW4gYm9keQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICRHZXRQYXJhbXtCb2R5fSAhfiAvKFxRJENvbnRlbnRJREhUTUxRdW90ZVxFfFxRJENvbnRlbnRJRFxFKS9pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyByZW1lbWJlciBpbmxpbmUgaW1hZ2VzIGFuZCBub3JtYWwgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgICAgICBwdXNoIEBOZXdBdHRhY2htZW50RGF0YSwgXCV7JEF0dGFjaG1lbnR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQEF0dGFjaG1lbnRzID0gQE5ld0F0dGFjaG1lbnREYXRhOwoKICAgICAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEZyb20gPSAiXCIkU2VsZi0+e1VzZXJGdWxsbmFtZX1cIiA8JFNlbGYtPntVc2VyRW1haWx9PiI7CiAgICAgICAgICAgIG15IEBOb3RpZnlVc2VySURzOwoKICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiB1c2VycyB0aGF0IHdpbGwgYmUgaW5mb3JtZWQgd2l0aG91dCBzZWxlY3Rpb24gaW4gaW5mb3JtZWQvaW52b2x2ZWQgbGlzdAogICAgICAgICAgICBteSBAVXNlckxpc3RXaXRob3V0U2VsZWN0aW9uCiAgICAgICAgICAgICAgICA9IHNwbGl0KCAnLCcsICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdVc2VyTGlzdFdpdGhvdXRTZWxlY3Rpb24nICkgfHwgIiIgKTsKCiAgICAgICAgICAgICMgZ2V0IGluZm9ybSB1c2VyIGxpc3QKICAgICAgICAgICAgbXkgQEluZm9ybVVzZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbmZvcm1Vc2VySUQnICk7CgogICAgICAgICAgICAjIGdldCBpbnZvbHZlZCB1c2VyIGxpc3QKICAgICAgICAgICAgbXkgQEludm9sdmVkVXNlcklEID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ0ludm9sdmVkVXNlcklEJyApOwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57SW5mb3JtQWdlbnR9ICkgewogICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5VXNlcklEcywgQEluZm9ybVVzZXJJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57SW52b2x2ZWRBZ2VudH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlVc2VySURzLCBASW52b2x2ZWRVc2VySUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBOb3RpZnlVc2VySURzLCBAVXNlckxpc3RXaXRob3V0U2VsZWN0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRTZWxmLT57QWN0aW9ufSBlcSAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJyApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlOjpCYWNrZW5kOjpFbWFpbCcpLT5BcnRpY2xlU2VuZCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRGcm9tLAogICAgICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICRDb25maWctPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9LAogICAgICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgICAgICAgPT4gXEBOb3RpZnlVc2VySURzLAogICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gXEBOb3RpZnlEb25lLAogICAgICAgICAgICAgICAgICAgIFVubG9ja09uQXdheSAgICAgICAgICAgICAgICAgICAgPT4gJFVubG9ja09uQXdheSwKICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50ICAgICAgICAgICAgICAgICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlOjpCYWNrZW5kOjpJbnRlcm5hbCcpLT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJENvbmZpZy0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICAgICAgICAgICAgID0+ICRDb25maWctPntIaXN0b3J5Q29tbWVudH0sCiAgICAgICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBcQE5vdGlmeVVzZXJJRHMsCiAgICAgICAgICAgICAgICAgICAgRXhjbHVkZU11dGVOb3RpZmljYXRpb25Ub1VzZXJJRCA9PiBcQE5vdGlmeURvbmUsCiAgICAgICAgICAgICAgICAgICAgVW5sb2NrT25Bd2F5ICAgICAgICAgICAgICAgICAgICA9PiAkVW5sb2NrT25Bd2F5LAogICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgICAgICAgICAgICAgICAgICAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0dGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICMgc2V0IHRoZSBvYmplY3QgSUQgKFRpY2tldElEIG9yIEFydGljbGVJRCkgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCBjb25maWdyYXRpb24KICAgICAgICAgICAgbXkgJE9iamVjdElEID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdBcnRpY2xlJyA/ICRBcnRpY2xlSUQgOiAkU2VsZi0+e1RpY2tldElEfTsKCiAgICAgICAgICAgICMgc2V0IHRoZSB2YWx1ZQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRPYmplY3RJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIElmIGZvcm0gd2FzIGNhbGxlZCBiYXNlZCBvbiBhIGRyYWZ0LAogICAgICAgICMgICBkZWxldGUgZHJhZnQgc2luY2UgaXRzIGNvbnRlbnQgaGFzIG5vdyBiZWVuIHVzZWQuCiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17Rm9ybURyYWZ0SUR9CiAgICAgICAgICAgICYmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Rm9ybURyYWZ0JyktPkZvcm1EcmFmdERlbGV0ZSgKICAgICAgICAgICAgICAgIEZvcm1EcmFmdElEID0+ICRHZXRQYXJhbXtGb3JtRHJhZnRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NvdWxkIG5vdCBkZWxldGUgZHJhZnQhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgaWYgKCAkU2VsZi0+e0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50fSAmJiAoICgkR2V0UGFyYW17U2VydmljZUlEfSAmJiAkU2VydmljZXtDcml0aWNhbGl0eX0gKSB8fCAhJEdldFBhcmFte1NlcnZpY2VJRH0gKSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNvbmZpZyBmb3IgY3JpdGljYWxpdHkgZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Dcml0aWNhbGl0eScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBwb3NzaWJsZSB2YWx1ZXMgZm9yIGNyaXRpY2FsaXR5CiAgICAgICAgICAgIG15ICRDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmV2ZXJzZSB0aGUgbGlzdCB0byBmaW5kIG91dCB0aGUga2V5CiAgICAgICAgICAgIG15ICVSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlcyA9IHJldmVyc2UgJXsgJENyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgfTsKCiAgICAgICAgICAgICMgc2V0IHRoZSBjcml0aWNhbGl0eQogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlc3sgJFNlcnZpY2V7Q3JpdGljYWxpdHl9IHx8ICcnIH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KCiAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAkUmV0dXJuVVJMIHx8PSAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGVJRCI7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICBVUkwgPT4gJFJldHVyblVSTCwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewogICAgICAgIG15ICVUaWNrZXQgICAgICAgICA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyICAgPSAkVGlja2V0e0N1c3RvbWVyVXNlcklEfTsKICAgICAgICBteSAkRWxlbWVudENoYW5nZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CgogICAgICAgIG15ICRTZXJ2aWNlSUQ7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgdmFsdWUgZnJvbSBwYXJhbSBpZiBmaWVsZCBpcyB2aXNpYmxlIGluIHRoZSBzY3JlZW4KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJENvbmZpZy0+e1NlcnZpY2V9ICkgewogICAgICAgICAgICAkU2VydmljZUlEID0gJEdldFBhcmFte1NlcnZpY2VJRH0gfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSB1c2UgdGlja2V0IHNlcnZpY2UgdmFsdWUgc2luY2UgaXQgY2FuJ3QgYmUgY2hhbmdlZAogICAgICAgIGVsc2lmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICAgICAgJFNlcnZpY2VJRCA9ICRUaWNrZXR7U2VydmljZUlEfSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIG15ICRRdWV1ZUlEID0gJEdldFBhcmFte05ld1F1ZXVlSUR9IHx8ICRUaWNrZXR7UXVldWVJRH07CiAgICAgICAgbXkgJFN0YXRlSUQgPSAkR2V0UGFyYW17TmV3U3RhdGVJRH0gfHwgJFRpY2tldHtTdGF0ZUlEfTsKCiAgICAgICAgIyBnZXQgbGlzdCB0eXBlCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkT3duZXJzID0gJFNlbGYtPl9HZXRPd25lcnMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIFN0YXRlSUQgID0+ICRTdGF0ZUlELAogICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9LAogICAgICAgICk7CiAgICAgICAgbXkgJE9sZE93bmVycyA9ICRTZWxmLT5fR2V0T2xkT3duZXJzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBTdGF0ZUlEICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICRSZXNwb25zaWJsZVVzZXJzID0gJFNlbGYtPl9HZXRSZXNwb25zaWJsZSgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgU3RhdGVJRCAgPT4gJFN0YXRlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgPT4gJFN0YXRlSUQsCiAgICAgICAgKTsKICAgICAgICBteSAkVHlwZXMgPSAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICApOwogICAgICAgIG15ICROZXdRdWV1ZXMgPSAkU2VsZi0+X0dldFF1ZXVlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgcmVzZXQgcHJldmlvdXMgU2VydmljZUlEIHRvIHJlc2V0IFNMQS1MaXN0IGlmIG5vIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoICFkZWZpbmVkICRTZXJ2aWNlSUQgfHwgISRTZXJ2aWNlcy0+eyRTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAkU2VydmljZUlEID0gJyc7CiAgICAgICAgfQogICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICAgICAgU2VydmljZUlEICAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICApOwogICAgICAgIG15ICROZXh0U3RhdGVzID0gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAkU3RhdGVJRCwKICAgICAgICApOwoKICAgICAgICAjIHVwZGF0ZSBEeW5hbWljIEZpZWxkcyBQb3NzaWJsZSBWYWx1ZXMgdmlhIEFKQVgKICAgICAgICBteSBARHluYW1pY0ZpZWxkQUpBWDsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXN9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICkgfHwgJFBvc3NpYmxlVmFsdWVzOwoKICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEID0+ICRRdWV1ZUlEIHx8ICcnLAogICAgICAgICk7CgogICAgICAgIG15IEBUZW1wbGF0ZUFKQVg7CgogICAgICAgICMgdXBkYXRlIHRpY2tldCBib2R5IGFuZCBhdHRhY2hlbWVudHMgaWYgbmVlZGVkLgogICAgICAgIGlmICggJEVsZW1lbnRDaGFuZ2VkIGVxICdTdGFuZGFyZFRlbXBsYXRlSUQnICkgewogICAgICAgICAgICBteSBAVGlja2V0QXR0YWNobWVudHM7CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZVRleHQ7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgVXBsb2FkIGNhY2hlCiAgICAgICAgICAgIG15ICRSZW1vdmVTdWNjZXNzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUmVtb3ZlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZvcm0gYXR0YWNobWVudHMgY291bGQgbm90IGJlIGRlbGV0ZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wbGF0ZSB0ZXh0IGFuZCBzZXQgbmV3IGF0dGFjaG1lbnRzIGlmIGEgdGVtcGxhdGUgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCBJc1Bvc2l0aXZlSW50ZWdlciggJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gKSApIHsKICAgICAgICAgICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwoKICAgICAgICAgICAgICAgICMgc2V0IHRlbXBsYXRlIHRleHQsIHJlcGxhY2Ugc21hcnQgdGFncyAobGltaXRlZCBhcyB0aWNrZXQgaXMgbm90IGNyZWF0ZWQpCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVUZXh0ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5UZW1wbGF0ZSgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgaWYgUmVwbHlUb0FydGljbGUgaXMgZ2l2ZW4sIGdldCB0aGlzIGFydGljbGUgdG8gZ2VuZXJhdGUKICAgICAgICAgICAgICAgICMgdGhlIHF1b3RlZCBhcnRpY2xlIGNvbnRlbnQKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGFydGljbGUgdG8gcXVvdGUKICAgICAgICAgICAgICAgICAgICBteSAkQm9keSA9ICRMYXlvdXRPYmplY3QtPkFydGljbGVRdW90ZSgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgID0+ICRTZWxmLT57UmVwbHlUb0FydGljbGV9LAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ID0+ICRVcGxvYWRDYWNoZU9iamVjdCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHByZXBhcmUgcXVvdGVkIGJvZHkgY29udGVudAogICAgICAgICAgICAgICAgICAgICRCb2R5ID0gJFNlbGYtPl9HZXRRdW90ZWRSZXBseUJvZHkoCiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRTZWxmLT57UmVwbHlUb0FydGljbGVDb250ZW50fSB9LAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+ICRCb2R5LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVUZXh0IC4gJzxicj48YnI+JyAuICRCb2R5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZVRleHQgLiAiXG5cbiIgLiAkQm9keTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgU3RkQXR0YWNobWVudE9iamVjdAogICAgICAgICAgICAgICAgbXkgJFN0ZEF0dGFjaG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudCcpOwoKICAgICAgICAgICAgICAgICMgYWRkIHN0ZC4gYXR0YWNobWVudHMgdG8gdGlja2V0CiAgICAgICAgICAgICAgICBteSAlQWxsU3RkQXR0YWNobWVudHMgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3IgKCBzb3J0IGtleXMgJUFsbFN0ZEF0dGFjaG1lbnRzICkgewogICAgICAgICAgICAgICAgICAgIG15ICVBdHRhY2htZW50c0RhdGEgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudEdldCggSUQgPT4gJF8gKTsKICAgICAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAlQXR0YWNobWVudHNEYXRhLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZW5kIGEgbGlzdCBvZiBhdHRhY2htZW50cyBpbiB0aGUgdXBsb2FkIGNhY2hlIGJhY2sgdG8gdGhlIGNsaWVudHNpZGUgSmF2YVNjcmlwdAogICAgICAgICAgICAgICAgIyB3aGljaCByZW5kZXJzIHRoZW4gdGhlIGxpc3Qgb2YgY3VycmVudGx5IHVwbG9hZGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBAVGlja2V0QXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBUaWNrZXRBdHRhY2htZW50cykgewogICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RmlsZXNpemV9ID0gJExheW91dE9iamVjdC0+SHVtYW5SZWFkYWJsZURhdGFTaXplKAogICAgICAgICAgICAgICAgICAgICAgICBTaXplID0+ICRBdHRhY2htZW50LT57RmlsZXNpemV9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBUZW1wbGF0ZUFKQVggPSAoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlVGVtcGxhdGVOb3RlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICcwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFRlbXBsYXRlVGV4dCB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1RpY2tldEF0dGFjaG1lbnRzJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcQFRpY2tldEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgICAgIEtlZXBEYXRhID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdPd25lcklEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE93bmVycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRSZXNwb25zaWJsZVVzZXJzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdTdGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0gPyAwIDogMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTdGFuZGFyZFRlbXBsYXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3UXVldWVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICROZXdRdWV1ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15ICRCb2R5ID0gJyc7CgogICAgICAgICMgaWYgUmVwbHlUb0FydGljbGUgaXMgZ2l2ZW4sIGdldCB0aGlzIGFydGljbGUgdG8gZ2VuZXJhdGUKICAgICAgICAjIHRoZSBxdW90ZWQgYXJ0aWNsZSBjb250ZW50CiAgICAgICAgaWYgKCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGFydGljbGUgdG8gcXVvdGUKICAgICAgICAgICAgJEJvZHkgPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgID0+ICRTZWxmLT57UmVwbHlUb0FydGljbGV9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgVXBsb2FkQ2FjaGVPYmplY3QgPT4gJFVwbG9hZENhY2hlT2JqZWN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBwcmVwYXJlIHF1b3RlZCBib2R5IGNvbnRlbnQKICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+X0dldFF1b3RlZFJlcGx5Qm9keSgKICAgICAgICAgICAgICAgICV7ICRTZWxmLT57UmVwbHlUb0FydGljbGVDb250ZW50fSB9LAogICAgICAgICAgICAgICAgQm9keSA9PiAkQm9keSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgYSBib2R5IGNvbnRlbnQgd2FzIHByZSBkZWZpbmVkLCBhZGQgdGhpcyBiZWZvcmUgdGhlIHF1b3RlZCBhcnRpY2xlIGNvbnRlbnQKICAgICAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSApIHsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEJvZHkgPSAkR2V0UGFyYW17Qm9keX0gLiAkQm9keTsKICAgICAgICB9CgogICAgICAgICMgZmlsbHVwIGNvbmZpZ3VyZWQgZGVmYXVsdCB2YXJzCiAgICAgICAgaWYgKCAkQm9keSBlcSAnJyAmJiAkQ29uZmlnLT57Qm9keX0gKSB7CiAgICAgICAgICAgICRCb2R5ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENvbmZpZy0+e0JvZHl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRCb2R5ID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgQm9keSB2YXIgdG8gY2FsY3VsYXRlZCBjb250ZW50CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJEJvZHk7CgogICAgICAgIGlmICggJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gKSB7CiAgICAgICAgICAgIG15ICRUaWNrZXRTdWJqZWN0UmUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U3ViamVjdFJlJykgfHwgJ1JlJzsKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFRpY2tldFN1YmplY3RSZSAuICc6ICcgLiAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlQ29udGVudH17U3ViamVjdH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggIWRlZmluZWQgJEdldFBhcmFte1N1YmplY3R9ICYmICRDb25maWctPntTdWJqZWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENvbmZpZy0+e1N1YmplY3R9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgQFRpY2tldFR5cGVEeW5hbWljRmllbGRzOwogICAgICAgIG15IEBBcnRpY2xlVHlwZUR5bmFtaWNGaWVsZHM7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRvIHN0b3JlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSBkYXRhYmFzZSAob3IgdW5kZWZpbmVkKQogICAgICAgICAgICBteSAkVmFsdWU7CgogICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyApIHsKCiAgICAgICAgICAgICAgICAjIE9ubHkgZ2V0IHZhbHVlcyBmb3IgVGlja2V0IGZpZWxkcyAoYWxsIHNjcmVlbnMgYmFzZWQgb24gQWdlbnRUaWNrZUFjdGlvbkNvbW1vbgogICAgICAgICAgICAgICAgIyBnZW5lcmF0ZXMgYSBuZXcgYXJ0aWNsZSwgdGhlbiBhcnRpY2xlIGZpZWxkcyB3aWxsIGJlIGFsd2F5cyBlbXB0eSBhdCB0aGUgYmVnaW5uaW5nKS4KICAgICAgICAgICAgICAgICMgVmFsdWUgaXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZSBmcm9tIFRpY2tldC4KICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwoKICAgICAgICAgICAgICAgICMgR2V0IGZpZWxkIGh0bWwuCiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkSFRNTCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICAgID0+ICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgICAgICA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQFRpY2tldFR5cGVEeW5hbWljRmllbGRzLCB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnQXJ0aWNsZScgKSB7CiAgICAgICAgICAgICAgICBteSAkQ2xhc3MgICAgICAgICAgICA9ICcnOwogICAgICAgICAgICAgICAgbXkgJE1hbmRhdG9yeVRvb2x0aXAgPSAwOwoKICAgICAgICAgICAgICAgIGlmICggJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRDb25maWctPntOb3RlTWFuZGF0b3J5fSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENsYXNzID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDbGFzcyAgICAgICAgICAgID0gJ1ZhbGlkYXRlX0RlcGVuZGluZ1JlcXVpcmVkQU5EIFZhbGlkYXRlX0RlcGVuZGluZ19DcmVhdGVBcnRpY2xlJzsKICAgICAgICAgICAgICAgICAgICAgICAgJE1hbmRhdG9yeVRvb2x0aXAgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIEdldCBmaWVsZCBodG1sLgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PiAoICRDbGFzcyBlcSAnVmFsaWRhdGVfUmVxdWlyZWQnICkgPyAxIDogMCwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgICAgICA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQEFydGljbGVUeXBlRHluYW1pY0ZpZWxkcywgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICAgICAgRmllbGQgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnlUb29sdGlwID0+ICRNYW5kYXRvcnlUb29sdGlwLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwcmludCBmb3JtIC4uLgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU21hbGwnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBCb2R5Q2xhc3MgPT4gJ1BvcHVwJywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICBUaW1lVW5pdHNSZXF1aXJlZCA9PiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJwogICAgICAgICAgICAgICAgOiAnJwogICAgICAgICAgICApLAogICAgICAgICAgICBUaWNrZXRUeXBlRHluYW1pY0ZpZWxkcyAgPT4gXEBUaWNrZXRUeXBlRHluYW1pY0ZpZWxkcywKICAgICAgICAgICAgQXJ0aWNsZVR5cGVEeW5hbWljRmllbGRzID0+IFxAQXJ0aWNsZVR5cGVEeW5hbWljRmllbGRzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigKICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBEZWZpbmUgdGhlIGR5bmFtaWMgZmllbGRzIHRvIHNob3cgYmFzZWQgb24gdGhlIG9iamVjdCB0eXBlLgogICAgbXkgJE9iamVjdFR5cGUgPSBbJ1RpY2tldCddOwoKICAgICMgT25seSBzY3JlZW5zIHRoYXQgYWRkIG5vdGVzIGNhbiBtb2RpZnkgQXJ0aWNsZSBkeW5hbWljIGZpZWxkcy4KICAgIGlmICggJENvbmZpZy0+e05vdGV9ICkgewogICAgICAgICRPYmplY3RUeXBlID0gWyAnVGlja2V0JywgJ0FydGljbGUnIF07CiAgICB9CgogICAgIyBHZXQgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuLgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+ICRPYmplY3RUeXBlLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICAjIFdpZGdldCBUaWNrZXQgQWN0aW9ucwogICAgaWYgKAogICAgICAgICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkQ29uZmlnLT57VGlja2V0VHlwZX0gKQogICAgICAgIHx8CiAgICAgICAgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICAgICAmJiAkQ29uZmlnLT57U2VydmljZX0gKSAgICAgfHwKICAgICAgICAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICYmICRDb25maWctPntSZXNwb25zaWJsZX0gKSB8fAogICAgICAgICRDb25maWctPntUaXRsZX0gICAgfHwKICAgICAgICAkQ29uZmlnLT57UXVldWV9ICAgIHx8CiAgICAgICAgJENvbmZpZy0+e093bmVyfSAgICB8fAogICAgICAgICRDb25maWctPntTdGF0ZX0gICAgfHwKICAgICAgICAkQ29uZmlnLT57UHJpb3JpdHl9IHx8CiAgICAgICAgc2NhbGFyIEB7ICRQYXJhbXtUaWNrZXRUeXBlRHluYW1pY0ZpZWxkc30gfSA+IDAKICAgICAgICApCiAgICB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1dpZGdldFRpY2tldEFjdGlvbnMnLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkQ29uZmlnLT57VGl0bGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaXRsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIG15ICREeW5hbWljRmllbGROYW1lcyA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoCiAgICAgICAgT25seUR5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnRHluYW1pY0ZpZWxkTmFtZXMnLAogICAgICAgIFZhbHVlID0+ICREeW5hbWljRmllbGROYW1lcywKICAgICk7CgogICAgIyB0eXBlcwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRDb25maWctPntUaWNrZXRUeXBlfSApIHsKICAgICAgICBteSAlVHlwZSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplICcgLiAoICRQYXJhbXtFcnJvcnN9LT57VHlwZUlESW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlcnZpY2VzCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJENvbmZpZy0+e1NlcnZpY2V9ICkgewogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVzZXQgcHJldmlvdXMgU2VydmljZUlEIHRvIHJlc2V0IFNMQS1MaXN0IGlmIG5vIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoICEkUGFyYW17U2VydmljZUlEfSB8fCAhJFNlcnZpY2VzLT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtTZXJ2aWNlSUR9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICJNb2Rlcm5pemUgIgogICAgICAgICAgICAgICAgLiAoICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fSA/ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIDogJycgKQogICAgICAgICAgICAgICAgLiAoICRQYXJhbXtTZXJ2aWNlSW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU2VydmljZU1hbmRhdG9yeSA9PiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gfHwgMCwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAlU0xBID0gJFRpY2tldE9iamVjdC0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAiTW9kZXJuaXplICIKICAgICAgICAgICAgICAgIC4gKCAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSA/ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIDogJycgKQogICAgICAgICAgICAgICAgLiAoICRQYXJhbXtTZXJ2aWNlSW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTTEFNYW5kYXRvcnkgPT4gJENvbmZpZy0+e1NMQU1hbmRhdG9yeX0sCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRDb25maWctPntRdWV1ZX0gKSB7CgogICAgICAgICMgZmV0Y2ggYWxsIHF1ZXVlcwogICAgICAgIG15ICVNb3ZlUXVldWVzID0gJFRpY2tldE9iamVjdC0+VGlja2V0TW92ZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ21vdmVfaW50bycsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbW92ZSBxdWV1ZXMKICAgICAgICAkUGFyYW17UXVldWVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgPT4geyAlTW92ZVF1ZXVlcywgJycgPT4gJy0nIH0sCiAgICAgICAgICAgIE11bHRpcGxlID0+IDAsCiAgICAgICAgICAgIFNpemUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgID0+ICdOZXdRdWV1ZUlEIE1vZGVybml6ZSAnCiAgICAgICAgICAgICAgICAuICggJENvbmZpZy0+e1F1ZXVlTWFuZGF0b3J5fSA/ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIDogJycgKQogICAgICAgICAgICAgICAgLiAoICRQYXJhbXtOZXdRdWV1ZUludmFsaWR9IHx8ICcnICksCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdOZXdRdWV1ZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJFBhcmFte05ld1F1ZXVlSUR9LAogICAgICAgICAgICBUcmVlVmlldyAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIEN1cnJlbnRRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUXVldWUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFF1ZXVlTWFuZGF0b3J5ID0+ICRDb25maWctPntRdWV1ZU1hbmRhdG9yeX0gfHwgMCwKICAgICAgICAgICAgICAgICVQYXJhbQogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgbXkgJFVzZXJPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKICAgIGlmICggJENvbmZpZy0+e093bmVyfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnM7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkVXNlck9iamVjdC0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnTmV3T3duZXInLAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBvbGQgb3duZXIKICAgICAgICBteSBAT2xkVXNlckluZm8gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRPd25lckxpc3QoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgbXkgQE9sZE93bmVyczsKICAgICAgICBteSAlT2xkT3duZXJzU2hvd247CiAgICAgICAgbXkgJVNlZW5PbGRPd25lcjsKICAgICAgICBpZiAoQE9sZFVzZXJJbmZvKSB7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMTsKICAgICAgICAgICAgVVNFUjoKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAT2xkVXNlckluZm8gKSB7CgogICAgICAgICAgICAgICAgIyBza2lwIGlmIG9sZCBvd25lciBpcyBhbHJlYWR5IGluIHRoZSBsaXN0CiAgICAgICAgICAgICAgICBuZXh0IFVTRVIgaWYgJFNlZW5PbGRPd25lcnsgJFVzZXItPntVc2VySUR9IH07CiAgICAgICAgICAgICAgICAkU2Vlbk9sZE93bmVyeyAkVXNlci0+e1VzZXJJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICBteSAkS2V5ICAgPSAkVXNlci0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckZ1bGxuYW1lfSI7CiAgICAgICAgICAgICAgICBwdXNoIEBPbGRPd25lcnMsIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkT2xkT3duZXJzU2hvd257JEtleX0gPSAkVmFsdWU7CiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkT2xkT3duZXJTZWxlY3RlZElEID0gJyc7CiAgICAgICAgaWYgKCAkUGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICRPbGRPd25lclNlbGVjdGVkSUQgPSAkUGFyYW17T2xkT3duZXJJRH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRPbGRVc2VySW5mb1swXS0+e1VzZXJJRH0gLiAnMSc7CiAgICAgICAgfQoKICAgICAgICBteSAkT2xkT3duZXJBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdPbGRPd25lcicsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVPbGRPd25lcnNTaG93biwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRPbGRPd25lckFDTCkgewogICAgICAgICAgICAlT2xkT3duZXJzU2hvd24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHN0cmluZwogICAgICAgICRQYXJhbXtPd25lclN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3T3duZXJJRCcsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSAnCiAgICAgICAgICAgICAgICAuICggJENvbmZpZy0+e093bmVyTWFuZGF0b3J5fSA/ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIDogJycgKQogICAgICAgICAgICAgICAgLiAoICRQYXJhbXtOZXdPd25lckludmFsaWR9IHx8ICcnICksCiAgICAgICAgICAgIFNpemUgICAgICAgICA9PiAxLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgRmlsdGVycyAgICAgID0+IHsKICAgICAgICAgICAgICAgIE9sZE93bmVycyA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUHJldmlvdXMgT3duZXInKSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgPT4gXCVPbGRPd25lcnNTaG93biwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBPd25lck1hbmRhdG9yeSA9PiAkQ29uZmlnLT57T3duZXJNYW5kYXRvcnl9IHx8IDAsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICYmICRDb25maWctPntSZXNwb25zaWJsZX0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFVzZXJPYmplY3QtPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkUXVldWVPYmplY3QtPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcmVzcG9uc2libGUKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgJwogICAgICAgICAgICAgICAgLiAoICRDb25maWctPntSZXNwb25zaWJsZU1hbmRhdG9yeX0gPyAnVmFsaWRhdGVfUmVxdWlyZWQgJyA6ICcnICkKICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17TmV3UmVzcG9uc2libGVJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlTWFuZGF0b3J5ID0+ICRDb25maWctPntSZXNwb25zaWJsZU1hbmRhdG9yeX0gfHwgMCwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgIH0KCiAgICBpZiAoICRDb25maWctPntTdGF0ZX0gKSB7CgogICAgICAgIG15ICVTdGF0ZTsKICAgICAgICBteSAlU3RhdGVMaXN0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkUGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdGV7U2VsZWN0ZWRWYWx1ZX0gPSAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1N0YXRlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICAkUGFyYW17U3RhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICA9PiBcJVN0YXRlTGlzdCwKICAgICAgICAgICAgTmFtZSAgPT4gJ05ld1N0YXRlSUQnLAogICAgICAgICAgICBDbGFzcyA9PiAnTW9kZXJuaXplICcKICAgICAgICAgICAgICAgIC4gKCAkQ29uZmlnLT57U3RhdGVNYW5kYXRvcnl9ID8gJ1ZhbGlkYXRlX1JlcXVpcmVkICcgOiAnJyApCiAgICAgICAgICAgICAgICAuICggJFBhcmFte05ld1N0YXRlSW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+ICRDb25maWctPntTdGF0ZURlZmF1bHR9ID8gMCA6IDEsCiAgICAgICAgICAgICVTdGF0ZSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU3RhdGVNYW5kYXRvcnkgPT4gJENvbmZpZy0+e1N0YXRlTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkQ29uZmlnLT57U3RhdGVUeXBlfSApICkgewoKICAgICAgICAgICAgU1RBVEVUWVBFOgogICAgICAgICAgICBmb3IgbXkgJFN0YXRlVHlwZSAoIEB7ICRDb25maWctPntTdGF0ZVR5cGV9IH0gKSB7CgogICAgICAgICAgICAgICAgbmV4dCBTVEFURVRZUEUgaWYgISRTdGF0ZVR5cGU7CiAgICAgICAgICAgICAgICBuZXh0IFNUQVRFVFlQRSBpZiAkU3RhdGVUeXBlICF+IC9wZW5kaW5nL2k7CgogICAgICAgICAgICAgICAgIyBnZXQgdXNlZCBjYWxlbmRhcgogICAgICAgICAgICAgICAgbXkgJENhbGVuZGFyID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFBhcmFte0RhdGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgICAgICAgICBZZWFyUGVyaW9kUGFzdCAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiA1LAogICAgICAgICAgICAgICAgICAgIERpZmZUaW1lICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKQogICAgICAgICAgICAgICAgICAgICAgICB8fCAwLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRlSW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICAgICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVEYXRlSW5GdXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgICA9PiAkQ2FsZW5kYXIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlUGVuZGluZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBsYXN0IFNUQVRFVFlQRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwcmlvcml0eQogICAgaWYgKCAkQ29uZmlnLT57UHJpb3JpdHl9ICkgewoKICAgICAgICBteSAlUHJpb3JpdHk7CiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRDb25maWctPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAkUHJpb3JpdHlMaXN0eycnfSA9ICctJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAhJFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICBpZiAoICRDb25maWctPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkVmFsdWV9ID0gJENvbmZpZy0+e1ByaW9yaXR5RGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQcmlvcml0eXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdQcmlvcml0eUlEfTsKICAgICAgICB9CiAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkSUR9IHx8PSAkUGFyYW17UHJpb3JpdHlJRH07CiAgICAgICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgIE5hbWUgID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICVQcmlvcml0eSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IFRpY2tldCB0eXBlIGR5bmFtaWMgZmllbGRzLgogICAgZm9yIG15ICRUaWNrZXRUeXBlRHluYW1pY0ZpZWxkICggQHsgJFBhcmFte1RpY2tldFR5cGVEeW5hbWljRmllbGRzfSB9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiAkVGlja2V0VHlwZUR5bmFtaWNGaWVsZCwKICAgICAgICApOwoKICAgICAgICAjIE91dHB1dCBjdXN0b21pemF0aW9uIGJsb2NrIHRvbywgaWYgaXQgZXhpc3RzLgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlRHluYW1pY0ZpZWxkXycgLiAkVGlja2V0VHlwZUR5bmFtaWNGaWVsZC0+e05hbWV9LAogICAgICAgICAgICBEYXRhID0+ICRUaWNrZXRUeXBlRHluYW1pY0ZpZWxkLAogICAgICAgICk7CiAgICB9CgogICAgIyBFbmQgV2lkZ2V0IFRpY2tldCBBY3Rpb25zCgogICAgIyBXaWRnZXQgQXJ0aWNsZQogICAgaWYgKCAkQ29uZmlnLT57Tm90ZX0gKSB7CgogICAgICAgICRQYXJhbXtXaWRnZXRTdGF0dXN9ID0gJ0NvbGxhcHNlZCc7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZy0+e05vdGVNYW5kYXRvcnl9CiAgICAgICAgICAgIHx8ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICB8fCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfQogICAgICAgICAgICB8fCAkUGFyYW17Q3JlYXRlQXJ0aWNsZX0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte1dpZGdldFN0YXR1c30gPSAnRXhwYW5kZWQnOwogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnLT57Tm90ZU1hbmRhdG9yeX0KICAgICAgICAgICAgfHwgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtTdWJqZWN0UmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgJFBhcmFte0JvZHlSZXF1aXJlZH0gICAgPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1N1YmplY3RSZXF1aXJlZH0gPSAnVmFsaWRhdGVfRGVwZW5kaW5nUmVxdWlyZWRBTkQgVmFsaWRhdGVfRGVwZW5kaW5nX0NyZWF0ZUFydGljbGUnOwogICAgICAgICAgICAkUGFyYW17Qm9keVJlcXVpcmVkfSAgICA9ICdWYWxpZGF0ZV9EZXBlbmRpbmdSZXF1aXJlZEFORCBWYWxpZGF0ZV9EZXBlbmRpbmdfQ3JlYXRlQXJ0aWNsZSc7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBjdXN0b21lciB2aXNpYmlsaXR5IG9mIHRoaXMgbm90ZSB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgYXJ0aWNsZSBmb3Igd2hvbSB0aGlzIGlzIHRoZSByZXBseQogICAgICAgIGlmICggJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gJiYgIWRlZmluZWQgJFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSApIHsKICAgICAgICAgICAgJFBhcmFte0lzVmlzaWJsZUZvckN1c3RvbWVyfSA9ICRTZWxmLT57UmVwbHlUb0FydGljbGVDb250ZW50fS0+e0lzVmlzaWJsZUZvckN1c3RvbWVyfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAhZGVmaW5lZCAkUGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9ICkgewogICAgICAgICAgICAkUGFyYW17SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9ID0gJENvbmZpZy0+e0lzVmlzaWJsZUZvckN1c3RvbWVyRGVmYXVsdH07CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXR0YWNobWVudHMKICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRhY2htZW50TGlzdH0gfSwgJEF0dGFjaG1lbnQ7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnV2lkZ2V0QXJ0aWNsZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYWxsIHVzZXIgaWRzIG9mIGFnZW50cywgdGhhdCBjYW4gYmUgc2hvd24gaW4gdGhpcyBkaWFsb2cKICAgICAgICAjIGJhc2VkIG9uIHF1ZXVlIHJpZ2h0cwogICAgICAgIG15ICVTaG93blVzZXJzOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFVzZXJPYmplY3QtPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkR0lEID0gJFF1ZXVlT2JqZWN0LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAnbm90ZScsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGVtYWlsIHBhcnNlciBvYmplY3QKICAgICAgICBteSAkRW1haWxQYXJzZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXItPm5ldygKICAgICAgICAgICAgTW9kZSAgPT4gJ1N0YW5kYWxvbmUnLAogICAgICAgICAgICBEZWJ1ZyA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgYW5kIHJldHJpZXZlIGludm9sdmVkIGFuZCBpbmZvcm1lZCBhZ2VudHMgb2YgUmVwbHlUbyBOb3RlCiAgICAgICAgbXkgQFJlcGx5VG9Vc2VyczsKICAgICAgICBteSAlUmVwbHlUb1VzZXJzSGFzaDsKICAgICAgICBteSAlUmVwbHlUb1VzZXJJRHM7CiAgICAgICAgaWYgKCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSApIHsKICAgICAgICAgICAgbXkgQFJlcGx5VG9QYXJ0cyA9ICRFbWFpbFBhcnNlck9iamVjdC0+U3BsaXRBZGRyZXNzTGluZSgKICAgICAgICAgICAgICAgIExpbmUgPT4gJFNlbGYtPntSZXBseVRvQXJ0aWNsZUNvbnRlbnR9LT57VG99IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgUkVQTFlUT1BBUlQ6CiAgICAgICAgICAgIGZvciBteSAkU2luZ2xlUmVwbHlUb1BhcnQgKEBSZXBseVRvUGFydHMpIHsKICAgICAgICAgICAgICAgIG15ICRSZXBseVRvQWRkcmVzcyA9ICRFbWFpbFBhcnNlck9iamVjdC0+R2V0RW1haWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgIEVtYWlsID0+ICRTaW5nbGVSZXBseVRvUGFydCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBSRVBMWVRPUEFSVCBpZiAhJFJlcGx5VG9BZGRyZXNzOwogICAgICAgICAgICAgICAgcHVzaCBAUmVwbHlUb1VzZXJzLCAkUmVwbHlUb0FkZHJlc3M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRSZXBseVRvVXNlcnNIYXNoeyRffSsrIGZvciBAUmVwbHlUb1VzZXJzOwoKICAgICAgICAgICAgIyBnZXQgdXNlciBpZHMgb2YgYXZhaWxhYmxlIHVzZXJzCiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVTaG93blVzZXJzICkgewogICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkVXNlckVtYWlsID0gJFVzZXJEYXRhe1VzZXJFbWFpbH07CiAgICAgICAgICAgICAgICBpZiAoICRSZXBseVRvVXNlcnNIYXNoeyRVc2VyRW1haWx9ICkgewogICAgICAgICAgICAgICAgICAgICRSZXBseVRvVXNlcklEc3skVXNlcklEfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIG9yaWdpbmFsIG5vdGUgc2VuZGVyIHRvIGxpc3Qgb2YgdXNlciBpZHMKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IEB7ICRTZWxmLT57UmVwbHlUb1NlbmRlclVzZXJJRH0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGlmIHNlbmRlciByZXBsaWVzIHRvIGhpbXNlbGYsIGRvIG5vdCBpbmNsdWRlIHNlbmRlciBpbiBsaXN0CiAgICAgICAgICAgICAgICBpZiAoICRVc2VySUQgbmUgJFNlbGYtPntVc2VySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRSZXBseVRvVXNlcklEc3skVXNlcklEfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVtb3ZlIHVzZXIgaWQgb2YgYWN0aXZlIHVzZXIKICAgICAgICAgICAgZGVsZXRlICRSZXBseVRvVXNlcklEc3sgJFNlbGYtPntVc2VySUR9IH07CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDb25maWctPntJbmZvcm1BZ2VudH0gfHwgJENvbmZpZy0+e0ludm9sdmVkQWdlbnR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9ybUFkZGl0aW9uYWxBZ2VudHMnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICAgICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICAgICAjIGdldCBhbGwgYWdlbnRzIGZvciAiaW52b2x2ZWQgYWdlbnRzIgogICAgICAgIGlmICggJENvbmZpZy0+e0ludm9sdmVkQWdlbnR9ICkgewoKICAgICAgICAgICAgbXkgQFVzZXJJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRJbnZvbHZlZEFnZW50c0xpc3QoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15IEBJbnZvbHZlZEFnZW50czsKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAxOwoKICAgICAgICAgICAgIyBnZXQgaW52b2x2ZWQgdXNlciBsaXN0CiAgICAgICAgICAgIG15IEBJbnZvbHZlZFVzZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJbnZvbHZlZFVzZXJJRCcgKTsKCiAgICAgICAgICAgIFVTRVI6CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQFVzZXJJRHMgKSB7CgogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJGdWxsbmFtZX0iOwogICAgICAgICAgICAgICAgaWYgKCAkVXNlci0+e091dE9mT2ZmaWNlTWVzc2FnZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlIC49ICIgJFVzZXItPntPdXRPZk9mZmljZU1lc3NhZ2V9IjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBJbnZvbHZlZEFnZW50cywgewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRVc2VyLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgICAgICAgICAjIGFkZCBpbnZvbHZlZCB1c2VyIGFzIHNlbGVjdGVkIGVudHJpZXMsIGlmIGF2YWlsYWJsZSBpbiBSZXBseVRvQWRkcmVzc2VzIGxpc3QKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gJiYgJFJlcGx5VG9Vc2VySURzeyAkVXNlci0+e1VzZXJJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBJbnZvbHZlZFVzZXJJRCwgJFVzZXItPntVc2VySUR9OwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkUmVwbHlUb1VzZXJJRHN7ICRVc2VyLT57VXNlcklEfSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkSW52b2x2ZWRBZ2VudFNpemUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okludm9sdmVkQWdlbnRNYXhTaXplJykgfHwgMzsKICAgICAgICAgICAgJFBhcmFte0ludm9sdmVkQWdlbnRTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcQEludm9sdmVkQWdlbnRzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiBcQEludm9sdmVkVXNlcklELAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSW52b2x2ZWRVc2VySUQnLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgPT4gJEludm9sdmVkQWdlbnRTaXplLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBibG9jayBpcyBjYWxsZWQgYmVsb3cgImluZm9ybSBhZ2VudHMiCiAgICAgICAgfQoKICAgICAgICAjIGFnZW50IGxpc3QKICAgICAgICBpZiAoICRDb25maWctPntJbmZvcm1BZ2VudH0gKSB7CgogICAgICAgICAgICAjIGdldCBpbmZvcm0gdXNlciBsaXN0CiAgICAgICAgICAgIG15IEBJbmZvcm1Vc2VySUQgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAnSW5mb3JtVXNlcklEJyApOwoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBlbWFpbCBhZGRyZXNzIG9mIGFsbCB1c2VycyBhbmQgY29tcGFyZSB0byByZXBseXRvLWFkZHJlc3NlcwogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVNob3duVXNlcnMgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVwbHlUb1VzZXJJRHN7JFVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZm9ybVVzZXJJRCwgJFVzZXJJRDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRSZXBseVRvVXNlcklEc3skVXNlcklEfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRJbmZvcm1BZ2VudFNpemUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkluZm9ybUFnZW50TWF4U2l6ZScpCiAgICAgICAgICAgICAgICB8fCAzOwogICAgICAgICAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiBcQEluZm9ybVVzZXJJRCwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAkSW5mb3JtQWdlbnRTaXplLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9ybUFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGludm9sdmVkCiAgICAgICAgaWYgKCAkQ29uZmlnLT57SW52b2x2ZWRBZ2VudH0gKSB7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ludm9sdmVkQWdlbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGxpc3Qgb2YgYWdlbnRzLCB0aGF0IHJlY2VpdmUgdGhpcyBub3RlIChSZXBseVRvTm90ZSkKICAgICAgICAjIGF0IGxlYXN0IHNlbmRlciBvZiBvcmlnaW5hbCBub3RlIGFuZCBhbGwgcmVjZXBpZW50cyBvZiB0aGUgb3JpZ2luYWwgbm90ZQogICAgICAgICMgdGhhdCBjb3VsZG4ndCBiZSBzZWxlY3RlZCB3aXRoIGludm9sdmVkL2luZm9ybSBhZ2VudHMKICAgICAgICBpZiAoICRTZWxmLT57UmVwbHlUb0FydGljbGV9ICkgewoKICAgICAgICAgICAgbXkgJFVzZXJzSGFzaFNpemUgPSBrZXlzICVSZXBseVRvVXNlcklEczsKICAgICAgICAgICAgbXkgJENvdW50ZXIgICAgICAgPSAwOwogICAgICAgICAgICAkUGFyYW17VXNlckxpc3RXaXRob3V0U2VsZWN0aW9ufSA9IGpvaW4oICcsJywga2V5cyAlUmVwbHlUb1VzZXJJRHMgKTsKCiAgICAgICAgICAgIGlmICggJFVzZXJzSGFzaFNpemUgPiAwICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWdlbnRzV2l0aG91dFNlbGVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlUmVwbHlUb1VzZXJJRHMgKSB7CiAgICAgICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5mb3JtQWdlbnRzV2l0aG91dFNlbGVjdGlvblNpbmdsZVVzZXInLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlVXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBvdXRwdXQgYSBzZXBhcmF0b3IgKEluZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb25TaW5nbGVVc2VyU2VwYXJhdG9yKSwKICAgICAgICAgICAgICAgICAgICAjIGlmIG5vdCBsYXN0IGVudHJ5CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ291bnRlciA8ICRVc2Vyc0hhc2hTaXplICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb25TaW5nbGVVc2VyU2VwYXJhdG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkQ29uZmlnLT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZy0+e05vdGVNYW5kYXRvcnl9CiAgICAgICAgICAgIHx8ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1YmplY3RMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHRMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1YmplY3RMYWJlbCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHRMYWJlbCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHRleHQgdGVtcGxhdGUgc3RyaW5nCiAgICAgICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKS0+U3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIFR5cGUgID0+ICdOb3RlJywKICAgICAgICApOwoKICAgICAgICBteSAkUXVldWVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSgKICAgICAgICAgICAgICAgICRRdWV1ZVN0YW5kYXJkVGVtcGxhdGVzCiAgICAgICAgICAgICAgICAgICAgfHwgKCAkQ29uZmlnLT57UXVldWV9ICYmIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YW5kYXJkVGVtcGxhdGVzICkgKQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUXVldWVTdGFuZGFyZFRlbXBsYXRlcyB8fCB7fSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSB8fCAnJywKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhbmRhcmRUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgR2V0IEFydGljbGUgdHlwZSBkeW5hbWljIGZpZWxkcy4KICAgICAgICBmb3IgbXkgJEFydGljbGVUeXBlRHluYW1pY0ZpZWxkICggQHsgJFBhcmFte0FydGljbGVUeXBlRHluYW1pY0ZpZWxkc30gfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZUR5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRBcnRpY2xlVHlwZUR5bmFtaWNGaWVsZCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJEFydGljbGVUeXBlRHluYW1pY0ZpZWxkLT57TWFuZGF0b3J5VG9vbHRpcH0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZUR5bmFtaWNGaWVsZEVycm9yJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRBcnRpY2xlVHlwZUR5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgT3V0cHV0IGN1c3RvbWl6YXRpb24gYmxvY2sgdG9vLCBpZiBpdCBleGlzdHMuCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGVEeW5hbWljRmllbGRfJyAuICRBcnRpY2xlVHlwZUR5bmFtaWNGaWVsZC0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkQXJ0aWNsZVR5cGVEeW5hbWljRmllbGQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgRW5kIFdpZGdldCBBcnRpY2xlCgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5leHRTdGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRSZXNwb25zaWJsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJVNob3duVXNlcnM7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIHNob3cgYWxsIHVzZXJzCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBvbmx5IHVzZXJzIHdpdGggcmVzcG9uc2libGUgb3IgcncgcGVtaXNzaW9ucyBpbiB0aGUgcXVldWUKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17QWxsVXNlcnN9ICkgewogICAgICAgIG15ICRHSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0UXVldWVHcm91cElEKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRQYXJhbXtOZXdRdWV1ZUlEfSB8fCAkUGFyYW17UXVldWVJRH0KICAgICAgICApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIHdvcmtmbG93CiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICVQYXJhbSwKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIHsgJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpIH0gaWYgJEFDTDsKCiAgICByZXR1cm4gXCVTaG93blVzZXJzOwp9CgpzdWIgX0dldE93bmVycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJVNob3duVXNlcnM7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIHNob3cgYWxsIHVzZXJzCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBvbmx5IHVzZXJzIHdpdGggb3duZXIgb3IgcncgcGVtaXNzaW9ucyBpbiB0aGUgcXVldWUKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17QWxsVXNlcnN9ICkgewogICAgICAgIG15ICRHSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0UXVldWVHcm91cElEKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRQYXJhbXtOZXdRdWV1ZUlEfSB8fCAkUGFyYW17UXVldWVJRH0KICAgICAgICApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdvd25lcicsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIHdvcmtmbG93CiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICVQYXJhbSwKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ05ld093bmVyJywKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIHsgJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpIH0gaWYgJEFDTDsKCiAgICByZXR1cm4gXCVTaG93blVzZXJzOwp9CgpzdWIgX0dldE9sZE93bmVycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgbXkgQE9sZFVzZXJJbmZvID0gJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJMaXN0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgbXkgJVVzZXJIYXNoOwogICAgaWYgKEBPbGRVc2VySW5mbykgewogICAgICAgIG15ICRDb3VudGVyID0gMTsKICAgICAgICBVU0VSOgogICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQE9sZFVzZXJJbmZvICkgewoKICAgICAgICAgICAgbmV4dCBVU0VSIGlmICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH07CgogICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJGdWxsbmFtZX0iOwogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIHdvcmtmbG93CiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICVQYXJhbSwKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ09sZE93bmVyJywKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlVXNlckhhc2g7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZTsKCiAgICAjIGdldCBvcHRpb25zIGZvciBkZWZhdWx0IHNlcnZpY2VzIGZvciB1bmtub3duIGN1c3RvbWVycwogICAgbXkgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyCiAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6U2VydmljZTo6RGVmYXVsdDo6VW5rbm93bkN1c3RvbWVyJyk7CgogICAgIyBjaGVjayBpZiBubyBDdXN0b21lclVzZXJJRCBpcyBzZWxlY3RlZAogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAwIGxlYXZlIEN1c3RvbWVyVXNlcklEIGVtcHR5LCBpdCB3aWxsIG5vdCBnZXQgYW55IHNlcnZpY2VzCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDEgc2V0IEN1c3RvbWVyVXNlcklEIHRvIGdldCBkZWZhdWx0IHNlcnZpY2VzCiAgICBpZiAoICEkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICYmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ID0gJzxERUZBVUxUPic7CiAgICB9CgogICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlU2VydmljZTsKfQoKc3ViIF9HZXRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBpZiBub24gc2V0IGN1c3RvbWVycyBjYW4gZ2V0IGRlZmF1bHQgc2VydmljZXMgdGhlbiB0aGV5IHNob3VsZCBhbHNvIGJlIGFibGUgdG8gZ2V0IHRoZSBTTEFzCiAgICAjICBmb3IgdGhvc2Ugc2VydmljZXMgKHRoaXMgd29ya3MgZHVyaW5nIHRpY2tldCBjcmVhdGlvbikuCiAgICAjIGlmIG5vIEN1c3RvbWVyVXNlcklEIGlzIHNldCwgVGlja2V0U0xBTGlzdCB3aWxsIGNvbXBsYWluIGR1cmluZyBBSkFYIHVwZGF0ZXMgYXMgVXNlcklEIGlzIG5vdAogICAgIyAgcGFzc2VkLiBTZWUgYnVnIDExMTQ3LgoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpEZWZhdWx0OjpVbmtub3duQ3VzdG9tZXInKTsKCiAgICAjIGNoZWNrIGlmIG5vIEN1c3RvbWVyVXNlcklEIGlzIHNlbGVjdGVkCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDAgbGVhdmUgQ3VzdG9tZXJVc2VySUQgZW1wdHksIGl0IHdpbGwgbm90IGdldCBhbnkgc2VydmljZXMKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMSBzZXQgQ3VzdG9tZXJVc2VySUQgdG8gZ2V0IGRlZmF1bHQgc2VydmljZXMKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gJiYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAnPERFRkFVTFQ+JzsKICAgIH0KCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAlU0xBID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlU0xBOwp9CgpzdWIgX0dldFByaW9yaXRpZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlUHJpb3JpdGllcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICVQYXJhbSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBpZiAoICEkQ29uZmlnLT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAkUHJpb3JpdGllc3snJ30gPSAnLSc7CiAgICB9CiAgICByZXR1cm4gXCVQcmlvcml0aWVzOwp9CgpzdWIgX0dldEZpZWxkc1RvVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFVwZGF0YWJsZUZpZWxkczsKCiAgICAjIHNldCB0aGUgZmllbGRzIHRoYXQgY2FuIGJlIHVwZGF0ZWFibGUgdmlhIEFKQVhVcGRhdGUKICAgIGlmICggISRQYXJhbXtPbmx5RHluYW1pY0ZpZWxkc30gKSB7CiAgICAgICAgQFVwZGF0YWJsZUZpZWxkcyA9IHF3KAogICAgICAgICAgICBUeXBlSUQgU2VydmljZUlEIFNMQUlEIE5ld093bmVySUQgTmV3UmVzcG9uc2libGVJRCBOZXdTdGF0ZUlECiAgICAgICAgICAgIE5ld1ByaW9yaXR5SUQKICAgICAgICApOwogICAgfQoKICAgICMgZGVmaW5lIHRoZSBkeW5hbWljIGZpZWxkcyB0byBzaG93IGJhc2VkIG9uIHRoZSBvYmplY3QgdHlwZQogICAgbXkgJE9iamVjdFR5cGUgPSBbJ1RpY2tldCddOwoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgb25seSBzY3JlZW5zIHRoYXQgYWRkIG5vdGVzIGNhbiBtb2RpZnkgQXJ0aWNsZSBkeW5hbWljIGZpZWxkcwogICAgaWYgKCAkQ29uZmlnLT57Tm90ZX0gKSB7CiAgICAgICAgJE9iamVjdFR5cGUgPSBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXTsKICAgIH0KCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gJE9iamVjdFR5cGUsCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0FDTFJlZHVjaWJsZTsKCiAgICAgICAgcHVzaCBAVXBkYXRhYmxlRmllbGRzLCAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CiAgICB9CgogICAgcmV0dXJuIFxAVXBkYXRhYmxlRmllbGRzOwp9CgpzdWIgX0dldFF1b3RlZFJlcGx5Qm9keSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyByZXdyYXAgYm9keSBpZiBleGlzdHMKICAgICAgICBpZiAoICRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgJFBhcmFte0JvZHl9ID1+IHMvXHQvIC9nOwogICAgICAgICAgICBteSAkUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlF1b3RlJykgfHwgJycsCiAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFF1b3RlKSB7CgogICAgICAgICAgICAgICAgIyBxdW90ZSB0ZXh0CiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAiPGJsb2NrcXVvdGUgdHlwZT1cImNpdGVcIj4kUGFyYW17Qm9keX08L2Jsb2NrcXVvdGU+XG4iOwoKICAgICAgICAgICAgICAgICMgY2xlYW51cCBub3QgY29tcGF0LiB0YWdzCiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q2xlYW51cCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0JvZHl9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkUmVzcG9uc2VGb3JtYXQgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5Gb3JtYXRUaW1lU3RyaW5nKCAkUGFyYW17Q3JlYXRlVGltZX0sICdEYXRlRm9ybWF0JywgJ05vU2Vjb25kcycgKTsKICAgICAgICAgICAgICAgICRSZXNwb25zZUZvcm1hdCAuPSAnIC0gJyAuICRQYXJhbXtGcm9tfSAuICcgJzsKICAgICAgICAgICAgICAgICRSZXNwb25zZUZvcm1hdAogICAgICAgICAgICAgICAgICAgIC49ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnd3JvdGUnKSAuICc6JzsKCiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkUmVzcG9uc2VGb3JtYXQgLiAkUGFyYW17Qm9keX07CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gIjxici8+IiAuICRQYXJhbXtCb2R5fTsKCiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtDcmVhdGVUaW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0RhdGUnKSAuCiAgICAgICAgICAgICAgICAgICAgICAgICI6ICRQYXJhbXtDcmVhdGVUaW1lfTxici8+IiAuICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3IgKHF3KFN1YmplY3QgUmVwbHlUbyBSZXBseS1UbyBDYyBUbyBGcm9tKSkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFteyRffSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRfKSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiAkUGFyYW17JF99PGJyLz4iIC4gJFBhcmFte0JvZHl9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkRnJvbSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RnJvbX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlRnJvbSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTWVzc2FnZSBmcm9tJyk7CiAgICAgICAgICAgICAgICBteSAkRW5kTWVzc2FnZSAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0VuZCBtZXNzYWdlJyk7CgogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gIjxici8+LS0tLSAkTWVzc2FnZUZyb20gJEZyb20gLS0tPGJyLz48YnIvPiIgLiAkUGFyYW17Qm9keX07CiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gLj0gIjxici8+LS0tLSAkRW5kTWVzc2FnZSAtLS08YnIvPiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBwcmVwYXJlIGJvZHksIHN1YmplY3QsIFJlcGx5VG8gLi4uCiAgICAgICAgIyByZXdyYXAgYm9keSBpZiBleGlzdHMKICAgICAgICBpZiAoICRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgJFBhcmFte0JvZHl9ID1+IHMvXHQvIC9nOwogICAgICAgICAgICBteSAkUXVvdGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlF1b3RlJyk7CiAgICAgICAgICAgIGlmICgkUXVvdGUpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9fiBzL1xuL1xuJFF1b3RlIC9nOwogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gIlxuJFF1b3RlICIgLiAkUGFyYW17Qm9keX07CgogICAgICAgICAgICAgICAgbXkgJFJlc3BvbnNlRm9ybWF0ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+Rm9ybWF0VGltZVN0cmluZyggJFBhcmFte0NyZWF0ZVRpbWV9LCAnRGF0ZUZvcm1hdCcsICdOb1NlY29uZHMnICk7CiAgICAgICAgICAgICAgICAkUmVzcG9uc2VGb3JtYXQgLj0gJyAtICcgLiAkUGFyYW17RnJvbX0gLiAnICc7CiAgICAgICAgICAgICAgICAkUmVzcG9uc2VGb3JtYXQKICAgICAgICAgICAgICAgICAgICAuPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ3dyb3RlJykgLiAiOlxuIjsKCiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkUmVzcG9uc2VGb3JtYXQgLiAkUGFyYW17Qm9keX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAiXG4iIC4gJFBhcmFte0JvZHl9OwogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17Q3JlYXRlVGltZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdEYXRlJykgLgogICAgICAgICAgICAgICAgICAgICAgICAiOiAkUGFyYW17Q3JlYXRlVGltZX1cbiIgLiAkUGFyYW17Qm9keX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZm9yIChxdyhTdWJqZWN0IFJlcGx5VG8gUmVwbHktVG8gQ2MgVG8gRnJvbSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkXykgLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogJFBhcmFteyRffVxuIiAuICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2VGcm9tID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdNZXNzYWdlIGZyb20nKTsKICAgICAgICAgICAgICAgIG15ICRFbmRNZXNzYWdlICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRW5kIG1lc3NhZ2UnKTsKCiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAiXG4tLS0tICRNZXNzYWdlRnJvbSAkUGFyYW17RnJvbX0gLS0tXG5cbiIgLiAkUGFyYW17Qm9keX07CiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gLj0gIlxuLS0tLSAkRW5kTWVzc2FnZSAtLS1cbiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtCb2R5fTsKfQoKc3ViIF9HZXRTdGFuZGFyZFRlbXBsYXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNyZWF0ZSB0ZW1wbGF0ZXMKICAgIG15ICVUZW1wbGF0ZXM7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgIG15ICRRdWV1ZUlEID0gJFBhcmFte1F1ZXVlSUR9IHx8ICcnOwogICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICYmICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZ2V0IFF1ZXVlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgbXkgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUXVldWVJRCA9ICRUaWNrZXR7UXVldWVJRH0gfHwgJyc7CiAgICB9CgogICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Tm90ZX0gKTsKCiAgICAjIHJldHVybiBqdXN0IHRoZSB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gJFN0YW5kYXJkVGVtcGxhdGVze05vdGV9Owp9CgpzdWIgX0dldFR5cGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0UXVldWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBHZXQgUXVldWVzLgogICAgbXkgJVF1ZXVlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0TW92ZUxpc3QoCiAgICAgICAgJVBhcmFtLAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVHlwZSAgICAgPT4gJ21vdmVfaW50bycsCiAgICApOwogICAgcmV0dXJuIFwlUXVldWVzOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRGcmVlVGV4dC5wbQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQojcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0RnJlZVRleHQ7CnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkOwoKIyAtLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBwYXJlbnQgcXcoIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRBY3Rpb25Db21tb24gKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldERlY2lzaW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyggS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEFjdGlvbkNvbW1vbiApOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSAwYTA0ZTcyMmZiY2JkMzljY2EzZmIwODljMjk0ZTcyYjMxNzBlNmIxIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRFbWFpbC5wbQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0RW1haWw7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTWFpbDo6QWRkcmVzczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JRENyZWF0ZSgpOwogICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCgogICAgIyBDaGVjayBpZiBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudCBpcyB1c2VkLgogICAgbXkgJE91dHB1dEZpbHRlckNvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyRWxlbWVudFBvc3QnKTsKICAgIGlmICggJE91dHB1dEZpbHRlckNvbmZpZy0+e0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50fSApIHsKICAgICAgICAkU2VsZi0+e0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50fSA9IDE7CiAgICB9CiMgLS0tCgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE91dHB1dDsKCiAgICAjIHN0b3JlIGxhc3QgcXVldWUgc2NyZWVuCiAgICBpZiAoICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSAmJiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gIX4gL0FjdGlvbj1BZ2VudFRpY2tldEVtYWlsLyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJFF1ZXVlT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgbXkgJE1haW5PYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkRGVidWcgICAgICAgICAgICAgID0gJFBhcmFte0RlYnVnfSB8fCAwOwogICAgbXkgJENvbmZpZyAgICAgICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRLZXkgKAogICAgICAgIHF3KFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlIFRvIENjIEJjYyBUaW1lVW5pdHMgUHJpb3JpdHlJRCBTdWJqZWN0IEJvZHkKICAgICAgICBUeXBlSUQgU2VydmljZUlEIFNMQUlEIE93bmVyQWxsIFJlc3BvbnNpYmxlQWxsIE5ld1Jlc3BvbnNpYmxlSUQgTmV3VXNlcklECiAgICAgICAgTmV4dFN0YXRlSUQgU3RhbmRhcmRUZW1wbGF0ZUlEIERlc3QgQXJ0aWNsZUlEIExpbmtUaWNrZXRJRAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgfQoKICAgICMgQUNMIGNvbXBhdGliaWxpdHkgdHJhbnNsYXRpb24KICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbTsKICAgICRBQ0xDb21wYXRHZXRQYXJhbXtPd25lcklEfSA9ICRHZXRQYXJhbXtOZXdVc2VySUR9OwoKICAgICMgaGFzaCBmb3IgY2hlY2sgZHVwbGljYXRlZCBlbnRyaWVzCiAgICBteSAlQWRkcmVzc2VzTGlzdDsKCiAgICAjIE11bHRpcGxlQ3VzdG9tZXIgVG8tZmllbGQKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyOwogICAgbXkgJEN1c3RvbWVyc051bWJlciA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSB8fCAnJzsKCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlcikgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAxOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uLiAkQ3VzdG9tZXJzTnVtYmVyICkgewogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkU2VsZWN0ZWQgZXEgJENvdW50ID8gJ2NoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcktleV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgICAgICBpZiAoJEN1c3RvbWVyRWxlbWVudCkgewoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RvfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2cgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3IgICAgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkID0gJyc7CiAgICAgICAgICAgICAgICBteSAkQ291bnRBdXggICAgICAgICA9ICRDdXN0b21lckNvdW50ZXIrKzsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQ3VzdG9tZXJFbGVtZW50KSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gJiYgJEN1c3RvbWVyRXJyb3IgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yIG5lICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkID0gJ2Rpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvciwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgTXVsdGlwbGVDdXN0b21lciBDYy1maWVsZAogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXJDYzsKICAgIG15ICRDdXN0b21lcnNOdW1iZXJDYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJDY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJDYykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXJDYyA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXJDYyApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudENjID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5Q2MgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NjQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50Q2MpIHsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnQ2MgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICcnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWRDYyA9ICcnOwogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4Q2MgICAgICAgICA9ICRDdXN0b21lckNvdW50ZXJDYysrOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0NjfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9IC49ICcsICcgLiAkQ3VzdG9tZXJFbGVtZW50Q2M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2N9ID0gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnRDYykgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50Q2N9ICYmICRDdXN0b21lckVycm9yQ2MgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JDYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckNjIG5lICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQ2MgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgJENvdW50QXV4Q2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckNjLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXhDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnRDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3JDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnQ2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZENjLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgTXVsdGlwbGVDdXN0b21lciBCY2MtZmllbGQKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQmNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckJjYyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJCY2NDdXN0b21lcicgKSB8fCAwOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyQmNjKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXJCY2MgKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnRCY2MgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQmNjQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5QmNjICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lcktleV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnRCY2MpIHsKCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICcnOwogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4QmNjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICcnOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0JjY30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JjY30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnRCY2M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSA9ICRDdXN0b21lckVsZW1lbnRCY2M7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEN1c3RvbWVyRWxlbWVudEJjYykgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ICYmICRDdXN0b21lckVycm9yQmNjIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQmNjID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckJjYyBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICdkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckJjYywgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4QmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudEJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yQmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2dCY2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZEJjYywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50QmNjfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgYW4gZW1wdHkgdmFsdWUgaWYgbm90IGRlZmluZWQKICAgICRHZXRQYXJhbXtDY30gID0gJycgaWYgIWRlZmluZWQgJEdldFBhcmFte0NjfTsKICAgICRHZXRQYXJhbXtCY2N9ID0gJycgaWYgIWRlZmluZWQgJEdldFBhcmFte0JjY307CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZm9ybSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgIyB0byBzdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBkeW5hbWljIGZpZWxkIGZvciB0aGUgaW1wYWN0CiAgICBteSAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnOwojIC0tLQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICMgaW1wYWN0IGZpZWxkIHdhcyBmb3VuZAogICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IGVxICdJVFNNSW1wYWN0JyApIHsKCiAgICAgICAgICAgICMgc3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgaW1wYWN0IGZpZWxkCiAgICAgICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgIH0KIyAtLS0KICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZCB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICBteSAlU2VydmljZTsKCiAgICBpZiAoICRTZWxmLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9ICkgewoKICAgICAgICAjIGdldCBuZWVkZWQgc3R1ZmYKICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAnRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnKTsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAnUHJpb3JpdHlSQycpOwogICAgICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcpIHx8ICcnOwoKICAgICAgICAjIGNoZWNrIGlmIHByaW9yaXR5IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZAogICAgICAgIGlmICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnU2VydmljZUlEJyB8fCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICAgICAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VHZXQoCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgSW5jaWRlbnRTdGF0ZSA9PiAkQ29uZmlnLT57U2hvd0luY2lkZW50U3RhdGV9IHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVjYWxjdWxhdGUgaW1wYWN0IGlmIGltcGFjdCBpcyBub3Qgc2V0IHVudGlsIG5vdwogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICYmICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gbmUgJ0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0JyApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICAgICAgICAgbXkgJERlZmF1bHRTZWxlY3Rpb24gPSAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX07CgogICAgICAgICAgICAgICAgaWYgKCREZWZhdWx0U2VsZWN0aW9uKSB7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgaW1wYWN0CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICREZWZhdWx0U2VsZWN0aW9uOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVjYWxjdWxhdGUgcHJpb3JpdHkKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gJiYgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUnKS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5fSwKICAgICAgICAgICAgICAgICAgICBJbXBhY3QgICAgICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG5vIHNlcnZpY2Ugd2FzIHNlbGVjdGVkCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGRvIG5vdCBzaG93IHRoZSBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gPSAnJzsKCiAgICAgICAgICAgICMgc2hvdyBvbmx5IHRoZSBlbXB0eSBzZWxlY3Rpb24KICAgICAgICAgICAgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30gPSB7fTsKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgdGhlIHNlbGVjdGVkIGltcGFjdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7SVRTTUltcGFjdH0gPSAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9OwogICAgfQojIC0tLQoKICAgICMgdHJhbnNmb3JtIHBlbmRpbmcgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgaWYgKAogICAgICAgIGRlZmluZWQgJEdldFBhcmFte1llYXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TW9udGh9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RGF5fQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0hvdXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TWludXRlfQogICAgICAgICkKICAgIHsKICAgICAgICAlR2V0UGFyYW0gPSAkTGF5b3V0T2JqZWN0LT5UcmFuc2Zvcm1EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gfHwgJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGVkJyApIHsKICAgICAgICBteSAlVGlja2V0OwogICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIGhlYWRlcgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgbm90aWZ5IGluZm8KICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdUaWNrZXQgIiVzIiBjcmVhdGVkIScsCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIExpbmsgPT4gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfQogICAgICAgICAgICAgICAgICAgIC4gJ0FjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JwogICAgICAgICAgICAgICAgICAgIC4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGxhc3QgcXVldWUgc2NyZWVuCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30KICAgICAgICAgICAgJiYgJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICF+IC9BY3Rpb249QWdlbnRUaWNrZXRFbWFpbC8KICAgICAgICAgICAgJiYgJFNlbGYtPntSZXF1ZXN0ZWRVUkx9ICF+IC9BY3Rpb249QWdlbnRUaWNrZXRFbWFpbC4qTGlua1RpY2tldElEPS8KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc3BsaXQgYXJ0aWNsZSBpZiBnaXZlbgogICAgICAgICMgZ2V0IEFydGljbGVJRAogICAgICAgIG15ICVBcnRpY2xlOwogICAgICAgIG15ICVDdXN0b21lckRhdGE7CiAgICAgICAgbXkgJEFydGljbGVGcm9tID0gJyc7CiAgICAgICAgbXkgJVNwbGl0VGlja2V0RGF0YTsKICAgICAgICBpZiAoICRHZXRQYXJhbXtBcnRpY2xlSUR9ICkgewoKICAgICAgICAgICAgbXkgJEFjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkIHJvIHBlcm1pc3Npb24hIiwKICAgICAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBHZXQgaW5mb3JtYXRpb24gZnJvbSBvcmlnaW5hbCB0aWNrZXQgKFNwbGl0VGlja2V0KS4KICAgICAgICAgICAgJVNwbGl0VGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QmFja2VuZEZvckFydGljbGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAlQXJ0aWNsZSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkR2V0UGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgYXJ0aWNsZSBpcyBmcm9tIHRoZSBzYW1lIFRpY2tldElEIGFzIHdlIGNoZWNrZWQgcGVybWlzc2lvbnMgZm9yLgogICAgICAgICAgICBpZiAoICRBcnRpY2xle1RpY2tldElEfSBuZSAkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0FydGljbGUgZG9lcyBub3QgYmVsb25nIHRvIHRpY2tldCAlcyEnLCAkU2VsZi0+e1RpY2tldElEfQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNhdmUgYXJ0aWNsZSBmcm9tIGZvciBhZGRyZXNzZXMgbGlzdAogICAgICAgICAgICAkQXJ0aWNsZUZyb20gPSAkQXJ0aWNsZXtGcm9tfTsKCiAgICAgICAgICAgICMgaWYgVG8gaXMgcHJlc2VudAogICAgICAgICAgICAjIGFuZCBpcyBubyBhIHF1ZXVlCiAgICAgICAgICAgICMgYW5kIGFsc28gaXMgbm8gYSBzeXN0ZW0gYWRkcmVzcwogICAgICAgICAgICAjIHNldCBUbyBhcyBhcnRpY2xlIGZyb20KICAgICAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkQXJ0aWNsZXtUb30gKSApIHsKICAgICAgICAgICAgICAgIG15ICVRdWV1ZXMgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCgpOwoKICAgICAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUXVldWUgKCBzb3J0IGtleXMgJXsgJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRDb25maWdPYmplY3QtPntDdXN0b21lclBhbmVsT3duU2VsZWN0aW9ufS0+eyRRdWV1ZX07CiAgICAgICAgICAgICAgICAgICAgICAgICRRdWV1ZXN7JFF1ZXVlfSA9ICRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJVF1ZXVlTG9va3VwID0gcmV2ZXJzZSAlUXVldWVzOwogICAgICAgICAgICAgICAgbXkgJVN5c3RlbUFkZHJlc3NMb29rdXAKICAgICAgICAgICAgICAgICAgICA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0xpc3QoKTsKICAgICAgICAgICAgICAgIG15IEBBcnRpY2xlRnJvbUFkZHJlc3M7CiAgICAgICAgICAgICAgICBteSAkU3lzdGVtQWRkcmVzc0VtYWlsOwoKICAgICAgICAgICAgICAgIGlmICgkQXJ0aWNsZUZyb20pIHsKICAgICAgICAgICAgICAgICAgICBAQXJ0aWNsZUZyb21BZGRyZXNzID0gTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEFydGljbGVGcm9tKTsKICAgICAgICAgICAgICAgICAgICAkU3lzdGVtQWRkcmVzc0VtYWlsID0gJEFydGljbGVGcm9tQWRkcmVzc1swXS0+YWRkcmVzcygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFF1ZXVlTG9va3VweyAkQXJ0aWNsZXtUb30gfSAmJiBkZWZpbmVkICRTeXN0ZW1BZGRyZXNzTG9va3VweyRTeXN0ZW1BZGRyZXNzRW1haWx9ICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xlRnJvbSA9ICRBcnRpY2xle1RvfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBib2R5IHByZXBhcmF0aW9uIGZvciBwbGFpbiB0ZXh0IHByb2Nlc3NpbmcKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ICA9PiAkVXBsb2FkQ2FjaGVPYmplY3QsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50c0luY2x1ZGUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEFydGljbGV7Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgY3VzdG9tZXIgaW5mbwogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRBcnRpY2xle0N1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRBcnRpY2xle0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRTcGxpdFRpY2tldERhdGF7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRTcGxpdFRpY2tldERhdGF7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRTcGxpdFRpY2tldERhdGF7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyTGlzdCAoIHNvcnQga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZXtGcm9tfSA9ICRDdXN0b21lclVzZXJMaXN0eyRLZXlDdXN0b21lclVzZXJMaXN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBtdWx0aXBsZSBhZGRyZXNzZXMgbGlzdAogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIG15ICRDb3VudEZyb20gPSBzY2FsYXIgQE11bHRpcGxlQ3VzdG9tZXIgfHwgMTsKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhRnJvbTsKICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJUN1c3RvbWVyRGF0YUZyb20gPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEFydGljbGVGcm9tKSApIHsKCiAgICAgICAgICAgIG15ICRDb3VudEF1eCAgICAgICAgID0gJENvdW50RnJvbTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3IgICAgPSAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2cgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZCA9ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJTZWxlY3RlZCA9ICggJENvdW50RnJvbSBlcSAnMScgPyAnY2hlY2tlZD0iY2hlY2tlZCInIDogJycgKTsKICAgICAgICAgICAgbXkgJEVtYWlsQWRkcmVzcyAgICAgPSAkRW1haWwtPmFkZHJlc3MoKTsKICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWxBZGRyZXNzICkgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEVtYWlsfSAmJiAkQ3VzdG9tZXJFcnJvciBlcSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkID0gJ2Rpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICAgICAgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnRGcm9tIC4gJ0Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5ID0gJyc7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEN1c3RvbWVyRGF0YUZyb217VXNlckVtYWlsfQogICAgICAgICAgICAgICAgJiYgJEN1c3RvbWVyRGF0YUZyb217VXNlckVtYWlsfSBlcSAkRW1haWxBZGRyZXNzCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcktleSA9ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudCA9ICRFbWFpbEFkZHJlc3M7CiAgICAgICAgICAgIGlmICggJEVtYWlsLT5waHJhc2UoKSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVsZW1lbnQgPSAkRW1haWwtPnBocmFzZSgpIC4gIiA8JEVtYWlsQWRkcmVzcz4iOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3IsCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZCwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEVtYWlsQWRkcmVzc30gPSAxOwogICAgICAgICAgICAkQ291bnRGcm9tKys7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc3RvcmUgdGhlIGR5bmFtaWMgZmllbGRzIGRlZmF1bHQgdmFsdWVzIG9yIHVzZWQgc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZXMgdG8gYmUgdXNlZCBhcwogICAgICAgICMgQUNMcyBpbmZvIGZvciBhbGwgZmllbGRzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZERlZmF1bHRzOwoKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9ICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHZhbHVlIGZyb20gZHluYW1pYyBmaWVsZCBjb25maWcgKGlmIGFueSkKICAgICAgICAgICAgbXkgJERlZmF1bHRWYWx1ZSA9ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfSB8fCAnJzsKCiAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIHZhbHVlIGZyb20gdXNlciBwcmVmZXJlbmNlcyBpZiBpcyBzZXQKICAgICAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAkRGVmYXVsdFZhbHVlID0gJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRGVmYXVsdFZhbHVlIGVxICcnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRAogICAgICAgICAgICAgICAgaWYgcmVmICREZWZhdWx0VmFsdWUgZXEgJ0FSUkFZJyAmJiAhSXNBcnJheVJlZldpdGhEYXRhKCREZWZhdWx0VmFsdWUpOwoKICAgICAgICAgICAgJER5bmFtaWNGaWVsZERlZmF1bHRzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREZWZhdWx0VmFsdWU7CiAgICAgICAgfQogICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGREZWZhdWx0czsKCiAgICAgICAgIyBnZXQgc3BsaXQgYXJ0aWNsZSBpZiBnaXZlbgogICAgICAgICMgY3JlYXRlIGh0bWwgc3RyaW5ncyBmb3IgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgICAgIG15ICVTcGxpdFRpY2tldFBhcmFtOwoKICAgICAgICAjIGluIGNhc2Ugb2Ygc3BsaXQgYSBUaWNrZXRJRCBhbmQgQXJ0aWNsZUlEIGFyZSBhbHdheXMgZ2l2ZW4sIHNlbmQgdGhlIFRpY2tldElEIHRvIGNhbGN1bGF0ZQogICAgICAgICMgQUNMcyBiYXNlZCBvbiBwYXJlbnQgaW5mb3JtYXRpb24KICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICYmICRBcnRpY2xle0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte1RpY2tldElEfSA9ICRTZWxmLT57VGlja2V0SUR9OwogICAgICAgIH0KCiAgICAgICAgIyBmaXggdG8gYnVnIyA4MDY4IEZpZWxkICYgRHluYW1pY0ZpZWxkIHByZXNlbGVjdGlvbiBvbiBUaWNrZXRTcGxpdAogICAgICAgICMgd2hlbiBzcGxpdHRpbmcgYSB0aWNrZXQgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZXMgbXVzdCByZW1haW4gaW4gdGhlIG5ldyB0aWNrZXQgc2NyZWVuCiAgICAgICAgIyB0aGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBTcGxpdFRpY2tldFBhcmFtIGhhc2gKICAgICAgICBpZiAoICRTcGxpdFRpY2tldFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IGluZm9ybWF0aW9uIGZyb20gb3JpZ2luYWwgdGlja2V0IChTcGxpdFRpY2tldCkKICAgICAgICAgICAgbXkgJVNwbGl0VGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNwbGl0VGlja2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBzaW1wbGUgSURzIHRvIHBhc3MgdGhlbSB0byB0aGUgbWFzawogICAgICAgICAgICBmb3IgbXkgJFNwbGl0ZWRQYXJhbSAocXcoVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBQcmlvcml0eUlEKSkgewogICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17JFNwbGl0ZWRQYXJhbX0gPSAkU3BsaXRUaWNrZXREYXRheyRTcGxpdGVkUGFyYW19OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBTdGF0ZUlEIGFzIE5leHRTdGF0ZUlECiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte05leHRTdGF0ZUlEfSA9ICRTcGxpdFRpY2tldERhdGF7U3RhdGVJRH07CgogICAgICAgICAgICAjIHNldCBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17VXNlclNlbGVjdGVkfSAgICAgICAgICAgID0gJFNwbGl0VGlja2V0RGF0YXtPd25lcklEfTsKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9ID0gJFNwbGl0VGlja2V0RGF0YXtSZXNwb25zaWJsZUlEfTsKCiAgICAgICAgICAgICMgc2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9ICkgewogICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UXVldWVJRH0gPSAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte0FsbFVzZXJzfSA9IDE7CgogICAgICAgICAgICAjIHNldCB0aGUgc2VsZWN0ZWQgcXVldWUgaW4gZm9ybWF0IElEfHxOYW1lCiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte0Zyb21TZWxlY3RlZH0gPSAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9IC4gJ3x8JyAuICRTcGxpdFRpY2tldERhdGF7UXVldWV9OwoKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJVNwbGl0VGlja2V0RGF0YSApIHsKICAgICAgICAgICAgICAgIGlmICggJEtleSA9fiAvRHluYW1pY0ZpZWxkXF8oLiopLyApIHsKICAgICAgICAgICAgICAgICAgICAkU3BsaXRUaWNrZXRQYXJhbXtEeW5hbWljRmllbGR9eyQxfSA9ICRTcGxpdFRpY2tldERhdGF7JEtleX07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTcGxpdFRpY2tldFBhcmFteyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRvIHN0b3JlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSBkYXRhYmFzZSAob3IgdW5kZWZpbmVkKQogICAgICAgICAgICBteSAkVmFsdWU7CgogICAgICAgICAgICAjIGluIGNhc2Ugb2Ygc3BsaXQgYSBUaWNrZXRJRCBhbmQgQXJ0aWNsZUlEIGFyZSBhbHdheXMgZ2l2ZW4sIEdldCB0aGUgdmFsdWUKICAgICAgICAgICAgIyBmcm9tIERCIHRoaXMgY2FzZXMKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSAmJiAkQXJ0aWNsZXtBcnRpY2xlSUR9ICkgewoKICAgICAgICAgICAgICAgICMgc2VsZWN0IFRpY2tldElEIG9yIEFydGljbGVJRCB0byBnZXQgdGhlIHZhbHVlIGRlcGVuZGluZyBvbiBkeW5hbWljIGZpZWxkIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIG15ICRPYmplY3RJRCA9ICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JwogICAgICAgICAgICAgICAgICAgID8gJFNlbGYtPntUaWNrZXRJRH0KICAgICAgICAgICAgICAgICAgICA6ICRBcnRpY2xle0FydGljbGVJRH07CgogICAgICAgICAgICAgICAgIyBnZXQgdmFsdWUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZSAoc3BsaXQpCiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRPYmplY3RJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgb3RoZXJ3aXNlIChvbiBhIG5ldyB0aWNrZXQpLiBDaGVjayBpZiB0aGUgdXNlciBoYXMgYSB1c2VyIHNwZWNpZmljIGRlZmF1bHQgdmFsdWUgZm9yCiAgICAgICAgICAgICMgdGhlIGR5bmFtaWMgZmllbGQsIG90aGVyd2lzZSB3aWxsIHVzZSBEeW5hbWljIEZpZWxkIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBvdmVycmlkZSB0aGUgdmFsdWUgZnJvbSB1c2VyIHByZWZlcmVuY2VzIGlmIGlzIHNldAogICAgICAgICAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PgogICAgICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVwZGF0YWJsZUZpZWxkcyA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgaWYgKAogICAgICAgICAgICByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxCiAgICAgICAgICAgICdIQVNIJwogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBHZXQgUXVldWUgc2V0dGluZ3MgaWYgJ0Rlc3QnIHBhcmFtIHdhcyBzZXQgaW4gdGhlIFVSTC4KICAgICAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICAgICAkR2V0UGFyYW17RGVzdH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKTsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0Rlc3R9ICYmICRHZXRQYXJhbXtEZXN0fSA9fiAvXihcZHsxLDEwMH0pXHxcfC4rPyQvICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJDE7CiAgICAgICAgICAgICAgICBteSAlUXVldWUgPSAkUXVldWVPYmplY3QtPkdldFN5c3RlbUFkZHJlc3MoIFF1ZXVlSUQgPT4gJEdldFBhcmFte1F1ZXVlSUR9ICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkUXVldWV7RW1haWx9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgRGVidWcgPT4gJERlYnVnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgICAgIFBBUkFNRVRFUjoKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9ICYmICRKb2JzeyRKb2J9LT57UGFyYW1UeXBlfSBuZSAnU2luZ2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEdldFBhcmFteyRQYXJhbWV0ZXJ9IH0gPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUEFSQU1FVEVSOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbXkgJE5ld1BhcmFtcyA9ICRPYmplY3QtPlJ1biggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICBpZiAoJE5ld1BhcmFtcykgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkTmV3UGFyYW1zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFuZCBmb3JtYXQgZGVmYXVsdCBzdWJqZWN0IGFuZCBib2R5CiAgICAgICAgbXkgJFN1YmplY3QgPSAkQXJ0aWNsZXtTdWJqZWN0fTsKICAgICAgICBpZiAoICEkU3ViamVjdCApIHsKICAgICAgICAgICAgJFN1YmplY3QgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQ29uZmlnLT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRCb2R5ID0gJEFydGljbGV7Qm9keX0gfHwgJyc7CiAgICAgICAgaWYgKCAhJEJvZHkgKSB7CiAgICAgICAgICAgICRCb2R5ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENvbmZpZy0+e0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQgKGlmIGJvZHkgaXMgYmFzZWQgb24gY29uZmlnKQogICAgICAgIGlmICggISRHZXRQYXJhbXtBcnRpY2xlSUR9ICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkQm9keSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpbiBjYXNlIG9mIHRpY2tldCBzcGxpdCBzZXQgJFNlbGYtPntRdWV1ZUlEfSBhcyB0aGUgUXVldWVJRCBvZiB0aGUgb3JpZ2luYWwgdGlja2V0LAogICAgICAgICMgaW4gb3JkZXIgdG8gc2V0IGNvcnJlY3QgQUNMcyBvbiBwYWdlIGxvYWQgKGluaXRpYWwpLiBTZWUgYnVnIDg2ODcuCiAgICAgICAgaWYgKAogICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVTcGxpdFRpY2tldFBhcmFtICkKICAgICAgICAgICAgJiYgJFNwbGl0VGlja2V0UGFyYW17UXVldWVJRH0KICAgICAgICAgICAgJiYgISRTZWxmLT57UXVldWVJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntRdWV1ZUlEfSA9ICRTcGxpdFRpY2tldFBhcmFte1F1ZXVlSUR9OwogICAgICAgIH0KCiAgICAgICAgbXkgJERlc3QgPSAnJzsKICAgICAgICBpZiAoICEkU2VsZi0+e1F1ZXVlSUR9ICYmICRHZXRQYXJhbXtEZXN0fSApIHsKCiAgICAgICAgICAgIG15IEBRdWV1ZVBhcnRzID0gc3BsaXQoIC9cfFx8LywgJEdldFBhcmFte0Rlc3R9ICk7CiAgICAgICAgICAgICRTZWxmLT57UXVldWVJRH0gPSAkUXVldWVQYXJ0c1swXTsKICAgICAgICAgICAgJERlc3QgPSAkR2V0UGFyYW17RGVzdH07CiAgICAgICAgfQoKICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0gICAgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAxLAogICAgICAgICAgICBTZXJ2aWNlcyA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrRW1haWxOZXcoCiAgICAgICAgICAgIFF1ZXVlSUQgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgTmV4dFN0YXRlcyA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7VXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0gICAgICAgICB8fCAxCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9ICAgICAgICAgfHwgMQogICAgICAgICAgICApLAogICAgICAgICAgICBUeXBlcyA9PiAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9ICAgICAgICAgfHwgMQogICAgICAgICAgICApLAogICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgIFNMQXMgICAgICAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlcyA9PiAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgJycsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFVzZXJzID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICApLAogICAgICAgICAgICBGcm9tTGlzdCA9PiAkU2VsZi0+X0dldFRvcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9CiAgICAgICAgICAgICksCiAgICAgICAgICAgIEZyb21TZWxlY3RlZCAgICAgID0+ICREZXN0LAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgICA9PiAkQXJ0aWNsZXtGcm9tfSAvLyAnJywKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgID0+ICRCb2R5LAogICAgICAgICAgICBDdXN0b21lcklEICAgICAgICA9PiAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lclVzZXIgICAgICA9PiAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgQ3VzdG9tZXJEYXRhICAgICAgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgIEF0dGFjaG1lbnRzICAgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgIExpbmtUaWNrZXRJRCAgICAgID0+ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9IHx8ICcnLAogICAgICAgICAgICBUaW1lVW5pdHNSZXF1aXJlZCA9PiAoCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJwogICAgICAgICAgICAgICAgOiAnJwogICAgICAgICAgICApLAogICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCAgICA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgID0+IFxATXVsdGlwbGVDdXN0b21lckNjLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgZGVsaXZlciBzaWduYXR1cmUKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTaWduYXR1cmUnICkgewogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkgfHwgJyc7CiAgICAgICAgbXkgJFF1ZXVlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUXVldWVJRCcgKTsKICAgICAgICBpZiAoICEkUXVldWVJRCApIHsKICAgICAgICAgICAgbXkgJERlc3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICAgICAgKCRRdWV1ZUlEKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0YXJ0IHdpdGggZW1wdHkgc2lnbmF0dXJlIChubyBxdWV1ZSBzZWxlY3RlZCkgLSBpZiB3ZSBoYXZlIGEgcXVldWUsIGdldCB0aGUgc2lnLgogICAgICAgIG15ICRTaWduYXR1cmUgPSAnJzsKICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRTZWxmLT5fR2V0U2lnbmF0dXJlKAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJE1pbWVUeXBlICA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICAkU2lnbmF0dXJlID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJE1pbWVUeXBlIC4gJzsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyB0aWNrZXQgYW5kIGFydGljbGUKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZU5ldycgKSB7CgogICAgICAgIG15ICVFcnJvcjsKICAgICAgICBteSAkTmV4dFN0YXRlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV4dFN0YXRlSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJVN0YXRlRGF0YTsKICAgICAgICBpZiAoJE5leHRTdGF0ZUlEKSB7CiAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkTmV4dFN0YXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICROZXh0U3RhdGUgICAgICAgID0gJFN0YXRlRGF0YXtOYW1lfTsKICAgICAgICBteSAkTmV3UmVzcG9uc2libGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdSZXNwb25zaWJsZUlEJyApIHx8ICcnOwogICAgICAgIG15ICROZXdVc2VySUQgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05ld1VzZXJJRCcgKSB8fCAnJzsKICAgICAgICBteSAkRGVzdCAgICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwoKICAgICAgICAjIHNlZSBpZiBvbmx5IGEgbmFtZSBoYXMgYmVlbiBwYXNzZWQKICAgICAgICBpZiAoICREZXN0ICYmICREZXN0ICF+IG17IFxBIChcZCspPyBcfCBcfCAuKyBceiB9eG1zICkgewoKICAgICAgICAgICAgIyBzZWUgaWYgd2UgY2FuIGdldCBhbiBJRCBmb3IgdGhpcyBxdWV1ZSBuYW1lCiAgICAgICAgICAgIG15ICREZXN0SUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgUXVldWUgPT4gJERlc3QsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJERlc3RJRCkgewogICAgICAgICAgICAgICAgJERlc3QgPSAkRGVzdElEIC4gJ3x8JyAuICREZXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJERlc3QgPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgKCAkTmV3UXVldWVJRCwgJEZyb20gKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgaWYgKCAhJE5ld1F1ZXVlSUQgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtPd25lckFsbH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJVF1ZXVlID0gJFF1ZXVlT2JqZWN0LT5HZXRTeXN0ZW1BZGRyZXNzKCBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSA9ICRRdWV1ZXtFbWFpbH07CiAgICAgICAgfQoKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICRDdXN0b21lcklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICRFeHBhbmRDdXN0b21lck5hbWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRXhwYW5kQ3VzdG9tZXJOYW1lJyApCiAgICAgICAgICAgIHx8IDA7CiAgICAgICAgbXkgJUZyb21FeHRlcm5hbEN1c3RvbWVyOwogICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gICAgICAgICAgICA9ICROZXdRdWV1ZUlEOwogICAgICAgICRHZXRQYXJhbXtFeHBhbmRDdXN0b21lck5hbWV9ID0gJEV4cGFuZEN1c3RvbWVyTmFtZTsKCiAgICAgICAgIyBnZXQgc2VuZGVyIHF1ZXVlIGZyb20KICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCROZXdRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlcgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3duZXJBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3BvbnNpYmxlQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGVhclRvJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJyc7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gMiApIHsKICAgICAgICAgICAgbXkgJEl0ZW0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiRXhwYW5kQ3VzdG9tZXJOYW1lJE51bWJlciIgKSB8fCAwOwogICAgICAgICAgICBpZiAoICROdW1iZXIgPT0gMSAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJE51bWJlciA9PSAyICYmICRJdGVtICkgewogICAgICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGh0bWwgc3RyaW5ncyBmb3IgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdDsKCiAgICAgICAgICAgICMgZG8gbm90IHZhbGlkYXRlIG9uIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgICAgIGlmICggISRFeHBhbmRDdXN0b21lck5hbWUgKSB7CgogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICksCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4KICAgICAgICAgICAgICAgICAgICAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgU2VydmVyRXJyb3IgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICB8fCAnJywKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e0Vycm9yTWVzc2FnZX0gfHwgJycsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRlICAgPT4gMSwKICAgICAgICAgICAgICAgIFVwZGF0YWJsZUZpZWxkcyA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgdXNlciBvYmplY3QKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgICAgICAjIEV4cGFuZCBDdXN0b21lciBOYW1lCiAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGE7CiAgICAgICAgaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDEgKSB7CgogICAgICAgICAgICAjIHNlYXJjaCBjdXN0b21lcgogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdDsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBqdXN0IG9uZSBjdXN0b21lciB1c2VyIGV4aXN0cwogICAgICAgICAgICAjIGlmIGp1c3Qgb25lLCBmaWxsdXAgQ3VzdG9tZXJVc2VySUQgYW5kIEN1c3RvbWVySUQKICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0gPSAwOwogICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcktleSAoIHNvcnQga2V5cyAlQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9Kys7CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3R9ICAgICA9ICRDdXN0b21lclVzZXJMaXN0eyRDdXN0b21lclVzZXJLZXl9OwogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0VXNlcn0gPSAkQ3VzdG9tZXJVc2VyS2V5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0gPT0gMSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gICAgICAgICAgICAgID0gJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0fTsKICAgICAgICAgICAgICAgICRFcnJvcntFeHBhbmRDdXN0b21lck5hbWV9ID0gMTsKICAgICAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIG1vcmUgdGhlIG9uZSBjdXN0b21lciB1c2VyIGV4aXN0cywgc2hvdyBsaXN0CiAgICAgICAgICAgICMgYW5kIGNsZWFuIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgZG9uJ3QgY2hlY2sgZW1haWwgc3ludGF4IG9uIG11bHRpIGN1c3RvbWVyIHNlbGVjdAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+U2V0KAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAwCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAnJzsKCiAgICAgICAgICAgICAgICAjIGNsZWFyIHRvIGlmIHRoZXJlIGlzIG5vIGN1c3RvbWVyIGZvdW5kCiAgICAgICAgICAgICAgICBpZiAoICElQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyb20gYW5kIGN1c3RvbWVyIGlkIGlmIGN1c3RvbWVyIHVzZXIgaXMgZ2l2ZW4KICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMiApIHsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyS2V5ICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICRDdXN0b21lclVzZXJMaXN0eyRDdXN0b21lclVzZXJLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7Q3VzdG9tZXJ9ICkgewogICAgICAgICAgICAgICAgbXkgJUV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7Q3VzdG9tZXJ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntFbWFpbH0gPSAkRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhe1VzZXJNYWlsU3RyaW5nfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGEgbmV3IGRlc3RpbmF0aW9uIHF1ZXVlIGlzIHNlbGVjdGVkCiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDMgKSB7CiAgICAgICAgICAgICRFcnJvcntOb1N1Ym1pdH0gPSAxOwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlciB8fCAkU2VsZWN0ZWRDdXN0b21lclVzZXIgKSB7CiAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEN1c3RvbWVySUQpIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICAgICAgbmV4dCBQQVJBTUVURVIgaWYgISRHZXRQYXJhbXskUGFyYW1ldGVyfTsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCAkR2V0UGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRQYXJhbWV0ZXIgLiAnRXJyb3JUeXBlJyB9CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFBhcmFtZXRlciAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFBhcmFtZXRlciAuICdJbnZhbGlkJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRJc0xvY2FsKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUGFyYW1ldGVyIC4gJ0lzTG9jYWxBZGRyZXNzJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBpdCBpcyBub3QgYSBzdWJhY3Rpb24gYWJvdXQgYXR0YWNobWVudHMsIGNoZWNrIGZvciBzZXJ2ZXIgZXJyb3JzCiAgICAgICAgaWYgKCAhJEV4cGFuZEN1c3RvbWVyTmFtZSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1RvfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVG9JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdEludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJE5ld1F1ZXVlSUQgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0Rlc3RpbmF0aW9uSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0JvZHlJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIGRhdGUgaXMgdmFsaWQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRFeHBhbmRDdXN0b21lck5hbWUKICAgICAgICAgICAgICAgICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9CiAgICAgICAgICAgICAgICAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBlbmRpbmcgZGF0ZSB0byBhIGRhdGV0aW1lIG9iamVjdAogICAgICAgICAgICAgICAgbXkgJFBlbmRpbmdEYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmQgPT4gMCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBjdXJyZW50IHN5c3RlbSBlcG9jaAogICAgICAgICAgICAgICAgbXkgJEN1clN5c3RlbURhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CgogICAgICAgICAgICAgICAgaWYgKCAhJFBlbmRpbmdEYXRlVGltZU9iamVjdCB8fCAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0IDwgJEN1clN5c3RlbURhdGVUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzZXJ2aWNlCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgICAgICYmICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzbGEKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NMQU1hbmRhdG9yeX0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU0xBSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAhJEdldFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1R5cGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKQogICAgICAgICAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17VGltZVVuaXRzfSBlcSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1RpbWVVbml0c0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgICAgIG15ICVBcnRpY2xlUGFyYW07CiAgICAgICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIERlYnVnID0+ICREZWJ1ZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICBteSAkTXVsdGlwbGU7CiAgICAgICAgICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE11bHRpcGxlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFN0b3JlTmV3ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJEpvYnN7JEpvYn0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgb3B0aW9ucyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgIyBhbmQgYWRkIHRoZW0gYmFjayB0byB0aGUgc2VsZWN0aW9uIHNvIHRoYXQgdGhlIHN1Ym1pdAogICAgICAgICAgICAgICAgIyB3aWxsIGNvbnRhaW4gb3B0aW9ucyB0aGF0IHdlcmUgaGlkZGVuIGZyb20gdGhlIGFnZW50CiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRPcHRpb25zVG9SZW1vdmVBSkFYJykgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQFJlbW92ZWRPcHRpb25zID0gJE9iamVjdC0+R2V0T3B0aW9uc1RvUmVtb3ZlQUpBWCglR2V0UGFyYW0pOwogICAgICAgICAgICAgICAgICAgIGlmIChAUmVtb3ZlZE9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRNdWx0aXBsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdmVkT3B0aW9uIChAUmVtb3ZlZE9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRHZXRQYXJhbXskS2V5fSB9LCAkUmVtb3ZlZE9wdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9IHNoaWZ0IEBSZW1vdmVkT3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHRpY2tldCBwYXJhbXMKICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0gPSAoCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKCAlR2V0UGFyYW0sICVBcnRpY2xlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBlcnJvcnMKICAgICAgICAgICAgICAgICVFcnJvciA9ICgKICAgICAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdC0+RXJyb3IoICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICBpZiAoICRFcnJvcntUb0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RvSXNMb2NhbEFkZHJlc3NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkRXJyb3J7Q2NJc0xvY2FsQWRkcmVzc30gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDY0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEVycm9ye0JjY0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGFuZCBmb3JtYXQgZGVmYXVsdCBzdWJqZWN0IGFuZCBib2R5CiAgICAgICAgICAgIG15ICRTdWJqZWN0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENvbmZpZy0+e1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJEJvZHkgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQ29uZmlnLT57Qm9keX0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dAogICAgICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJEJvZHkgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEJvZHksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjc2V0IEJvZHkgYW5kIFN1YmplY3QgcGFyYW1ldGVycyBmb3IgT3V0cHV0CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTdWJqZWN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkQm9keTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc2VydmljZXMKICAgICAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCAgIHx8IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlc2V0IHByZXZpb3VzIFNlcnZpY2VJRCB0byByZXNldCBTTEEtTGlzdCBpZiBubyBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTZXJ2aWNlSUR9IHx8ICEkU2VydmljZXMtPnsgJEdldFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRCB8fCAxLAogICAgICAgICAgICAgICAgU2VydmljZXMgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBoZWFkZXIKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrRW1haWxOZXcoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VycyAgID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVXNlclNlbGVjdGVkICAgICA9PiAkTmV3VXNlcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJTZWxlY3RlZCA9PiAkTmV3UmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZXMgICAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZSAgPT4gJE5leHRTdGF0ZSwKICAgICAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCAgIHx8IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVHlwZXMgPT4gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgIFNMQXMgICAgICAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZXMgPT4gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgJycsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgICAgICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ3VzdG9tZXJJRCApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGF0YSAgICAgID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICAgICAgVGltZVVuaXRzUmVxdWlyZWQgPT4gKAogICAgICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgICAgID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJwogICAgICAgICAgICAgICAgICAgIDogJycKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBGcm9tTGlzdCAgICAgPT4gJFNlbGYtPl9HZXRUb3MoKSwKICAgICAgICAgICAgICAgIEZyb21TZWxlY3RlZCA9PiAkRGVzdCwKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRHZXRQYXJhbXtTdWJqZWN0fSApLAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEdldFBhcmFte0JvZHl9ICksCiAgICAgICAgICAgICAgICBFcnJvcnMgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgU2lnbmF0dXJlICAgID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MICAgICA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJDYywKICAgICAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICAgICAgICAgIEZyb21FeHRlcm5hbEN1c3RvbWVyID0+IFwlRnJvbUV4dGVybmFsQ3VzdG9tZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFR5cGVJRCAgICAgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgU2VydmljZUlEICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBTTEFJRCAgICAgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgUHJpb3JpdHlJRCAgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ1RpY2tldCc7CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgIGlmICggJFNlbGYtPntJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudH0gJiYgJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHl9ICkgewoKICAgICAgICAgICAgIyBnZXQgY29uZmlnIGZvciBjcml0aWNhbGl0eSBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG15ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTUNyaXRpY2FsaXR5JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHBvc3NpYmxlIHZhbHVlcyBmb3IgY3JpdGljYWxpdHkKICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZXZlcnNlIHRoZSBsaXN0IHRvIGZpbmQgb3V0IHRoZSBrZXkKICAgICAgICAgICAgbXkgJVJldmVyc2VDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzID0gcmV2ZXJzZSAleyAkQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlcyB9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIGNyaXRpY2FsaXR5CiAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlc3sgJFNlcnZpY2V7Q3JpdGljYWxpdHl9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KCiAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICk7CiAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50cywgXCVVcGxvYWRTdHVmZjsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyZSBzdWJqZWN0CiAgICAgICAgbXkgJFRuID0gJFRpY2tldE9iamVjdC0+VGlja2V0TnVtYmVyTG9va3VwKCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVG4sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnTmV3JywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIG5ldyBvd25lciBpcyBnaXZlbiAodGhlbiBzZW5kIG5vIGFnZW50IG5vdGlmeSkKICAgICAgICBteSAkTm9BZ2VudE5vdGlmeSA9IDA7CiAgICAgICAgaWYgKCROZXdVc2VySUQpIHsKICAgICAgICAgICAgJE5vQWdlbnROb3RpZnkgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gLj0gJzxici8+PGJyLz4nIC4gJFNpZ25hdHVyZTsKCiAgICAgICAgICAgICMgcmVtb3ZlIHVudXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgIG15IEBOZXdBdHRhY2htZW50RGF0YTsKICAgICAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SUQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDb250ZW50SUQpOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBhdHRhY2htZW50IGlmIG5vdCBsaW5rZWQgaW4gYm9keQogICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVAogICAgICAgICAgICAgICAgICAgICAgICBpZiAkR2V0UGFyYW17Qm9keX0gIX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIGlubGluZSBpbWFnZXMgYW5kIG5vcm1hbCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAQXR0YWNobWVudHMgPSBATmV3QXR0YWNobWVudERhdGE7CgogICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gLj0gIlxuXG4iIC4gJFNpZ25hdHVyZTsKICAgICAgICB9CgogICAgICAgICMgbG9va3VwIHNlbmRlcgogICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwogICAgICAgIG15ICRTZW5kZXIgICAgICAgICAgICA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2VuZGVyKAogICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdFbWFpbCcgKTsKCiAgICAgICAgIyBzZW5kIGVtYWlsCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZVNlbmQoCiAgICAgICAgICAgIE5vQWdlbnROb3RpZnkgICAgICAgID0+ICROb0FnZW50Tm90aWZ5LAogICAgICAgICAgICBBdHRhY2htZW50ICAgICAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICRDb25maWctPntTZW5kZXJUeXBlfSwKICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gJENvbmZpZy0+e0lzVmlzaWJsZUZvckN1c3RvbWVyfSwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJFNlbmRlciwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgQ2MgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0NjfSwKICAgICAgICAgICAgQmNjICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0JjY30sCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJENvbmZpZy0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gJENvbmZpZy0+e0hpc3RvcnlDb21tZW50fQogICAgICAgICAgICAgICAgfHwgIlwlXCUkR2V0UGFyYW17VG99LCAkR2V0UGFyYW17Q2N9LCAkR2V0UGFyYW17QmNjfSIsCiAgICAgICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ0FydGljbGUnOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBwcmUtc3VibWl0dGVkIGF0dGFjaG1lbnRzCiAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBsaW5rIHRpY2tldHMKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9CiAgICAgICAgICAgICYmICRDb25maWctPntTcGxpdExpbmtUeXBlfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U3BsaXRMaW5rVHlwZX0tPntMaW5rVHlwZX0KICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9LT57RGlyZWN0aW9ufQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkR2V0UGFyYW17TGlua1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgcm8gcGVybWlzc2lvbiEiLAogICAgICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU291cmNlS2V5ID0gJEdldFBhcmFte0xpbmtUaWNrZXRJRH07CiAgICAgICAgICAgIG15ICRUYXJnZXRLZXkgPSAkVGlja2V0SUQ7CgogICAgICAgICAgICBpZiAoICRDb25maWctPntTcGxpdExpbmtUeXBlfS0+e0RpcmVjdGlvbn0gZXEgJ1NvdXJjZScgKSB7CiAgICAgICAgICAgICAgICAkU291cmNlS2V5ID0gJFRpY2tldElEOwogICAgICAgICAgICAgICAgJFRhcmdldEtleSA9ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGxpbmsgdGhlIHRpY2tldHMKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0FkZCgKICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRUYXJnZXRLZXksCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9LT57TGlua1R5cGV9IHx8ICdOb3JtYWwnLAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgb3duZXIgKGlmIG5ldyB1c2VyIGlkIGlzIGdpdmVuKQogICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkTmV3VXNlcklELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGxvY2sKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZWxzZSBzZXQgb3duZXIgdG8gY3VycmVudCBhZ2VudCBidXQgZG8gbm90IGxvY2sgaXQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHJlc3BvbnNpYmxlIChpZiBuZXcgdXNlciBpZCBpcyBnaXZlbikKICAgICAgICBpZiAoJE5ld1Jlc3BvbnNpYmxlSUQpIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICROZXdSZXNwb25zaWJsZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG91bGQgaSBzZXQgYW4gdW5sb2NrPwogICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewoKICAgICAgICAgICAgIyBzZXQgbG9jawogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgIGlmICggJFNlbGYtPntJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudH0gKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgdGVtcG9yYXJpbHkgbGlua3MKICAgICAgICAgICAgbXkgJFRlbXBMaW5rTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFN0YXRlICA9PiAnVGVtcG9yYXJ5JywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRUZW1wTGlua0xpc3QgJiYgcmVmICRUZW1wTGlua0xpc3QgZXEgJ0hBU0gnICYmICV7JFRlbXBMaW5rTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRPYmplY3RPcmcgKCBzb3J0IGtleXMgJXskVGVtcExpbmtMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IHR5cGVsaXN0CiAgICAgICAgICAgICAgICAgICAgbXkgJFR5cGVMaXN0ID0gJFRlbXBMaW5rTGlzdC0+eyRUYXJnZXRPYmplY3RPcmd9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFR5cGUgKCBzb3J0IGtleXMgJXskVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFR5cGVMaXN0LT57JFR5cGV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRLZXlPcmcgKCBzb3J0IGtleXMgJXsgJERpcmVjdGlvbkxpc3QtPnskRGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgdGVtcCBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdDIgPT4gJFRhcmdldE9iamVjdE9yZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MiAgICA9PiAkVGFyZ2V0S2V5T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlT2JqZWN0ID0gJFRhcmdldE9iamVjdE9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlS2V5ICAgID0gJFRhcmdldEtleU9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0T2JqZWN0ID0gJ1RpY2tldCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldEtleSAgICA9ICRUaWNrZXRJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGlyZWN0aW9uIGVxICdUYXJnZXQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU291cmNlT2JqZWN0ID0gJ1RpY2tldCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VLZXkgICAgPSAkVGlja2V0SUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0S2V5ICAgID0gJFRhcmdldEtleU9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwZXJtYW5lbnRseSBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJFNvdXJjZU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAkVGFyZ2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQojIC0tLQoKICAgICAgICAjIGdldCByZWRpcmVjdCBzY3JlZW4KICAgICAgICBteSAkTmV4dFNjcmVlbiA9ICRTZWxmLT57VXNlckNyZWF0ZU5leHRNYXNrfSB8fCAnQWdlbnRUaWNrZXRFbWFpbCc7CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47U3ViYWN0aW9uPUNyZWF0ZWQ7VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewogICAgICAgIG15ICREZXN0ICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwogICAgICAgIG15ICRDdXN0b21lclVzZXIgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKTsKICAgICAgICBteSAkRWxlbWVudENoYW5nZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CgogICAgICAgICMgZ2V0IEZyb20gYmFzZWQgb24gc2VsZWN0ZWQgcXVldWUKICAgICAgICBteSAkUXVldWVJRCA9ICcnOwogICAgICAgIGlmICggJERlc3QgPX4gL14oXGR7MSwxMDB9KVx8XHwuKz8kLyApIHsKICAgICAgICAgICAgJFF1ZXVlSUQgPSAkMTsKICAgICAgICAgICAgbXkgJVF1ZXVlID0gJFF1ZXVlT2JqZWN0LT5HZXRTeXN0ZW1BZGRyZXNzKCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSA9ICRRdWV1ZXtFbWFpbH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsaXN0IHR5cGUKICAgICAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRUb3MgPSAkU2VsZi0+X0dldFRvcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE5ld1RvczsKCiAgICAgICAgaWYgKCRUb3MpIHsKICAgICAgICAgICAgVE9zOgogICAgICAgICAgICBmb3IgbXkgJEtleVRvICggc29ydCBrZXlzICV7JFRvc30gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRUb3MtPnskS2V5VG99IGVxICctJyApOwogICAgICAgICAgICAgICAgJE5ld1Rvcy0+eyIkS2V5VG98fCRUb3MtPnskS2V5VG99In0gPSAkVG9zLT57JEtleVRvfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCRRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJFVzZXJzID0gJFNlbGYtPl9HZXRVc2VycygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9LAogICAgICAgICk7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlVXNlcnMgPSAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9LAogICAgICAgICk7CiAgICAgICAgbXkgJE5leHRTdGF0ZXMgPSAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkU0xBcyA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICAgICAgU2VydmljZXMgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICk7CiAgICAgICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgfHwgJycsCiAgICAgICAgKTsKICAgICAgICBteSAkVHlwZXMgPSAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0FDTFJlZHVjaWJsZTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc30gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgKSB8fCAkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSBAVGVtcGxhdGVBSkFYOwoKICAgICAgICAjIHVwZGF0ZSB0aWNrZXQgYm9keSBhbmQgYXR0YWNoZW1lbnRzIGlmIG5lZWRlZC4KICAgICAgICBpZiAoICRFbGVtZW50Q2hhbmdlZCBlcSAnU3RhbmRhcmRUZW1wbGF0ZUlEJyApIHsKICAgICAgICAgICAgbXkgQFRpY2tldEF0dGFjaG1lbnRzOwogICAgICAgICAgICBteSAkVGVtcGxhdGVUZXh0OwoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIGF0dGFjaG1lbnRzIGZyb20gdGhlIFVwbG9hZCBjYWNoZQogICAgICAgICAgICBteSAkUmVtb3ZlU3VjY2VzcyA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFJlbW92ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGb3JtIGF0dGFjaG1lbnRzIGNvdWxkIG5vdCBiZSBkZWxldGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgdGVtcGxhdGUgdGV4dCBhbmQgc2V0IG5ldyBhdHRhY2htZW50cyBpZiBhIHRlbXBsYXRlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0ZW1wbGF0ZSB0ZXh0LCByZXBsYWNlIHNtYXJ0IHRhZ3MgKGxpbWl0ZWQgYXMgdGlja2V0IGlzIG5vdCBjcmVhdGVkKQogICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgU3RkQXR0YWNobWVudE9iamVjdAogICAgICAgICAgICAgICAgbXkgJFN0ZEF0dGFjaG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudCcpOwoKICAgICAgICAgICAgICAgICMgYWRkIHN0ZC4gYXR0YWNobWVudHMgdG8gdGlja2V0CiAgICAgICAgICAgICAgICBteSAlQWxsU3RkQXR0YWNobWVudHMgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3IgKCBzb3J0IGtleXMgJUFsbFN0ZEF0dGFjaG1lbnRzICkgewogICAgICAgICAgICAgICAgICAgIG15ICVBdHRhY2htZW50c0RhdGEgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudEdldCggSUQgPT4gJF8gKTsKICAgICAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAlQXR0YWNobWVudHNEYXRhLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzZW5kIGEgbGlzdCBvZiBhdHRhY2htZW50cyBpbiB0aGUgdXBsb2FkIGNhY2hlIGJhY2sgdG8gdGhlIGNsaWVudHNpZGUgSmF2YVNjcmlwdAogICAgICAgICAgICAgICAgIyB3aGljaCByZW5kZXJzIHRoZW4gdGhlIGxpc3Qgb2YgY3VycmVudGx5IHVwbG9hZGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBAVGlja2V0QXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBUaWNrZXRBdHRhY2htZW50cykgewogICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57RmlsZXNpemV9ID0gJExheW91dE9iamVjdC0+SHVtYW5SZWFkYWJsZURhdGFTaXplKAogICAgICAgICAgICAgICAgICAgICAgICBTaXplID0+ICRBdHRhY2htZW50LT57RmlsZXNpemV9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBUZW1wbGF0ZUFKQVggPSAoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlVGVtcGxhdGVDcmVhdGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJzAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkVGVtcGxhdGVUZXh0IHx8ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnVGlja2V0QXR0YWNobWVudHMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFxAVGlja2V0QXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAgICAgS2VlcERhdGEgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSBARXh0ZW5kZWREYXRhOwoKICAgICAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgIyB1c2UgUXVldWVJRCBmcm9tIHdlYiByZXF1ZXN0IGluIGNvbXBvc2UgbW9kdWxlcwogICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVJRDsKCiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgICAgIEpPQjoKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgbmV4dCBKT0IgaWYgISRNYWluT2JqZWN0LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgRGVidWcgPT4gJERlYnVnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkTXVsdGlwbGU7CgogICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSm9ic3skSm9ifS0+e1BhcmFtVHlwZX0gJiYgJEpvYnN7JEpvYn0tPntQYXJhbVR5cGV9IG5lICdTaW5nbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBAeyAkR2V0UGFyYW17JFBhcmFtZXRlcn0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE11bHRpcGxlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBQQVJBTUVURVI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICRPYmplY3QtPkRhdGEoICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CgogICAgICAgICAgICAgICAgIyBnZXQgQUpBWCBwYXJhbSB2YWx1ZXMKICAgICAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRQYXJhbUFKQVgnKSApIHsKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0gPSAoICVHZXRQYXJhbSwgJE9iamVjdC0+R2V0UGFyYW1BSkFYKCVHZXRQYXJhbSkgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCBvcHRpb25zIHRoYXQgaGF2ZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGlvbiB2aXNpYmxlCiAgICAgICAgICAgICAgICAjIHRvIHRoZSBhZ2VudC4gVGhlc2Ugb3B0aW9ucyB3aWxsIGJlIGFkZGVkIGFnYWluIG9uIHN1Ym1pdC4KICAgICAgICAgICAgICAgIGlmICggJE9iamVjdC0+Y2FuKCdHZXRPcHRpb25zVG9SZW1vdmVBSkFYJykgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQE9wdGlvbnNUb1JlbW92ZSA9ICRPYmplY3QtPkdldE9wdGlvbnNUb1JlbW92ZUFKQVgoJUdldFBhcmFtKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRPcHRpb25Ub1JlbW92ZSAoQE9wdGlvbnNUb1JlbW92ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJERhdGF7JE9wdGlvblRvUmVtb3ZlfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEtleSA9ICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICBpZiAoJEtleSkgewogICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgIEBFeHRlbmRlZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+ICRNdWx0aXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNvbnZlcnQgU2lnbmF0dXJlIHRvIEFTQ0lJLCBpZiBSaWNoVGV4dCBpcyBvbgogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAjICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSggU3RyaW5nID0+ICRTaWduYXR1cmUsICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uSlNPTigKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICROZXdUb3MsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICREZXN0LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTaWduYXR1cmUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFVzZXJzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUmVzcG9uc2libGVVc2VycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJE5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRQcmlvcml0aWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFN0YW5kYXJkVGVtcGxhdGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRUeXBlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIEBUZW1wbGF0ZUFKQVgsCiAgICAgICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkTGF5b3V0T2JqZWN0LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gU3ViYWN0aW9uIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5leHRTdGF0ZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRVc2VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXJzCiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBqdXN0IHNob3cgb25seSB1c2VycyB3aXRoIHNlbGVjdGVkIGN1c3RvbSBxdWV1ZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgQFVzZXJJRHMgPSAkVGlja2V0T2JqZWN0LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgIGZvciBteSAkR3JvdXBNZW1iZXJLZXkgKCBzb3J0IGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkR3JvdXBNZW1iZXJLZXkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skR3JvdXBNZW1iZXJLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgc2hvdyB1c2VycwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgIH0KCiAgICAjIHNob3cgYWxsIHVzZXJzIHdobyBhcmUgb3duZXIgb3IgcncgaW4gdGhlIHF1ZXVlIGdyb3VwCiAgICBlbHNpZiAoICRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICBteSAkR0lEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uR3JvdXBHZXQoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRNZW1iZXJLZXkgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JE1lbWJlcktleX0gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skTWVtYmVyS2V5fSA9ICRBbGxHcm91cHNNZW1iZXJzeyRNZW1iZXJLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnT3duZXInLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4geyAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0UmVzcG9uc2libGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte0FsbFVzZXJzfSApIHsKICAgICAgICBteSBAVXNlcklEcyA9ICRUaWNrZXRPYmplY3QtPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRHcm91cE1lbWJlcktleSAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVUlEIChAVXNlcklEcykgewogICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRHcm91cE1lbWJlcktleSApIHsKICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBbGxHcm91cHNNZW1iZXJzeyRHcm91cE1lbWJlcktleX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBzaG93IHVzZXJzCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBhbGwgdXNlcnMgd2hvIGFyZSByZXNwb25zaWJsZSBvciBydyBpbiB0aGUgcXVldWUgZ3JvdXAKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15ICRHSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJE1lbWJlcktleSAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkQWxsR3JvdXBzTWVtYmVyc3skTWVtYmVyS2V5fSApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRNZW1iZXJLZXl9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JE1lbWJlcktleX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlUHJpb3JpdGllcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0VHlwZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0eXBlCiAgICBteSAlVHlwZTsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVR5cGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZTsKCiAgICAjIGNoZWNrIG5lZWRlZAogICAgcmV0dXJuIFwlU2VydmljZSBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpEZWZhdWx0OjpVbmtub3duQ3VzdG9tZXInKTsKCiAgICAjIGNoZWNrIGlmIG5vIEN1c3RvbWVyVXNlcklEIGlzIHNlbGVjdGVkCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDAgbGVhdmUgQ3VzdG9tZXJVc2VySUQgZW1wdHksIGl0IHdpbGwgbm90IGdldCBhbnkgc2VydmljZXMKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMSBzZXQgQ3VzdG9tZXJVc2VySUQgdG8gZ2V0IGRlZmF1bHQgc2VydmljZXMKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gJiYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAnPERFRkFVTFQ+JzsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlU2VydmljZTsKfQoKc3ViIF9HZXRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRUb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdUb3M7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSApIHsKICAgICAgICAlTmV3VG9zID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpIH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBTZWxlY3Rpb25UeXBlIFF1ZXVlIG9yIFN5c3RlbUFkZHJlc3M/CiAgICAgICAgbXkgJVRvczsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgJVRvcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+TW92ZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVUb3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzUXVldWVMaXN0KCk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjcmVhdGUgcGVybWlzc2lvbiBxdWV1ZXMKICAgICAgICBteSAlVXNlckdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIHN0cmluZwogICAgICAgIFFVRVVFSUQ6CiAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICVUb3MgKSB7CiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVHZXQoIElEID0+ICRRdWV1ZUlEICk7CgogICAgICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2ssIGNhbiB3ZSBjcmVhdGUgbmV3IHRpY2tldHMgaW4gcXVldWUKICAgICAgICAgICAgbmV4dCBRVUVVRUlEIGlmICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9OwoKICAgICAgICAgICAgbXkgJFN0cmluZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25TdHJpbmcnKQogICAgICAgICAgICAgICAgfHwgJzxSZWFsbmFtZT4gPDxFbWFpbD4+IC0gUXVldWU6IDxRdWV1ZT4nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlPi8kUXVldWVEYXRhe05hbWV9L2c7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWVDb21tZW50Pi8kUXVldWVEYXRhe0NvbW1lbnR9L2c7CgogICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMKICAgICAgICAgICAgJFN0cmluZyA9fiBze1xzK1x6fXt9IGlmICEkUXVldWVEYXRhe0NvbW1lbnR9OwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIG5lICdRdWV1ZScgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0RhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUb3N7JFF1ZXVlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UmVhbG5hbWU+LyRTeXN0ZW1BZGRyZXNzRGF0YXtSZWFsbmFtZX0vZzsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88RW1haWw+LyRTeXN0ZW1BZGRyZXNzRGF0YXtOYW1lfS9nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICROZXdUb3N7JFF1ZXVlSUR9ID0gJFN0cmluZzsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgZW1wdHkgc2VsZWN0aW9uCiAgICAkTmV3VG9zeycnfSA9ICctJzsKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9HZXRTaWduYXR1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHByZXBhcmUgc2lnbmF0dXJlCiAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKICAgIG15ICRTaWduYXR1cmUgICAgICAgICA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2lnbmF0dXJlKAogICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9LAogICAgICAgIERhdGEgICAgPT4gXCVQYXJhbSwKICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRTaWduYXR1cmU7Cn0KCnN1YiBfR2V0U3RhbmRhcmRUZW1wbGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVGVtcGxhdGVzOwogICAgbXkgJFF1ZXVlSUQgPSAkUGFyYW17UXVldWVJRH0gfHwgJyc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUXVldWVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgaWYgKCAhJFF1ZXVlSUQgKSB7CiAgICAgICAgbXkgJFVzZXJEZWZhdWx0UXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlVzZXJEZWZhdWx0UXVldWUnKSB8fCAnJzsKCiAgICAgICAgaWYgKCRVc2VyRGVmYXVsdFF1ZXVlKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFVzZXJEZWZhdWx0UXVldWUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFF1ZXVlSUQgJiYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgaWYgKCAhJFF1ZXVlSUQgJiYgJFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgIyBnZXQgUXVldWVJRCBmcm9tIHRoZSB0aWNrZXQKICAgICAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRRdWV1ZUlEID0gJFRpY2tldHtRdWV1ZUlEfSB8fCAnJzsKICAgIH0KCiAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfSApOwoKICAgICMgcmV0dXJuIGp1c3QgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBzY3JlZW4KICAgIHJldHVybiAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfTsKfQoKc3ViIF9NYXNrRW1haWxOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgc2V0IEpTIGRhdGEKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJTZWFyY2gnLAogICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgU2hvd0N1c3RvbWVyVGlja2V0cyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlNob3dDdXN0b21lclRpY2tldHMnKSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGJ1aWxkIHN0cmluZwogICAgJFBhcmFte09wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtVc2Vyc30sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtVc2VyU2VsZWN0ZWR9LAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAkUGFyYW17TmV4dFN0YXRlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUGFyYW17TmV4dFN0YXRlc30sCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFBhcmFte05leHRTdGF0ZX0gfHwgJENvbmZpZy0+e1N0YXRlRGVmYXVsdH0sCiAgICApOwoKICAgICMgYnVpbGQgRGVzdGluYXRpb24gc3RyaW5nCiAgICBteSAlTmV3VG87CiAgICBpZiAoICRQYXJhbXtGcm9tTGlzdH0gKSB7CiAgICAgICAgZm9yIG15ICRGcm9tS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtGcm9tTGlzdH0gfSApIHsKICAgICAgICAgICAgJE5ld1RveyIkRnJvbUtleXx8JFBhcmFte0Zyb21MaXN0fS0+eyRGcm9tS2V5fSJ9ID0gJFBhcmFte0Zyb21MaXN0fS0+eyRGcm9tS2V5fTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICEkUGFyYW17RnJvbVNlbGVjdGVkfSApIHsKICAgICAgICBteSAkVXNlckRlZmF1bHRRdWV1ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VXNlckRlZmF1bHRRdWV1ZScpIHx8ICcnOwogICAgICAgIGlmICgkVXNlckRlZmF1bHRRdWV1ZSkgewogICAgICAgICAgICBteSAkUXVldWVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFVzZXJEZWZhdWx0UXVldWUgKTsKICAgICAgICAgICAgaWYgKCRRdWV1ZUlEKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17RnJvbVNlbGVjdGVkfSA9ICIkUXVldWVJRHx8JFVzZXJEZWZhdWx0UXVldWUiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICRQYXJhbXtGcm9tU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAnIC4gKCAkUGFyYW17RXJyb3JzfS0+e0Rlc3RpbmF0aW9uSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgVHJlZVZpZXcgICAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTZWxlY3RlZElEICAgICA9PiAkUGFyYW17RnJvbVNlbGVjdGVkfSwKICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0Zyb21TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlTmV3VG8sCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAnIC4gKCAkUGFyYW17RXJyb3JzfS0+e0Rlc3RpbmF0aW9uSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBUcmVlVmlldyAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RnJvbVNlbGVjdGVkfSwKICAgICAgICApOwogICAgfQoKICAgICMgY3VzdG9tZXIgaW5mbyBzdHJpbmcKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJExheW91dE9iamVjdC0+QWdlbnRDdXN0b21lclZpZXdUYWJsZSgKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17Q3VzdG9tZXJEYXRhfSwKICAgICAgICAgICAgTWF4ICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2VNYXhTaXplJyksCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJUYWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgcHJlcGFyZSBlcnJvcnMhCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciBteSAkRXJyb3JLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Vycm9yc30gfSApIHsKICAgICAgICAgICAgJFBhcmFteyRFcnJvcktleX0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRQYXJhbXtFcnJvcnN9LT57JEVycm9yS2V5fSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEZyb20gZXh0ZXJuYWwKICAgIG15ICRTaG93RXJyb3JzID0gMTsKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0KICAgICAgICAmJgogICAgICAgIGRlZmluZWQgJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0VtYWlsfSAmJgogICAgICAgIGRlZmluZWQgJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0N1c3RvbWVyfQogICAgICAgICkKICAgIHsKICAgICAgICAkU2hvd0Vycm9ycyA9IDA7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Zyb21FeHRlcm5hbEN1c3RvbWVyJywKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0RhdGFFbWFpbCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0tPntFbWFpbH0sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdEYXRhQ3VzdG9tZXInLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LT57Q3VzdG9tZXJ9LAogICAgICAgICk7CiAgICB9CgogICAgIyBDYwogICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gfSApIHsKICAgICAgICAgICAgaWYgKCAhJFNob3dFcnJvcnMgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZW1wdHkgdmFsdWVzIGZvciBlcnJvcnMKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gICAgPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJEaXNhYmxlZH0gPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30gPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckNjICkgewogICAgICAgICRQYXJhbXtDY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBCY2MKICAgIG15ICRDdXN0b21lckNvdW50ZXJCY2MgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJCY2N9IH0gKSB7CiAgICAgICAgICAgIGlmICggISRTaG93RXJyb3JzICkgewoKICAgICAgICAgICAgICAgICMgc2V0IGVtcHR5IHZhbHVlcyBmb3IgZXJyb3JzCiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRGlzYWJsZWR9ID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9ID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlckJjYysrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyQmNjICkgewogICAgICAgICRQYXJhbXtCY2NDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQmNjKyssCiAgICAgICAgfSwKICAgICk7CgogICAgIyBUbwogICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gfSApIHsKICAgICAgICAgICAgaWYgKCAhJFNob3dFcnJvcnMgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZW1wdHkgdmFsdWVzIGZvciBlcnJvcnMKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gICAgPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJEaXNhYmxlZH0gPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30gPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyKyssCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17VG9JbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntUb0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RvU2VydmVyRXJyb3JNc2cnLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtFcnJvcnN9LT57VG9FcnJvclR5cGV9IHx8ICEkU2hvd0Vycm9ycyApIHsKICAgICAgICAkUGFyYW17VG9JbnZhbGlkfSA9ICcnOwogICAgfQoKICAgIGlmICggJFBhcmFte0NjSW52YWxpZH0gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57Q2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDY1NlcnZlckVycm9yTXNnJywKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17RXJyb3JzfS0+e0NjRXJyb3JUeXBlfSB8fCAhJFNob3dFcnJvcnMgKSB7CiAgICAgICAgJFBhcmFte0NjSW52YWxpZH0gPSAnJzsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtCY2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntCY2NFcnJvclR5cGV9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCY2NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0Vycm9yc30tPntCY2NFcnJvclR5cGV9IHx8ICEkU2hvd0Vycm9ycyApIHsKICAgICAgICAkUGFyYW17QmNjSW52YWxpZH0gPSAnJzsKICAgIH0KCiAgICBteSAkRHluYW1pY0ZpZWxkTmFtZXMgPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKAogICAgICAgIE9ubHlEeW5hbWljRmllbGRzID0+IDEKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdEeW5hbWljRmllbGROYW1lcycsCiAgICAgICAgVmFsdWUgPT4gJER5bmFtaWNGaWVsZE5hbWVzLAogICAgKTsKCiAgICAjIGJ1aWxkIHR5cGUgc3RyaW5nCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1R5cGVzfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZSAnIC4gKCAkUGFyYW17RXJyb3JzfS0+e1R5cGVJbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFR5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBzZXJ2aWNlIHN0cmluZwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewoKICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgID0+ICRQYXJhbXtTZXJ2aWNlc30sCiAgICAgICAgICAgIE5hbWUgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBDbGFzcyA9PiAnTW9kZXJuaXplICcKICAgICAgICAgICAgICAgIC4gKCAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gPyAnVmFsaWRhdGVfUmVxdWlyZWQgJyA6ICcnICkKICAgICAgICAgICAgICAgIC4gKCAkUGFyYW17RXJyb3JzfS0+e1NlcnZpY2VJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU2VydmljZU1hbmRhdG9yeSA9PiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gfHwgMCwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17U0xBc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgJwogICAgICAgICAgICAgICAgLiAoICRDb25maWctPntTTEFNYW5kYXRvcnl9ID8gJ1ZhbGlkYXRlX1JlcXVpcmVkICcgOiAnJyApCiAgICAgICAgICAgICAgICAuICggJFBhcmFte0Vycm9yc30tPntTTEFJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU0xBTWFuZGF0b3J5ID0+ICRDb25maWctPntTTEFNYW5kYXRvcnl9IHx8IDAsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGV4aXN0cyBjcmVhdGUgdGVtcGxhdGVzIHJlZ2FyZGxlc3MgdGhlIHF1ZXVlCiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZScpLT5TdGFuZGFyZFRlbXBsYXRlTGlzdCgKICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgIFR5cGUgID0+ICdDcmVhdGUnLAogICAgKTsKCiAgICAjIGJ1aWxkIHRleHQgdGVtcGxhdGUgc3RyaW5nCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YW5kYXJkVGVtcGxhdGVzICkgKSB7CiAgICAgICAgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVzfSB8fCB7fSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGFuZGFyZFRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgcHJpb3JpdHkgc3RyaW5nCiAgICBpZiAoICEkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5fSA9ICRDb25maWctPntQcmlvcml0eX07CiAgICB9CiAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFBhcmFte1ByaW9yaXRpZXN9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgICAgPT4gJFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17UHJpb3JpdHl9LAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICk7CgogICAgIyBwZW5kaW5nIGRhdGEgc3RyaW5nCiAgICAkUGFyYW17UGVuZGluZ0RhdGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICVQYXJhbSwKICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICA9PiA1LAogICAgICAgIERpZmZUaW1lICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMCwKICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e0RhdGVJbnZhbGlkfSB8fCAnICcsCiAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgKTsKCiAgICAjIHNob3cgb3duZXIgc2VsZWN0aW9uCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3T3duZXJTZWxlY3Rpb24nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgcmVzcG9uc2libGUgc2VsZWN0aW9uCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1Jlc3BvbnNpYmxlU2VsZWN0aW9uJykKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LT57Jyd9ID0gJy0nOwogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZU9wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJTZWxlY3RlZH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBEeW5hbWljIGZpZWxkcwogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBza2lwIGZpZWxkcyB0aGF0IEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgKICAgICAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIGh0bWwgc3RyaW5ncyBmb3JtICRQYXJhbQogICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWxNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNob3cgdGhlIGN1c3RvbWVyIHVzZXIgYWRkcmVzcyBib29rIGlmIHRoZSBtb2R1bGUgaXMgcmVnaXN0ZXJlZCBhbmQgamF2YSBzY3JpcHQgc3VwcG9ydCBpcyBhdmFpbGFibGUuCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudEN1c3RvbWVyVXNlckFkZHJlc3NCb29rfQogICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9CiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtPcHRpb25DdXN0b21lclVzZXJBZGRyZXNzQm9va30gPSAxOwogICAgfQoKICAgICMgc2hvdyBjdXN0b21lciBlZGl0IGxpbmsKICAgIG15ICRPcHRpb25DdXN0b21lciA9ICRMYXlvdXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgQWN0aW9uID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICApOwoKICAgIG15ICRTaG93bk9wdGlvbnNCbG9jazsKCiAgICBpZiAoJE9wdGlvbkN1c3RvbWVyKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmVlZCB0byBjYWxsIE9wdGlvbnMgYmxvY2sKICAgICAgICBpZiAoICEkU2hvd25PcHRpb25zQmxvY2sgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgICAgICRTaG93bk9wdGlvbnNCbG9jayA9IDE7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3B0aW9uQ3VzdG9tZXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAjIG1ha2Ugc3VyZSB0byBzaG93IHRoZSBvcHRpb25zIGJsb2NrIHNvIHRoYXQgdGhlICJMaW5rIFRpY2tldCIgb3B0aW9uIGlzIHNob3duCiAgICAjIGV2ZW4gaWYgc3BlbGxjaGVja2VyLCBhZGRyZXNzIGJvb2sgYW5kIE9wdGlvbkN1c3RvbWVyIGlzIHR1cm5lZCBvZmYKICAgIGlmICggJFNlbGYtPntJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudH0gJiYgISRTaG93bk9wdGlvbnNCbG9jayApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IGZsYWcgdG8gInRydWUiIGluIG9yZGVyIHRvIHByZXZlbnQgY2FsbGluZyB0aGUgT3B0aW9ucyBibG9jayBhZ2FpbgogICAgICAgICRTaG93bk9wdGlvbnNCbG9jayA9IDE7CiAgICB9CiMgLS0tCgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldEVtYWlsJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKc3ViIF9HZXRGaWVsZHNUb1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBVcGRhdGFibGVGaWVsZHM7CgogICAgIyBzZXQgdGhlIGZpZWxkcyB0aGF0IGNhbiBiZSB1cGRhdGVhYmxlIHZpYSBBSkFYVXBkYXRlCiAgICBpZiAoICEkUGFyYW17T25seUR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgIEBVcGRhdGFibGVGaWVsZHMgPSBxdygKICAgICAgICAgICAgVHlwZUlEIERlc3QgTmV4dFN0YXRlSUQgUHJpb3JpdHlJRCBTZXJ2aWNlSUQgU0xBSUQgU2lnbktleUlEIENyeXB0S2V5SUQgVG8gQ2MgQmNjCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRAogICAgICAgICk7CiAgICB9CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0FDTFJlZHVjaWJsZTsKCiAgICAgICAgcHVzaCBAVXBkYXRhYmxlRmllbGRzLCAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CiAgICB9CgogICAgcmV0dXJuIFxAVXBkYXRhYmxlRmllbGRzOwp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSAwYTA0ZTcyMmZiY2JkMzljY2EzZmIwODljMjk0ZTcyYjMxNzBlNmIxIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRQaG9uZS5wbQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0UGhvbmU7CiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RSUzo6UGVybDo6REJPYmplY3QpCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTWFpbDo6QWRkcmVzczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgI2dldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KCiAgICAjIENoZWNrIGlmIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50IGlzIHVzZWQuCiAgICBteSAkT3V0cHV0RmlsdGVyQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UG9zdCcpOwogICAgaWYgKCAkT3V0cHV0RmlsdGVyQ29uZmlnLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9ICkgewogICAgICAgICRTZWxmLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9ID0gMTsKICAgIH0KIyAtLS0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgcXcoQXJ0aWNsZUlEIExpbmtUaWNrZXRJRCBQcmlvcml0eUlEIE5ld1VzZXJJRAogICAgICAgIEZyb20gU3ViamVjdCBCb2R5IE5leHRTdGF0ZUlEIFRpbWVVbml0cwogICAgICAgIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlCiAgICAgICAgTmV3UmVzcG9uc2libGVJRCBSZXNwb25zaWJsZUFsbCBPd25lckFsbCBUeXBlSUQgU2VydmljZUlEIFNMQUlECiAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEIEZyb21DaGF0SUQgRGVzdAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgfQoKICAgICMgQUNMIGNvbXBhdGliaWxpdHkgdHJhbnNsYXRpb24KICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbTsKICAgICRBQ0xDb21wYXRHZXRQYXJhbXtPd25lcklEfSA9ICRHZXRQYXJhbXtOZXdVc2VySUR9OwoKICAgICMgTXVsdGlwbGVDdXN0b21lciBGcm9tLWZpZWxkCiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyRnJvbUN1c3RvbWVyJyApIHx8IDA7CiAgICBteSAkU2VsZWN0ZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSB8fCAnJzsKCiAgICAjIGhhc2ggZm9yIGNoZWNrIGR1cGxpY2F0ZWQgZW50cmllcwogICAgbXkgJUFkZHJlc3Nlc0xpc3Q7CgogICAgIyBnZXQgY2hlY2sgaXRlbSBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXIpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLi4gJEN1c3RvbWVyc051bWJlciApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJTZWxlY3RlZCA9ICggJFNlbGVjdGVkIGVxICRDb3VudCA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50KSB7CgogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRXJyb3JNc2cgPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtGcm9tfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkQ3VzdG9tZXJFbGVtZW50OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnQpICkgewogICAgICAgICAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSAmJiAkQ3VzdG9tZXJFcnJvciBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3IgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnQgLiAnRXJyb3InOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXIsIHsKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJTZWxlY3RlZCA9PiAkQ3VzdG9tZXJTZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2csCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskQ3VzdG9tZXJFbGVtZW50fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZm9ybSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgIyB0byBzdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBkeW5hbWljIGZpZWxkIGZvciB0aGUgaW1wYWN0CiAgICBteSAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnOwojIC0tLQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAjIGltcGFjdCBmaWVsZCB3YXMgZm91bmQKICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSBlcSAnSVRTTUltcGFjdCcgKSB7CgogICAgICAgICAgICAjIHN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGltcGFjdCBmaWVsZAogICAgICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnID0gJER5bmFtaWNGaWVsZENvbmZpZzsKICAgICAgICB9CiMgLS0tCiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZDsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGQgfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgbXkgJVNlcnZpY2U7CgogICAgaWYgKCAkU2VsZi0+e0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50fSApIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gJ0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0Jyk7CiAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ICAgICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oUGFyYW0gPT4gJ1ByaW9yaXR5UkMnKTsKICAgICAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbShQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnKSB8fCAnJzsKCiAgICAgICAgIyBjaGVjayBpZiBwcmlvcml0eSBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcgfHwgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnICkgewogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBzZXJ2aWNlIHdhcyBzZWxlY3RlZAogICAgICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBzZXJ2aWNlCiAgICAgICAgICAgICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUdldCgKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBJbmNpZGVudFN0YXRlID0+ICRDb25maWctPntTaG93SW5jaWRlbnRTdGF0ZX0gfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZWNhbGN1bGF0ZSBpbXBhY3QgaWYgaW1wYWN0IGlzIG5vdCBzZXQgdW50aWwgbm93CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gJiYgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBuZSAnRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICBteSAkRGVmYXVsdFNlbGVjdGlvbiA9ICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfTsKCiAgICAgICAgICAgICAgICBpZiAoJERlZmF1bHRTZWxlY3Rpb24pIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCBpbXBhY3QKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJERlZmF1bHRTZWxlY3Rpb247CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eVJDfSAmJiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZScpLT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHl9LAogICAgICAgICAgICAgICAgICAgIEltcGFjdCAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG5vIHNlcnZpY2Ugd2FzIHNlbGVjdGVkCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGRvIG5vdCBzaG93IHRoZSBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gPSAnJzsKCiAgICAgICAgICAgICMgc2hvdyBvbmx5IHRoZSBlbXB0eSBzZWxlY3Rpb24KICAgICAgICAgICAgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntQb3NzaWJsZVZhbHVlc30gPSB7fTsKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgdGhlIHNlbGVjdGVkIGltcGFjdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7SVRTTUltcGFjdH0gPSAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9OwogICAgfQoKIyAtLS0KCiAgICAjIHRyYW5zZm9ybSBwZW5kaW5nIHRpbWUsIHRpbWUgc3RhbXAgYmFzZWQgb24gdXNlciB0aW1lIHpvbmUKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXtZZWFyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01vbnRofQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0RheX0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtIb3VyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01pbnV0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJUdldFBhcmFtID0gJExheW91dE9iamVjdC0+VHJhbnNmb3JtRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkR2V0UGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdDaGF0RW5naW5lOjpBY3RpdmUnKSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ2hhdCBpcyBub3QgYWN0aXZlLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBPaywgdGFrZSB0aGUgY2hhdAogICAgICAgIG15ICVDaGF0UGFydGljaXBhbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5DaGF0UGFydGljaXBhbnRDaGVjaygKICAgICAgICAgICAgQ2hhdElEICAgICAgICA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgIENoYXR0ZXJUeXBlICAgPT4gJ1VzZXInLAogICAgICAgICAgICBDaGF0dGVySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQ2hhdHRlckFjdGl2ZSA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggISVDaGF0UGFydGljaXBhbnQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24uJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEdldCBwZXJtaXNzaW9ucwogICAgICAgIG15ICRQZXJtaXNzaW9uTGV2ZWwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5DaGF0UGVybWlzc2lvbkxldmVsR2V0KAogICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgaWYgb2JzZXJ2ZXIKICAgICAgICBpZiAoICRQZXJtaXNzaW9uTGV2ZWwgbmUgJ093bmVyJyAmJiAkUGVybWlzc2lvbkxldmVsIG5lICdQYXJ0aWNpcGFudCcgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24uJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICRQZXJtaXNzaW9uTGV2ZWwsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSB8fCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NyZWF0ZWQnICkgewogICAgICAgIG15ICVUaWNrZXQ7CiAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICB9CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGlmIHRoZXJlIGlzIG5vIHRpY2tldCBpZCEKICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CgogICAgICAgICAgICAjIG5vdGlmeSBpbmZvCiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldCAiJXMiIGNyZWF0ZWQhJywKICAgICAgICAgICAgICAgICAgICAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgTGluayA9PiAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0nCiAgICAgICAgICAgICAgICAgICAgLiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc3RvcmUgbGFzdCBxdWV1ZSBzY3JlZW4KICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fQogICAgICAgICAgICAmJiAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gIX4gL0FjdGlvbj1BZ2VudFRpY2tldFBob25lLwogICAgICAgICAgICAmJiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0gIX4gL0FjdGlvbj1BZ2VudFRpY2tldFBob25lLipMaW5rVGlja2V0SUQ9LwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzcGxpdCBhcnRpY2xlIGlmIGdpdmVuCiAgICAgICAgIyBnZXQgQXJ0aWNsZUlECiAgICAgICAgbXkgJUFydGljbGU7CiAgICAgICAgbXkgJUN1c3RvbWVyRGF0YTsKICAgICAgICBteSAkQXJ0aWNsZUZyb20gPSAnJzsKICAgICAgICBteSAlU3BsaXRUaWNrZXREYXRhOwogICAgICAgIGlmICggJEdldFBhcmFte0FydGljbGVJRH0gKSB7CgogICAgICAgICAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgICA9PiBUcmFuc2xhdGFibGUoJ1lvdSBuZWVkIHJvIHBlcm1pc3Npb24hJyksCiAgICAgICAgICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IGluZm9ybWF0aW9uIGZyb20gb3JpZ2luYWwgdGlja2V0IChTcGxpdFRpY2tldCkuCiAgICAgICAgICAgICVTcGxpdFRpY2tldERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JBcnRpY2xlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJUFydGljbGUgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGFydGljbGUgaXMgZnJvbSB0aGUgc2FtZSBUaWNrZXRJRCBhcyB3ZSBjaGVja2VkIHBlcm1pc3Npb25zIGZvci4KICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtUaWNrZXRJRH0gbmUgJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnQXJ0aWNsZSBkb2VzIG5vdCBiZWxvbmcgdG8gdGlja2V0ICVzIScsICRTZWxmLT57VGlja2V0SUR9ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNhdmUgYXJ0aWNsZSBmcm9tIGZvciBhZGRyZXNzZXMgbGlzdAogICAgICAgICAgICAkQXJ0aWNsZUZyb20gPSAkQXJ0aWNsZXtGcm9tfTsKCiAgICAgICAgICAgICMgaWYgVG8gaXMgcHJlc2VudAogICAgICAgICAgICAjIGFuZCBpcyBubyBhIHF1ZXVlCiAgICAgICAgICAgICMgYW5kIGFsc28gaXMgbm8gYSBzeXN0ZW0gYWRkcmVzcwogICAgICAgICAgICAjIHNldCBUbyBhcyBhcnRpY2xlIGZyb20KICAgICAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkQXJ0aWNsZXtUb30gKSApIHsKICAgICAgICAgICAgICAgIG15ICVRdWV1ZXMgPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdCgpOwoKICAgICAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUXVldWUgKCBzb3J0IGtleXMgJXsgJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRDb25maWdPYmplY3QtPntDdXN0b21lclBhbmVsT3duU2VsZWN0aW9ufS0+eyRRdWV1ZX07CiAgICAgICAgICAgICAgICAgICAgICAgICRRdWV1ZXN7JFF1ZXVlfSA9ICRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJVF1ZXVlTG9va3VwID0gcmV2ZXJzZSAlUXVldWVzOwogICAgICAgICAgICAgICAgbXkgJVN5c3RlbUFkZHJlc3NMb29rdXAKICAgICAgICAgICAgICAgICAgICA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0xpc3QoKTsKICAgICAgICAgICAgICAgIG15IEBBcnRpY2xlRnJvbUFkZHJlc3M7CiAgICAgICAgICAgICAgICBteSAkU3lzdGVtQWRkcmVzc0VtYWlsOwoKICAgICAgICAgICAgICAgIGlmICgkQXJ0aWNsZUZyb20pIHsKICAgICAgICAgICAgICAgICAgICBAQXJ0aWNsZUZyb21BZGRyZXNzID0gTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEFydGljbGVGcm9tKTsKICAgICAgICAgICAgICAgICAgICAkU3lzdGVtQWRkcmVzc0VtYWlsID0gJEFydGljbGVGcm9tQWRkcmVzc1swXS0+YWRkcmVzcygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFF1ZXVlTG9va3VweyAkQXJ0aWNsZXtUb30gfSAmJiBkZWZpbmVkICRTeXN0ZW1BZGRyZXNzTG9va3VweyRTeXN0ZW1BZGRyZXNzRW1haWx9ICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xlRnJvbSA9ICRBcnRpY2xle1RvfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBib2R5IHByZXBhcmF0aW9uIGZvciBwbGFpbiB0ZXh0IHByb2Nlc3NpbmcKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ICA9PiAkVXBsb2FkQ2FjaGVPYmplY3QsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50c0luY2x1ZGUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEFydGljbGV7Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgY3VzdG9tZXIgaW5mbwogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRTcGxpdFRpY2tldERhdGF7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRTcGxpdFRpY2tldERhdGF7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNwbGl0VGlja2V0RGF0YXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yIG15ICRLZXlDdXN0b21lclVzZXJMaXN0ICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xle0Zyb219ID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlckxpc3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG11bHRpcGxlIGFkZHJlc3NlcyBsaXN0CiAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgbXkgJENvdW50RnJvbSA9IHNjYWxhciBATXVsdGlwbGVDdXN0b21lciB8fCAxOwogICAgICAgIG15ICVDdXN0b21lckRhdGFGcm9tOwogICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlQ3VzdG9tZXJEYXRhRnJvbSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQXJ0aWNsZUZyb20pICkgewoKICAgICAgICAgICAgbXkgJENvdW50QXV4ICAgICAgICAgPSAkQ291bnRGcm9tOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkID0gJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gKCAkQ291bnRGcm9tIGVxICcxJyA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwogICAgICAgICAgICBteSAkRW1haWxBZGRyZXNzICAgICA9ICRFbWFpbC0+YWRkcmVzcygpOwogICAgICAgICAgICBpZiAoICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbEFkZHJlc3MgKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskRW1haWx9ICYmICRDdXN0b21lckVycm9yIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAkQ291bnRBdXggICAgICAgICA9ICRDb3VudEZyb20gLiAnRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXkgPSAnJzsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkQ3VzdG9tZXJEYXRhRnJvbXtVc2VyRW1haWx9CiAgICAgICAgICAgICAgICAmJiAkQ3VzdG9tZXJEYXRhRnJvbXtVc2VyRW1haWx9IGVxICRFbWFpbEFkZHJlc3MKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyS2V5ID0gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50ID0gJEVtYWlsQWRkcmVzczsKICAgICAgICAgICAgaWYgKCAkRW1haWwtPnBocmFzZSgpICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRWxlbWVudCA9ICRFbWFpbC0+cGhyYXNlKCkgLiAiIDwkRW1haWxBZGRyZXNzPiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXIsIHsKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJTZWxlY3RlZCA9PiAkQ3VzdG9tZXJTZWxlY3RlZCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvciwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3JNc2cgPT4gJEN1c3RvbWVyRXJyb3JNc2csCiAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkLAogICAgICAgICAgICB9OwogICAgICAgICAgICAkQWRkcmVzc2VzTGlzdHskRW1haWxBZGRyZXNzfSA9IDE7CiAgICAgICAgICAgICRDb3VudEZyb20rKzsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICBteSAlVXNlclByZWZlcmVuY2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzdG9yZSB0aGUgZHluYW1pYyBmaWVsZHMgZGVmYXVsdCB2YWx1ZXMgb3IgdXNlZCBzcGVjaWZpYyBkZWZhdWx0IHZhbHVlcyB0byBiZSB1c2VkIGFzCiAgICAgICAgIyBBQ0xzIGluZm8gZm9yIGFsbCBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkRGVmYXVsdHM7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfSApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwoKICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCB2YWx1ZSBmcm9tIGR5bmFtaWMgZmllbGQgY29uZmlnIChpZiBhbnkpCiAgICAgICAgICAgIG15ICREZWZhdWx0VmFsdWUgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJyc7CgogICAgICAgICAgICAjIG92ZXJyaWRlIHRoZSB2YWx1ZSBmcm9tIHVzZXIgcHJlZmVyZW5jZXMgaWYgaXMgc2V0CiAgICAgICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgJERlZmF1bHRWYWx1ZSA9ICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJERlZmF1bHRWYWx1ZSBlcSAnJzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgcmVmICREZWZhdWx0VmFsdWUgZXEgJ0FSUkFZJyAmJiAhSXNBcnJheVJlZldpdGhEYXRhKCREZWZhdWx0VmFsdWUpOwoKICAgICAgICAgICAgJER5bmFtaWNGaWVsZERlZmF1bHRzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREZWZhdWx0VmFsdWU7CiAgICAgICAgfQogICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGREZWZhdWx0czsKCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgbXkgJVNwbGl0VGlja2V0UGFyYW07CgogICAgICAgICMgaW4gY2FzZSBvZiBzcGxpdCBhIFRpY2tldElEIGFuZCBBcnRpY2xlSUQgYXJlIGFsd2F5cyBnaXZlbiwgc2VuZCB0aGUgVGlja2V0SUQgdG8gY2FsY3VsYXRlCiAgICAgICAgIyBBQ0xzIGJhc2VkIG9uIHBhcmVudCBpbmZvcm1hdGlvbgogICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRJRH0gJiYgJEFydGljbGV7QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17VGlja2V0SUR9ID0gJFNlbGYtPntUaWNrZXRJRH07CiAgICAgICAgfQoKICAgICAgICAjIGZpeCB0byBidWcjIDgwNjggRmllbGQgJiBEeW5hbWljRmllbGQgcHJlc2VsZWN0aW9uIG9uIFRpY2tldFNwbGl0CiAgICAgICAgIyB3aGVuIHNwbGl0dGluZyBhIHRpY2tldCB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlcyBtdXN0IHJlbWFpbiBpbiB0aGUgbmV3IHRpY2tldCBzY3JlZW4KICAgICAgICAjIHRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIFNwbGl0VGlja2V0UGFyYW0gaGFzaAogICAgICAgIGlmICggJFNwbGl0VGlja2V0UGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAgICAgIyBHZXQgaW5mb3JtYXRpb24gZnJvbSBvcmlnaW5hbCB0aWNrZXQgKFNwbGl0VGlja2V0KS4KICAgICAgICAgICAgbXkgJVNwbGl0VGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNwbGl0VGlja2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBzaW1wbGUgSURzIHRvIHBhc3MgdGhlbSB0byB0aGUgbWFzawogICAgICAgICAgICBmb3IgbXkgJFNwbGl0ZWRQYXJhbSAocXcoVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBQcmlvcml0eUlEKSkgewogICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17JFNwbGl0ZWRQYXJhbX0gPSAkU3BsaXRUaWNrZXREYXRheyRTcGxpdGVkUGFyYW19OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBTdGF0ZUlEIGFzIE5leHRTdGF0ZUlECiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte05leHRTdGF0ZUlEfSA9ICRTcGxpdFRpY2tldERhdGF7U3RhdGVJRH07CgogICAgICAgICAgICAjIHNldCBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17VXNlclNlbGVjdGVkfSAgICAgICAgICAgID0gJFNwbGl0VGlja2V0RGF0YXtPd25lcklEfTsKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9ID0gJFNwbGl0VGlja2V0RGF0YXtSZXNwb25zaWJsZUlEfTsKCiAgICAgICAgICAgICMgc2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9ICkgewogICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UXVldWVJRH0gPSAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte0FsbFVzZXJzfSA9IDE7CgogICAgICAgICAgICAjIHNldCB0aGUgc2VsZWN0ZWQgcXVldWUgaW4gZm9ybWF0IElEfHxOYW1lCiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte1RvU2VsZWN0ZWR9ID0gJFNwbGl0VGlja2V0RGF0YXtRdWV1ZUlEfSAuICd8fCcgLiAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlfTsKCiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVTcGxpdFRpY2tldERhdGEgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRLZXkgPX4gL0R5bmFtaWNGaWVsZFxfKC4qKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17RHluYW1pY0ZpZWxkfXskMX0gPSAkU3BsaXRUaWNrZXREYXRheyRLZXl9OwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkU3BsaXRUaWNrZXRQYXJhbXskS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0byBzdG9yZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gZGF0YWJhc2UgKG9yIHVuZGVmaW5lZCkKICAgICAgICAgICAgbXkgJFZhbHVlOwoKICAgICAgICAgICAgIyBpbiBjYXNlIG9mIHNwbGl0IGEgVGlja2V0SUQgYW5kIEFydGljbGVJRCBhcmUgYWx3YXlzIGdpdmVuLCBHZXQgdGhlIHZhbHVlCiAgICAgICAgICAgICMgZnJvbSBEQiB0aGlzIGNhc2VzCiAgICAgICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRJRH0gJiYgJEFydGljbGV7QXJ0aWNsZUlEfSApIHsKCiAgICAgICAgICAgICAgICAjIHNlbGVjdCBUaWNrZXRJRCBvciBBcnRpY2xlSUQgdG8gZ2V0IHRoZSB2YWx1ZSBkZXBlbmRpbmcgb24gZHluYW1pYyBmaWVsZCBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBteSAkT2JqZWN0SUQgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ1RpY2tldCcKICAgICAgICAgICAgICAgICAgICA/ICRTZWxmLT57VGlja2V0SUR9CiAgICAgICAgICAgICAgICAgICAgOiAkQXJ0aWNsZXtBcnRpY2xlSUR9OwoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UgKHNwbGl0KQogICAgICAgICAgICAgICAgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkT2JqZWN0SUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG90aGVyd2lzZSAob24gYSBuZXcgdGlja2V0KS4gQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIGEgdXNlciBzcGVjaWZpYyBkZWZhdWx0IHZhbHVlIGZvcgogICAgICAgICAgICAjIHRoZSBkeW5hbWljIGZpZWxkLCBvdGhlcndpc2Ugd2lsbCB1c2UgRHluYW1pYyBGaWVsZCBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIHZhbHVlIGZyb20gdXNlciBwcmVmZXJlbmNlcyBpZiBpcyBzZXQKICAgICAgICAgICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzICAgICAgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgICAgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhbmQgZm9ybWF0IGRlZmF1bHQgc3ViamVjdCBhbmQgYm9keQogICAgICAgIG15ICRTdWJqZWN0ID0gJEFydGljbGV7U3ViamVjdH07CiAgICAgICAgaWYgKCAhJFN1YmplY3QgKSB7CiAgICAgICAgICAgICRTdWJqZWN0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENvbmZpZy0+e1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkQm9keSA9ICRBcnRpY2xle0JvZHl9IHx8ICcnOwogICAgICAgIGlmICggISRCb2R5ICkgewogICAgICAgICAgICAkQm9keSA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRDb25maWctPntCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0IChpZiBib2R5IGlzIGJhc2VkIG9uIGNvbmZpZykKICAgICAgICBpZiAoICEkR2V0UGFyYW17QXJ0aWNsZUlEfSAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJEJvZHkgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQm9keSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaW4gY2FzZSBvZiB0aWNrZXQgc3BsaXQgc2V0ICRTZWxmLT57UXVldWVJRH0gYXMgdGhlIFF1ZXVlSUQgb2YgdGhlIG9yaWdpbmFsIHRpY2tldCwKICAgICAgICAjIGluIG9yZGVyIHRvIHNldCBjb3JyZWN0IEFDTHMgb24gcGFnZSBsb2FkIChpbml0aWFsKS4gU2VlIGJ1ZyA4Njg3LgogICAgICAgIGlmICgKICAgICAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoIFwlU3BsaXRUaWNrZXRQYXJhbSApCiAgICAgICAgICAgICYmICRTcGxpdFRpY2tldFBhcmFte1F1ZXVlSUR9CiAgICAgICAgICAgICYmICEkU2VsZi0+e1F1ZXVlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT57UXVldWVJRH0gPSAkU3BsaXRUaWNrZXRQYXJhbXtRdWV1ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgR2V0IHByZWRlZmluZWQgUXVldWVJRCAoaWYgbm8gcXVldWUgZnJvbSBzcGxpdCB0aWNrZXQgaXMgc2V0KS4KICAgICAgICBpZiAoICEkU2VsZi0+e1F1ZXVlSUR9ICYmICRHZXRQYXJhbXtEZXN0fSApIHsKCiAgICAgICAgICAgIG15IEBRdWV1ZVBhcnRzID0gc3BsaXQoIC9cfFx8LywgJEdldFBhcmFte0Rlc3R9ICk7CiAgICAgICAgICAgICRTZWxmLT57UXVldWVJRH0gPSAkUXVldWVQYXJ0c1swXTsKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17VG9TZWxlY3RlZH0gPSAkR2V0UGFyYW17RGVzdH07CiAgICAgICAgfQoKICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0gICAgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9ICAgICAgICAgfHwgMSwKICAgICAgICAgICAgU2VydmljZXMgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tQaG9uZU5ldygKICAgICAgICAgICAgUXVldWVJRCAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICBOZXh0U3RhdGVzID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSAgICAgICAgIHx8IDEsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9ICAgICAgICAgfHwgMSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgVHlwZXMgPT4gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSAgICAgICAgIHx8IDEsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFNlcnZpY2VzICAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgU0xBcyAgICAgICAgICAgICAgPT4gJFNMQXMsCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVzID0+ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAnJywKICAgICAgICAgICAgKSwKICAgICAgICAgICAgVXNlcnMgPT4gJFNlbGYtPl9HZXRVc2VycygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICApLAogICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJzID0+ICRTZWxmLT5fR2V0UmVzcG9uc2libGVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFRvID0+ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgIEZyb20gICAgICAgICA9PiAkQXJ0aWNsZXtGcm9tfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRTdWJqZWN0LAogICAgICAgICAgICBCb2R5ICAgICAgICAgPT4gJEJvZHksCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkU3BsaXRUaWNrZXREYXRhe0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRTcGxpdFRpY2tldERhdGF7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgIEN1c3RvbWVyRGF0YSA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgQXR0YWNobWVudHMgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgIExpbmtUaWNrZXRJRCA9PiAkR2V0UGFyYW17TGlua1RpY2tldElEfSB8fCAnJywKICAgICAgICAgICAgRnJvbUNoYXRJRCAgID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSB8fCAnJywKICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZEhUTUwgPT4gXCVEeW5hbWljRmllbGRIVE1MLAogICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyID0+IFxATXVsdGlwbGVDdXN0b21lciwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IHRpY2tldCBhbmQgYXJ0aWNsZQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlTmV3JyApIHsKCiAgICAgICAgbXkgJUVycm9yOwogICAgICAgIG15ICVTdGF0ZURhdGE7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV4dFN0YXRlSUR9ICkgewogICAgICAgICAgICAlU3RhdGVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJE5leHRTdGF0ZSA9ICRTdGF0ZURhdGF7TmFtZX0gfHwgJyc7CiAgICAgICAgbXkgJERlc3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKCiAgICAgICAgIyBzZWUgaWYgb25seSBhIG5hbWUgaGFzIGJlZW4gcGFzc2VkCiAgICAgICAgaWYgKCAkRGVzdCAmJiAkRGVzdCAhfiBteyBcQSAoXGQrKT8gXHwgXHwgLisgXHogfXhtcyApIHsKCiAgICAgICAgICAgICMgc2VlIGlmIHdlIGNhbiBnZXQgYW4gSUQgZm9yIHRoaXMgcXVldWUgbmFtZQogICAgICAgICAgICBteSAkRGVzdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFF1ZXVlID0+ICREZXN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCREZXN0SUQpIHsKICAgICAgICAgICAgICAgICREZXN0ID0gJERlc3RJRCAuICd8fCcgLiAkRGVzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREZXN0ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICggJE5ld1F1ZXVlSUQsICRUbyApID0gc3BsaXQoIC9cfFx8LywgJERlc3QgKTsKICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkTmV3UXVldWVJRDsKCiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ByZVNlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkU2VsZWN0ZWRDdXN0b21lclVzZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJJRCcgKSB8fCAnJzsKICAgICAgICBteSAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0V4cGFuZEN1c3RvbWVyTmFtZScgKQogICAgICAgICAgICB8fCAwOwogICAgICAgIG15ICVGcm9tRXh0ZXJuYWxDdXN0b21lcjsKICAgICAgICAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7Q3VzdG9tZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ByZVNlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CgogICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ093bmVyQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte093bmVyQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdSZXNwb25zaWJsZUFsbFJlZnJlc2gnICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0gPSAxOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xlYXJGcm9tJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAnJzsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDIgKSB7CiAgICAgICAgICAgIG15ICRJdGVtID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIkV4cGFuZEN1c3RvbWVyTmFtZSRDb3VudCIgKSB8fCAwOwogICAgICAgICAgICBpZiAoICRDb3VudCA9PSAxICYmICRJdGVtICkgewogICAgICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQ291bnQgPT0gMiAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJld3JhcCBib2R5IGlmIG5vIHJpY2ggdGV4dCBpcyB1c2VkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gJiYgISRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5XcmFwUGxhaW5UZXh0KAogICAgICAgICAgICAgICAgTWF4Q2hhcmFjdGVycyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpLAogICAgICAgICAgICAgICAgUGxhaW5UZXh0ICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBwZW5kaW5nIGRhdGUKICAgICAgICBpZiAoICEkRXhwYW5kQ3VzdG9tZXJOYW1lICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgYSBkYXRldGltZSBvYmplY3QgYmFzZWQgb24gcGVuZGluZyBkYXRlCiAgICAgICAgICAgIG15ICRQZW5kaW5nRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBTZWNvbmQgPT4gMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBjdXJyZW50IHN5c3RlbSBlcG9jaAogICAgICAgICAgICBteSAkQ3VyU3lzdGVtRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICAgICAgaWYgKCAhJFBlbmRpbmdEYXRlVGltZU9iamVjdCB8fCAkUGVuZGluZ0RhdGVUaW1lT2JqZWN0IDwgJEN1clN5c3RlbURhdGVUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdDsKCiAgICAgICAgICAgICMgZG8gbm90IHZhbGlkYXRlIG9uIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgICAgIGlmICggISRFeHBhbmRDdXN0b21lck5hbWUgKSB7CgogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICksCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBTZXJ2ZXJFcnJvciAgICAgICAgICA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSB8fCAnJywKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSAgICAgICAgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSB8fCAnJywKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzICAgICAgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgICAgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZXhwYW5kIGN1c3RvbWVyIG5hbWUKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YTsKICAgICAgICBpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMSApIHsKCiAgICAgICAgICAgICMgc2VhcmNoIGN1c3RvbWVyCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0OwogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgU2VhcmNoICAgICAgICAgICA9PiAkR2V0UGFyYW17RnJvbX0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJPbmx5ID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGp1c3Qgb25lIGN1c3RvbWVyIHVzZXIgZXhpc3RzCiAgICAgICAgICAgICMgaWYganVzdCBvbmUsIGZpbGx1cCBDdXN0b21lclVzZXJJRCBhbmQgQ3VzdG9tZXJJRAogICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9IDA7CiAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0rKzsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH0gICAgID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlcn07CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3RVc2VyfSA9ICRLZXlDdXN0b21lclVzZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSA9PSAxICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ICAgICAgICAgICAgPSAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdExhc3R9OwogICAgICAgICAgICAgICAgJEVycm9ye0V4cGFuZEN1c3RvbWVyTmFtZX0gPSAxOwogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0VXNlcn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn07CiAgICAgICAgICAgICAgICAgICAgJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntFbWFpbH0gPSAkRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhe1VzZXJFbWFpbH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgbW9yZSB0aGFuIG9uZSBjdXN0b21lciB1c2VyIGV4aXN0LCBzaG93IGxpc3QKICAgICAgICAgICAgIyBhbmQgY2xlYW4gQ3VzdG9tZXJVc2VySUQgYW5kIEN1c3RvbWVySUQKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBkb24ndCBjaGVjayBlbWFpbCBzeW50YXggb24gbXVsdGkgY3VzdG9tZXIgc2VsZWN0CiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IDAKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICcnOwoKICAgICAgICAgICAgICAgICMgY2xlYXIgZnJvbSBpZiB0aGVyZSBpcyBubyBjdXN0b21lciBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAhJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyb20gYW5kIGN1c3RvbWVyIGlkIGlmIGN1c3RvbWVyIHVzZXIgaXMgZ2l2ZW4KICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMiApIHsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlcn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gKSB7CiAgICAgICAgICAgICAgICBteSAlRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEZyb21FeHRlcm5hbEN1c3RvbWVye0VtYWlsfSA9ICRFeHRlcm5hbEN1c3RvbWVyVXNlckRhdGF7VXNlck1haWxTdHJpbmd9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRFcnJvcntFeHBhbmRDdXN0b21lck5hbWV9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgaWYgYSBuZXcgZGVzdGluYXRpb24gcXVldWUgaXMgc2VsZWN0ZWQKICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMyApIHsKICAgICAgICAgICAgJEVycm9ye05vU3VibWl0fSA9IDE7CiAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkU2VsZWN0ZWRDdXN0b21lclVzZXI7CiAgICAgICAgfQoKICAgICAgICAjICdqdXN0JyBubyBzdWJtaXQKICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gNCApIHsKICAgICAgICAgICAgJEVycm9ye05vU3VibWl0fSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgY3VzdG9tZXIgaW5mbwogICAgICAgIG15ICVDdXN0b21lckRhdGE7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2UnKSApIHsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciApIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlciB8fCAkU2VsZWN0ZWRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkQ3VzdG9tZXJJRCkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJEdldFBhcmFte0Zyb219ICkgKSB7CiAgICAgICAgICAgIGlmICggISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcntFcnJvclR5cGV9ICAgPSAkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0Vycm9yVHlwZSgpIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRFcnJvcntGcm9tSW52YWxpZH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJEV4cGFuZEN1c3RvbWVyTmFtZSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0Zyb219ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydGcm9tSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJE5ld1F1ZXVlSUQgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0Rlc3RpbmF0aW9uSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzZXJ2aWNlCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgICAgICYmICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzbGEKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NMQU1hbmRhdG9yeX0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU0xBSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggKCAhJEdldFBhcmFte1R5cGVJRH0gKSAmJiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVHlwZUlESW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydSaWNoVGV4dEludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKQogICAgICAgICAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17VGltZVVuaXRzfSBlcSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1RpbWVVbml0c0ludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGdldCBhbmQgZm9ybWF0IGRlZmF1bHQgc3ViamVjdCBhbmQgYm9keQogICAgICAgICAgICBteSAkU3ViamVjdCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRDb25maWctPntTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRCb2R5ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJENvbmZpZy0+e0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRCb2R5ID0gJExheW91dE9iamVjdC0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgI3NldCBCb2R5IGFuZCBTdWJqZWN0IHBhcmFtZXRlcnMgZm9yIE91dHB1dAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkU3ViamVjdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJEJvZHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHNlcnZpY2VzCiAgICAgICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZXNldCBwcmV2aW91cyBTZXJ2aWNlSUQgdG8gcmVzZXQgU0xBLUxpc3QgaWYgbm8gc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U2VydmljZUlEfSB8fCAhJFNlcnZpY2VzLT57ICRHZXRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU0xBcyA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgU2VydmljZXMgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBoZWFkZXIKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgICAgICMgaHRtbCBvdXRwdXQKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tQaG9uZU5ldygKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJzICAgPT4gJFNlbGYtPl9HZXRVc2VycygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVXNlclNlbGVjdGVkICAgICA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlcnMgPT4gJFNlbGYtPl9HZXRSZXNwb25zaWJsZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VyU2VsZWN0ZWQgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgTmV4dFN0YXRlcyAgICAgICAgICAgICAgPT4gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAkU2VsZWN0ZWRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRCB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZSAgPT4gJE5leHRTdGF0ZSwKICAgICAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAkU2VsZWN0ZWRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRCB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFR5cGVzID0+ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgU2VydmljZXMgICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgU0xBcyAgICAgICAgICAgICAgPT4gJFNMQXMsCiAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlcyA9PiAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRCB8fCAnJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBDdXN0b21lcklEICAgPT4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ3VzdG9tZXJJRCApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICAgICBUbyAgICAgICAgICAgPT4gJFNlbGYtPl9HZXRUb3MoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlECiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVG9TZWxlY3RlZCAgPT4gJERlc3QsCiAgICAgICAgICAgICAgICBFcnJvcnMgICAgICA9PiBcJUVycm9yLAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZEhUTUwgICAgID0+IFwlRHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXIgICAgID0+IFxATXVsdGlwbGVDdXN0b21lciwKICAgICAgICAgICAgICAgIEZyb21FeHRlcm5hbEN1c3RvbWVyID0+IFwlRnJvbUV4dGVybmFsQ3VzdG9tZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFR5cGVJRCAgICAgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgU2VydmljZUlEICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBTTEFJRCAgICAgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgIFByaW9yaXR5SUQgICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgIE93bmVySUQgICAgICA9PiAxLAogICAgICAgICAgICBDdXN0b21lck5vICAgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkU2VsZWN0ZWRDdXN0b21lclVzZXIsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdGlja2V0IGR5bmFtaWMgZmllbGRzCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdUaWNrZXQnOwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICBpZiAoICRTZWxmLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9ICYmICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNvbmZpZyBmb3IgY3JpdGljYWxpdHkgZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Dcml0aWNhbGl0eScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBwb3NzaWJsZSB2YWx1ZXMgZm9yIGNyaXRpY2FsaXR5CiAgICAgICAgICAgIG15ICRDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmV2ZXJzZSB0aGUgbGlzdCB0byBmaW5kIG91dCB0aGUga2V5CiAgICAgICAgICAgIG15ICVSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlcyA9IHJldmVyc2UgJXsgJENyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgfTsKCiAgICAgICAgICAgICMgc2V0IHRoZSBjcml0aWNhbGl0eQogICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkUmV2ZXJzZUNyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXN7ICRTZXJ2aWNle0NyaXRpY2FsaXR5fSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgLS0tCgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICApOwogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudERhdGEsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgfQoKICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAjIHJlbW92ZSB1bnVzZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICBteSBATmV3QXR0YWNobWVudERhdGE7CiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgZm9yIGxpbmsgZW5jb2RlIG9mIHJpY2ggdGV4dCBlZGl0b3IsIHNlZSBidWcjNTA1MwogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkKICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciBpbmxpbmUgaW1hZ2VzIGFuZCBub3JtYWwgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIHB1c2ggQE5ld0F0dGFjaG1lbnREYXRhLCBcJXskQXR0YWNobWVudH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQEF0dGFjaG1lbnREYXRhID0gQE5ld0F0dGFjaG1lbnREYXRhOwoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFBsYWluQm9keSA9ICRHZXRQYXJhbXtCb2R5fTsKCiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJFBsYWluQm9keSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0MkFzY2lpKCBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9ICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIG5ldyBvd25lciBpcyBnaXZlbiAodGhlbiBzZW5kIG5vIGFnZW50IG5vdGlmeSkKICAgICAgICBteSAkTm9BZ2VudE5vdGlmeSA9IDA7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3VXNlcklEfSApIHsKICAgICAgICAgICAgJE5vQWdlbnROb3RpZnkgPSAxOwogICAgICAgIH0KICAgICAgICBteSAkQXJ0aWNsZU9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CiAgICAgICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnUGhvbmUnICk7CiAgICAgICAgbXkgJEFydGljbGVJRCAgICAgICAgICAgID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICBOb0FnZW50Tm90aWZ5ICAgICAgICA9PiAkTm9BZ2VudE5vdGlmeSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAkQ29uZmlnLT57U2VuZGVyVHlwZX0sCiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+ICRDb25maWctPntJc1Zpc2libGVGb3JDdXN0b21lcn0sCiAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgICAgICAgPT4gJFRvLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIEJvZHkgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICRDb25maWctPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICRDb25maWctPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCiAgICAgICAgICAgID8gJ2F1dG8gcmVwbHknCiAgICAgICAgICAgIDogJycsCiAgICAgICAgICAgIE9yaWdIZWFkZXIgPT4gewogICAgICAgICAgICAgICAgRnJvbSAgICA9PiAkR2V0UGFyYW17RnJvbX0sCiAgICAgICAgICAgICAgICBUbyAgICAgID0+ICRHZXRQYXJhbXtUb30sCiAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgIEJvZHkgICAgPT4gJFBsYWluQm9keSwKCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFF1ZXVlID0+ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKSwKICAgICAgICApOwogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnQXJ0aWNsZSc7CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUGVybWlzc2lvbnMgY2hlY2sgd2VyZSBkb25lIGVhcmxpZXIKICAgICAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICAgICAgbXkgJENoYXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpOwogICAgICAgICAgICBteSAlQ2hhdCAgICAgICA9ICRDaGF0T2JqZWN0LT5DaGF0R2V0KAogICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgQENoYXRNZXNzYWdlTGlzdCA9ICRDaGF0T2JqZWN0LT5DaGF0TWVzc2FnZUxpc3QoCiAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkQ2hhdEFydGljbGVJRDsKCiAgICAgICAgICAgIGlmIChAQ2hhdE1lc3NhZ2VMaXN0KSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJE1lc3NhZ2UgKEBDaGF0TWVzc2FnZUxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAkTWVzc2FnZS0+e01lc3NhZ2VUZXh0fSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgICAgICAgID0+ICRNZXNzYWdlLT57TWVzc2FnZVRleHR9LAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rRmVhdHVyZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEFydGljbGVDaGF0QmFja2VuZCA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQ2hhbm5lbCggQ2hhbm5lbE5hbWUgPT4gJ0NoYXQnICk7CiAgICAgICAgICAgICAgICAkQ2hhdEFydGljbGVJRCA9ICRBcnRpY2xlQ2hhdEJhY2tlbmQtPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICRDb25maWctPntTZW5kZXJUeXBlfSwKICAgICAgICAgICAgICAgICAgICBDaGF0TWVzc2FnZUxpc3QgICAgICA9PiBcQENoYXRNZXNzYWdlTGlzdCwKICAgICAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAkQ29uZmlnLT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICRDb25maWctPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRDaGF0QXJ0aWNsZUlEKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpcyBjdXN0b21lciBhY3RpdmVseSBwcmVzZW50CiAgICAgICAgICAgICAgICAjIGl0IG1lYW5zIGN1c3RvbWVyIGhhcyBhY2NlcHRlZCB0aGlzIGNoYXQgYW5kIG5vdCBsZWZ0IGl0IQogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyUHJlc2VudCA9ICRDaGF0T2JqZWN0LT5DdXN0b21lclByZXNlbnQoCiAgICAgICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICAgICBBY3RpdmUgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3M7CgogICAgICAgICAgICAgICAgIyBpZiB0aGVyZSBpcyBubyBjdXN0b21lciBwcmVzZW50IGluIHRoZSBjaGF0CiAgICAgICAgICAgICAgICAjIGp1c3QgcmVtb3ZlIHRoZSBjaGF0CiAgICAgICAgICAgICAgICBpZiAoICEkQ3VzdG9tZXJQcmVzZW50ICkgewogICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJENoYXRPYmplY3QtPkNoYXREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIENoYXRJRCA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSBzZXQgY2hhdCBzdGF0dXMgdG8gY2xvc2VkIGFuZCBpbmZvcm0gb3RoZXIgYWdlbnRzCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9ICRDaGF0T2JqZWN0LT5DaGF0VXBkYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBDaGF0SUQgICAgID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICAgICA9PiAnY2xvc2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRlZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJFJlcXVlc3Rlck5hbWUgPSAkVXNlcntVc2VyRnVsbG5hbWV9OwogICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0ZXJOYW1lIHx8PSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgICAgICAgICAgICAgIG15ICRMZWF2ZU1lc3NhZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGhhcyBsZWZ0IHRoZSBjaGF0LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICRSZXF1ZXN0ZXJOYW1lLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJENoYXRPYmplY3QtPkNoYXRNZXNzYWdlQWRkKAogICAgICAgICAgICAgICAgICAgICAgICBDaGF0SUQgICAgICAgICAgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBDaGF0dGVySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBDaGF0dGVyVHlwZSAgICAgPT4gJ1VzZXInLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVGV4dCAgICAgPT4gJExlYXZlTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtR2VuZXJhdGVkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyB0aW1lIGFmdGVyIGNoYXQgd2lsbCBiZSByZW1vdmVkCiAgICAgICAgICAgICAgICAgICAgbXkgJENoYXRUVEwgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0NoYXRFbmdpbmU6OkNoYXRUVEwnKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJENoYXRDbG9zZWRNZXNzYWdlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGNoYXQgaGFzIGJlZW4gY2xvc2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJXMgaG91cnMuIiwKICAgICAgICAgICAgICAgICAgICAgICAgJENoYXRUVEwsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQ2hhdE9iamVjdC0+Q2hhdE1lc3NhZ2VBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgIENoYXRJRCAgICAgICAgICA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENoYXR0ZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENoYXR0ZXJUeXBlICAgICA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VUZXh0ICAgICA9PiAkQ2hhdENsb3NlZE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbUdlbmVyYXRlZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGFsbCBBR0VOVCBwYXJ0aWNpcGFudHMgZnJvbSBjaGF0CiAgICAgICAgICAgICAgICAgICAgbXkgQFBhcnRpY2lwYW50c0xpc3QgPSAkQ2hhdE9iamVjdC0+Q2hhdFBhcnRpY2lwYW50TGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIENIQVRQQVJUSUNJUEFOVDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJENoYXRQYXJ0aWNpcGFudCAoQFBhcnRpY2lwYW50c0xpc3QpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCBpdCB0aGlzIHBhcnRpY2lwYW50IGlzIG5vdCBhZ2VudAogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IENIQVRQQVJUSUNJUEFOVCBpZiAkQ2hhdFBhcnRpY2lwYW50LT57Q2hhdHRlclR5cGV9IG5lICdVc2VyJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHRoaXMgcGFydGljaXBhbnRzIGZyb20gdGhlIGNoYXQKICAgICAgICAgICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkQ2hhdE9iamVjdC0+Q2hhdFBhcnRpY2lwYW50UmVtb3ZlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhdElEICAgICAgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhdHRlcklEICAgPT4gJENoYXRQYXJ0aWNpcGFudC0+e0NoYXR0ZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGF0dGVyVHlwZSA9PiAnVXNlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBvd25lciAoaWYgbmV3IHVzZXIgaWQgaXMgZ2l2ZW4pCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3VXNlcklEfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGxvY2sKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZWxzZSBzZXQgb3duZXIgdG8gY3VycmVudCBhZ2VudCBidXQgZG8gbm90IGxvY2sgaXQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHJlc3BvbnNpYmxlIChpZiBuZXcgdXNlciBpZCBpcyBnaXZlbikKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50RGF0YSkgewogICAgICAgICAgICAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0ZWQgYXR0YWNobWVudHMKICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAjIGxpbmsgdGlja2V0cwogICAgICAgIGlmICgKICAgICAgICAgICAgJEdldFBhcmFte0xpbmtUaWNrZXRJRH0KICAgICAgICAgICAgJiYgJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9CiAgICAgICAgICAgICYmICRDb25maWctPntTcGxpdExpbmtUeXBlfS0+e0xpbmtUeXBlfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U3BsaXRMaW5rVHlwZX0tPntEaXJlY3Rpb259CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICAgID0+IFRyYW5zbGF0YWJsZSgnWW91IG5lZWQgcm8gcGVybWlzc2lvbiEnKSwKICAgICAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNvdXJjZUtleSA9ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9OwogICAgICAgICAgICBteSAkVGFyZ2V0S2V5ID0gJFRpY2tldElEOwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57U3BsaXRMaW5rVHlwZX0tPntEaXJlY3Rpb259IGVxICdTb3VyY2UnICkgewogICAgICAgICAgICAgICAgJFNvdXJjZUtleSA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICRUYXJnZXRLZXkgPSAkR2V0UGFyYW17TGlua1RpY2tldElEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBsaW5rIHRoZSB0aWNrZXRzCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtBZGQoCiAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGFyZ2V0S2V5LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRDb25maWctPntTcGxpdExpbmtUeXBlfS0+e0xpbmtUeXBlfSB8fCAnTm9ybWFsJywKICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2xvc2VkIHRpY2tldHMgZ2V0IHVubG9ja2VkCiAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CgogICAgICAgICAgICAjIHNldCBsb2NrCiAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgaWYgKCAkU2VsZi0+e0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50fSApIHsKCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wb3JhcmlseSBsaW5rcwogICAgICAgICAgICBteSAkVGVtcExpbmtMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0xpc3QoCiAgICAgICAgICAgICAgICBPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgU3RhdGUgID0+ICdUZW1wb3JhcnknLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFRlbXBMaW5rTGlzdCAmJiByZWYgJFRlbXBMaW5rTGlzdCBlcSAnSEFTSCcgJiYgJXskVGVtcExpbmtMaXN0fSApIHsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJFRhcmdldE9iamVjdE9yZyAoIHNvcnQga2V5cyAleyRUZW1wTGlua0xpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdHlwZWxpc3QKICAgICAgICAgICAgICAgICAgICBteSAkVHlwZUxpc3QgPSAkVGVtcExpbmtMaXN0LT57JFRhcmdldE9iamVjdE9yZ307CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVHlwZSAoIHNvcnQga2V5cyAleyRUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkVHlwZUxpc3QtPnskVHlwZX07CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyREaXJlY3Rpb25MaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFRhcmdldEtleU9yZyAoIHNvcnQga2V5cyAleyAkRGlyZWN0aW9uTGlzdC0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSB0ZW1wIGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QxID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkxICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MiA9PiAkVGFyZ2V0T2JqZWN0T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkyICAgID0+ICRUYXJnZXRLZXlPcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXRPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0S2V5ICAgID0gJFRpY2tldElEOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREaXJlY3Rpb24gZXEgJ1RhcmdldCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNvdXJjZUtleSAgICA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldE9iamVjdCA9ICRUYXJnZXRPYmplY3RPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIHBlcm1hbmVudGx5IGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAkU291cmNlT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICRUYXJnZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGFyZ2V0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgLS0tCgogICAgICAgICMgZ2V0IHJlZGlyZWN0IHNjcmVlbgogICAgICAgIG15ICROZXh0U2NyZWVuID0gJFNlbGYtPntVc2VyQ3JlYXRlTmV4dE1hc2t9IHx8ICdBZ2VudFRpY2tldFBob25lJzsKCiAgICAgICAgIyByZWRpcmVjdAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbjtTdWJhY3Rpb249Q3JlYXRlZDtUaWNrZXRJRD0kVGlja2V0SUQiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CiAgICAgICAgbXkgJERlc3QgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApOwogICAgICAgIG15ICRFbGVtZW50Q2hhbmdlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcgKSB8fCAnJzsKICAgICAgICBteSAkUXVldWVJRCAgICAgICAgPSAnJzsKICAgICAgICBpZiAoICREZXN0ID1+IC9eKFxkezEsMTAwfSlcfFx8Lis/JC8gKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJDE7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsaXN0IHR5cGUKICAgICAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRUb3MgPSAkU2VsZi0+X0dldFRvcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE5ld1RvczsKCiAgICAgICAgaWYgKCRUb3MpIHsKICAgICAgICAgICAgVE9zOgogICAgICAgICAgICBmb3IgbXkgJEtleVRvICggc29ydCBrZXlzICV7JFRvc30gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRUb3MtPnskS2V5VG99IGVxICctJyApOwogICAgICAgICAgICAgICAgJE5ld1Rvcy0+eyIkS2V5VG98fCRUb3MtPnskS2V5VG99In0gPSAkVG9zLT57JEtleVRvfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAkVXNlcnMgPSAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkUmVzcG9uc2libGVVc2VycyA9ICRTZWxmLT5fR2V0UmVzcG9uc2libGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkTmV4dFN0YXRlcyA9ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICAgICBTZXJ2aWNlcyAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgKTsKICAgICAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgUXVldWVJRCA9PiAkUXVldWVJRCB8fCAnJywKICAgICAgICApOwogICAgICAgIG15ICRUeXBlcyA9ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyB1cGRhdGUgRHluYW1pYyBGaWVsZHMgUG9zc2libGUgVmFsdWVzIHZpYSBBSkFYCiAgICAgICAgbXkgQER5bmFtaWNGaWVsZEFKQVg7CgogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc30gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgKSB8fCAkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgbXkgQFRlbXBsYXRlQUpBWDsKCiAgICAgICAgIyB1cGRhdGUgdGlja2V0IGJvZHkgYW5kIGF0dGFjaGVtZW50cyBpZiBuZWVkZWQuCiAgICAgICAgaWYgKCAkRWxlbWVudENoYW5nZWQgZXEgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgKSB7CiAgICAgICAgICAgIG15IEBUaWNrZXRBdHRhY2htZW50czsKICAgICAgICAgICAgbXkgJFRlbXBsYXRlVGV4dDsKCiAgICAgICAgICAgICMgcmVtb3ZlIGFsbCBhdHRhY2htZW50cyBmcm9tIHRoZSBVcGxvYWQgY2FjaGUKICAgICAgICAgICAgbXkgJFJlbW92ZVN1Y2Nlc3MgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRSZW1vdmVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRm9ybSBhdHRhY2htZW50cyBjb3VsZCBub3QgYmUgZGVsZXRlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIHRlbXBsYXRlIHRleHQgYW5kIHNldCBuZXcgYXR0YWNobWVudHMgaWYgYSB0ZW1wbGF0ZSBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoIElzUG9zaXRpdmVJbnRlZ2VyKCAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSApICkgewogICAgICAgICAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yJyk7CgogICAgICAgICAgICAgICAgIyBzZXQgdGVtcGxhdGUgdGV4dCwgcmVwbGFjZSBzbWFydCB0YWdzIChsaW1pdGVkIGFzIHRpY2tldCBpcyBub3QgY3JlYXRlZCkKICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlRlbXBsYXRlKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIFN0ZEF0dGFjaG1lbnRPYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIHRpY2tldAogICAgICAgICAgICAgICAgbXkgJUFsbFN0ZEF0dGFjaG1lbnRzID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzRGF0YSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VuZCBhIGxpc3Qgb2YgYXR0YWNobWVudHMgaW4gdGhlIHVwbG9hZCBjYWNoZSBiYWNrIHRvIHRoZSBjbGllbnRzaWRlIEphdmFTY3JpcHQKICAgICAgICAgICAgICAgICMgd2hpY2ggcmVuZGVycyB0aGVuIHRoZSBsaXN0IG9mIGN1cnJlbnRseSB1cGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgQFRpY2tldEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAVGlja2V0QXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSA9ICRMYXlvdXRPYmplY3QtPkh1bWFuUmVhZGFibGVEYXRhU2l6ZSgKICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9PiAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBAVGVtcGxhdGVBSkFYID0gKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZVRlbXBsYXRlQ3JlYXRlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICcwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFRlbXBsYXRlVGV4dCB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1RpY2tldEF0dGFjaG1lbnRzJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcQFRpY2tldEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgICAgIEtlZXBEYXRhID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkTmV3VG9zLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkRGVzdCwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFVzZXJzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUmVzcG9uc2libGVVc2VycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJE5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRQcmlvcml0aWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFN0YW5kYXJkVGVtcGxhdGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRUeXBlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIEBUZW1wbGF0ZUFKQVgsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBTdWJhY3Rpb24hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQp9CgpzdWIgX0dldE5leHRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlTmV4dFN0YXRlczsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJU5leHRTdGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVOZXh0U3RhdGVzOwp9CgpzdWIgX0dldFVzZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte0FsbFVzZXJzfSApIHsKICAgICAgICBteSBAVXNlcklEcyA9ICRUaWNrZXRPYmplY3QtPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRLZXlHcm91cE1lbWJlciAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVUlEIChAVXNlcklEcykgewogICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRLZXlHcm91cE1lbWJlciApIHsKICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBbGxHcm91cHNNZW1iZXJzeyRLZXlHcm91cE1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGFsbCBzeXN0ZW0gdXNlcnMKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IGFsbCB1c2VycyB3aG8gYXJlIG93bmVyIG9yIHJ3IGluIHRoZSBxdWV1ZSBncm91cAogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgbXkgJEdJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9ICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICApOwogICAgICAgIGZvciBteSAkS2V5TWVtYmVyICggc29ydCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICBpZiAoICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JEtleU1lbWJlcn0gPSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5TWVtYmVyfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHdvcmtmbG93CiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICVQYXJhbSwKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ093bmVyJywKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIHsgJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpIH0gaWYgJEFDTDsKCiAgICByZXR1cm4gXCVTaG93blVzZXJzOwp9CgpzdWIgX0dldFJlc3BvbnNpYmxlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXJzCiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBqdXN0IHNob3cgb25seSB1c2VycyB3aXRoIHNlbGVjdGVkIGN1c3RvbSBxdWV1ZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgQFVzZXJJRHMgPSAkVGlja2V0T2JqZWN0LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgIGZvciBteSAkS2V5R3JvdXBNZW1iZXIgKCBzb3J0IGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkS2V5R3JvdXBNZW1iZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5R3JvdXBNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBhbGwgc3lzdGVtIHVzZXJzCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBhbGwgdXNlcnMgd2hvIGFyZSByZXNwb25zaWJsZSBvciBydyBpbiB0aGUgcXVldWUgZ3JvdXAKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15ICRHSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Hcm91cEdldCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEtleU1lbWJlciAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkQWxsR3JvdXBzTWVtYmVyc3skS2V5TWVtYmVyfSApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlUHJpb3JpdGllcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0VHlwZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0eXBlCiAgICBteSAlVHlwZTsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVR5cGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZTsKCiAgICAjIGNoZWNrIG5lZWRlZAogICAgcmV0dXJuIFwlU2VydmljZSBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIKICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpEZWZhdWx0OjpVbmtub3duQ3VzdG9tZXInKTsKCiAgICAjIGNoZWNrIGlmIG5vIEN1c3RvbWVyVXNlcklEIGlzIHNlbGVjdGVkCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDAgbGVhdmUgQ3VzdG9tZXJVc2VySUQgZW1wdHksIGl0IHdpbGwgbm90IGdldCBhbnkgc2VydmljZXMKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMSBzZXQgQ3VzdG9tZXJVc2VySUQgdG8gZ2V0IGRlZmF1bHQgc2VydmljZXMKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gJiYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAnPERFRkFVTFQ+JzsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlU2VydmljZTsKfQoKc3ViIF9HZXRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRUb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdUb3M7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSApIHsKICAgICAgICAlTmV3VG9zID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpIH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBTZWxlY3Rpb25UeXBlIFF1ZXVlIG9yIFN5c3RlbUFkZHJlc3M/CiAgICAgICAgbXkgJVRvczsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgJVRvcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+TW92ZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICAgICAgQWN0aW9uICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVUb3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLT5TeXN0ZW1BZGRyZXNzUXVldWVMaXN0KCk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjcmVhdGUgcGVybWlzc2lvbiBxdWV1ZXMKICAgICAgICBteSAlVXNlckdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICk7CgogICAgICAgIG15ICRTeXN0ZW1BZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKTsKICAgICAgICBteSAkUXVldWVPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgICAgICBRVUVVRUlEOgogICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQga2V5cyAlVG9zICkgewoKICAgICAgICAgICAgbXkgJVF1ZXVlRGF0YSA9ICRRdWV1ZU9iamVjdC0+UXVldWVHZXQoIElEID0+ICRRdWV1ZUlEICk7CgogICAgICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2ssIGNhbiB3ZSBjcmVhdGUgbmV3IHRpY2tldHMgaW4gcXVldWUKICAgICAgICAgICAgbmV4dCBRVUVVRUlEIGlmICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9OwoKICAgICAgICAgICAgbXkgJFN0cmluZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25TdHJpbmcnKQogICAgICAgICAgICAgICAgfHwgJzxSZWFsbmFtZT4gPDxFbWFpbD4+IC0gUXVldWU6IDxRdWV1ZT4nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlPi8kUXVldWVEYXRhe05hbWV9L2c7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWVDb21tZW50Pi8kUXVldWVEYXRhe0NvbW1lbnR9L2c7CgogICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMKICAgICAgICAgICAgaWYgKCAhJFF1ZXVlRGF0YXtDb21tZW50fSApIHsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gc3tccytcen17fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIG5lICdRdWV1ZScgKSB7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0RhdGEgPSAkU3lzdGVtQWRkcmVzc09iamVjdC0+U3lzdGVtQWRkcmVzc0dldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkVG9zeyRRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHMvPFJlYWxuYW1lPi8kU3lzdGVtQWRkcmVzc0RhdGF7UmVhbG5hbWV9L2c7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHMvPEVtYWlsPi8kU3lzdGVtQWRkcmVzc0RhdGF7TmFtZX0vZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTmV3VG9zeyRRdWV1ZUlEfSA9ICRTdHJpbmc7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGVtcHR5IHNlbGVjdGlvbgogICAgJE5ld1Rvc3snJ30gPSAnLSc7CiAgICByZXR1cm4gXCVOZXdUb3M7Cn0KCnN1YiBfR2V0U3RhbmRhcmRUZW1wbGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVGVtcGxhdGVzOwogICAgbXkgJFF1ZXVlSUQgPSAkUGFyYW17UXVldWVJRH0gfHwgJyc7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUXVldWVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgaWYgKCAhJFF1ZXVlSUQgKSB7CiAgICAgICAgbXkgJFVzZXJEZWZhdWx0UXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlVzZXJEZWZhdWx0UXVldWUnKSB8fCAnJzsKCiAgICAgICAgaWYgKCRVc2VyRGVmYXVsdFF1ZXVlKSB7CiAgICAgICAgICAgICRRdWV1ZUlEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFVzZXJEZWZhdWx0UXVldWUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFF1ZXVlSUQgJiYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgaWYgKCAhJFF1ZXVlSUQgJiYgJFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgIyBnZXQgUXVldWVJRCBmcm9tIHRoZSB0aWNrZXQKICAgICAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRRdWV1ZUlEID0gJFRpY2tldHtRdWV1ZUlEfSB8fCAnJzsKICAgIH0KCiAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfSApOwoKICAgICMgcmV0dXJuIGp1c3QgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBzY3JlZW4KICAgIHJldHVybiAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfTsKfQoKc3ViIF9NYXNrUGhvbmVOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgc2V0IEpTIGRhdGEKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJTZWFyY2gnLAogICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgU2hvd0N1c3RvbWVyVGlja2V0cyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlNob3dDdXN0b21lclRpY2tldHMnKSwKICAgICAgICAgICAgQWxsb3dNdWx0aXBsZUZyb20gICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmU6OkFsbG93TXVsdGlwbGVGcm9tJyksCiAgICAgICAgfSwKICAgICk7CgogICAgIyBidWlsZCBzdHJpbmcKICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17VXNlcnN9LAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VXNlclNlbGVjdGVkfSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdVc2VySUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgJFBhcmFte05leHRTdGF0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFBhcmFte05leHRTdGF0ZXN9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRQYXJhbXtOZXh0U3RhdGV9IHx8ICRDb25maWctPntTdGF0ZURlZmF1bHR9LAogICAgKTsKCiAgICAjIGJ1aWxkIHRvIHN0cmluZwogICAgbXkgJU5ld1RvOwogICAgaWYgKCAkUGFyYW17VG99ICkgewogICAgICAgIGZvciBteSAkS2V5VG8gKCBzb3J0IGtleXMgJXsgJFBhcmFte1RvfSB9ICkgewogICAgICAgICAgICAkTmV3VG97IiRLZXlUb3x8JFBhcmFte1RvfS0+eyRLZXlUb30ifSA9ICRQYXJhbXtUb30tPnskS2V5VG99OwogICAgICAgIH0KICAgIH0KICAgIGlmICggISRQYXJhbXtUb1NlbGVjdGVkfSApIHsKICAgICAgICBteSAkVXNlckRlZmF1bHRRdWV1ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VXNlckRlZmF1bHRRdWV1ZScpIHx8ICcnOwoKICAgICAgICBpZiAoJFVzZXJEZWZhdWx0UXVldWUpIHsKICAgICAgICAgICAgbXkgJFF1ZXVlSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRVc2VyRGVmYXVsdFF1ZXVlICk7CiAgICAgICAgICAgIGlmICgkUXVldWVJRCkgewogICAgICAgICAgICAgICAgJFBhcmFte1RvU2VsZWN0ZWR9ID0gIiRRdWV1ZUlEfHwkVXNlckRlZmF1bHRRdWV1ZSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAkUGFyYW17VG9TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkFnZW50UXVldWVMaXN0T3B0aW9uKAogICAgICAgICAgICBDbGFzcyAgICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBUcmVlVmlldyAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgID0+ICRQYXJhbXtUb1NlbGVjdGVkfSwKICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte1RvU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkIE1vZGVybml6ZScsCiAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlTmV3VG8sCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgVHJlZVZpZXcgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkUGFyYW17VG9TZWxlY3RlZH0sCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN1c3RvbWVyIGluZm8gc3RyaW5nCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclRhYmxlfSA9ICRMYXlvdXRPYmplY3QtPkFnZW50Q3VzdG9tZXJWaWV3VGFibGUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0N1c3RvbWVyRGF0YX0sCiAgICAgICAgICAgIE1heCAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlTWF4U2l6ZScpLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyVGFibGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgZXJyb3JzIQogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgbXkgJEtleUVycm9yICggc29ydCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskS2V5RXJyb3J9ID0gJyogJyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskS2V5RXJyb3J9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgRnJvbSBleHRlcm5hbAogICAgbXkgJFNob3dFcnJvcnMgPSAxOwogICAgaWYgKAogICAgICAgIGRlZmluZWQgJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfSAmJgogICAgICAgIGRlZmluZWQgJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0VtYWlsfSAmJgogICAgICAgIGRlZmluZWQgJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0N1c3RvbWVyfQogICAgICAgICkKICAgIHsKICAgICAgICAkU2hvd0Vycm9ycyA9IDA7CiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnRnJvbUV4dGVybmFsQ3VzdG9tZXJOYW1lJywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfS0+e0N1c3RvbWVyfSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb21FeHRlcm5hbEN1c3RvbWVyRW1haWwnLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LT57RW1haWx9LAogICAgICAgICk7CiAgICB9CiAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9ICkgewogICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSB9ICkgewogICAgICAgICAgICBpZiAoICEkU2hvd0Vycm9ycyApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBlbXB0eSB2YWx1ZXMgZm9yIGVycm9ycwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yfSAgICA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckRpc2FibGVkfSA9ICcnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXIrKywKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtGcm9tSW52YWxpZH0gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57RnJvbUVycm9yVHlwZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0Zyb21TZXJ2ZXJFcnJvck1zZycgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0Vycm9yc30tPntGcm9tRXJyb3JUeXBlfSB8fCAhJFNob3dFcnJvcnMgKSB7CiAgICAgICAgJFBhcmFte0Zyb21JbnZhbGlkfSA9ICcnOwogICAgfQoKICAgIG15ICREeW5hbWljRmllbGROYW1lcyA9ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoCiAgICAgICAgT25seUR5bmFtaWNGaWVsZHMgPT4gMQogICAgKTsKCiAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdEeW5hbWljRmllbGROYW1lcycsCiAgICAgICAgVmFsdWUgPT4gJER5bmFtaWNGaWVsZE5hbWVzLAogICAgKTsKCiAgICAjIGJ1aWxkIHR5cGUgc3RyaW5nCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9LT57VHlwZUlESW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17VHlwZXN9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgc2VydmljZSBzdHJpbmcKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICA9PiAkUGFyYW17U2VydmljZXN9LAogICAgICAgICAgICBOYW1lICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgQ2xhc3MgPT4gJ01vZGVybml6ZSAnCiAgICAgICAgICAgICAgICAuICggJENvbmZpZy0+e1NlcnZpY2VNYW5kYXRvcnl9ID8gJ1ZhbGlkYXRlX1JlcXVpcmVkICcgOiAnJyApCiAgICAgICAgICAgICAgICAuICggJFBhcmFte0Vycm9yc30tPntTZXJ2aWNlSURJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU2VydmljZU1hbmRhdG9yeSA9PiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gfHwgMCwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17U0xBU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17U0xBc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUgJwogICAgICAgICAgICAgICAgLiAoICRDb25maWctPntTTEFNYW5kYXRvcnl9ID8gJ1ZhbGlkYXRlX1JlcXVpcmVkICcgOiAnJyApCiAgICAgICAgICAgICAgICAuICggJFBhcmFte0Vycm9yc30tPntTTEFJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU0xBTWFuZGF0b3J5ID0+ICRDb25maWctPntTTEFNYW5kYXRvcnl9IHx8IDAsCiAgICAgICAgICAgICAgICAlUGFyYW0KICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgaWYgZXhpc3RzIGNyZWF0ZSB0ZW1wbGF0ZXMgcmVnYXJkbGVzcyB0aGUgcXVldWUKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJyktPlN0YW5kYXJkVGVtcGxhdGVMaXN0KAogICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgVHlwZSAgPT4gJ0NyZWF0ZScsCiAgICApOwoKICAgICMgYnVpbGQgdGV4dCB0ZW1wbGF0ZSBzdHJpbmcKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlU3RhbmRhcmRUZW1wbGF0ZXMgKSApIHsKICAgICAgICAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZXN9IHx8IHt9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSB8fCAnJywKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YW5kYXJkVGVtcGxhdGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBwcmlvcml0eSBzdHJpbmcKICAgIGlmICggISRQYXJhbXtQcmlvcml0eUlEfSApIHsKICAgICAgICAkUGFyYW17UHJpb3JpdHl9ID0gJENvbmZpZy0+e1ByaW9yaXR5fTsKICAgIH0KICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUGFyYW17UHJpb3JpdGllc30sCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgICA9PiAkUGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17UHJpb3JpdHl9LAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgKTsKCiAgICAjIHBlbmRpbmcgZGF0YSBzdHJpbmcKICAgICRQYXJhbXtQZW5kaW5nRGF0ZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgJVBhcmFtLAogICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICA9PiAwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgID0+IDUsCiAgICAgICAgRGlmZlRpbWUgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQZW5kaW5nRGlmZlRpbWUnKSB8fCAwLAogICAgICAgIENsYXNzICAgICAgICAgICAgICAgID0+ICRQYXJhbXtFcnJvcnN9LT57RGF0ZUludmFsaWR9LAogICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgID0+IDEsCiAgICAgICAgVmFsaWRhdGVEYXRlSW5GdXR1cmUgPT4gMSwKICAgICk7CgogICAgIyBzaG93IG93bmVyIHNlbGVjdGlvbgogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld093bmVyU2VsZWN0aW9uJykgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHJlc3BvbnNpYmxlIHNlbGVjdGlvbgogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpCiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdSZXNwb25zaWJsZVNlbGVjdGlvbicpCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZVVzZXJzfS0+eycnfSA9ICctJzsKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVPcHRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJzfSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZVNlbGVjdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgRHluYW1pYyBmaWVsZHMKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBza2lwIGZpZWxkcyB0aGF0IEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgKICAgICAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIGh0bWwgc3RyaW5ncyBmb3JtICRQYXJhbQogICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJFBhcmFte0R5bmFtaWNGaWVsZEhUTUx9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWxNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17VGltZVVuaXRzUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17VGltZVVuaXRzUmVxdWlyZWR9ID0gJyc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgY3VzdG9tZXIgZWRpdCBsaW5rCiAgICBteSAkT3B0aW9uQ3VzdG9tZXIgPSAkTGF5b3V0T2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIEFjdGlvbiA9PiAnQWRtaW5DdXN0b21lclVzZXInLAogICAgICAgIFR5cGUgICA9PiAncncnLAogICAgKTsKCiAgICBteSAkU2hvd25PcHRpb25zQmxvY2s7CgogICAgaWYgKCRPcHRpb25DdXN0b21lcikgewoKICAgICAgICAjIGNoZWNrIGlmIG5lZWQgdG8gY2FsbCBPcHRpb25zIGJsb2NrCiAgICAgICAgaWYgKCAhJFNob3duT3B0aW9uc0Jsb2NrICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE9wdGlvbnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGZsYWcgdG8gInRydWUiIGluIG9yZGVyIHRvIHByZXZlbnQgY2FsbGluZyB0aGUgT3B0aW9ucyBibG9jayBhZ2FpbgogICAgICAgICAgICAkU2hvd25PcHRpb25zQmxvY2sgPSAxOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ09wdGlvbkN1c3RvbWVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgIyBtYWtlIHN1cmUgdG8gc2hvdyB0aGUgb3B0aW9ucyBibG9jayBzbyB0aGF0IHRoZSAiTGluayBUaWNrZXQiIG9wdGlvbiBpcyBzaG93bgogICAgIyBldmVuIGlmIHNwZWxsY2hlY2tlciBhbmQgT3B0aW9uQ3VzdG9tZXIgaXMgdHVybmVkIG9mZgogICAgaWYgKCAkU2VsZi0+e0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50fSAmJiAhJFNob3duT3B0aW9uc0Jsb2NrICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRPcHRpb25zJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgJFNob3duT3B0aW9uc0Jsb2NrID0gMTsKICAgIH0KIyAtLS0KCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCBAeyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH0KICAgICAgICAgICAgJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0KICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEB7ICRQYXJhbXtBdHRhY2htZW50TGlzdH0gfSwgJEF0dGFjaG1lbnQ7CiAgICB9CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRDb25maWctPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFBlcm1pc3Npb25zIGhhdmUgYmVlbiBjaGVja2VkIGJlZm9yZSBpbiBSdW4oKQogICAgaWYgKCAkUGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgbXkgQENoYXRNZXNzYWdlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0JyktPkNoYXRNZXNzYWdlTGlzdCgKICAgICAgICAgICAgQ2hhdElEID0+ICRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJE1lc3NhZ2UgKEBDaGF0TWVzc2FnZXMpIHsKICAgICAgICAgICAgJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCAgICAgICAgPT4gJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0sCiAgICAgICAgICAgICAgICBMaW5rRmVhdHVyZSA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NoYXRBcnRpY2xlUHJldmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2hhdE1lc3NhZ2VzID0+IFxAQ2hhdE1lc3NhZ2VzLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFBob25lJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCnN1YiBfR2V0RmllbGRzVG9VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAVXBkYXRhYmxlRmllbGRzOwoKICAgICMgc2V0IHRoZSBmaWVsZHMgdGhhdCBjYW4gYmUgdXBkYXRhYmxlIHZpYSBBSkFYVXBkYXRlCiAgICBpZiAoICEkUGFyYW17T25seUR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgIEBVcGRhdGFibGVGaWVsZHMgPSBxdygKICAgICAgICAgICAgVHlwZUlECiAgICAgICAgICAgIERlc3QKICAgICAgICAgICAgU2VydmljZUlECiAgICAgICAgICAgIFNMQUlECiAgICAgICAgICAgIE5ld1VzZXJJRAogICAgICAgICAgICBOZXdSZXNwb25zaWJsZUlECiAgICAgICAgICAgIE5leHRTdGF0ZUlECiAgICAgICAgICAgIFByaW9yaXR5SUQKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlECiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKS0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgIHB1c2ggQFVwZGF0YWJsZUZpZWxkcywgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwogICAgfQoKICAgIHJldHVybiBcQFVwZGF0YWJsZUZpZWxkczsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA1OWMxYzY2MGU2ODM1ZTVjZDJjZTllODVhMWM3MTIxNWM3OTcxNDgzIC0gS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRQcm9jZXNzLnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRQcm9jZXNzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzICRTZWxmLCAkVHlwZTsKCiAgICAjIGdsb2JhbCBjb25maWcgaGFzaCBmb3IgaWQgZGlzc29sdXRpb24KICAgICRTZWxmLT57TmFtZVRvSUR9ID0gewogICAgICAgIFRpdGxlICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgU3RhdGUgICAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIFN0YXRlSUQgICAgICAgID0+ICdTdGF0ZUlEJywKICAgICAgICBQcmlvcml0eSAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgUHJpb3JpdHlJRCAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIExvY2sgICAgICAgICAgID0+ICdMb2NrSUQnLAogICAgICAgIExvY2tJRCAgICAgICAgID0+ICdMb2NrSUQnLAogICAgICAgIFF1ZXVlICAgICAgICAgID0+ICdRdWV1ZUlEJywKICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgQ3VzdG9tZXIgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgIEN1c3RvbWVySUQgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICBDdXN0b21lck5vICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJ0N1c3RvbWVyVXNlcklEJywKICAgICAgICBPd25lciAgICAgICAgICA9PiAnT3duZXJJRCcsCiAgICAgICAgT3duZXJJRCAgICAgICAgPT4gJ093bmVySUQnLAogICAgICAgIFR5cGUgICAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgIFR5cGVJRCAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgIFNMQSAgICAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgU0xBSUQgICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICBTZXJ2aWNlICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICBSZXNwb25zaWJsZSAgICA9PiAnUmVzcG9uc2libGVJRCcsCiAgICAgICAgUmVzcG9uc2libGVJRCAgPT4gJ1Jlc3BvbnNpYmxlSUQnLAogICAgICAgIFBlbmRpbmdUaW1lICAgID0+ICdQZW5kaW5nVGltZScsCiAgICAgICAgQXJ0aWNsZSAgICAgICAgPT4gJ0FydGljbGUnLAogICAgfTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQoKICAgICMgQ2hlY2sgaWYgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQgaXMgdXNlZC4KICAgIG15ICRPdXRwdXRGaWx0ZXJDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpPdXRwdXQ6OkZpbHRlckVsZW1lbnRQb3N0Jyk7CiAgICBpZiAoICRPdXRwdXRGaWx0ZXJDb25maWctPntJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudH0gKSB7CiAgICAgICAgJFNlbGYtPntJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudH0gPSAxOwogICAgfQojIC0tLQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIG15ICRUaWNrZXRJRCAgICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApOwogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCcgKTsKICAgIG15ICRBY3Rpdml0eURpYWxvZ0hhc2hSZWY7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRBY3Rpdml0eURpYWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2cnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAkU2VsZi0+e0ZpcnN0QWN0aXZpdHlEaWFsb2d9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpcnN0QWN0aXZpdHlEaWFsb2cnICk7CiAgICAkU2VsZi0+e0xpbmtUaWNrZXRJRH0gICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0xpbmtUaWNrZXRJRCcgKSB8fCAnJzsKICAgICRTZWxmLT57QXJ0aWNsZUlEfSAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApIHx8ICcnOwoKICAgICMgZ2V0IHRoZSB0aWNrZXQgaW5mb3JtYXRpb24gb24gbGluayBhY3Rpb25zCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldElEfSApIHsKICAgICAgICBteSAlVGlja2V0RGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntMaW5rVGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEV4dGVuZGVkID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSA9IFwlVGlja2V0RGF0YTsKCiAgICAgICAgIyBzZXQgTGlua1RpY2tldElEIHBhcmFtIGZvciBzaG93aW5nIG9uIG1haW4gZm9ybQogICAgICAgICRQYXJhbXtMaW5rVGlja2V0SUR9ID0gJFNlbGYtPntMaW5rVGlja2V0SUR9OwogICAgfQoKICAgICMgZ2V0IHRoZSBhcnRpY2xlIGluZm9ybWF0aW9uIG9uIGxpbmsgYWN0aW9ucwogICAgaWYgKCAkU2VsZi0+e0FydGljbGVJRH0gKSB7CiAgICAgICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpLT5CYWNrZW5kRm9yQXJ0aWNsZSgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57TGlua1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICBteSAlQXJ0aWNsZSA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57TGlua1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xpbmtBcnRpY2xlRGF0YX0gPSBcJUFydGljbGU7CgogICAgICAgICMgc2V0IEFydGljbGVJRCBwYXJhbSBmb3Igc2hvd2luZyBvbiBtYWluIGZvcm0KICAgICAgICAkUGFyYW17QXJ0aWNsZUlEfSA9ICRTZWxmLT57QXJ0aWNsZUlEfTsKICAgIH0KCiAgICBpZiAoJFRpY2tldElEKSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhlcmUgaXMgYSBjb25maWd1cmVkIHJlcXVpcmVkIHBlcm1pc3Npb24KICAgICAgICAjIGZvciB0aGUgQWN0aXZpdHlEaWFsb2cgKGlmIHRoZXJlIGlzIG9uZSkKICAgICAgICBteSAkQWN0aXZpdHlEaWFsb2dQZXJtaXNzaW9uID0gJ3J3JzsKICAgICAgICBpZiAoJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQpIHsKICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nSGFzaFJlZiA9ICRBY3Rpdml0eURpYWxvZ09iamVjdC0+QWN0aXZpdHlEaWFsb2dHZXQoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEFjdGl2aXR5RGlhbG9nSGFzaFJlZikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3QgZ2V0IEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nSGFzaFJlZi0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nUGVybWlzc2lvbiA9ICRBY3Rpdml0eURpYWxvZ0hhc2hSZWYtPntQZXJtaXNzaW9ufTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAkQWN0aXZpdHlEaWFsb2dQZXJtaXNzaW9uLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgKTsKCiAgICAgICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICAgICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdZb3UgbmVlZCAlcyBwZXJtaXNzaW9ucyEnLCAkQWN0aXZpdHlEaWFsb2dQZXJtaXNzaW9uICksCiAgICAgICAgICAgICAgICBXaXRoSGVhZGVyID0+ICd5ZXMnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgICAgIG15ICVQb3NzaWJsZUFjdGlvbnMgPSAoIDEgPT4gJFNlbGYtPntBY3Rpb259ICk7CgogICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBteSAlQWNsQWN0aW9uID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwoKICAgICAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgICAgICBpZiAoICRBQ0wgfHwgSXNIYXNoUmVmV2l0aERhdGEoIFwlQWNsQWN0aW9uICkgKSB7CgogICAgICAgICAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwoKICAgICAgICAgICAgIyBzaG93IGVycm9yIHNjcmVlbiBpZiBBQ0wgcHJvaGliaXRzIHRoaXMgYWN0aW9uCiAgICAgICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7ICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eURpYWxvZ0hhc2hSZWYpICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiBpdCdzIGFscmVhZHkgbG9ja2VkIGJ5IHNvbWVib2R5IGVsc2UKICAgICAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2dIYXNoUmVmLT57UmVxdWlyZWRMb2NrfSApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXRPYmplY3QtPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRUaWNrZXRJRCApICkgewogICAgICAgICAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRUaWNrZXRPYmplY3QtPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU29ycnksIHlvdSBuZWVkIHRvIGJlIHRoZSB0aWNrZXQgb3duZXIgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJExvY2sgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBTZXQgbmV3IG93bmVyIGlmIHRpY2tldCBvd25lciBpcyBkaWZmZXJlbnQgdGhlbiBsb2dnZWQgdXNlci4KICAgICAgICAgICAgICAgICAgICBpZiAoICRMb2NrICYmICggJFRpY2tldHtPd25lcklEfSAhPSAkU2VsZi0+e1VzZXJJRH0gKSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgUmVtZW1iZXIgcHJldmlvdXMgb3duZXIsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXN0b3JlIHRpY2tldCBvd25lciBvbiB1bmRvIGFjdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte1ByZXZpb3VzT3duZXJ9ID0gJFRpY2tldHtPd25lcklEfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIFJlbG9hZCB0aGUgcGFyZW50IHdpbmRvdyB0byBzaG93IHRoZSB1cGRhdGVkIGxvY2sgc3RhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQYXJlbnRSZWxvYWR9ID0gMTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgU2hvdyBsb2NrIHN0YXRlIGxpbmsuCiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtSZW5kZXJMb2NrZWR9ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRUaWNrZXROdW1iZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXROdW1iZXJMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgbm90aWZ5IHRoZSBhZ2VudCB0aGF0IHRoZSB0aWNrZXQgd2FzIGxvY2tlZAogICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte05vdGlmeX0gfSwgewogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnTm90aWNlJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gIiRUaWNrZXROdW1iZXI6ICIgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlRpY2tldCBsb2NrZWQuIiksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlQWN0aXZpdHlEaWFsb2dzID0geyAxID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEIH07CgogICAgICAgICAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgICAgID0+ICRQb3NzaWJsZUFjdGl2aXR5RGlhbG9ncywKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgICAgICAgICAgPT4gJ0FjdGl2aXR5RGlhbG9nJywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgICAgICAgICAgPT4gJy0nLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAleyRQb3NzaWJsZUFjdGl2aXR5RGlhbG9nc30gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgQUNMIHJlc3RyaWN0aW9ucyBleGlzdAogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVBY3Rpdml0eURpYWxvZ3MpICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgbGlzdCBvbmx5IEFjdGl2ZSBwcm9jZXNzZXMgYnkgZGVmYXVsdAogICAgbXkgQFByb2Nlc3NTdGF0ZXMgPSAoJ0FjdGl2ZScpOwoKICAgICMgc2V0IElzTWFpbldpbmRvdywgSXNBamF4UmVxdWVzdCwgSXNQcm9jZXNzRW5yb2xsIGZvciBwcm9wZXIgZXJyb3IgcmVzcG9uc2VzLCBzY3JlZW4gZGlzcGxheQogICAgIyBhbmQgcHJvY2VzcyBsaXN0CiAgICAkU2VsZi0+e0lzTWFpbldpbmRvd30gICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSXNNYWluV2luZG93JyApICAgIHx8ICcnOwogICAgJFNlbGYtPntJc0FqYXhSZXF1ZXN0fSAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lzQWpheFJlcXVlc3QnICkgICB8fCAnJzsKICAgICRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJc1Byb2Nlc3NFbnJvbGwnICkgfHwgJyc7CgogICAgIyBmZXRjaCBhbHNvIEZhZGVBd2F5IHByb2Nlc3NlcyB0byBjb250aW51ZSB3b3JraW5nIHdpdGggZXhpc3RpbmcgdGlja2V0cywgYnV0IG5vdCB0byBzdGFydCBuZXcKICAgICMgICAgb25lcwogICAgaWYgKCAhJFNlbGYtPntJc01haW5XaW5kb3d9ICYmICRTZWxmLT57U3ViYWN0aW9ufSApIHsKICAgICAgICBwdXNoIEBQcm9jZXNzU3RhdGVzLCAnRmFkZUF3YXknOwogICAgfQoKICAgICMgY3JlYXRlIHByb2Nlc3Mgb2JqZWN0CiAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycgPT4gewogICAgICAgICAgICBBY3Rpdml0eU9iamVjdCAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHknKSwKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dPYmplY3QgICA9PiAkQWN0aXZpdHlEaWFsb2dPYmplY3QsCiAgICAgICAgICAgIFRyYW5zaXRpb25PYmplY3QgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uJyksCiAgICAgICAgICAgIFRyYW5zaXRpb25BY3Rpb25PYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uJyksCiAgICAgICAgICAgIH0KICAgICk7CiAgICBteSAkUHJvY2Vzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycpOwoKICAgICMgZ2V0IHByb2Nlc3NlcwogICAgbXkgJFByb2Nlc3NMaXN0ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NMaXN0KAogICAgICAgIFByb2Nlc3NTdGF0ZSA9PiBcQFByb2Nlc3NTdGF0ZXMsCiAgICAgICAgSW50ZXJmYWNlICAgID0+IFsnQWdlbnRJbnRlcmZhY2UnXSwKICAgICk7CgogICAgIyBhbHNvIGdldCB0aGUgbGlzdCBvZiBwcm9jZXNzZXMgaW5pdGlhdGVkIGJ5IGN1c3RvbWVycywgYXMgYW4gYWN0aXZpdHkgZGlhbG9nIG1pZ2h0IGJlCiAgICAjIGNvbmZpZ3VyZWQgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UKICAgIG15ICRGb2xsb3d1cFByb2Nlc3NMaXN0ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NMaXN0KAogICAgICAgIFByb2Nlc3NTdGF0ZSA9PiBcQFByb2Nlc3NTdGF0ZXMsCiAgICAgICAgSW50ZXJmYWNlICAgID0+IFsgJ0FnZW50SW50ZXJmYWNlJywgJ0N1c3RvbWVySW50ZXJmYWNlJyBdLAogICAgKTsKCiAgICBteSAkUHJvY2Vzc0VudGl0eUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Byb2Nlc3NFbnRpdHlJRCcgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkUHJvY2Vzc0xpc3QpICYmICFJc0hhc2hSZWZXaXRoRGF0YSgkRm9sbG93dXBQcm9jZXNzTGlzdCkgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gUHJvY2VzcyBjb25maWd1cmVkIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgcHJvY2VzcyBsaXN0IGZvciBBQ0xzLCB1c2Ugb25seSBlbnRpdGllcyBpbnN0ZWFkIG9mIG5hbWVzLCBjb252ZXJ0IGZyb20KICAgICMgICBQMSA9PiBOYW1lIHRvIFAxID0+IFAxLiBBcyBBQ0xzIHNob3VsZCB3b3JrIG9ubHkgYWdhaW5zdCBlbnRpdGllcwogICAgbXkgJVByb2Nlc3NMaXN0QUNMID0gbWFwIHsgJF8gPT4gJF8gfSBzb3J0IGtleXMgJXskUHJvY2Vzc0xpc3R9OwoKICAgICMgdmFsaWRhdGUgdGhlIFByb2Nlc3NMaXN0IHdpdGggc3RvcmVkIEFDTHMKICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnUHJvY2VzcycsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnLScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVByb2Nlc3NMaXN0QUNMLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgKTsKCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzTGlzdCkgJiYgJEFDTCApIHsKCiAgICAgICAgIyBnZXQgQUNMIHJlc3VsdHMKICAgICAgICBteSAlQUNMRGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgIyByZWNvdmVyIHByb2Nlc3MgbmFtZXMKICAgICAgICBteSAlUmVkdWNlZFByb2Nlc3NMaXN0ID0gbWFwIHsgJF8gPT4gJFByb2Nlc3NMaXN0LT57JF99IH0gc29ydCBrZXlzICVBQ0xEYXRhOwoKICAgICAgICAjIHJlcGxhY2Ugb3JpZ2luYWwgcHJvY2VzcyBsaXN0IHdpdGggdGhlIHJlZHVjZWQgb25lCiAgICAgICAgJFByb2Nlc3NMaXN0ID0gXCVSZWR1Y2VkUHJvY2Vzc0xpc3Q7CiAgICB9CgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Zvcm1JRCcgKTsKCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUnKS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgIyBpZiB3ZSBoYXZlIG5vIHN1YmFjdGlvbiBkaXNwbGF5IHRoZSBwcm9jZXNzIGxpc3QgdG8gc3RhcnQgYSBuZXcgb25lCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgICMgdG8gZGlzcGxheSB0aGUgcHJvY2VzcyBsaXN0IGlzIG1hbmRhdG9yeSB0byBoYXZlIHByb2Nlc3NlcyB0aGF0IGFnZW50IGNhbiBzdGFydAogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzTGlzdCkgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBQcm9jZXNzIGNvbmZpZ3VyZWQhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwcm9jZXNzIGlkIChpZiBhbnksIGEgcHJvY2VzcyBzaG91bGQgYmUgcHJlLXNlbGVjdGVkKQogICAgICAgICRQYXJhbXtQcm9jZXNzSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApOwogICAgICAgIGlmICggJFBhcmFte1Byb2Nlc3NJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtQcmVTZWxlY3RQcm9jZXNzfSA9IDE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPl9EaXNwbGF5UHJvY2Vzc0xpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJvY2Vzc0xpc3QgICAgID0+ICRQcm9jZXNzTGlzdCwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQgfHwgJFBhcmFte1Byb2Nlc3NJRH0sCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHRoZSBzZWxlY3RlZCBwcm9jZXNzIGZyb20gdGhlIGxpc3QgaXMgdmFsaWQsIHByZXZlbnQgdGFtcGVyIHdpdGggcHJvY2VzcyBzZWxlY3Rpb24KICAgICMgICAgbGlzdCAobm90IGV4aXN0aW5nLCBpbnZhbGlkIGFuIGZhZGUgYXdheSBwcm9jZXNzZXMgbXVzdCBub3QgYmUgYWJsZSB0byBzdGFydCBhIG5ldyBwcm9jZXNzCiAgICAjICAgIHRpY2tldCkKICAgIGVsc2lmICgKICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rpc3BsYXlBY3Rpdml0eURpYWxvZ0FKQVgnCiAgICAgICAgJiYgISRQcm9jZXNzTGlzdC0+eyRQcm9jZXNzRW50aXR5SUR9CiAgICAgICAgJiYgJFNlbGYtPntJc01haW5XaW5kb3d9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHRyYW5zbGF0ZSB0aGUgZXJyb3IgbWVzc2FnZSAoYXMgaXQgd2lsbCBiZSBpbmplY3RlZCBpbiB0aGUgSFRNTCkKICAgICAgICBteSAkRXJyb3JNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJUaGUgc2VsZWN0ZWQgcHJvY2VzcyBpcyBpbnZhbGlkISIpOwoKICAgICAgICAjIHJldHVybiBhIHByZWRlZmluZWQgSFRNTCBzdHJ1Y3R1cmUgYXMgdGhlIEFKQVggY2FsbCBpcyBleHBlY3RpbmcgYW5kIEhUTUwgcmVzcG9uc2UKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbDsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAnPGRpdiBjbGFzcz0iU2VydmVyRXJyb3IiIGRhdGEtbWVzc2FnZT0iJyAuICRFcnJvck1lc3NhZ2UgLiAnIj48L2Rpdj4nLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgaW52YWxpZCBwcm9jZXNzIGlzIGRldGVjdGVkIG9uIGEgQWN0aXZpdHlEaWxvZyBwb3AtdXAgc2NyZWVuIHNob3cgYW4gZXJyb3IgbWVzc2FnZQogICAgZWxzaWYgKAogICAgICAgICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGlzcGxheUFjdGl2aXR5RGlhbG9nJwogICAgICAgICYmICEkRm9sbG93dXBQcm9jZXNzTGlzdC0+eyRQcm9jZXNzRW50aXR5SUR9CiAgICAgICAgJiYgISRTZWxmLT57SXNNYWluV2luZG93fQogICAgICAgICkKICAgIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ1Byb2Nlc3MgJXMgaXMgaW52YWxpZCEnLCAkUHJvY2Vzc0VudGl0eUlEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHRoZSBuZWNlc3NhcnkgcGFyYW1ldGVycwogICAgIyBjb2xsZWN0cyBhIG1peHR1cmUgb2YgcHJlc2VudCB2YWx1ZXMgYm90dG9tIHRvIHRvcDoKICAgICMgU3lzQ29uZmlnIERlZmF1bHRWYWx1ZXMsIEFjdGl2aXR5RGlhbG9nIERlZmF1bHRWYWx1ZXMsIFRpY2tldFZhbHVlcywgU3VibWl0dGVkVmFsdWVzCiAgICAjIGluY2x1ZGluZyBBY3Rpdml0eURpYWxvZ0VudGl0eUlEIGFuZCBQcm9jZXNzRW50aXR5SUQKICAgICMgaXMgdXNlZCBmb3I6CiAgICAjIC0gUGFyYW1ldGVyIGNoZWNraW5nIGJlZm9yZSBzdG9yaW5nCiAgICAjIC0gd2lsbCBiZSB1c2VkIGZvciBBQ0wgY2hlY2tpbmcgbGF0ZXIgb24KICAgIG15ICRHZXRQYXJhbSA9ICRTZWxmLT5fR2V0UGFyYW0oCiAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICApOwoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZUFjdGl2aXR5RGlhbG9nJyAmJiAkUHJvY2Vzc0VudGl0eUlEICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5fU3RvcmVBY3Rpdml0eURpYWxvZygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcm9jZXNzTmFtZSAgICAgPT4gJFByb2Nlc3NMaXN0LT57JFByb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGlzcGxheUFjdGl2aXR5RGlhbG9nJyAmJiAkUHJvY2Vzc0VudGl0eUlEICkgewoKICAgICAgICByZXR1cm4gJFNlbGYtPl9PdXRwdXRBY3Rpdml0eURpYWxvZygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgID0+ICRHZXRQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rpc3BsYXlBY3Rpdml0eURpYWxvZ0FKQVgnICYmICRQcm9jZXNzRW50aXR5SUQgKSB7CgogICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ0hUTUwgPSAkU2VsZi0+X091dHB1dEFjdGl2aXR5RGlhbG9nKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEFjdGl2aXR5RGlhbG9nSFRNTCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgIHJldHVybiAkU2VsZi0+X1JlbmRlckFqYXgoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICA9PiAkR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU3ViYWN0aW9uIGlzIGludmFsaWQhJyksCiAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgKTsKfQoKc3ViIF9SZW5kZXJBamF4IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIEZhdGFsRXJyb3IgaXMgc2FmZSBiZWNhdXNlIGEgSlNPTiBzdHJ1Y3R1cmUgaXMgZXhwZWN0aW5nLCB0aGVuIGl0IHdpbGwgcmVzdWx0IGludG8gYQogICAgIyBjb21tdW5pY2F0aW9ucyBlcnJvcgoKICAgIGZvciBteSAkTmVlZGVkIChxdyhQcm9jZXNzRW50aXR5SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlckFqYXgnICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW17R2V0UGFyYW19e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9OwogICAgaWYgKCAhJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0VudGl0eUlEJywgJ19SZW5kZXJBamF4JyApLAogICAgICAgICk7CiAgICB9CiAgICBteSAkQWN0aXZpdHlEaWFsb2cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5RGlhbG9nJyktPkFjdGl2aXR5RGlhbG9nR2V0KAogICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkQWN0aXZpdHlEaWFsb2cpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ05vIEFjdGl2aXR5RGlhbG9nIGNvbmZpZ3VyZWQgZm9yICVzIGluIF9SZW5kZXJBamF4IScsCiAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgIG15ICVGaWVsZHNQcm9jZXNzZWQ7CiAgICBteSBASlNPTkNvbGxlY3RvcjsKCiAgICBteSAkU2VydmljZXM7CgogICAgIyBBbGwgc3VibWl0dGVkIER5bmFtaWNGaWVsZHMKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGZvcm0gaHR0cCByZXF1ZXN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwoKICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZENoZWNrUGFyYW07CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZEl0ZW0gKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZEl0ZW07CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIWRlZmluZWQgJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkSXRlbX07CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIWxlbmd0aCAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRJdGVtfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZENoZWNrUGFyYW17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRJdGVtIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRJdGVtfTsKICAgIH0KICAgICRQYXJhbXtHZXRQYXJhbX0tPntEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRDaGVja1BhcmFtOwoKICAgICMgR2V0IHRoZSBhY3Rpdml0eSBkaWFsb2cncyBTdWJtaXQgUGFyYW0ncyBvciBDb25maWcgUGFyYW1zCiAgICBESUFMT0dGSUVMRDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKCiAgICAgICAgIyBTa2lwIGlmIHdlJ3JlIHdvcmtpbmcgb24gYSBmaWVsZCB0aGF0IHdhcyBhbHJlYWR5IGRvbmUgd2l0aCBvciB3aXRob3V0IElECiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfQogICAgICAgICAgICAmJiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgPX4gbXteRHluYW1pY0ZpZWxkXyguKil9eG1zICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkTmFtZSA9ICQxOwoKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICggZ3JlcCB7ICRfLT57TmFtZX0gZXEgJER5bmFtaWNGaWVsZE5hbWUgfSBAeyREeW5hbWljRmllbGR9IClbMF07CgogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgISRJc0FDTFJlZHVjaWJsZTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgIyBnZXQgdGlja2V0IG9iamVjdAogICAgICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXN9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICkgfHwgJFBvc3NpYmxlVmFsdWVzOwoKICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgSlNPTkNvbGxlY3RvcgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnT3duZXJJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICREYXRhID0gJFNlbGYtPl9HZXRPd25lcnMoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBPd25lciB0byB0aGUgSlNPTkNvbGxlY3RvcgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte0dldFBhcmFtfXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1Jlc3BvbnNpYmxlSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0UmVzcG9uc2libGVzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgUmVzcG9uc2libGUgdG8gdGhlIEpTT05Db2xsZWN0b3IKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtHZXRQYXJhbX17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdRdWV1ZUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFF1ZXVlcygKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIFF1ZXVlIHRvIHRoZSBKU09OQ29sbGVjdG9yCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBASlNPTkNvbGxlY3RvciwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICREYXRhLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17R2V0UGFyYW19eyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnU3RhdGVJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICREYXRhID0gJFNlbGYtPl9HZXRTdGF0ZXMoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBTdGF0ZSB0byB0aGUgSlNPTkNvbGxlY3RvcgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRQYXJhbXtHZXRQYXJhbX17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnUHJpb3JpdHlJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICREYXRhID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICApOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgICMgY2hlY2sgaWYgcHJpb3JpdHkgbmVlZHMgdG8gYmUgcmVjYWxjdWxhdGVkCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9CiAgICAgICAgICAgICAgICAmJiAoICRQYXJhbXtHZXRQYXJhbX0tPntFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtHZXRQYXJhbX0tPntFbGVtZW50Q2hhbmdlZH0gZXEgJ0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0JwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0dldFBhcmFtfS0+e1NlcnZpY2VJRH0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtHZXRQYXJhbX0tPntEeW5hbWljRmllbGRfSVRTTUltcGFjdH0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtHZXRQYXJhbX0tPntEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fQogICAgICAgICAgICApIHsKCiAgICAgICAgICAgICAgICAjIGNhbGN1bGF0ZSBwcmlvcml0eSBmcm9tIHRoZSBDSVAgbWF0cml4CiAgICAgICAgICAgICAgICBteSAkUHJpb3JpdHlJREZyb21JbXBhY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlJyktPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkUGFyYW17R2V0UGFyYW19LT57RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eX0sCiAgICAgICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJFBhcmFte0dldFBhcmFtfS0+e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBhZGQgUHJpb3JpdHkgdG8gdGhlIEpTT05Db2xsZWN0b3IKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRQcmlvcml0eUlERnJvbUltcGFjdCwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CgogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgfQojIC0tLQoKICAgICAgICAgICAgIyBhZGQgUHJpb3JpdHkgdG8gdGhlIEpTT05Db2xsZWN0b3IKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRQYXJhbXtHZXRQYXJhbX17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnU2VydmljZUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VydmljZXMgPSAkRGF0YTsKCiAgICAgICAgICAgICMgYWRkIFNlcnZpY2UgdG8gdGhlIEpTT05Db2xsZWN0b3IgKFVzZSBTZXJ2aWNlSUQgZnJvbSB3ZWIgcmVxdWVzdCkKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZXJ2aWNlSUQnICkgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1NMQUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgIyBpZiBTTEEgaXMgcmVuZGVyIGJlZm9yZSBzZXJ2aWNlIChieSBpdCBvcmRlciBpbiB0aGUgZmllbGRzKSBpdCBuZWVkcyB0byBjcmVhdGUKICAgICAgICAgICAgIyB0aGUgc2VydmljZSBsaXN0CiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRTZXJ2aWNlcykgKSB7CiAgICAgICAgICAgICAgICAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREYXRhID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICAgICAgU2VydmljZXMgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApIHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgU0xBIHRvIHRoZSBKU09OQ29sbGVjdG9yIChVc2UgU2VsZWN0ZWRJRCBmcm9tIHdlYiByZXF1ZXN0KQogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NMQUlEJyApIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSBlcSAnVHlwZUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBBZGQgVHlwZSB0byB0aGUgSlNPTkNvbGxlY3RvciAoVXNlIFNlbGVjdGVkSUQgZnJvbSB3ZWIgcmVxdWVzdCkuCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBASlNPTkNvbGxlY3RvciwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICREYXRhLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVHlwZUlEJyApIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oIFtASlNPTkNvbGxlY3Rvcl0gKTsKCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwp9CgojID1jdXQKIwojIF9HZXRQYXJhbSgpCiMKIyByZXR1cm5zIHRoZSBjdXJyZW50IGRhdGEgc3RhdGUgb2YgdGhlIHN1Ym1pdHRlZCBpbmZvcm1hdGlvbgojCiMgVGhpcyBjb250YWlucyB0aGUgZm9sbG93aW5nIGRhdGEgZm9yIHRoZSBkaWZmZXJlbnQgY2FsbGVyczoKIwojICAgICBJbml0aWFsIGNhbGwgd2l0aCBzZWxlY3RlZCBQcm9jZXNzOgojICAgICAgICAgUHJvY2Vzc0VudGl0eUlECiMgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlECiMgICAgICAgICBEZWZhdWx0VmFsdWVzIGZvciB0aGUgY29uZmlndXJlZCBGaWVsZHMgaW4gdGhhdCBBY3Rpdml0eURpYWxvZwojICAgICAgICAgRGVmYXVsdFZhbHVlcyBmb3IgdGhlIDQgcmVxdWlyZWQgRmllbGRzIFF1ZXVlIFN0YXRlIExvY2sgUHJpb3JpdHkKIwojICAgICBGaXJzdCBTdG9yZSBjYWxsIHN1Ym1pdHRpbmcgYW4gQWN0aXZpdHkgRGlhbG9nOgojICAgICAgICAgUHJvY2Vzc0VudGl0eUlECiMgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlECiMgICAgICAgICBTdWJtaXR0ZWRWYWx1ZXMgZm9yIHRoZSBjdXJyZW50IEFjdGl2aXR5RGlhbG9nCiMgICAgICAgICBBY3Rpdml0eURpYWxvZyBEZWZhdWx0VmFsdWVzIGZvciBpbnZpc2libGUgZmllbGRzIG9mIHRoYXQgQWN0aXZpdHlEaWFsb2cKIyAgICAgICAgIERlZmF1bHRWYWx1ZXMgZm9yIHRoZSA0IHJlcXVpcmVkIEZpZWxkcyBRdWV1ZSBTdGF0ZSBMb2NrIFByaW9yaXR5CiMgICAgICAgICAgICAgaWYgbm90IGNvbmZpZ3VyZWQgaW4gdGhlIEFjdGl2aXR5RGlhbG9nCiMKIyAgICAgQWN0aXZpdHlEaWFsb2cgZmlsbG91dCByZXF1ZXN0IG9uIGV4aXN0aW5nIFRpY2tldDoKIyAgICAgICAgIFByb2Nlc3NFbnRpdHlJRAojICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAojICAgICAgICAgVGlja2V0VmFsdWVzCiMKIyAgICAgQWN0aXZpdHlEaWFsb2cgc3RvcmUgcmVxdWVzdCBvciBBamF4VXBkYXRlIHJlcXVlc3Qgb24gZXhpc3RpbmcgVGlja2V0czoKIyAgICAgICAgIFByb2Nlc3NFbnRpdHlJRAojICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAojICAgICAgICAgVGlja2V0VmFsdWVzIGZvciBhbGwgbm90LVN1Ym1pdHRlZCBWYWx1ZXMKIyAgICAgICAgIFN1Ym1pdHRlZCBWYWx1ZXMKIwojICAgICBteSAkR2V0UGFyYW0gPSBfR2V0UGFyYW0oCiMgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRCwKIyAgICAgKTsKIwojID1jdXQKCnN1YiBfR2V0UGFyYW0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjbXkgJElzQUpBWFVwZGF0ZSA9ICRQYXJhbXtBSkFYfSB8fCAnJzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhQcm9jZXNzRW50aXR5SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX0dldFBhcmFtJyApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICBteSAlR2V0UGFyYW07CiAgICBteSAlVGlja2V0OwogICAgbXkgJFByb2Nlc3NFbnRpdHlJRCAgICAgICAgPSAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfTsKICAgIG15ICRUaWNrZXRJRCAgICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApOwogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgIFBhcmFtID0+ICdBY3Rpdml0eURpYWxvZ0VudGl0eUlEJywKICAgICk7CiAgICBteSAkQWN0aXZpdHlFbnRpdHlJRDsKICAgIG15ICVWYWx1ZXNHb3R0ZW47CiAgICBteSAkVmFsdWU7CgogICAgIyBnZXQgYWN0aXZpdHkgZGlhbG9nIG9iamVjdAogICAgbXkgJEFjdGl2aXR5RGlhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpOwoKICAgICMgY3JlYXRlIHByb2Nlc3Mgb2JqZWN0CiAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycgPT4gewogICAgICAgICAgICBBY3Rpdml0eU9iamVjdCAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHknKSwKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dPYmplY3QgICA9PiAkQWN0aXZpdHlEaWFsb2dPYmplY3QsCiAgICAgICAgICAgIFRyYW5zaXRpb25PYmplY3QgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uJyksCiAgICAgICAgICAgIFRyYW5zaXRpb25BY3Rpb25PYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uJyksCiAgICAgICAgICAgIH0KICAgICk7CiAgICBteSAkUHJvY2Vzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycpOwoKICAgICMgSWYgd2UgZ290IG5vIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgYW5kIG5vIFRpY2tldElECiAgICAjIHdlIGhhdmUgdG8gZ2V0IHRoZSBQcm9jZXNzZXMnIFN0YXJ0cG9pbnQKICAgIGlmICggISRBY3Rpdml0eURpYWxvZ0VudGl0eUlEICYmICggISRUaWNrZXRJRCB8fCAkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKSApIHsKICAgICAgICBteSAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZyA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzU3RhcnRwb2ludEdldCgKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgKTsKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfQogICAgICAgICAgICB8fCAhJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eX0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnR290IG5vIFN0YXJ0IEFjdGl2aXR5RW50aXR5SUQgb3IgU3RhcnQgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCBmb3IgUHJvY2VzczogJXMgaW4gX0dldFBhcmFtIScsCiAgICAgICAgICAgICAgICAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfTsKICAgICAgICAkQWN0aXZpdHlFbnRpdHlJRCAgICAgICA9ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHl9OwogICAgfQoKICAgIG15ICRBY3Rpdml0eURpYWxvZyA9ICRBY3Rpdml0eURpYWxvZ09iamVjdC0+QWN0aXZpdHlEaWFsb2dHZXQoCiAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICBJbnRlcmZhY2UgICAgICAgICAgICAgID0+ICdBZ2VudEludGVyZmFjZScsCiAgICApOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eURpYWxvZykgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdDb3VsZG5cJ3QgZ2V0IEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgaWYgdGhlcmUgaXMgYSB0aWNrZXQgdGhlbiBpcyBub3QgYW4gQUpBWCByZXF1ZXN0CiAgICBpZiAoJFRpY2tldElEKSB7CiAgICAgICAgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICAlR2V0UGFyYW0gPSAlVGlja2V0OwogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJUdldFBhcmFtICkgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IGdldCBUaWNrZXQgZm9yIFRpY2tldElEOiAlcyBpbiBfR2V0UGFyYW0hJywKICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9ICkgewogICAgICAgICAgICAkQWN0aXZpdHlFbnRpdHlJRCA9ICRUaWNrZXR7CiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycKICAgICAgICAgICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRBY3Rpdml0eUlEIikKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCAhJEFjdGl2aXR5RW50aXR5SUQgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IGRldGVybWluZSBBY3Rpdml0eUVudGl0eUlELiBEeW5hbWljRmllbGQgb3IgQ29uZmlnIGlzblwndCBzZXQgcHJvcGVybHkhJwogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KICAgICRHZXRQYXJhbXtBY3Rpdml0eURpYWxvZ0VudGl0eUlEfSA9ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEOwogICAgJEdldFBhcmFte0FjdGl2aXR5RW50aXR5SUR9ICAgICAgID0gJEFjdGl2aXR5RW50aXR5SUQ7CiAgICAkR2V0UGFyYW17UHJvY2Vzc0VudGl0eUlEfSAgICAgICAgPSAkUHJvY2Vzc0VudGl0eUlEOwoKICAgICMgR2V0IHRoZSBhY3Rpdml0eWRpYWxvZ3MncyBTdWJtaXQgUGFyYW0ncyBvciBDb25maWcgUGFyYW1zCiAgICBESUFMT0dGSUVMRDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKCiAgICAgICAgIyBTa2lwIGlmIHdlJ3JlIHdvcmtpbmcgb24gYSBmaWVsZCB0aGF0IHdhcyBhbHJlYWR5IGRvbmUgd2l0aCBvciB3aXRob3V0IElECiAgICAgICAgaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSAmJiAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgPX4gbXteRHluYW1pY0ZpZWxkXyguKil9eG1zICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkTmFtZSA9ICQxOwoKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIEdldCB0aGUgQ29uZmlnIG9mIHRoZSBjdXJyZW50IER5bmFtaWNGaWVsZCAodGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGdyZXAgcmVzdWx0IGFycmF5KQogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gKCBncmVwIHsgJF8tPntOYW1lfSBlcSAkRHluYW1pY0ZpZWxkTmFtZSB9IEB7JER5bmFtaWNGaWVsZH0gKVswXTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPQogICAgICAgICAgICAgICAgICAgICJEeW5hbWljRmllbGRDb25maWcgbWlzc2luZyBmb3IgZmllbGQ6ICREeW5hbWljRmllbGROYW1lLCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiOwoKICAgICAgICAgICAgICAgICMgbG9nIGVycm9yIGJ1dCBkb2VzIG5vdCBzdG9wIHRoZSBleGVjdXRpb24gYXMgaXQgY291bGQgYmUgYW4gb2xkIEFydGljbGUKICAgICAgICAgICAgICAgICMgRHluYW1pY0ZpZWxkLCBzZWUgYnVnIzExNjY2CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEdldCBEeW5hbWljRmllbGQgVmFsdWVzCiAgICAgICAgICAgICRWYWx1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKS0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAjIHNldCB0aGUgY3JpdGljYWxpdHkgZnJvbSB0aGUgc2VydmljZQogICAgICAgICAgICBpZiAoICRTZWxmLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9ICYmICREeW5hbWljRmllbGROYW1lIGVxICdJVFNNQ3JpdGljYWxpdHknICYmICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZXJ2aWNlSUQnICkgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICAgICAgICAgbXkgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IHRoZSBjcml0aWNhbGl0eQogICAgICAgICAgICAgICAgJFZhbHVlID0gJFNlcnZpY2V7Q3JpdGljYWxpdHl9OwogICAgICAgICAgICB9CiMgLS0tCgogICAgICAgICAgICAjIElmIHdlIGdvdCBhIHN1Ym1pdHRlZCBwYXJhbSwgdGFrZSBpdCBhbmQgbmV4dCBvdXQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkVmFsdWUKICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAkVmFsdWUgZXEgJycKICAgICAgICAgICAgICAgICAgICB8fCBJc1N0cmluZ1dpdGhEYXRhKCRWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB8fCBJc0FycmF5UmVmV2l0aERhdGEoJFZhbHVlKQogICAgICAgICAgICAgICAgICAgIHx8IElzSGFzaFJlZldpdGhEYXRhKCRWYWx1ZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFZhbHVlOwogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBJZiB3ZSBkaWRuJ3QgaGF2ZSBhIFBhcmFtIFZhbHVlIHRyeSB0aGUgdGlja2V0IFZhbHVlCiAgICAgICAgICAgICMgbmV4dCBvdXQgaWYgaXQgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkVGlja2V0eyRDdXJyZW50RmllbGR9CiAgICAgICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHskQ3VycmVudEZpZWxkfSBlcSAnJwogICAgICAgICAgICAgICAgICAgIHx8IElzU3RyaW5nV2l0aERhdGEoICRUaWNrZXR7JEN1cnJlbnRGaWVsZH0gKQogICAgICAgICAgICAgICAgICAgIHx8IElzQXJyYXlSZWZXaXRoRGF0YSggJFRpY2tldHskQ3VycmVudEZpZWxkfSApCiAgICAgICAgICAgICAgICAgICAgfHwgSXNIYXNoUmVmV2l0aERhdGEoICRUaWNrZXR7JEN1cnJlbnRGaWVsZH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkVGlja2V0eyRDdXJyZW50RmllbGR9OwogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBJZiB3ZSBoYWQgbmVpdGhlciBzdWJtaXR0ZWQgbm9yIHRpY2tldCBwYXJhbSBnZXQgdGhlIEFjdGl2aXR5RGlhbG9nJ3MgZGVmYXVsdCBWYWx1ZQogICAgICAgICAgICAjIG5leHQgb3V0IGlmIGl0IHdhcyBzdWNjZXNzZnVsCiAgICAgICAgICAgICRWYWx1ZSA9ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRWYWx1ZSAmJiBsZW5ndGggJFZhbHVlICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFZhbHVlOwogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBJZiB3ZSBoYWQgbm8gc3VibWl0dGVkLCB0aWNrZXQgb3IgQWN0aXZpdHlEaWFsb2cgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICAjIHVzZSB0aGUgRHluYW1pY0ZpZWxkJ3MgZGVmYXVsdCB2YWx1ZSBhbmQgbmV4dCBvdXQKICAgICAgICAgICAgJFZhbHVlID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRWYWx1ZSAmJiBsZW5ndGggJFZhbHVlICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFZhbHVlOwogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBhbGwgdGhhdCBmYWlsZWQgdGhlbiB0aGUgZmllbGQgc2hvdWxkIG5vdCBoYXZlIGEgZGVmaW5lZCB2YWx1ZSBvdGhlcndpc2UKICAgICAgICAgICAgIyBpZiBhIHZhbHVlIChldmVuIGVtcHR5KSBpcyBzZW50LCBmaWVsZHMgbGlrZSBEYXRlIG9yIERhdGVUaW1lIHdpbGwgbWFyayB0aGUgZmllbGQgYXMKICAgICAgICAgICAgIyB1c2VkIHdpdGggdGhlIGZpZWxkIGRpc3BsYXkgdmFsdWUsIHRoaXMgY291bGQgbGVhZCB0byB1bndhbnRlZCBmaWVsZCBzZXRzLAogICAgICAgICAgICAjIHNlZSBidWcjOTE1OQogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmaWVsZHMKICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgZXEgJ0FydGljbGUnICkgewoKICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1YmplY3QnICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCb2R5JyApOwogICAgICAgICAgICBAeyAkR2V0UGFyYW17SW5mb3JtVXNlcklEfSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICdJbmZvcm1Vc2VySUQnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFZhbHVlc0dvdHRlbntBcnRpY2xlfSA9IDEgaWYgKCAkR2V0UGFyYW17U3ViamVjdH0gJiYgJEdldFBhcmFte0JvZHl9ICk7CgogICAgICAgICAgICAkR2V0UGFyYW17VGltZVVuaXRzfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaW1lVW5pdHMnICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgZXEgJ0N1c3RvbWVySUQnICkgewogICAgICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJ9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnUGVuZGluZ1RpbWUnICkgewogICAgICAgICAgICBteSAkUHJlZml4ID0gJ1BlbmRpbmdUaW1lJzsKCiAgICAgICAgICAgICMgT2ssIHdlIG5lZWQgdG8gdHJ5IHRvIGZpbmQgdGhlIHRhcmdldCBzdGF0ZSBub3cKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YTsKCiAgICAgICAgICAgICMgZ2V0IHN0YXRlIG9iamVjdAogICAgICAgICAgICBteSAkU3RhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKTsKCiAgICAgICAgICAgICMgV2FzIHNvbWV0aGluZyBzdWJtaXR0ZWQgZnJvbSB0aGUgR1VJPwogICAgICAgICAgICBteSAkVGFyZ2V0U3RhdGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGF0ZUlEJyApOwogICAgICAgICAgICBpZiAoJFRhcmdldFN0YXRlSUQpIHsKICAgICAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkU3RhdGVPYmplY3QtPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUYXJnZXRTdGF0ZUlELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBGYWxsYmFjayAxOiBkZWZhdWx0IHZhbHVlIG9mIGRpYWxvZyBmaWVsZCBTdGF0ZQogICAgICAgICAgICBpZiAoICElU3RhdGVEYXRhICYmICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317U3RhdGV9e0RlZmF1bHRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAlU3RhdGVEYXRhID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317U3RhdGV9e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEZhbGxiYWNrIDI6IGRlZmF1bHQgdmFsdWUgb2YgZGlhbG9nIGZpZWxkIFN0YXRlSUQKICAgICAgICAgICAgaWYgKCAhJVN0YXRlRGF0YSAmJiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9e1N0YXRlSUR9e0RlZmF1bHRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAlU3RhdGVEYXRhID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9e1N0YXRlSUR9e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEZhbGxiYWNrIDM6IGV4aXN0aW5nIHRpY2tldCBzdGF0ZQogICAgICAgICAgICBpZiAoICElU3RhdGVEYXRhICYmICVUaWNrZXQgKSB7CiAgICAgICAgICAgICAgICAlU3RhdGVEYXRhID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkVGlja2V0e1N0YXRlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcGVuZGluZyB0aW1lIHZhbHVlcwogICAgICAgICAgICAjIGRlcGVuZHMgb24gU3RhdGVUeXBlIGNvbnRhaW5pbmcgJ15wZW5kaW5nJwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdGF0ZURhdGEgKQogICAgICAgICAgICAgICAgJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0KICAgICAgICAgICAgICAgICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICBteSAlRGF0ZVBhcmFtID0gKCBQcmVmaXggPT4gJFByZWZpeCApOwoKICAgICAgICAgICAgICAgICMgbWFwIHRoZSBHZXRQYXJhbSdzIERhdGUgVmFsdWVzIHRvIG91ciBEYXRlUGFyYW1IYXNoCiAgICAgICAgICAgICAgICAlRGF0ZVBhcmFtID0gbWFwIHsKICAgICAgICAgICAgICAgICAgICAoICRQcmVmaXggLiAkXyApCiAgICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICggJFByZWZpeCAuICRfICkgKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSk7CgogICAgICAgICAgICAgICAgIyBpZiBhbGwgdmFsdWVzIGFyZSBwcmVzZW50CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkRGF0ZVBhcmFteyAkUHJlZml4IC4gJ1llYXInIH0KICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICREYXRlUGFyYW17ICRQcmVmaXggLiAnTW9udGgnIH0KICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICREYXRlUGFyYW17ICRQcmVmaXggLiAnRGF5JyB9CiAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkRGF0ZVBhcmFteyAkUHJlZml4IC4gJ0hvdXInIH0KICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICREYXRlUGFyYW17ICRQcmVmaXggLiAnTWludXRlJyB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAjIHJlY2FsY3VsYXRlIHRpbWUgYWNjb3JkaW5nIHRvIHRoZSB1c2VyJ3MgdGltZXpvbmUKICAgICAgICAgICAgICAgICAgICAlRGF0ZVBhcmFtID0gJExheW91dE9iamVjdC0+VHJhbnNmb3JtRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJURhdGVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHJlZm9ybWF0IGZvciBzdG9yaW5nIChlLmcuIHRha2Ugb3V0IFByZWZpeCkKICAgICAgICAgICAgICAgICAgICAleyAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gfQogICAgICAgICAgICAgICAgICAgICAgICA9IG1hcCB7ICRfID0+ICREYXRlUGFyYW17ICRQcmVmaXggLiAkXyB9IH0gcXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpOwogICAgICAgICAgICAgICAgICAgICRWYWx1ZXNHb3R0ZW57UGVuZGluZ1RpbWV9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBOb24gRHluYW1pY0ZpZWxkcwogICAgICAgICMgMS4gdHJ5IHRvIGdldCB0aGUgcmVxdWlyZWQgcGFyYW0KICAgICAgICBteSAkVmFsdWUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSApOwoKICAgICAgICBpZiAoJFZhbHVlKSB7CgogICAgICAgICAgICAjIGlmIHdlIGhhdmUgYW4gSUQgZmllbGQgbWFrZSBzdXJlIHRoZSB2YWx1ZSB3aXRob3V0IElEIHdvbid0IGJlIGluIHRoZQogICAgICAgICAgICAjICVHZXRQYXJhbSBIYXNoIGFueSBtb3JlCiAgICAgICAgICAgIGlmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gPX4gbXsoLiopSUQkfXhtcyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskMX0gPSB1bmRlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkR2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gICAgID0gJFZhbHVlOwogICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CgogICAgICAgICMgSWYgd2UgZ290IHRpY2tldCBwYXJhbXMsIHRoZSBHZXRQYXJhbSBIYXNoIHdhcyBhbHJlYWR5IGZpbGxlZCBiZWZvcmUgdGhlIGxvb3AKICAgICAgICAjIGFuZCB3ZSBjYW4gbmV4dCBvdXQKICAgICAgICBpZiAoICRHZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSApIHsKICAgICAgICAgICAgJFZhbHVlc0dvdHRlbnsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgZXEgJ1F1ZXVlJyAmJiAhJEdldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ICkgewogICAgICAgICAgICBteSAkVXNlckRlZmF1bHRRdWV1ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VXNlckRlZmF1bHRRdWV1ZScpIHx8ICcnOwogICAgICAgICAgICBpZiAoJFVzZXJEZWZhdWx0UXVldWUpIHsKICAgICAgICAgICAgICAgIG15ICRRdWV1ZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkVXNlckRlZmF1bHRRdWV1ZSApOwogICAgICAgICAgICAgICAgaWYgKCRRdWV1ZUlEKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRDdXJyZW50RmllbGR9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRVc2VyRGVmYXVsdFF1ZXVlOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSAgICAgPSAkUXVldWVJRDsKICAgICAgICAgICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIFN1Ym1pdHRlZCBub3JlIFRpY2tldCBQYXJhbSBnZXQgQWN0aXZpdHlEaWFsb2cgQ29uZmlnJ3MgUGFyYW0KICAgICAgICBpZiAoICRDdXJyZW50RmllbGQgbmUgJ0N1c3RvbWVySUQnICkgewogICAgICAgICAgICAkVmFsdWUgPSAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgfQogICAgICAgIGlmICgkVmFsdWUpIHsKICAgICAgICAgICAgJFZhbHVlc0dvdHRlbnsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgICAgICRHZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRWYWx1ZTsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CiAgICB9CiAgICBSRVFVSVJFREZJRUxETE9PUDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkIChxdyhRdWV1ZSBTdGF0ZSBMb2NrIFByaW9yaXR5KSkgewogICAgICAgICRWYWx1ZSA9IHVuZGVmOwogICAgICAgIGlmICggISRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RGVmYXVsdCRDdXJyZW50RmllbGQiKTsKICAgICAgICAgICAgaWYgKCAhJFZhbHVlICkgewoKICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzOjpEZWZhdWx0JXMgQ29uZmlnIFZhbHVlIG1pc3NpbmchJywKICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEdldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFZhbHVlOwogICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJERlc3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgIGlmICgkRGVzdCkgewoKICAgICAgICBteSBAUXVldWVQYXJ0cyA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CgogICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRRdWV1ZVBhcnRzWzBdOwogICAgICAgICRHZXRQYXJhbXtRdWV1ZX0gICA9ICRRdWV1ZVBhcnRzWzFdOwoKICAgICAgICAkVmFsdWVzR290dGVue1F1ZXVlSUR9ID0gMTsKICAgIH0KCiAgICAjIGdldCBhbHNvIHRoZSBJRHMgZm9yIHRoZSBSZXF1aXJlZCBmaWxlcyAoaWYgdGhleSBhcmUgbm90IHByZXNlbnQpCiAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZX0gJiYgISRHZXRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRHZXRQYXJhbXtRdWV1ZX0gKTsKICAgIH0KICAgIGlmICggJEdldFBhcmFte1N0YXRlfSAmJiAhJEdldFBhcmFte1N0YXRlSUR9ICkgewogICAgICAgICRHZXRQYXJhbXtTdGF0ZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUxvb2t1cCggU3RhdGUgPT4gJEdldFBhcmFte1N0YXRlfSApOwogICAgfQogICAgaWYgKCAkR2V0UGFyYW17TG9ja30gJiYgISRHZXRQYXJhbXtMb2NrSUR9ICkgewogICAgICAgICRHZXRQYXJhbXtMb2NrSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvY2snKS0+TG9ja0xvb2t1cCggTG9jayA9PiAkR2V0UGFyYW17TG9ja30gKTsKICAgIH0KICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5fSAmJiAhJEdldFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScpLT5Qcmlvcml0eUxvb2t1cCgKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJEdldFBhcmFte1ByaW9yaXR5fSwKICAgICAgICApOwogICAgfQoKICAgICMgYW5kIGZpbmFsbHkgd2UnbGwgaGF2ZSB0aGUgc3BlY2lhbCBwYXJhbWV0ZXJzOgogICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdSZXNwb25zaWJsZUFsbCcgKTsKICAgICRHZXRQYXJhbXtPd25lckFsbH0gICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3duZXJBbGwnICk7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJyApOwoKICAgIHJldHVybiBcJUdldFBhcmFtOwp9CgpzdWIgX091dHB1dEFjdGl2aXR5RGlhbG9nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkVGlja2V0SUQgICAgICAgICAgICAgICA9ICRQYXJhbXtHZXRQYXJhbX17VGlja2V0SUR9OwogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW17R2V0UGFyYW19e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9OwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBDaGVjayBuZWVkZWQgcGFyYW1ldGVyczoKICAgICMgUHJvY2Vzc0VudGl0eUlEIG9ubHkKICAgICMgVGlja2V0SUQgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAogICAgaWYgKCAhJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0gfHwgKCAhJFRpY2tldElEICYmICEkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCApICkgewogICAgICAgIG15ICRNZXNzYWdlID0gVHJhbnNsYXRhYmxlKCdHb3Qgbm8gUHJvY2Vzc0VudGl0eUlEIG9yIFRpY2tldElEIGFuZCBBY3Rpdml0eURpYWxvZ0VudGl0eUlEIScpOwoKICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZzsKICAgIG15ICVUaWNrZXQ7CiAgICBteSAlRXJyb3IgICAgICAgICA9ICgpOwogICAgbXkgJUVycm9yTWVzc2FnZXMgPSAoKTsKCiAgICAjIElmIHdlIGhhZCBFcnJvcnMsIHdlIGdvdCBhbiBFcnJvcmhhc2gKICAgICVFcnJvciAgICAgICAgID0gJXsgJFBhcmFte0Vycm9yfSB9ICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICk7CiAgICAlRXJyb3JNZXNzYWdlcyA9ICV7ICRQYXJhbXtFcnJvck1lc3NhZ2VzfSB9IGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvck1lc3NhZ2VzfSApICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRBY3Rpdml0eU9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHknKTsKICAgIG15ICRBY3Rpdml0eURpYWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2cnKTsKCiAgICAjIGNyZWF0ZSBwcm9jZXNzIG9iamVjdAogICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MnID0+IHsKICAgICAgICAgICAgQWN0aXZpdHlPYmplY3QgICAgICAgICA9PiAkQWN0aXZpdHlPYmplY3QsCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nT2JqZWN0ICAgPT4gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LAogICAgICAgICAgICBUcmFuc2l0aW9uT2JqZWN0ICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbicpLAogICAgICAgICAgICBUcmFuc2l0aW9uQWN0aW9uT2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbkFjdGlvbicpLAogICAgICAgICAgICB9CiAgICApOwogICAgbXkgJFByb2Nlc3NPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MnKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgaWYgKCAhJFRpY2tldElEIHx8ICRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSApIHsKICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZyA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzU3RhcnRwb2ludEdldCgKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nKSApIHsKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnQ2FuXCd0IGdldCBTdGFydEFjdGl2aXR5RGlhbG9nIGFuZCBTdGFydEFjdGl2aXR5RGlhbG9nIGZvciB0aGUgUHJvY2Vzc0VudGl0eUlEICIlcyIhJywKICAgICAgICAgICAgICAgICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBubyBBSkFYIHVwZGF0ZSBpbiB0aGlzIHBhcnQKICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVUaWNrZXQgKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ2FuXCd0IGdldCBUaWNrZXQgIiVzIiEnLCAkUGFyYW17VGlja2V0SUR9ICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRHluYW1pY0ZpZWxkUHJvY2Vzc0lEID0gJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudFByb2Nlc3NJRCcpOwogICAgICAgIG15ICREeW5hbWljRmllbGRBY3Rpdml0eUlEID0gJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudEFjdGl2aXR5SUQnKTsKCiAgICAgICAgaWYgKCAhJFRpY2tldHskRHluYW1pY0ZpZWxkUHJvY2Vzc0lEfSB8fCAhJFRpY2tldHskRHluYW1pY0ZpZWxkQWN0aXZpdHlJRH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnQ2FuXCd0IGdldCBQcm9jZXNzRW50aXR5SUQgb3IgQWN0aXZpdHlFbnRpdHlJRCBmb3IgVGlja2V0ICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nID0gewogICAgICAgICAgICBBY3Rpdml0eSAgICAgICA9PiAkVGlja2V0eyREeW5hbWljRmllbGRBY3Rpdml0eUlEfSwKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2cgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAoICElVGlja2V0ICYmICRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSApIHsKICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRBY3Rpdml0eSA9ICRBY3Rpdml0eU9iamVjdC0+QWN0aXZpdHlHZXQoCiAgICAgICAgSW50ZXJmYWNlICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eX0KICAgICk7CiAgICBpZiAoICEkQWN0aXZpdHkgKSB7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICdDYW5cJ3QgZ2V0IEFjdGl2aXR5IGNvbmZpZ3VyYXRpb24gZm9yIEFjdGl2aXR5RW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5fSwKICAgICAgICApOwoKICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQWN0aXZpdHlEaWFsb2cgPSAkQWN0aXZpdHlEaWFsb2dPYmplY3QtPkFjdGl2aXR5RGlhbG9nR2V0KAogICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgKTsKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eURpYWxvZykgKSB7CiAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICdDYW5cJ3QgZ2V0IEFjdGl2aXR5RGlhbG9nIGNvbmZpZ3VyYXRpb24gZm9yIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfSwKICAgICAgICApOwoKICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdyZXAgb3V0IE92ZXJ3cml0ZXMgaWYgZGVmaW5lZCBvbiB0aGUgQWN0aXZpdHkKICAgIG15IEBPdmVyd3JpdGVBY3Rpdml0eURpYWxvZ051bWJlciA9IGdyZXAgewogICAgICAgIHJlZiAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ317JF99IGVxICdIQVNIJwogICAgICAgICAgICAmJiAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ317JF99e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9CiAgICAgICAgICAgICYmICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfXskX317QWN0aXZpdHlEaWFsb2dFbnRpdHlJRH0gZXEKICAgICAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30KICAgICAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfXskX317T3ZlcndyaXRlfSApCiAgICB9IGtleXMgJXsgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9IH07CgogICAgIyBsZXQgdGhlIE92ZXJ3cml0ZXMgT3ZlcndyaXRlIHRoZSBBY3Rpdml0eURpYWxvZydzIEhhc2ggdmFsdWVzCiAgICBpZiAoICRPdmVyd3JpdGVBY3Rpdml0eURpYWxvZ051bWJlclswXSApIHsKICAgICAgICAleyRBY3Rpdml0eURpYWxvZ30gPSAoCiAgICAgICAgICAgICV7JEFjdGl2aXR5RGlhbG9nfSwKICAgICAgICAgICAgJXsgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9eyAkT3ZlcndyaXRlQWN0aXZpdHlEaWFsb2dOdW1iZXJbMF0gfXtPdmVyd3JpdGV9IH0KICAgICAgICApOwogICAgfQoKICAgICMgQWRkIFBhZ2VIZWFkZXIsIE5hdmJhciwgRm9ybWhlYWRlciAoUHJvY2Vzcy9BY3Rpdml0eURpYWxvZ0hlYWRlcikKICAgIG15ICRPdXRwdXQ7CiAgICBteSAkTWFpbkJveENsYXNzOwoKICAgIGlmICggISRTZWxmLT57SXNNYWluV2luZG93fSAmJiAhJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9ICkgewogICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7TnVtYmVyfSwKICAgICAgICApOwoKICAgICAgICAjIGRpc3BsYXkgZ2l2ZW4gbm90aWZ5IG1lc3NhZ2VzIGlmIHRoaXMgaXMgbm90IGFuIEFKQVggcmVxdWVzdAogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17Tm90aWZ5fSApICkgewoKICAgICAgICAgICAgZm9yIG15ICROb3RpZnlEYXRhICggQHsgJFBhcmFte05vdGlmeX0gfSApIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCAleyROb3RpZnlEYXRhfSApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkQWN0aXZpdHlEaWFsb2ctPntOYW1lfSApCiAgICAgICAgICAgICAgICAgICAgfHwgJycsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICgKICAgICAgICAoICRTZWxmLT57SXNNYWluV2luZG93fSB8fCAkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKQogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCBcJUVycm9yICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkU2VsZi0+e0NvbmZpZ30tPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRpc3BsYXkgY29tcGxldGUgaGVhZGVyIGFuZCBuYXZpZ2F0aW9uIGJhciBpbiBBSkFYIGRpYWxvZ3Mgd2hlbiB0aGVyZSBpcyBhIHNlcnZlciBlcnJvcgogICAgICAgICMgICAgdW5sZXNzIHdlIGFyZSBpbiBhIHByb2Nlc3MgZW5yb2xsbWVudCAob25seSB3aGVuIElzTWFpbldpbmRvdyBpcyBhY3RpdmUpCiAgICAgICAgbXkgJFR5cGUgPSAkU2VsZi0+e0lzTWFpbldpbmRvd30gPyAnJyA6ICdTbWFsbCc7CiAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgVHlwZSA9PiAkVHlwZSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICB9CgogICAgICAgICMgZGlzcGxheSBvcmlnaW5hbCBoZWFkZXIgdGV4dHMgKHRoZSBwcm9jZXNzIGxpc3QgbWF5YmUgaXMgbm90IG5lY2Vzc2FyeSkKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFByb2Nlc3MnIC4gJFR5cGUsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgSXNQcm9jZXNzRW5yb2xsID0+ICRTZWxmLT57SXNQcm9jZXNzRW5yb2xsfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aGUgTWFpbkJveCBjbGFzcyB0byBhZGQgY29ycmVjdCBib3JkZXJzIHRvIHRoZSBzY3JlZW4KICAgICAgICAkTWFpbkJveENsYXNzID0gJ01haW5Cb3gnOwogICAgfQoKICAgICMgZGlzcGxheSBwcm9jZXNzIGluZm9ybWF0aW9uCiAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKCiAgICAgICAgIyBnZXQgcHJvY2VzcyBkYXRhCiAgICAgICAgbXkgJFByb2Nlc3MgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc0dldCgKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG1haW4gcHJvY2VzcyBpbmZvcm1hdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzSW5mb1NpZGViYXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFByb2Nlc3MgICAgICAgID0+ICRQcm9jZXNzLT57TmFtZX0gICAgICAgIHx8ICcnLAogICAgICAgICAgICAgICAgQWN0aXZpdHkgICAgICAgPT4gJEFjdGl2aXR5LT57TmFtZX0gICAgICAgfHwgJycsCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZyA9PiAkQWN0aXZpdHlEaWFsb2ctPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBhY3Rpdml0eSBkaWFsb2cgc2hvcnQgZGVzY3JpcHRpb24gKGlmIGFueSkKICAgICAgICBpZiAoCiAgICAgICAgICAgIGRlZmluZWQgJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25TaG9ydH0KICAgICAgICAgICAgJiYgJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25TaG9ydH0gbmUgJycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzSW5mb1NpZGViYXJBY3Rpdml0eURpYWxvZ0Rlc2MnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dEZXNjcmlwdGlvbiA9PiAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fSB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBsb25nIGRlc2NyaXB0aW9uIGluZm9ybWF0aW9uIGlmIGV4aXN0cwogICAgICAgIGlmICgKICAgICAgICAgICAgZGVmaW5lZCAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvbkxvbmd9CiAgICAgICAgICAgICYmIGxlbmd0aCAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvbkxvbmd9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9uZ0Rlc2NyaXB0aW9uU2lkZWJhcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGRlc2NyaXB0aW9ucwogICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydAogICAgICAgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Rlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nCiAgICAgICAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICRBY3Rpdml0eURpYWxvZy0+e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBjbG9zZSAmIGNhbmNlbCBsaW5rIGlmIG5lY2Vzc2FyeQogICAgaWYgKCAhJFNlbGYtPntJc01haW5XaW5kb3d9ICYmICEkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17UmVuZGVyTG9ja2VkfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQcm9wZXJ0aWVzTG9jaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2FuY2VsTGluaycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgIH0KCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L0FjdGl2aXR5RGlhbG9nSGVhZGVyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBGb3JtTmFtZSAgICAgICAgICAgICAgID0+ICdBY3Rpdml0eURpYWxvZ0RpYWxvZycgLiAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfSwKICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIFN1YmFjdGlvbiAgICAgICAgICAgICAgPT4gJ1N0b3JlQWN0aXZpdHlEaWFsb2cnLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgID0+ICRUaWNrZXR7VGlja2V0SUR9IHx8ICcnLAogICAgICAgICAgICBMaW5rVGlja2V0SUQgICAgICAgICAgID0+ICRTZWxmLT57TGlua1RpY2tldElEfSwKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEICAgICAgICA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfQogICAgICAgICAgICAgICAgfHwgJFRpY2tldHsKICAgICAgICAgICAgICAgICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KAogICAgICAgICAgICAgICAgICAgICdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudFByb2Nlc3NJRCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBJc01haW5XaW5kb3cgICAgPT4gJFNlbGYtPntJc01haW5XaW5kb3d9LAogICAgICAgICAgICBJc1Byb2Nlc3NFbnJvbGwgPT4gJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9LAogICAgICAgICAgICBNYWluQm94Q2xhc3MgICAgPT4gJE1haW5Cb3hDbGFzcyB8fCAnJywKICAgICAgICB9LAogICAgKTsKCiAgICBteSAlUmVuZGVyZWRGaWVsZHMgPSAoKTsKCiAgICAjIGdldCB0aGUgbGlzdCBvZiBmaWVsZHMgd2hlcmUgdGhlIEFKQVggbG9hZGVyIGljb24gc2hvdWxkIGFwcGVhciBvbiBBSkFYIHVwZGF0ZXMgdHJpZ2dlcmVkCiAgICAjIGJ5IEFjdGl2aXR5RGlhbG9nIGZpZWxkcwogICAgbXkgJEFKQVhVcGRhdGFibGVGaWVsZHMgPSAkU2VsZi0+X0dldEFKQVhVcGRhdGFibGVGaWVsZHMoCiAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZHMgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfSwKICAgICk7CgogICAgIyBMb29wIHRocm91Z2ggQWN0aXZpdHlEaWFsb2dGaWVsZHMgYW5kIHJlbmRlciB0aGVpciBvdXRwdXQKICAgIERJQUxPR0ZJRUxEOgogICAgZm9yIG15ICRDdXJyZW50RmllbGQgKCBAeyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZE9yZGVyfSB9ICkgewogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9ICkgKSB7CiAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0NhblwndCBnZXQgZGF0YSBmb3IgRmllbGQgIiVzIiBvZiBBY3Rpdml0eURpYWxvZyAiJXMiIScsCiAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUZpZWxkRGF0YSA9ICV7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgIyBXZSByZW5kZXIganVzdCB2aXNpYmxlIEFjdGl2aXR5RGlhbG9nRmllbGRzCiAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAhJEZpZWxkRGF0YXtEaXNwbGF5fTsKCiAgICAgICAgIyByZW5kZXIgRHluYW1pY0ZpZWxkcwogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCA9fiBte15EeW5hbWljRmllbGRfKC4qKX14bXMgKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJDE7CiAgICAgICAgICAgIG15ICRSZXNwb25zZSAgICAgICAgID0gJFNlbGYtPl9SZW5kZXJEeW5hbWljRmllbGQoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICREeW5hbWljRmllbGROYW1lLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlcyAgICAgICA9PiBcJUVycm9yTWVzc2FnZXMgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJEFKQVhVcGRhdGFibGVGaWVsZHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7JEN1cnJlbnRGaWVsZH0gPSAxOwoKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFN0YXRlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdTdGF0ZUlEJyApCiAgICAgICAgewoKICAgICAgICAgICAgIyBXZSBkb24ndCByZW5kZXIgRmllbGRzIHR3aWNlLAogICAgICAgICAgICAjIGlmIHRoZXJlIHdhcyBhbHJlYWR5IGEgQ29uZmlnIHdpdGhvdXQgSUQsIHNraXAgdGhpcyBmaWVsZAogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJTdGF0ZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFF1ZXVlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdRdWV1ZUlEJyApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJRdWV1ZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFByaW9yaXR5CiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdQcmlvcml0eUlEJyApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJQcmlvcml0eSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIExvY2sKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ0xvY2tJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlckxvY2soCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJEFKQVhVcGRhdGFibGVGaWVsZHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBTZXJ2aWNlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdTZXJ2aWNlSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJTZXJ2aWNlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRBSkFYVXBkYXRhYmxlRmllbGRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyRDdXJyZW50RmllbGR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFNMQQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnU0xBSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJTTEEoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJEFKQVhVcGRhdGFibGVGaWVsZHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBPd25lcgogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnT3duZXJJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlck93bmVyKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRBSkFYVXBkYXRhYmxlRmllbGRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgcmVzcG9uc2libGUKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1Jlc3BvbnNpYmxlSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJSZXNwb25zaWJsZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIEN1c3RvbWVySUQKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ0N1c3RvbWVySUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJDdXN0b21lcigKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgIGVsc2lmICggJEN1cnJlbnRGaWVsZCBlcSAnUGVuZGluZ1RpbWUnICkgewoKICAgICAgICAgICAgIyBQZW5kaW5nVGltZSBpcyBqdXN0IHVzZWZ1bCBpZiB3ZSBoYXZlIFN0YXRlIG9yIFN0YXRlSUQKICAgICAgICAgICAgaWYgKCAhZ3JlcCB7bXteKFN0YXRlSUR8U3RhdGUpJH14bXN9IEB7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkT3JkZXJ9IH0gKSB7CiAgICAgICAgICAgICAgICBteSAkTWVzc2FnZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnUGVuZGluZ1RpbWUgY2FuIGp1c3QgYmUgdXNlZCBpZiBTdGF0ZSBvciBTdGF0ZUlEIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBzYW1lIEFjdGl2aXR5RGlhbG9nLiBBY3Rpdml0eURpYWxvZzogJXMhJywKICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJQZW5kaW5nVGltZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgVGl0bGUKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1RpdGxlJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyVGl0bGUoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3skQ3VycmVudEZpZWxkfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBBcnRpY2xlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdBcnRpY2xlJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyQXJ0aWNsZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgSW5mb3JtQWdlbnRzICAgICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57QXJ0aWNsZX0tPntDb25maWd9LT57SW5mb3JtQWdlbnRzfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3skQ3VycmVudEZpZWxkfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBUeXBlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdUeXBlSUQnICkgewoKICAgICAgICAgICAgIyBXZSBkb24ndCByZW5kZXIgRmllbGRzIHR3aWNlLAogICAgICAgICAgICAjIGlmIHRoZXJlIHdhcyBhbHJlYWR5IGEgQ29uZmlnIHdpdGhvdXQgSUQsIHNraXAgdGhpcyBmaWVsZAogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJUeXBlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRBSkFYVXBkYXRhYmxlRmllbGRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkRm9vdGVyQ1NTQ2xhc3MgPSAnRm9vdGVyJzsKCiAgICBpZiAoICRTZWxmLT57SXNBamF4UmVxdWVzdH0gKSB7CgogICAgICAgICMgRHVlIHRvIHRoZSBpbml0aWFsIGxvYWRpbmcgb2YKICAgICAgICAjIHRoZSBmaXJzdCBBY3Rpdml0eURpYWxvZyBhZnRlciBQcm9jZXNzIHNlbGVjdGlvbgogICAgICAgICMgd2UgaGF2ZSB0byBiaW5kIHRoZSBBamF4VXBkYXRlIEZ1bmN0aW9uIG9uCiAgICAgICAgIyB0aGUgc2VsZWN0cywgc28gd2UgZ2V0IHRoZSBjb21wbGV0ZSBKU09uRG9jdW1lbnRDb21wbGV0ZSBjb2RlCiAgICAgICAgIyBhbmQgZGVsaXZlciBpdCBpbiB0aGUgRm9vdGVySlMgYmxvY2suCiAgICAgICAgIyBUaGlzIEphdmFzY3JpcHQgUGFydCBpcyBleGVjdXRlZCBpbgogICAgICAgICMgQWdlbnRUaWNrZXRQcm9jZXNzLnR0CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Zvb3RlckpTJywKICAgICAgICApOwoKICAgICAgICAkRm9vdGVyQ1NTQ2xhc3MgPSAnQ2VudGVyZWQnOwogICAgfQoKICAgICMgc2V0IHN1Ym1pdCBidXR0b24gZGF0YQogICAgbXkgJEJ1dHRvblRleHQgID0gJ1N1Ym1pdCc7CiAgICBteSAkQnV0dG9uVGl0bGUgPSAnU2F2ZSc7CiAgICBteSAkQnV0dG9uSUQgICAgPSAnU3VibWl0JyAuICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9OwogICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRCdXR0b25UZXh0fSApIHsKICAgICAgICAkQnV0dG9uVGV4dCAgPSAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRCdXR0b25UZXh0fTsKICAgICAgICAkQnV0dG9uVGl0bGUgPSAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRCdXR0b25UZXh0fTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdGb290ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBGb290ZXJDU1NDbGFzcyA9PiAkRm9vdGVyQ1NTQ2xhc3MsCiAgICAgICAgICAgIEJ1dHRvblRleHQgICAgID0+ICRCdXR0b25UZXh0LAogICAgICAgICAgICBCdXR0b25UaXRsZSAgICA9PiAkQnV0dG9uVGl0bGUsCiAgICAgICAgICAgIEJ1dHRvbklEICAgICAgID0+ICRCdXR0b25JRAoKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRBY3Rpdml0eURpYWxvZy0+e1N1Ym1pdEFkdmljZVRleHR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdWJtaXRBZHZpY2VUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBBZHZpY2VUZXh0ID0+ICRBY3Rpdml0eURpYWxvZy0+e1N1Ym1pdEFkdmljZVRleHR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyByZWxvYWQgcGFyZW50IHdpbmRvdwogICAgaWYgKCAkUGFyYW17UGFyZW50UmVsb2FkfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdQYXJlbnRSZWxvYWQnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBBZGQgdGhlIEZvcm1Gb290ZXIKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvQWN0aXZpdHlEaWFsb2dGb290ZXInLAogICAgICAgIERhdGEgICAgICAgICA9PiB7fSwKICAgICk7CgogICAgIyBkaXNwbGF5IHJlZ3VsYXIgZm9vdGVyIG9ubHkgaW4gbm9uLWFqYXggY2FzZQogICAgaWYgKCAhJFNlbGYtPntJc0FqYXhSZXF1ZXN0fSApIHsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAkU2VsZi0+e0lzTWFpbldpbmRvd30gPyAnJyA6ICdTbWFsbCcgKTsKICAgIH0KCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9SZW5kZXJQZW5kaW5nVGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyUGVuZGluZ1RpbWUnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJQZW5kaW5nVGltZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsID0+ICgKICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdQZW5kaW5nIERhdGUnKQogICAgICAgICAgICAgICAgLiAnICgnCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnZm9yIHBlbmRpbmcqIHN0YXRlcycpIC4gJyknCiAgICAgICAgKSwKICAgICAgICBGaWVsZElEID0+ICdSZXNwb25zaWJsZUlEJywKICAgICAgICBGb3JtSUQgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgKTsKCiAgICBteSAkRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSApIHsKICAgICAgICBpZiAoICRQYXJhbXtFcnJvcn0tPnsnUGVuZGluZ3RUaW1lRGF5J30gKSB7CiAgICAgICAgICAgICREYXRhe1BlbmRpbmd0VGltZURheUVycm9yfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiRGF0ZSBpbnZhbGlkISIpOwogICAgICAgICAgICAkRXJyb3IgPSAkUGFyYW17RXJyb3J9LT57J1BlbmRpbmd0VGltZURheSd9OwogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtFcnJvcn0tPnsnUGVuZGluZ3RUaW1lSG91cid9ICkgewogICAgICAgICAgICAkRGF0YXtQZW5kaW5ndFRpbWVIb3VyRXJyb3J9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJEYXRlIGludmFsaWQhIik7CiAgICAgICAgICAgICRFcnJvciA9ICRQYXJhbXtFcnJvcn0tPnsnUGVuZGluZ3RUaW1lRGF5J307CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDYWxlbmRhciA9ICcnOwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgdXNlZCBjYWxlbmRhciBpZiB3ZSBoYXZlIHRpY2tldCBkYXRhCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICkgewogICAgICAgICRDYWxlbmRhciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENhbGVuZGFyR2V0KAogICAgICAgICAgICAleyAkUGFyYW17VGlja2V0fSB9LAogICAgICAgICk7CiAgICB9CgogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgUHJlZml4ID0+ICdQZW5kaW5nVGltZScsCiAgICAgICAgUGVuZGluZ1RpbWVSZXF1aXJlZCA9PgogICAgICAgICAgICAoCiAgICAgICAgICAgICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIKICAgICAgICAgICAgKSA/IDEgOiAwLAogICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlID0+IDUsCiAgICAgICAgRGlmZlRpbWUgICAgICAgICA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgIHx8ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykKICAgICAgICAgICAgfHwgODY0MDAsCiAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJEVycm9yLAogICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgID0+IDEsCiAgICAgICAgVmFsaWRhdGVEYXRlSW5GdXR1cmUgPT4gMSwKICAgICAgICBDYWxlbmRhciAgICAgICAgICAgICA9PiAkQ2FsZW5kYXIsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpQZW5kaW5nVGltZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpQZW5kaW5nVGltZTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlBlbmRpbmdUaW1lOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvUGVuZGluZ1RpbWUnICksCiAgICB9Owp9CgpzdWIgX1JlbmRlckR5bmFtaWNGaWVsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCBGaWVsZE5hbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlckR5bmFtaWNGaWVsZCcgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICk7CgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICggZ3JlcCB7ICRfLT57TmFtZX0gZXEgJFBhcmFte0ZpZWxkTmFtZX0gfSBAeyREeW5hbWljRmllbGR9IClbMF07CgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CgogICAgICAgIG15ICRNZXNzYWdlID0gIkR5bmFtaWNGaWVsZENvbmZpZyBtaXNzaW5nIGZvciBmaWVsZDogJFBhcmFte0ZpZWxkTmFtZX0sIG9yIGlzIG5vdCBhIFRpY2tldCBEeW5hbWljIEZpZWxkISI7CgogICAgICAgICMgbG9nIGVycm9yIGJ1dCBkb2VzIG5vdCBzdG9wIHRoZSBleGVjdXRpb24gYXMgaXQgY291bGQgYmUgYW4gb2xkIEFydGljbGUKICAgICAgICAjIER5bmFtaWNGaWVsZCwgc2VlIGJ1ZyMxMTY2NgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgICAgIEhUTUwgICAgPT4gJycsCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgKTsKCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICk7CgogICAgICAgICMgQWxsIFRpY2tldCBEeW5hbWljRmllbGRzCiAgICAgICAgIyB1c2VkIGZvciBBQ0wgY2hlY2tpbmcKICAgICAgICBteSAlRHluYW1pY0ZpZWxkQ2hlY2tQYXJhbSA9IG1hcCB7ICRfID0+ICRQYXJhbXtHZXRQYXJhbX17JF99IH0KICAgICAgICAgICAgZ3JlcCB7bXteRHluYW1pY0ZpZWxkX314bXN9ICgga2V5cyAleyAkUGFyYW17R2V0UGFyYW19IH0gKTsKCiAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkICA9PiBcJUR5bmFtaWNGaWVsZENoZWNrUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTZXJ2ZXJFcnJvcjsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0Vycm9yfS0+eyAkUGFyYW17RmllbGROYW1lfSB9CiAgICAgICAgICAgICYmICRQYXJhbXtFcnJvcn0tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfSBuZSAnJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VydmVyRXJyb3IgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBzdG9yZWQgZHluYW1pYyBmaWVsZCB2YWx1ZSAoc3BsaXQpCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldElEfSApIHsKCiAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRTZWxmLT57TGlua1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57ICdEeW5hbWljRmllbGRfJyAuICRQYXJhbXtGaWVsZE5hbWV9IH0gPSAkVmFsdWU7CiAgICB9CiAgICBteSAkRXJyb3JNZXNzYWdlID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3JNZXNzYWdlc30gKSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0Vycm9yTWVzc2FnZXN9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH0KICAgICAgICAgICAgJiYgJFBhcmFte0Vycm9yTWVzc2FnZXN9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH0gbmUgJycKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEVycm9yTWVzc2FnZSA9ICRQYXJhbXtFcnJvck1lc3NhZ2VzfS0+eyAkUGFyYW17RmllbGROYW1lfSB9OwogICAgICAgIH0KICAgIH0KCiAgICBteSAkRHluYW1pY0ZpZWxkSFRNTCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJFBhcmFte0ZpZWxkTmFtZX0gfSwKICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKSwKICAgICAgICBBSkFYVXBkYXRlICAgICAgICAgICA9PiAxLAogICAgICAgIE1hbmRhdG9yeSAgICAgICAgICAgID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIsCiAgICAgICAgVXBkYXRhYmxlRmllbGRzICAgICAgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9LAogICAgICAgIFNlcnZlckVycm9yICAgICAgICAgID0+ICRTZXJ2ZXJFcnJvciwKICAgICAgICBFcnJvck1lc3NhZ2UgICAgICAgICA9PiAkRXJyb3JNZXNzYWdlLAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBOYW1lICAgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICBMYWJlbCAgID0+ICREeW5hbWljRmllbGRIVE1MLT57TGFiZWx9LAogICAgICAgIENvbnRlbnQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpEeW5hbWljRmllbGQnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfQogICAgICAgICAgICAgICAgfHwgJ3J3OkR5bmFtaWNGaWVsZDpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkR5bmFtaWNGaWVsZDpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L0R5bmFtaWNGaWVsZCcgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyVGl0bGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclRpdGxlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyVGl0bGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkVGl0bGUgPSAkUGFyYW17VGlja2V0fS0+e1RpdGxlfSAvLyAnJzsKCiAgICBpZiAoICEkVGl0bGUgJiYgJFNlbGYtPntMaW5rQXJ0aWNsZURhdGF9ICkgewogICAgICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntMaW5rQXJ0aWNsZURhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkVGl0bGUgPSAkVGlja2V0e1RpdGxlfTsKICAgIH0KCiAgICAkUGFyYW17R2V0UGFyYW19LT57VGl0bGV9IC8vPSAkVGl0bGU7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlRpdGxlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgVmFsdWUgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LT57VGl0bGV9LAogICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgICMgb3V0cHV0IHNlcnZlciBlcnJvcnMKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1RpdGxlJ30gKSB7CiAgICAgICAgJERhdGF7U2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6VGl0bGUnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlRpdGxlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlRpdGxlOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvVGl0bGUnICksCiAgICB9OwoKfQoKc3ViIF9SZW5kZXJBcnRpY2xlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEIFRpY2tldCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyQXJ0aWNsZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlckFydGljbGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua0FydGljbGVEYXRhfSApIHsKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgICAgIG15ICRUaWNrZXROdW1iZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXROdW1iZXJMb29rdXAoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57TGlua0FydGljbGVEYXRhfS0+e1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgc3ViamVjdAogICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPntTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkU2VsZi0+e0xpbmtBcnRpY2xlRGF0YX0tPntTdWJqZWN0fSB8fCAnJywKICAgICAgICApOwoKICAgICAgICAjIGJvZHkgcHJlcGFyYXRpb24gZm9yIHBsYWluIHRleHQgcHJvY2Vzc2luZwogICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPntCb2R5fSA9ICRMYXlvdXRPYmplY3QtPkFydGljbGVRdW90ZSgKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICRTZWxmLT57TGlua0FydGljbGVEYXRhfS0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICRTZWxmLT57TGlua0FydGljbGVEYXRhfS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpLAogICAgICAgICAgICBBdHRhY2htZW50c0luY2x1ZGUgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgIG15IEBBdHRhY2htZW50cyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgKTsKCiAgICAjIHNob3cgYXR0YWNobWVudHMKICAgIEFUVEFDSE1FTlQ6CiAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgIG15ICVEYXRhID0gKAogICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0FydGljbGUnLAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICAgICBTdWJqZWN0ICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0tPntTdWJqZWN0fSwKICAgICAgICBCb2R5ICAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0tPntCb2R5fSwKICAgICAgICBMYWJlbFN1YmplY3QgICAgID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0NvbmZpZ30tPntMYWJlbFN1YmplY3R9CiAgICAgICAgICAgIHx8ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU3ViamVjdCIpLAogICAgICAgIExhYmVsQm9keSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntDb25maWd9LT57TGFiZWxCb2R5fQogICAgICAgICAgICB8fCAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlRleHQiKSwKICAgICAgICBBdHRhY2htZW50TGlzdCA9PiAkUGFyYW17QXR0YWNobWVudExpc3R9LAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICAjIG91dHB1dCBzZXJ2ZXIgZXJyb3JzCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydBcnRpY2xlU3ViamVjdCd9ICkgewogICAgICAgICREYXRhe1N1YmplY3RTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgfQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn0tPnsnQXJ0aWNsZUJvZHknfSApIHsKICAgICAgICAkRGF0YXtCb2R5U2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6QXJ0aWNsZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuU3ViamVjdCcsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuQm9keScsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJFNlbGYtPntDb25maWd9LT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6QXJ0aWNsZTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkFydGljbGU6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtJbmZvcm1BZ2VudHN9ICkgewoKICAgICAgICBteSAlU2hvd25Vc2VyczsKICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkR0lEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17VGlja2V0fS0+e1F1ZXVlSUR9ICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ25vdGUnLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAnJywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSW5mb3JtVXNlcklEJywKICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICBTaXplICAgICAgID0+IDMsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6QXJ0aWNsZTpJbmZvcm1BZ2VudCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHNlcnZlciBlcnJvcnMKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1RpbWVVbml0cyd9ICkgewogICAgICAgICRQYXJhbXtUaW1lVW5pdHNJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBzaG93IHRpbWUgdW5pdHMKICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykKICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntDb25maWd9LT57VGltZVVuaXRzfQogICAgICAgICkKICAgIHsKCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykgKSB7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1RpbWVVbml0c1JlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57Q29uZmlnfS0+e1RpbWVVbml0c30gPT0gMSApIHsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFyYW17VGltZVVuaXRzUmVxdWlyZWR9ID0gJyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHNSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgIH0KCiAgICAgICAgIyBHZXQgVGltZVVuaXRzIHZhbHVlLgogICAgICAgICRQYXJhbXtUaW1lVW5pdHN9ID0gJFBhcmFte0dldFBhcmFtfXtUaW1lVW5pdHN9OwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvQXJ0aWNsZScgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyQ3VzdG9tZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlckN1c3RvbWVyJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyQ3VzdG9tZXInICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICgpOwoKICAgIG15ICRTdWJtaXR0ZWRDdXN0b21lclVzZXJJRCA9ICRQYXJhbXtHZXRQYXJhbX17Q3VzdG9tZXJVc2VySUR9OwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsQ3VzdG9tZXJVc2VyID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiQ3VzdG9tZXIgdXNlciIpLAogICAgICAgIExhYmVsQ3VzdG9tZXJJRCAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiQ3VzdG9tZXJJRCIpLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICAjIG91dHB1dCBzZXJ2ZXIgZXJyb3JzCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAkRGF0YXtDdXN0b21lclVzZXJJRFNlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+e0N1c3RvbWVySUR9ICkgewogICAgICAgICREYXRhe0N1c3RvbWVySURTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFNlbGYtPntMaW5rVGlja2V0RGF0YX0tPntDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoCiAgICAgICAgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAkUGFyYW17VGlja2V0fS0+e0N1c3RvbWVyVXNlcklEfSApCiAgICAgICAgfHwgJFN1Ym1pdHRlZEN1c3RvbWVyVXNlcklECiAgICAgICAgKQogICAgewogICAgICAgICVDdXN0b21lclVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRTdWJtaXR0ZWRDdXN0b21lclVzZXJJRAogICAgICAgICAgICAgICAgfHwgJFBhcmFte1RpY2tldH17Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGN1c3RvbWVyIGZpZWxkIGFzICJGaXJzdE5hbWUgTGFzdG5hbWUiIDxNYWlsQWRkcmVzcz4KICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlQ3VzdG9tZXJVc2VyRGF0YSApICkgewogICAgICAgICREYXRhe0N1c3RvbWVyVXNlcklEfSAgICAgICA9ICJcIiRDdXN0b21lclVzZXJEYXRhe1VzZXJGdWxsbmFtZX0iIC4gIlwiIDwkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyRW1haWx9PiI7CiAgICAgICAgJERhdGF7Q3VzdG9tZXJJRH0gICAgICAgICAgID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9IHx8ICcnOwogICAgICAgICREYXRhe1NlbGVjdGVkQ3VzdG9tZXJVc2VyfSA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJJRH0gfHwgJyc7CiAgICB9CgogICAgIyBXaGVuIHRoZXJlIGlzIG5vIEN1c3RvbWVyIGluIHRoZSBEQiwgaXQgY291bGQgYmUgdW5rbm93biBDdXN0b21lciwgc2V0IGl0IGZyb20gdGhlIHRpY2tldC4KICAgICMgU2VlIGJ1ZyMxMjc5NyAoIGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3OTcgKS4KICAgIGVsc2UgewogICAgICAgICREYXRhe0N1c3RvbWVyVXNlcklEfSA9ICRQYXJhbXtUaWNrZXR9e0N1c3RvbWVyVXNlcklEfSB8fCAnJzsKICAgICAgICAkRGF0YXtDdXN0b21lcklEfSAgICAgPSAkUGFyYW17VGlja2V0fXtDdXN0b21lcklEfSAgICAgfHwgJyc7CiAgICB9CgogICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJGaWVsZHNUb1VwZGF0ZScsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6Q3VzdG9tZXInLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbkN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OkN1c3RvbWVyOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6Q3VzdG9tZXI6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9DdXN0b21lcicgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyUmVzcG9uc2libGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclJlc3BvbnNpYmxlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyUmVzcG9uc2libGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPntSZXNwb25zaWJsZUFsbH0gPSAxOwogICAgfQoKICAgIG15ICRSZXNwb25zaWJsZXMgPSAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcyggJXsgJFBhcmFte0dldFBhcmFtfSB9ICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlJlc3BvbnNpYmxlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnUmVzcG9uc2libGVJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBSZXNwb25zaWJsZUFsbCAgID0+ICRQYXJhbXtHZXRQYXJhbX17UmVzcG9uc2libGVBbGx9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBpZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjICAgIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CgogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgdXNlciBvYmplY3QKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gKSB7CgogICAgICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ1Jlc3BvbnNpYmxlJyApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJFJlc3BvbnNpYmxlSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17UmVzcG9uc2libGVJRH07CiAgICBpZiAoICRSZXNwb25zaWJsZUlEUGFyYW0gJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFVzZXJPYmplY3QtPlVzZXJMb29rdXAoIFVzZXJJRCA9PiAkUmVzcG9uc2libGVJRFBhcmFtICk7CiAgICB9CgogICAgIyBpZiB0aGVyZSBpcyBubyB1c2VyIGZyb20gR2V0UGFyYW0gb3IgZGVmYXVsdCBhbmQgdGhlIGZpZWxkIGlzIG1hbmRhdG9yeSBnZXQgaXQgZnJvbSB0aGUgdGlja2V0CiAgICAjICAgIChpZiBhbnkpCiAgICBpZiAoCiAgICAgICAgISRTZWxlY3RlZFZhbHVlCiAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMgogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntSZXNwb25zaWJsZX07CiAgICB9CgogICAgIyBpZiB3ZSBoYXZlIGEgdXNlciBhbHJlYWR5IGFuZCB0aGUgZmllbGQgaXMgbm90IG1hbmRhdG9yeSBhbmQgaXQgaXMgdGhlIHNhbWUgYXMgaW4gdGlja2V0LCB0aGVuCiAgICAjICAgIHNldCBpdCB0byBub25lIChhcyBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgY2hhbmdlZCBhZnRlcmFsbCkKICAgIGVsc2lmICgKICAgICAgICAkU2VsZWN0ZWRWYWx1ZQogICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICE9IDIKICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKQogICAgICAgICYmICRTZWxlY3RlZFZhbHVlIGVxICRQYXJhbXtUaWNrZXR9LT57UmVzcG9uc2libGV9CiAgICAgICAgKQogICAgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJyc7CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydSZXNwb25zaWJsZUlEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGxvb2sgdXAgJFNlbGVjdGVkSUQKICAgIG15ICRTZWxlY3RlZElEOwogICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgJFNlbGVjdGVkSUQgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkU2VsZWN0ZWRJRCA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9LT57UmVzcG9uc2libGVJRH07CiAgICB9CgogICAgIyBidWlsZCBSZXNwb25zaWJsZSBzdHJpbmcKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRSZXNwb25zaWJsZXMsCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZXNwb25zaWJsZUlEJywKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNlbGVjdGVkSUQsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICJNb2Rlcm5pemUgJFNlcnZlckVycm9yIiwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICk7CgogICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnUmVzcG9uc2libGVGaWVsZHNUb1VwZGF0ZScsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9CiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6UmVzcG9uc2libGU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpSZXNwb25zaWJsZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1Jlc3BvbnNpYmxlJyApLAogICAgfTsKCn0KCnN1YiBfUmVuZGVyT3duZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlck93bmVyJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyT3duZXInICksCiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPntPd25lckFsbH0gPSAxOwogICAgfQoKICAgIG15ICRPd25lcnMgPSAkU2VsZi0+X0dldE93bmVycyggJXsgJFBhcmFte0dldFBhcmFtfSB9ICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk93bmVyIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnT3duZXJJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBPd25lckFsbCAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17T3duZXJBbGx9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBpZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjICAgIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CgogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgdXNlciBvYmplY3QKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gKSB7CgogICAgICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ093bmVyJyApIHsKCiAgICAgICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkT3duZXJJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtPd25lcklEfTsKICAgIGlmICggJE93bmVySURQYXJhbSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVXNlck9iamVjdC0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlcklEID0+ICRPd25lcklEUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIHRoZXJlIGlzIG5vIHVzZXIgZnJvbSBHZXRQYXJhbSBvciBkZWZhdWx0IGFuZCB0aGUgZmllbGQgaXMgbWFuZGF0b3J5IGdldCBpdCBmcm9tIHRoZSB0aWNrZXQKICAgICMgICAgKGlmIGFueSkKICAgIGlmICgKICAgICAgICAhJFNlbGVjdGVkVmFsdWUKICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyCiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fS0+e093bmVyfTsKICAgIH0KCiAgICAjIGlmIHdlIGhhdmUgYSB1c2VyIGFscmVhZHkgYW5kIHRoZSBmaWVsZCBpcyBub3QgbWFuZGF0b3J5IGFuZCBpdCBpcyB0aGUgc2FtZSBhcyBpbiB0aWNrZXQsIHRoZW4KICAgICMgICAgc2V0IGl0IHRvIG5vbmUgKGFzIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBjaGFuZ2VkIGFmdGVyYWxsKQogICAgZWxzaWYgKAogICAgICAgICRTZWxlY3RlZFZhbHVlCiAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gIT0gMgogICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApCiAgICAgICAgJiYgJFNlbGVjdGVkVmFsdWUgZXEgJFBhcmFte1RpY2tldH0tPntPd25lcn0KICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAnJzsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J093bmVySUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfS0+e093bmVySUR9OwogICAgfQoKICAgICMgbG9vayB1cCAkU2VsZWN0ZWRJRAogICAgbXkgJFNlbGVjdGVkSUQ7CiAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAkU2VsZWN0ZWRJRCA9ICRVc2VyT2JqZWN0LT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIE93bmVyIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gJE93bmVycywKICAgICAgICBOYW1lICAgICAgICAgPT4gJ093bmVySUQnLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRJRCB8fCAnJywKICAgICAgICBDbGFzcyAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdPd25lckZpZWxkc1RvVXBkYXRlJywKICAgICAgICBWYWx1ZSA9PiAkUGFyYW17QUpBWFVwZGF0YWJsZUZpZWxkc30KICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3Ok93bmVyJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpPd25lcjpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3Ok93bmVyOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvT3duZXInICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclNMQSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyU0xBJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyU0xBJyApLAogICAgICAgIH07CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57UXVldWVJRH0gICAgICAgID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX0tPntRdWV1ZUlEfTsKICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57VGlja2V0SUR9ICAgICAgID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX0tPntUaWNrZXRJRH07CiAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+e0N1c3RvbWVyVXNlcklEfSA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9LT57Q3VzdG9tZXJVc2VySUR9OwogICAgfQoKICAgICMgY3JlYXRlIGEgbG9jYWwgY29weSBvZiB0aGUgR2V0UGFyYW0KICAgIG15ICVHZXRTZXJ2aWNlc1BhcmFtID0gJXsgJFBhcmFte0dldFBhcmFtfSB9OwoKICAgICMgdXNlIHRpY2tldCBpbmZvcm1hdGlvbiBhcyBhIGZhbGwgYmFjayBpZiBjdXN0b21lciB3YXMgYWxyZWFkeSBzZXQsIG90aGVyd2lzZSB3aGVuIHRoZQogICAgIyBhY3Rpdml0eSBkaWFsb2cgZGlzcGxheXMgdGhlIHNlcnZpY2UgbGlzdCB3aWxsIGJlIGluaXRpYWxseSBlbXB0eSwgc2VlIGJ1ZyMxMDA1OQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSApIHsKICAgICAgICAkR2V0U2VydmljZXNQYXJhbXtDdXN0b21lclVzZXJJRH0gfHw9ICRQYXJhbXtUaWNrZXR9LT57Q3VzdG9tZXJVc2VySUR9IHx8PSAnJzsKICAgIH0KCiAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICVHZXRTZXJ2aWNlc1BhcmFtLAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPntTZXJ2aWNlc30gID0gJFNlcnZpY2VzOwogICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPntTZXJ2aWNlSUR9ID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX0tPntTZXJ2aWNlSUR9OwogICAgfQoKICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICBTZXJ2aWNlcyA9PiAkU2VydmljZXMsCiAgICApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJTTEEiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IFNMQSBvYmplY3QKICAgIG15ICRTTEFPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyk7CgogICAgbXkgJFNMQUlEUGFyYW0gPSAkUGFyYW17R2V0UGFyYW19e1NMQUlEfTsKICAgIGlmICgkU0xBSURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNMQU9iamVjdC0+U0xBTG9va3VwKCBTTEFJRCA9PiAkU0xBSURQYXJhbSApOwogICAgfQoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ1NMQScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNMQU9iamVjdC0+U0xBTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFNMQSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNMQU9iamVjdC0+U0xBTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFNMQSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fS0+e1NMQX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydTTEFJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9LT57U0xBfTsKICAgIH0KCiAgICAjIGJ1aWxkIFNMQSBzdHJpbmcKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkU0xBcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRWYWx1ZSwKICAgICAgICBQb3NzaWJsZU5vbmUgID0+IDEsCiAgICAgICAgU29ydCAgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMCwKICAgICAgICBDbGFzcyAgICAgICAgID0+ICJNb2Rlcm5pemUgJFNlcnZlckVycm9yIiwKICAgICAgICBNYXggICAgICAgICAgID0+IDIwMCwKICAgICk7CgogICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnU0xBRmllbGRzVG9VcGRhdGUnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfQogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6U0xBJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpTTEE6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpTTEE6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9TTEEnICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclNlcnZpY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclNlcnZpY2UnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJTZXJ2aWNlJyApLAogICAgICAgIH07CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57UXVldWVJRH0gICAgICAgID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX0tPntRdWV1ZUlEfTsKICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57VGlja2V0SUR9ICAgICAgID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX0tPntUaWNrZXRJRH07CiAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+e0N1c3RvbWVyVXNlcklEfSA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9LT57Q3VzdG9tZXJVc2VySUR9OwogICAgfQoKICAgICMgY3JlYXRlIGEgbG9jYWwgY29weSBvZiB0aGUgR2V0UGFyYW0KICAgIG15ICVHZXRTZXJ2aWNlc1BhcmFtID0gJXsgJFBhcmFte0dldFBhcmFtfSB9OwoKICAgICMgdXNlIHRpY2tldCBpbmZvcm1hdGlvbiBhcyBhIGZhbGwgYmFjayBpZiBjdXN0b21lciB3YXMgYWxyZWFkeSBzZXQsIG90aGVyd2lzZSB3aGVuIHRoZQogICAgIyBhY3Rpdml0eSBkaWFsb2cgZGlzcGxheXMgdGhlIHNlcnZpY2UgbGlzdCB3aWxsIGJlIGluaXRpYWxseSBlbXB0eSwgc2VlIGJ1ZyMxMDA1OQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSApIHsKICAgICAgICAkR2V0U2VydmljZXNQYXJhbXtDdXN0b21lclVzZXJJRH0gfHw9ICRQYXJhbXtUaWNrZXR9LT57Q3VzdG9tZXJVc2VySUR9IHx8PSAnJzsKICAgIH0KCiAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICVHZXRTZXJ2aWNlc1BhcmFtLAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU2VydmljZSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHNlcnZpY2Ugb2JqZWN0CiAgICBteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CgogICAgbXkgJFNlcnZpY2VJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtTZXJ2aWNlSUR9OwogICAgaWYgKCRTZXJ2aWNlSURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZUlEUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdTZXJ2aWNlJyApIHsKCiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CgogICAgICAgICAgICAjIEZldGNoIERlZmF1bHRWYWx1ZSBmcm9tIENvbmZpZwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSBuZSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntTZXJ2aWNlfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1NlcnZpY2VJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9LT57U2VydmljZX07CiAgICB9CgogICAgIyBidWlsZCBTZXJ2aWNlIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgUG9zc2libGVOb25lICA9PiAxLAogICAgICAgIFRyZWVWaWV3ICAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgIFNvcnQgICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDAsCiAgICAgICAgTWF4ICAgICAgICAgICA9PiAyMDAsCiAgICApOwoKICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ1NlcnZpY2VGaWVsZHNUb1VwZGF0ZScsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9CiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpTZXJ2aWNlJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpTZXJ2aWNlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6U2VydmljZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1NlcnZpY2UnICksCiAgICB9OwoKfQoKc3ViIF9SZW5kZXJMb2NrIHsKCiAgICAjIGZvciBsb2NrIHN0YXRlcyB0aGVyZSdzIG5vIEFDTCBjaGVja2luZyB5ZXQgaW1wbGVtZW50ZWQgc28gbm8gY2hlY2tpbmcuLi4KCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyTG9jaycgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlckxvY2snICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkTG9ja3MgPSAkU2VsZi0+X0dldExvY2tzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkxvY2sgc3RhdGUiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdMb2NrSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBsb2NrIG9iamVjdAogICAgbXkgJExvY2tPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9jaycpOwoKICAgIG15ICRMb2NrSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17TG9ja0lEfTsKICAgICRTZWxlY3RlZFZhbHVlID0gJExvY2tPYmplY3QtPkxvY2tMb29rdXAoIExvY2tJRCA9PiAkTG9ja0lEUGFyYW0gKQogICAgICAgIGlmICgkTG9ja0lEUGFyYW0pOwoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ0xvY2snICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJExvY2tPYmplY3QtPkxvY2tMb29rdXAoCiAgICAgICAgICAgICAgICBMb2NrID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkTG9ja09iamVjdC0+TG9ja0xvb2t1cCgKICAgICAgICAgICAgTG9ja0lEID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJycKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiAhJFNlbGVjdGVkVmFsdWU7CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntMb2NrfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J0xvY2tJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9LT57TG9ja307CiAgICB9CgogICAgIyBidWlsZCBsb2NrIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRMb2NrcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdMb2NrSUQnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgKTsKCiAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdMb2NrRmllbGRzVG9VcGRhdGUnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfQogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6TG9jaycsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6TG9jazpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkxvY2s6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9Mb2NrJyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJQcmlvcml0eSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyUHJpb3JpdHknICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJQcmlvcml0eScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlByaW9yaXR5IiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHByaW9yaXR5IG9iamVjdAogICAgbXkgJFByaW9yaXR5T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5Jyk7CgogICAgbXkgJFByaW9yaXR5SURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17UHJpb3JpdHlJRH07CiAgICBpZiAoJFByaW9yaXR5SURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUxvb2t1cCgKICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkUHJpb3JpdHlJRFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnUHJpb3JpdHknICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUxvb2t1cCgKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFByaW9yaXR5T2JqZWN0LT5Qcmlvcml0eUxvb2t1cCgKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntQcmlvcml0eX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydQcmlvcml0eUlEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGlua1RpY2tldERhdGF9ICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNlbGYtPntMaW5rVGlja2V0RGF0YX0tPntQcmlvcml0eX07CiAgICB9CgogICAgIyBidWlsZCBuZXh0IFByaW9yaXRpZXMgc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFByaW9yaXRpZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplICRTZXJ2ZXJFcnJvciIsCiAgICApOwoKICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ1ByaW9yaXR5RmllbGRzVG9VcGRhdGUnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfQogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6UHJpb3JpdHknLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlByaW9yaXR5OkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6UHJpb3JpdHk6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9Qcmlvcml0eScgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyUXVldWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclF1ZXVlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyUXVldWUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkUXVldWVzID0gJFNlbGYtPl9HZXRRdWV1ZXMoCiAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiVG8gcXVldWUiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdRdWV1ZUlEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCBxdWV1ZSBvYmplY3QKICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgICMgaWYgd2UgZ290IFF1ZXVlSUQgYXMgUGFyYW0gZnJvbSB0aGUgR1VJCiAgICBteSAkUXVldWVJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtRdWV1ZUlEfTsKICAgIGlmICgkUXVldWVJRFBhcmFtKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICBRdWV1ZUlEID0+ICRRdWV1ZUlEUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdRdWV1ZScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgUXVldWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fS0+e1F1ZXVlfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1F1ZXVlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgZ2V0IGxpc3QgdHlwZQogICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgIGlmICggJFNlbGYtPntMaW5rVGlja2V0RGF0YX0gKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfS0+e1F1ZXVlfTsKICAgIH0KCiAgICAjIGJ1aWxkIG5leHQgcXVldWVzIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRRdWV1ZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAwLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplICRTZXJ2ZXJFcnJvciIsCiAgICAgICAgVHJlZVZpZXcgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgU29ydCAgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgIFBvc3NpYmxlTm9uZSAgPT4gMSwKICAgICk7CgogICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnUXVldWVGaWVsZHNUb1VwZGF0ZScsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9CiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpRdWV1ZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6UXVldWU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpRdWV1ZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1F1ZXVlJyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJTdGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyU3RhdGUnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJTdGF0ZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRTdGF0ZXMgPSAkU2VsZi0+X0dldFN0YXRlcyggJXsgJFBhcmFte0dldFBhcmFtfSB9ICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIk5leHQgdGlja2V0IHN0YXRlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgc3RhdGUgb2JqZWN0CiAgICBteSAkU3RhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKTsKCiAgICBteSAkU3RhdGVJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtTdGF0ZUlEfTsKICAgIGlmICgkU3RhdGVJRFBhcmFtKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU3RhdGVPYmplY3QtPlN0YXRlTG9va3VwKCBTdGF0ZUlEID0+ICRTdGF0ZUlEUGFyYW0gKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdTdGF0ZScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU3RhdGVPYmplY3QtPlN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgU3RhdGUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU3RhdGVPYmplY3QtPlN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgU3RhdGVJRCA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fS0+e1N0YXRlfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1N0YXRlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFN0YXRlcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdTdGF0ZUlEJywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRWYWx1ZSwKICAgICAgICBDbGFzcyAgICAgICAgID0+ICJNb2Rlcm5pemUgJFNlcnZlckVycm9yIiwKICAgICk7CgogICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnU3RhdGVGaWVsZHNUb1VwZGF0ZScsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9CiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpTdGF0ZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6U3RhdGU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpTdGF0ZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1N0YXRlJyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJUeXBlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJUeXBlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyVHlwZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRUeXBlcyA9ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiVHlwZSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHR5cGUgb2JqZWN0CiAgICBteSAkVHlwZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyk7CgogICAgbXkgJFR5cGVJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtUeXBlSUR9OwogICAgaWYgKCRUeXBlSURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFR5cGVPYmplY3QtPlR5cGVMb29rdXAoCiAgICAgICAgICAgIFR5cGVJRCA9PiAkVHlwZUlEUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdUeXBlJyApIHsKCiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CgogICAgICAgICAgICAjIEZldGNoIERlZmF1bHRWYWx1ZSBmcm9tIENvbmZpZwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVHlwZU9iamVjdC0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSBuZSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRUeXBlT2JqZWN0LT5UeXBlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFR5cGUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntUeXBlfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1R5cGVJRCd9ICkgewogICAgICAgICRTZXJ2ZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0xpbmtUaWNrZXREYXRhfSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTZWxmLT57TGlua1RpY2tldERhdGF9LT57VHlwZX07CiAgICB9CgogICAgIyBidWlsZCBTZXJ2aWNlIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRUeXBlcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgUG9zc2libGVOb25lICA9PiAxLAogICAgICAgIFNvcnQgICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDAsCiAgICAgICAgTWF4ICAgICAgICAgICA9PiAyMDAsCiAgICApOwoKICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ1R5cGVGaWVsZHNUb1VwZGF0ZScsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9CiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpUeXBlJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpUeXBlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6VHlwZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1R5cGUnICksCiAgICB9Owp9CgpzdWIgX1N0b3JlQWN0aXZpdHlEaWFsb2cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGlja2V0SUQgPSAkUGFyYW17R2V0UGFyYW19LT57VGlja2V0SUR9OwogICAgbXkgJFByb2Nlc3NTdGFydHBvaW50OwogICAgbXkgJVRpY2tldDsKICAgIG15ICRQcm9jZXNzRW50aXR5SUQ7CiAgICBteSAkQWN0aXZpdHlFbnRpdHlJRDsKICAgIG15ICVFcnJvcjsKICAgIG15ICVFcnJvck1lc3NhZ2VzOwoKICAgIG15ICVUaWNrZXRQYXJhbTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIG15ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0gJFBhcmFte0dldFBhcmFtfS0+e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9OwogICAgaWYgKCAhJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0FjdGl2aXR5RGlhbG9nRW50aXR5SUQgbWlzc2luZyEnKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGFjdGl2aXR5IGRpYWxvZyBvYmplY3QKICAgIG15ICRBY3Rpdml0eURpYWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2cnKTsKICAgIG15ICRBY3Rpdml0eURpYWxvZyAgICAgICA9ICRBY3Rpdml0eURpYWxvZ09iamVjdC0+QWN0aXZpdHlEaWFsb2dHZXQoCiAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICBJbnRlcmZhY2UgICAgICAgICAgICAgID0+ICdBZ2VudEludGVyZmFjZScsCiAgICApOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eURpYWxvZykgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnQ291bGRuXCd0IGdldCBDb25maWcgZm9yIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICApOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgY2hlY2sgZWFjaCBGaWVsZCBvZiBhbiBBY3Rpdml0eSBEaWFsb2cgYW5kIGZpbGwgdGhlIGVycm9yIGhhc2ggaWYgc29tZXRoaW5nIGdvZXMgaG9ycmlibHkgd3JvbmcKICAgIG15ICVDaGVja2VkRmllbGRzOwogICAgRElBTE9HRklFTEQ6CiAgICBmb3IgbXkgJEN1cnJlbnRGaWVsZCAoIEB7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkT3JkZXJ9IH0gKSB7CiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkID1+IG17XkR5bmFtaWNGaWVsZF8oLiopfXhtcyApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZE5hbWUgPSAkMTsKCiAgICAgICAgICAgICMgR2V0IHRoZSBDb25maWcgb2YgdGhlIGN1cnJlbnQgRHluYW1pY0ZpZWxkICh0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgZ3JlcCByZXN1bHQgYXJyYXkpCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAoIGdyZXAgeyAkXy0+e05hbWV9IGVxICREeW5hbWljRmllbGROYW1lIH0gQHskRHluYW1pY0ZpZWxkfSApWzBdOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CgogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICJEeW5hbWljRmllbGRDb25maWcgbWlzc2luZyBmb3IgZmllbGQ6ICRQYXJhbXtGaWVsZE5hbWV9LCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiOwoKICAgICAgICAgICAgICAgICMgbG9nIGVycm9yIGJ1dCBkb2VzIG5vdCBzdG9wIHRoZSBleGVjdXRpb24gYXMgaXQgY291bGQgYmUgYW4gb2xkIEFydGljbGUKICAgICAgICAgICAgICAgICMgRHluYW1pY0ZpZWxkLCBzZWUgYnVnIzExNjY2CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFdpbGwgYmUgZXh0ZW5kZWQgbGF0ZXIgb24gZm9yIEFDTCBDaGVja2luZzoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIGFuIGludmlzaWJsZSBmaWVsZCwgdXNlIGNvbmZpZydzIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0tPntEaXNwbGF5fSA9PSAwICkgewogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIGRlZmluZWQgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9LT57RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgICAgICYmIGxlbmd0aCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30tPnskQ3VycmVudEZpZWxkfS0+e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvbmx5IHZhbGlkYXRlIHZpc2libGUgZmllbGRzCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIyBDaGVjayBEeW5hbWljRmllbGQgVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0tPntEaXNwbGF5fSA9PSAyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSAgICAgICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAkRXJyb3JNZXNzYWdlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVmFsaWRhdGlvblJlc3VsdC0+e0Vycm9yTWVzc2FnZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFRpY2tldFBhcmFteyRDdXJyZW50RmllbGR9ID0KICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEluIGNhc2Ugb2YgRHluYW1pY0ZpZWxkcyB0aGVyZSBpcyBubyBOYW1lVG9JRCB0cmFuc2xhdGlvbgogICAgICAgICAgICAjIHNvIGp1c3QgdGFrZSB0aGUgRHluYW1pY0ZpZWxkIG5hbWUKICAgICAgICAgICAgJENoZWNrZWRGaWVsZHN7JEN1cnJlbnRGaWVsZH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ0N1c3RvbWVySUQnCiAgICAgICAgICAgIHx8ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ0N1c3RvbWVyVXNlcklEJwogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkQ2hlY2tlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnsnQ3VzdG9tZXJJRCd9IH07CgogICAgICAgICAgICAjIGlzIG5vdCBwb3NzaWJsZSB0byBhIGhhdmUgYW4gaW52aXNpYmxlIGZpZWxkIGZvciB0aGlzIHBhcnRpY3VsYXIgdmFsdWUKICAgICAgICAgICAgIyBvbiBhZ2VudCBpbnRlcmZhY2UKICAgICAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0tPntEaXNwbGF5fSA9PSAwICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ291bGRuXCd0IHVzZSBDdXN0b21lcklEIGFzIGFuIGludmlzaWJsZSBmaWVsZC4nKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEN1c3RvbWVySUQgc2hvdWxkIG5vdCBiZSBtYW5kYXRvcnkgYXMgaW4gb3RoZXIgc2NyZWVucwogICAgICAgICAgICAkVGlja2V0UGFyYW17Q3VzdG9tZXJJRH0gPSAkUGFyYW17R2V0UGFyYW19LT57Q3VzdG9tZXJJRH0gfHwgJyc7CgogICAgICAgICAgICAjIFVuZm9ydHVuYXRlbHkgVGlja2V0Q3JlYXRlIG5lZWRzICdDdXN0b21lclVzZXInIGFzIHBhcmFtIGluc3RlYWQgb2YgJ0N1c3RvbWVyVXNlcklEJwogICAgICAgICAgICBteSAkQ3VzdG9tZXJVc2VySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICk7CgogICAgICAgICAgICAjIGZhbGwtYmFjaywgaWYgY3VzdG9tZXIgYXV0by1jb21wbGV0ZSBkb2VzIG5vdCBzaG93biBhbnkgcmVzdWx0cywgdGhlbiB0cnkgdG8gdXNlCiAgICAgICAgICAgICMgdGhlIGNvbnRlbnQgb2YgdGhlIG9yaWdpbmFsIGZpZWxkIGFzIGN1c3RvbWVyIHVzZXIgaWQKICAgICAgICAgICAgaWYgKCAhJEN1c3RvbWVyVXNlcklEICkgewoKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclVzZXJJRCcgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQ3VzdG9tZXJVc2VySUQpICkgewogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKS0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRFcnJvcnsnQ3VzdG9tZXJVc2VySUQnfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkQ3VzdG9tZXJVc2VySUQgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0N1c3RvbWVyVXNlcklEJ30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFRpY2tldFBhcmFte0N1c3RvbWVyVXNlcn0gPSAkQ3VzdG9tZXJVc2VySUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENoZWNrZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57J0N1c3RvbWVySUQnfSB9ICAgICA9IDE7CiAgICAgICAgICAgICRDaGVja2VkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eydDdXN0b21lclVzZXJJRCd9IH0gPSAxOwoKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkQ3VycmVudEZpZWxkIGVxICdQZW5kaW5nVGltZScgKSB7CiAgICAgICAgICAgIG15ICRQcmVmaXggPSAnUGVuZGluZ1RpbWUnOwoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBWYWx1ZXMgb3RoZXJ3aXNlIHRha2UgYW4gZW1wdHkgc3RyaW5nCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17R2V0UGFyYW19LT57UGVuZGluZ1RpbWV9ICkKICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJFBhcmFte0dldFBhcmFtfS0+e1BlbmRpbmdUaW1lfS0+e1llYXJ9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQYXJhbXtHZXRQYXJhbX0tPntQZW5kaW5nVGltZX0tPntNb250aH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJFBhcmFte0dldFBhcmFtfS0+e1BlbmRpbmdUaW1lfS0+e0RheX0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJFBhcmFte0dldFBhcmFtfS0+e1BlbmRpbmdUaW1lfS0+e0hvdXJ9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQYXJhbXtHZXRQYXJhbX0tPntQZW5kaW5nVGltZX0tPntNaW51dGV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRQYXJhbXtHZXRQYXJhbX0tPntQZW5kaW5nVGltZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBubyBQZW5kaW5nIHN0YXR1cyB3ZSBoYXZlIG5vIHRpbWUgdG8gc2V0CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFRpY2tldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENoZWNrZWRGaWVsZHN7J1BlbmRpbmdUaW1lJ30gPSAxOwogICAgICAgIH0KCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIHNraXAgaWYgd2UndmUgYWxyZWFkeSBjaGVja2VkIElEIG9yIE5hbWUKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkQ2hlY2tlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3VsdCA9ICRTZWxmLT5fQ2hlY2tGaWVsZCgKICAgICAgICAgICAgICAgIEZpZWxkID0+ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICAleyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzdWx0ICkgewoKICAgICAgICAgICAgICAgICMgc3BlY2lhbCBjYXNlIGZvciBBcnRpY2xlIChTdWJqZWN0ICYgQm9keSkKICAgICAgICAgICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnQXJ0aWNsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBcnRpY2xlUGFydCAocXcoU3ViamVjdCBCb2R5KSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17R2V0UGFyYW19LT57JEFydGljbGVQYXJ0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNldCBlcnJvciBmb3IgZWFjaCBwYXJ0IChpZiBhbnkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICdBcnRpY2xlJyAuICRBcnRpY2xlUGFydCB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGFsbCBvdGhlciBmaWVsZHMKICAgICAgICAgICAgICAgIGVsc2lmICggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQgZXEgJ0FydGljbGUnCiAgICAgICAgICAgICAgICAmJiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0tPntDb25maWd9LT57VGltZVVuaXRzfQogICAgICAgICAgICAgICAgJiYgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9LT57Q29uZmlnfS0+e1RpbWVVbml0c30gPT0gMgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17R2V0UGFyYW19LT57VGltZVVuaXRzfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgZXJyb3IgZm9yIHRoZSB0aW1lLXVuaXRzIChpZiBhbnkpCiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydUaW1lVW5pdHMnfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2lmICgkUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9ICRSZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENoZWNrZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHByb2Nlc3Mgb2JqZWN0CiAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycgPT4gewogICAgICAgICAgICBBY3Rpdml0eU9iamVjdCAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHknKSwKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dPYmplY3QgICA9PiAkQWN0aXZpdHlEaWFsb2dPYmplY3QsCiAgICAgICAgICAgIFRyYW5zaXRpb25PYmplY3QgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uJyksCiAgICAgICAgICAgIFRyYW5zaXRpb25BY3Rpb25PYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uJyksCiAgICAgICAgICAgIH0KICAgICk7CiAgICBteSAkUHJvY2Vzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycpOwoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgbXkgQE5vdGlmeTsKCiAgICBteSAkTmV3VGlja2V0SUQ7CiAgICBpZiAoICEkVGlja2V0SUQgKSB7CgogICAgICAgICRQcm9jZXNzRW50aXR5SUQgPSAkUGFyYW17R2V0UGFyYW19LT57UHJvY2Vzc0VudGl0eUlEfTsKICAgICAgICBpZiAoICEkUHJvY2Vzc0VudGl0eUlEICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ01pc3NpbmcgUHJvY2Vzc0VudGl0eUlELCBjaGVjayB5b3VyIEFjdGl2aXR5RGlhbG9nSGVhZGVyLnR0IScpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFByb2Nlc3NTdGFydHBvaW50ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NTdGFydHBvaW50R2V0KAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFByb2Nlc3NTdGFydHBvaW50CiAgICAgICAgICAgIHx8ICFJc0hhc2hSZWZXaXRoRGF0YSgkUHJvY2Vzc1N0YXJ0cG9pbnQpCiAgICAgICAgICAgIHx8ICEkUHJvY2Vzc1N0YXJ0cG9pbnQtPntBY3Rpdml0eX0gfHwgISRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5RGlhbG9nfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ05vIFN0YXJ0QWN0aXZpdHlEaWFsb2cgb3IgU3RhcnRBY3Rpdml0eURpYWxvZyBmb3IgUHJvY2VzcyAiJXMiIGNvbmZpZ3VyZWQhJywKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQWN0aXZpdHlFbnRpdHlJRCA9ICRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5fTsKCiAgICAgICAgTkVFREVETE9PUDoKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoUXVldWUgU3RhdGUgTG9jayBQcmlvcml0eSkpIHsKCiAgICAgICAgICAgIGlmICggISRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH0tPnskTmVlZGVkfSB9ICkgewoKICAgICAgICAgICAgICAgICMgaWYgYSByZXF1aXJlZCBmaWVsZCBoYXMgbm8gdmFsdWUgY2FsbCBfQ2hlY2tGaWVsZCBhcyBmaWxlZCBpcyBoaWRkZW4KICAgICAgICAgICAgICAgICMgKE5vIERpc3BsYXkgcGFyYW0gPSBEaXNwbGF5ID0+IDApIGFuZCBubyBEZWZhdWx0VmFsdWUsIHRvIHVzZSBnbG9iYWwgZGVmYXVsdCBhcwogICAgICAgICAgICAgICAgIyBmYWxsLWJhY2suIE9uZSByZWFzb24gZm9yIHRoaXMgdG8gaGFwcGVuIGlzIHRoYXQgQWN0aXZpdHlEaWFsb2cgRGVmYXVsdFZhbHVlIHRyaWVkCiAgICAgICAgICAgICAgICAjIHRvIHNldCBiZWZvcmUsIHdhcyBub3QgdmFsaWQuCiAgICAgICAgICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPl9DaGVja0ZpZWxkKAogICAgICAgICAgICAgICAgICAgIEZpZWxkID0+ICRTZWxmLT57TmFtZVRvSUR9LT57JE5lZWRlZH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkU2VsZi0+e05hbWVUb0lEfS0+eyROZWVkZWR9IH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfS0+eyROZWVkZWR9IH0gPSAkUmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIElmIHdlIGhhZCBubyBFcnJvcnMsIHdlIGNhbiBjcmVhdGUgdGhlIFRpY2tldCBhbmQgU2V0IEFjdGl2aXR5RW50aXR5SUQgYXMgd2VsbCBhcwogICAgICAgICMgUHJvY2Vzc0VudGl0eUlECiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlRXJyb3IgKSApIHsKCiAgICAgICAgICAgICRUaWNrZXRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwoKICAgICAgICAgICAgaWYgKCAhJFRpY2tldFBhcmFte093bmVySUR9ICkgewoKICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXtPd25lcklEfSA9ICRQYXJhbXtHZXRQYXJhbX0tPntPd25lcklEfSB8fCAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZG9lcyBub3QgcHJvdmlkZSBhIHRpY2tldCB0aXRsZSBzZXQgYSBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgIGlmICggISRUaWNrZXRQYXJhbXtUaXRsZX0gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdGhlIGN1cnJlbnQgc2VydmVyIFRpbWUtc3RhbXAKICAgICAgICAgICAgICAgIG15ICRDdXJyZW50VGltZVN0YW1wID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17VGl0bGV9ID0gIiRQYXJhbXtQcm9jZXNzTmFtZX0gLSAkQ3VycmVudFRpbWVTdGFtcCI7CgogICAgICAgICAgICAgICAgIyB1c2UgYXJ0aWNsZSBzdWJqZWN0IGZyb20gdGhlIHdlYiByZXF1ZXN0IGlmIGFueQogICAgICAgICAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17R2V0UGFyYW19LT57U3ViamVjdH0gKSApIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17VGl0bGV9ID0gJFBhcmFte0dldFBhcmFtfS0+e1N1YmplY3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSBhIG5ldyB0aWNrZXQKICAgICAgICAgICAgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKCVUaWNrZXRQYXJhbSk7CgogICAgICAgICAgICBpZiAoICEkVGlja2V0SUQgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IGNyZWF0ZSB0aWNrZXQgZm9yIFByb2Nlc3Mgd2l0aCBQcm9jZXNzRW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1RpY2tldFByb2Nlc3NTZXQoCiAgICAgICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IHNldCBQcm9jZXNzRW50aXR5SUQgIiVzIiBvbiBUaWNrZXRJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTdWNjZXNzID0gdW5kZWY7CgogICAgICAgICAgICAkU3VjY2VzcyA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzVGlja2V0QWN0aXZpdHlTZXQoCiAgICAgICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAkUHJvY2Vzc1N0YXJ0cG9pbnQtPntBY3Rpdml0eX0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IHNldCBBY3Rpdml0eUVudGl0eUlEICIlcyIgb24gVGlja2V0SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVUaWNrZXQgKSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3Qgc3RvcmUgQWN0aXZpdHlEaWFsb2csIGludmFsaWQgVGlja2V0SUQ6ICVzIScsCiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKAoKICAgICAgICAgICAgICAgICMgMi4gcmVtb3ZlICJEeW5hbWljRmllbGRfIiBmcm9tIHN0cmluZwogICAgICAgICAgICAgICAgbWFwIHsKICAgICAgICAgICAgICAgICAgICBteSAkRmllbGQgPSAkXzsKICAgICAgICAgICAgICAgICAgICAkRmllbGQgPX4gc3teRHluYW1pY0ZpZWxkXyguKil9eyQxfXhtczsKCiAgICAgICAgICAgICAgICAgICAgIyAzLiBncmVwIGZyb20gdGhlIER5bmFtaWNGaWVsZENvbmZpZ3MgdGhlIHJlc3VsdGluZyBEeW5hbWljRmllbGRzIHdpdGhvdXQKICAgICAgICAgICAgICAgICAgICAjICJEeW5hbWljRmllbGRfIgogICAgICAgICAgICAgICAgICAgIGdyZXAgeyAkXy0+e05hbWV9IGVxICRGaWVsZCB9IEB7JER5bmFtaWNGaWVsZH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIDEuIGdyZXAgYWxsIER5bmFtaWNGaWVsZHMKICAgICAgICAgICAgICAgIGdyZXAge217XkR5bmFtaWNGaWVsZF8oLiopfXhtc30gQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBhbmQgbm93IGl0J3MgZWFzeSwganVzdCBzdG9yZSB0aGUgZHluYW1pYyBGaWVsZCBWYWx1ZXMgOykKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGlja2V0UGFyYW17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbWVtYmVyIG5ldyBjcmVhdGVkIFRpY2tldElECiAgICAgICAgICAgICROZXdUaWNrZXRJRCA9ICRUaWNrZXRJRDsKICAgICAgICB9CiAgICB9CgogICAgZWxzaWYgKCAkVGlja2V0SUQgJiYgJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9ICkgewoKICAgICAgICAjIHVzZSBFcnJvciBpbnN0ZWFkIG9mIEZhdGFsRXJyb3IgYXMgd2UgYXJlIGluIGEgUG9wLXVwIHdpbmRvdwogICAgICAgICMgR2V0IFRpY2tldCB0byBjaGVjayBUaWNrZXRJRCB3YXMgdmFsaWQKICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVUaWNrZXQgKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0ludmFsaWQgVGlja2V0SUQ6ICVzIScsICRUaWNrZXRJRCApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1RpY2tldFByb2Nlc3NTZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3Qgc2V0IFByb2Nlc3NFbnRpdHlJRCAiJXMiIG9uIFRpY2tldElEICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFN1Y2Nlc3MgPSB1bmRlZjsKCiAgICAgICAgJFByb2Nlc3NTdGFydHBvaW50ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NTdGFydHBvaW50R2V0KAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFByb2Nlc3NTdGFydHBvaW50CiAgICAgICAgICAgIHx8ICFJc0hhc2hSZWZXaXRoRGF0YSgkUHJvY2Vzc1N0YXJ0cG9pbnQpCiAgICAgICAgICAgIHx8ICEkUHJvY2Vzc1N0YXJ0cG9pbnQtPntBY3Rpdml0eX0gfHwgISRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5RGlhbG9nfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdObyBTdGFydEFjdGl2aXR5RGlhbG9nIG9yIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZm9yIFByb2Nlc3MgIiVzIiBjb25maWd1cmVkIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFN1Y2Nlc3MgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1RpY2tldEFjdGl2aXR5U2V0KAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5fSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5FcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3Qgc2V0IEFjdGl2aXR5RW50aXR5SUQgIiVzIiBvbiBUaWNrZXRJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXNlIFByb2Nlc3NFbnRpdHlJRCBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICRQcm9jZXNzRW50aXR5SUQgPSAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfTsKCiAgICAgICAgIyBDaGVjayBpZiB3ZSBkZWFsIHdpdGggYSBUaWNrZXQgVXBkYXRlCiAgICAgICAgbXkgJFVwZGF0ZVRpY2tldElEID0gJFRpY2tldElEOwogICAgfQoKICAgICMgSWYgd2UgaGFkIGEgVGlja2V0SUQsIGdldCB0aGUgVGlja2V0CiAgICBlbHNlIHsKCiAgICAgICAgIyBHZXQgVGlja2V0IHRvIGNoZWNrIFRpY2tldElEIHdhcyB2YWxpZAogICAgICAgICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCBcJVRpY2tldCApICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBzdG9yZSBBY3Rpdml0eURpYWxvZywgaW52YWxpZCBUaWNrZXRJRDogJXMhJywKICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICAgICAkQWN0aXZpdHlFbnRpdHlJRCA9ICRUaWNrZXR7CiAgICAgICAgICAgICdEeW5hbWljRmllbGRfJwogICAgICAgICAgICAgICAgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Byb2Nlc3M6OkR5bmFtaWNGaWVsZFByb2Nlc3NNYW5hZ2VtZW50QWN0aXZpdHlJRCcpCiAgICAgICAgfTsKICAgICAgICBpZiAoICEkQWN0aXZpdHlFbnRpdHlJRCApCiAgICAgICAgewoKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd0RpYWxvZ0Vycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ01pc3NpbmcgQWN0aXZpdHlFbnRpdHlJRCBpbiBUaWNrZXQgJXMhJywKICAgICAgICAgICAgICAgICAgICAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgYWN0aXZpdHkgZGlhbG9nIHRvIHNhdmUgaXMgc3RpbGwgdGhlIGNvcnJlY3QgYWN0aXZpdHkKICAgICAgICBteSAkQWN0aXZpdHkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5JyktPkFjdGl2aXR5R2V0KAogICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICRBY3Rpdml0eUVudGl0eUlELAogICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgID0+IFsnQWdlbnRJbnRlcmZhY2UnXSwKICAgICAgICApOwogICAgICAgIG15ICVBY3Rpdml0eURpYWxvZ3MgPSByZXZlcnNlICV7ICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfSAvLyB7fSB9OwogICAgICAgIGlmICggISRBY3Rpdml0eURpYWxvZ3N7JEFjdGl2aXR5RGlhbG9nRW50aXR5SUR9ICkgewoKICAgICAgICAgICAgbXkgJFRpY2tldEhvb2sgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKTsKICAgICAgICAgICAgbXkgJFRpY2tldEhvb2tEaXZpZGVyID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJyk7CgogICAgICAgICAgICAkRXJyb3J7V3JvbmdBY3Rpdml0eX0gPSAxOwogICAgICAgICAgICBwdXNoIEBOb3RpZnksIHsKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1RoaXMgc3RlcCBkb2VzIG5vdCBiZWxvbmcgYW55bW9yZSB0byB0aGUgY3VycmVudCBhY3Rpdml0eSBpbiBwcm9jZXNzIGZvciB0aWNrZXQgXCclcyVzJXNcJyEgQW5vdGhlciB1c2VyIGNoYW5nZWQgdGhpcyB0aWNrZXQgaW4gdGhlIG1lYW50aW1lLiBQbGVhc2UgY2xvc2UgdGhpcyB3aW5kb3cgYW5kIHJlbG9hZCB0aGUgdGlja2V0LicsCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldEhvb2ssCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldEhvb2tEaXZpZGVyLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAkUHJvY2Vzc0VudGl0eUlEID0gJFRpY2tldHsKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRQcm9jZXNzSUQnKQogICAgICAgIH07CgogICAgICAgIGlmICggISRQcm9jZXNzRW50aXR5SUQgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd0RpYWxvZ0Vycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ01pc3NpbmcgUHJvY2Vzc0VudGl0eUlEIGluIFRpY2tldCAlcyEnLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiB3ZSBnb3QgZXJyb3JzIGdvIGJhY2sgdG8gZGlzcGxheWluZyB0aGUgQWN0aXZpdHlEaWFsb2cKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlRXJyb3IgKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9PdXRwdXRBY3Rpdml0eURpYWxvZygKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEICAgICAgICA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgID0+ICRUaWNrZXRJRCB8fCB1bmRlZiwKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICAgICA9PiBcJUVycm9yLAogICAgICAgICAgICBFcnJvck1lc3NhZ2VzICAgICAgICAgID0+IFwlRXJyb3JNZXNzYWdlcywKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICBOb3RpZnkgICAgICAgICAgICAgICAgID0+IFxATm90aWZ5LAogICAgICAgICk7CiAgICB9CgogICAgIyBDaGVjayBpZiB3ZSBkZWFsIHdpdGggYSBUaWNrZXQgVXBkYXRlCiAgICBteSAkVXBkYXRlVGlja2V0SUQgPSAkUGFyYW17R2V0UGFyYW19LT57VGlja2V0SUR9OwoKICAgICMgV2Ugc2F2ZSBvbmx5IG9uY2UsIG5vIG1hdHRlciBpZiBvbmUgb3IgbW9yZSBjb25maWd1cmF0aW9ucyBhcmUgc2V0IGZvciB0aGUgc2FtZSBwYXJhbQogICAgbXkgJVN0b3JlZEZpZWxkczsKCiAgICAjIFNhdmUgbG9vcCBmb3Igc3RvcmluZyBUaWNrZXQgVmFsdWVzIHRoYXQgd2VyZSBub3QgcmVxdWlyZWQgb24gdGhlIGluaXRpYWwgVGlja2V0Q3JlYXRlCiAgICBESUFMT0dGSUVMRDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0gKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDYW5cJ3QgZ2V0IGRhdGEgZm9yIEZpZWxkICIlcyIgb2YgQWN0aXZpdHlEaWFsb2cgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkID1+IG17XkR5bmFtaWNGaWVsZF8oLiopfXhtcyApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZE5hbWUgPSAkMTsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICggZ3JlcCB7ICRfLT57TmFtZX0gZXEgJER5bmFtaWNGaWVsZE5hbWUgfSBAeyREeW5hbWljRmllbGR9IClbMF07CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKCiAgICAgICAgICAgICAgICBteSAkTWVzc2FnZQogICAgICAgICAgICAgICAgICAgID0gIkR5bmFtaWNGaWVsZENvbmZpZyBtaXNzaW5nIGZvciBmaWVsZDogJFBhcmFte0ZpZWxkTmFtZX0sIG9yIGlzIG5vdCBhIFRpY2tldCBEeW5hbWljIEZpZWxkISI7CgogICAgICAgICAgICAgICAgIyBsb2cgZXJyb3IgYnV0IGRvZXMgbm90IHN0b3AgdGhlIGV4ZWN1dGlvbiBhcyBpdCBjb3VsZCBiZSBhbiBvbGQgQXJ0aWNsZQogICAgICAgICAgICAgICAgIyBEeW5hbWljRmllbGQsIHNlZSBidWcjMTE2NjYKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUaWNrZXRQYXJhbXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBzZXQgRHluYW1pY0ZpZWxkIHZhbHVlIGZvciAlcyBvZiBUaWNrZXQgd2l0aCBJRCAiJXMiIGluIEFjdGl2aXR5RGlhbG9nICIlcyIhJywKICAgICAgICAgICAgICAgICAgICAgICAgJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRDdXJyZW50RmllbGQgZXEgJ1BlbmRpbmdUaW1lJyApIHsKCiAgICAgICAgICAgICMgVGhpcyBWYWx1ZSBpcyBqdXN0IHNldCBpZiBTdGF0dXMgd2FzIG9uIGEgUGVuZGluZyBzdGF0ZQogICAgICAgICAgICAjIHNvIGl0IGhhcyB0byBiZSBwb3NzaWJsZSB0byBzdG9yZSB0aGUgdGlja2V0IGlmIHRoaXMgb25lJ3MgZW1wdHkKICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFRpY2tldFBhcmFteydQZW5kaW5nVGltZSd9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgJXsgJFRpY2tldFBhcmFteydQZW5kaW5nVGltZSd9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHNldCBQZW5kaW5nVGltZSBmb3IgVGlja2V0IHdpdGggSUQgIiVzIiBpbiBBY3Rpdml0eURpYWxvZyAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBlbHNpZiAoICRDdXJyZW50RmllbGQgZXEgJ0FydGljbGUnICYmICggJFVwZGF0ZVRpY2tldElEIHx8ICROZXdUaWNrZXRJRCApICkgewoKICAgICAgICAgICAgbXkgJFRpY2tldElEID0gJFVwZGF0ZVRpY2tldElEIHx8ICROZXdUaWNrZXRJRDsKCiAgICAgICAgICAgIGlmICggJFBhcmFte0dldFBhcmFtfS0+e1N1YmplY3R9ICYmICRQYXJhbXtHZXRQYXJhbX0tPntCb2R5fSApIHsKCiAgICAgICAgICAgICAgICAjIGFkZCBub3RlCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUlEID0gJyc7CiAgICAgICAgICAgICAgICBteSAkTWltZVR5cGUgID0gJ3RleHQvcGxhaW4nOwoKICAgICAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgICAgIG15IEBOZXdBdHRhY2htZW50RGF0YTsKICAgICAgICAgICAgICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIHNraXAsIGRlbGV0ZWQgbm90IHVzZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ29udGVudElECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0ID0+ICRDb250ZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBhdHRhY2htZW50IGlmIG5vdCBsaW5rZWQgaW4gYm9keQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0gIX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgaW5saW5lIGltYWdlcyBhbmQgbm9ybWFsIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBOZXdBdHRhY2htZW50RGF0YSwgXCV7JEF0dGFjaG1lbnR9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBAQXR0YWNobWVudHMgPSBATmV3QXR0YWNobWVudERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQ29tbXVuaWNhdGlvbkNoYW5uZWwgPSAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57QXJ0aWNsZX0tPntDb25maWd9LT57Q29tbXVuaWNhdGlvbkNoYW5uZWx9CiAgICAgICAgICAgICAgICAgICAgLy8gJ0ludGVybmFsJzsKCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JDaGFubmVsKAogICAgICAgICAgICAgICAgICAgIENoYW5uZWxOYW1lID0+ICRDb21tdW5pY2F0aW9uQ2hhbm5lbCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBDaGFuZ2UgaGlzdG9yeSB0eXBlIGFuZCBjb21tZW50IGFjY29yZGluZ2x5IHRvIHRoZSBwcm9jZXNzIGFydGljbGUuCiAgICAgICAgICAgICAgICBteSAkSGlzdG9yeVR5cGUgICAgPSAnQWRkTm90ZSc7CiAgICAgICAgICAgICAgICBteSAkSGlzdG9yeUNvbW1lbnQgPSAnJSVOb3RlJzsKICAgICAgICAgICAgICAgIGlmICggJENvbW11bmljYXRpb25DaGFubmVsIGVxICdQaG9uZScgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlUeXBlICAgID0gJ1Bob25lQ2FsbEFnZW50JzsKICAgICAgICAgICAgICAgICAgICAkSGlzdG9yeUNvbW1lbnQgPSAnJSUnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRGcm9tID0gIlwiJFNlbGYtPntVc2VyRnVsbG5hbWV9XCIgPCRTZWxmLT57VXNlckVtYWlsfT4iOwogICAgICAgICAgICAgICAgJEFydGljbGVJRCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57QXJ0aWNsZX0tPntDb25maWd9LT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9IC8vIDAsCiAgICAgICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICRIaXN0b3J5VHlwZSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAkSGlzdG9yeUNvbW1lbnQsCiAgICAgICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtCb2R5fSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19e1N1YmplY3R9LAogICAgICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+e0FydGljbGV9LT57Q29uZmlnfS0+e0luZm9ybUFnZW50c30KICAgICAgICAgICAgICAgICAgICA/ICRQYXJhbXtHZXRQYXJhbX17SW5mb3JtVXNlcklEfQogICAgICAgICAgICAgICAgICAgIDogW10sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0dGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAgICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCB0aGUgbGluayB0aWNrZXQgaWQgaWYgZ2l2ZW4KICAgICAgICAgICAgICAgIG15ICRMaW5rVGlja2V0SUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTGlua1RpY2tldElEJyApIHx8ICcnOwoKICAgICAgICAgICAgICAgICMgZ2V0IHNjcmVlbiBjb25maWcKICAgICAgICAgICAgICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICAgICAgICAgICAgICMgbGluayB0aWNrZXRzCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJExpbmtUaWNrZXRJRAogICAgICAgICAgICAgICAgICAgICYmICRDb25maWctPntTcGxpdExpbmtUeXBlfQogICAgICAgICAgICAgICAgICAgICYmICRDb25maWctPntTcGxpdExpbmtUeXBlfS0+e0xpbmtUeXBlfQogICAgICAgICAgICAgICAgICAgICYmICRDb25maWctPntTcGxpdExpbmtUeXBlfS0+e0RpcmVjdGlvbn0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkTGlua1RpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgcm8gcGVybWlzc2lvbiEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VLZXkgPSAkTGlua1RpY2tldElEOwogICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXRLZXkgPSAkVGlja2V0SUQ7CgogICAgICAgICAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9LT57RGlyZWN0aW9ufSBlcSAnU291cmNlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNvdXJjZUtleSA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldEtleSA9ICRMaW5rVGlja2V0SUQ7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGxpbmsgdGhlIHRpY2tldHMKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkU291cmNlS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGFyZ2V0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJENvbmZpZy0+e1NwbGl0TGlua1R5cGV9LT57TGlua1R5cGV9IHx8ICdOb3JtYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX0tPntUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXRPYmplY3QtPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRQYXJhbXtHZXRQYXJhbX17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIElmIHdlIGhhdmUgdG8gVXBkYXRlIGEgdGlja2V0LCB1cGRhdGUgdGhlIHRyYW5zbWl0dGVkIHZhbHVlcwogICAgICAgIGVsc2lmICgkVXBkYXRlVGlja2V0SUQpIHsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzOwogICAgICAgICAgICBpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1RpdGxlJyApIHsKCiAgICAgICAgICAgICAgICAjIGlmIHRoZXJlIGlzIG5vIHRpdGxlLCBub3RoaW5nIGlzIG5lZWRlZCB0byBiZSBkb25lCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgIWRlZmluZWQgJFRpY2tldFBhcmFteydUaXRsZSd9CiAgICAgICAgICAgICAgICAgICAgfHwgKCBkZWZpbmVkICRUaWNrZXRQYXJhbXsnVGl0bGUnfSAmJiAkVGlja2V0UGFyYW17J1RpdGxlJ30gZXEgJycgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBvdGhlcndpc2Ugc2V0IHRoZSB0aWNrZXQgdGl0bGUKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRUaWNrZXRQYXJhbXsnVGl0bGUnfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnQ3VzdG9tZXJJRCcKICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdDdXN0b21lclVzZXJJRCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkU3RvcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0tPntEaXNwbGF5fSA9PSAxICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dyb25nIEFjdGl2aXR5RGlhbG9nIEZpZWxkIGNvbmZpZzogJXMgY2FuXCd0IGJlIERpc3BsYXkgPT4gMSAvIFNob3cgZmllbGQgKFBsZWFzZSBjaGFuZ2UgaXRzIGNvbmZpZ3VyYXRpb24gdG8gYmUgRGlzcGxheSA9PiAwIC8gRG8gbm90IHNob3cgZmllbGQgb3IgRGlzcGxheSA9PiAyIC8gU2hvdyBmaWVsZCBhcyBtYW5kYXRvcnkpIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBza2lwIFRpY2tldEN1c3RvbWVyU2V0KCkgaWYgdGhlcmUgaXMgbm8gY2hhbmdlIGluIHRoZSBjdXN0b21lcgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7Q3VzdG9tZXJJRH0gZXEgJFRpY2tldFBhcmFte0N1c3RvbWVySUR9CiAgICAgICAgICAgICAgICAgICAgJiYgJFRpY2tldHtDdXN0b21lclVzZXJJRH0gZXEgJFRpY2tldFBhcmFte0N1c3RvbWVyVXNlcn0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICMgSW4gdGhpcyBjYXNlIHdlIGRvbid0IHdhbnQgdG8gY2FsbCBhbnkgYWRkaXRpb25hbCBzdG9yZXMKICAgICAgICAgICAgICAgICAgICAjIG9uIEN1c3RvbWVyLCBDdXN0b21lck5vLCBDdXN0b21lcklEIG9yIEN1c3RvbWVyVXNlcklECiAgICAgICAgICAgICAgICAgICAgIyBzbyBtYWtlIHN1cmUgYm90aCBmaWVsZHMgYXJlIHNldCB0byAiU3RvcmVkIiA7KQogICAgICAgICAgICAgICAgICAgICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57J0N1c3RvbWVySUQnfSB9ICAgICA9IDE7CiAgICAgICAgICAgICAgICAgICAgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnsnQ3VzdG9tZXJVc2VySUQnfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3VzdG9tZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgTm8gPT4gJFRpY2tldFBhcmFte0N1c3RvbWVySUR9LAoKICAgICAgICAgICAgICAgICAgICAjIGhlcmUgdG9vOiB1bmZvcnR1bmF0ZWx5IFRpY2tldENyZWF0ZSB0YWtlcyBQYXJhbSAnQ3VzdG9tZXJVc2VyJwogICAgICAgICAgICAgICAgICAgICMgaW5zdGVhZCBvZiBDdXN0b21lclVzZXJJRCwgc28gb3VyIFRpY2tldFBhcmFtIGhhc2gKICAgICAgICAgICAgICAgICAgICAjIGhhcyB0aGUgQ3VzdG9tZXJVc2VyIEtleSBpbnN0ZWFkIG9mICdDdXN0b21lclVzZXJJRCcKICAgICAgICAgICAgICAgICAgICBVc2VyICAgICA9PiAkVGlja2V0UGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIEluIHRoaXMgY2FzZSB3ZSBkb24ndCB3YW50IHRvIGNhbGwgYW55IGFkZGl0aW9uYWwgc3RvcmVzCiAgICAgICAgICAgICAgICAjIG9uIEN1c3RvbWVyLCBDdXN0b21lck5vLCBDdXN0b21lcklEIG9yIEN1c3RvbWVyVXNlcklECiAgICAgICAgICAgICAgICAjIHNvIG1ha2Ugc3VyZSBib3RoIGZpZWxkcyBhcmUgc2V0IHRvICJTdG9yZWQiIDspCiAgICAgICAgICAgICAgICAkU3RvcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eydDdXN0b21lcklEJ30gfSAgICAgPSAxOwogICAgICAgICAgICAgICAgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnsnQ3VzdG9tZXJVc2VySUQnfSB9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgICAgIG15ICRUaWNrZXRGaWVsZFNldFN1YiA9ICRDdXJyZW50RmllbGQ7CiAgICAgICAgICAgICAgICAkVGlja2V0RmllbGRTZXRTdWIgPX4gc3tJRCR9e314bXM7CiAgICAgICAgICAgICAgICAkVGlja2V0RmllbGRTZXRTdWIgPSAnVGlja2V0JyAuICRUaWNrZXRGaWVsZFNldFN1YiAuICdTZXQnOwoKICAgICAgICAgICAgICAgIGlmICggJFRpY2tldE9iamVjdC0+Y2FuKCRUaWNrZXRGaWVsZFNldFN1YikgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRVcGRhdGVGaWVsZE5hbWU7CgogICAgICAgICAgICAgICAgICAgICMgc2FkbHkgd2UgbmVlZCBhbiBleGNlcHRpb24gZm9yIE93bmVyKElEKSBhbmQgUmVzcG9uc2libGUoSUQpLCBiZWNhdXNlIHRoZQogICAgICAgICAgICAgICAgICAgICMgVGlja2V0KlNldCBzdWJzIG5lZWQgTmV3VXNlcklEIGFzIHBhcmFtCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICBzY2FsYXIgZ3JlcCB7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJF8gfQogICAgICAgICAgICAgICAgICAgICAgICBxdyggT3duZXJJRCBSZXNwb25zaWJsZUlEICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZUZpZWxkTmFtZSA9ICdOZXdVc2VySUQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZUZpZWxkTmFtZSA9ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHRvIHN0b3JlIGlmIHRoZSBmaWVsZCBuZWVkcyB0byBiZSB1cGRhdGVkCiAgICAgICAgICAgICAgICAgICAgbXkgJEZpZWxkVXBkYXRlOwoKICAgICAgICAgICAgICAgICAgICAjIG9ubHkgU2VydmljZSBhbmQgU0xBIGZpZWxkcyBhY2NlcHRzIGVtcHR5IHZhbHVlcyBpZiB0aGUgaGFzaCBrZXkgaXMgbm90CiAgICAgICAgICAgICAgICAgICAgIyBkZWZpbmVkIHNldCBpdCB0byBlbXB0eSBzbyB0aGUgVGlja2V0KlNldCBmdW5jdGlvbiBjYWxsIHdpbGwgZ2V0IHRoZSBlbXB0eQogICAgICAgICAgICAgICAgICAgICMgdmFsdWUKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICggJFVwZGF0ZUZpZWxkTmFtZSBlcSAnU2VydmljZUlEJyB8fCAkVXBkYXRlRmllbGROYW1lIGVxICdTTEFJRCcgKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhZGVmaW5lZCAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkRmllbGRVcGRhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgU2VydmljZSBhbiBTTEEgZmllbGRzIGlmIHRoZXkgaGF2ZSBhIGRlZmluZWQgdmFsdWUgKGV2ZW4gZW1wdHkpCiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkVXBkYXRlRmllbGROYW1lIGVxICdTZXJ2aWNlSUQnIHx8ICRVcGRhdGVGaWVsZE5hbWUgZXEgJ1NMQUlEJyApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkRmllbGRVcGRhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgYW55IG90aGVyIGZpZWxkIHRoYXQgaXRzIHZhbHVlIGlzIGRlZmluZWQgYW5kIG5vdCBlbXB0eQogICAgICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZUZpZWxkTmFtZSBuZSAnU2VydmljZUlEJwogICAgICAgICAgICAgICAgICAgICAgICAmJiAkVXBkYXRlRmllbGROYW1lIG5lICdTTEFJRCcKICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSBuZSAnJwogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkRmllbGRVcGRhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAxOwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIG5lZWRzIHRvIGJlIHVwZGF0ZWQKICAgICAgICAgICAgICAgICAgICBpZiAoJEZpZWxkVXBkYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+JFRpY2tldEZpZWxkU2V0U3ViKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZUZpZWxkTmFtZSA9PiAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGluIGNhc2Ugb2YgYSBuZXcgc2VydmljZSBhbmQgbm8gbmV3IFNMQSBpcyB0byBiZSBzZXQsIGNoZWNrIGlmIGN1cnJlbnQKICAgICAgICAgICAgICAgICAgICAgICAgIyBhc3NpZ25lZCBTTEEgaXMgc3RpbGwgdmFsaWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZUZpZWxkTmFtZSBlcSAnU2VydmljZUlEJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWRlZmluZWQgJFRpY2tldFBhcmFte1NMQUlEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGlja2V0IGRldGFpbHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIHRpY2tldCBhbHJlYWR5IGhhdmUgYW4gU0xBIGFzc2lnbmVkIGdldCB0aGUgbGlzdCBTTEFzIGZvciB0aGUgbmV3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoICRUaWNrZXR7U0xBSUR9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJVNMQUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyktPlNMQUxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBjdXJyZW50IFNMQSBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgU0xBIGZvciBuZXcgc2VydmljZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIFNMQSBmcm9tIHRpY2tldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRTTEFMaXN0eyAkVGlja2V0e1NMQUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRTTEFTZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTEFJRCAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHNldCAlcyBmb3IgVGlja2V0IHdpdGggSUQgIiVzIiBpbiBBY3Rpdml0eURpYWxvZyAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgICAgICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBUcmFuc2l0aW9ucyB3aWxsIGJlIGhhbmRsZWQgYnkgdGlja2V0IGV2ZW50IG1vZHVsZSAoVGlja2V0UHJvY2Vzc1RyYW5zaXRpb25zLnBtKS4KCiAgICAjIGlmIHdlIHdlcmUgdXBkYXRpbmcgYSB0aWNrZXQsIGNsb3NlIHRoZSBwb3AtdXAgYW5kIHJldHVybiB0byB6b29tCiAgICAjIGVsc2UgKG5ldyB0aWNrZXQpIGp1c3QgZ28gdG8gem9vbSB0byBzaG93IHRoZSBuZXcgdGlja2V0CiAgICBpZiAoJFVwZGF0ZVRpY2tldElEKSB7CgogICAgICAgICMgbG9hZCBuZXcgVVJMIGluIHBhcmVudCB3aW5kb3cgYW5kIGNsb3NlIHBvcC11cAogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Qb3B1cENsb3NlKAogICAgICAgICAgICBVUkwgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFVwZGF0ZVRpY2tldElEIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQiLAogICAgKTsKfQoKc3ViIF9EaXNwbGF5UHJvY2Vzc0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIElmIHdlIGhhdmUgYSBQcm9jZXNzRW50aXR5SUQKICAgICRQYXJhbXtFcnJvcnN9LT57UHJvY2Vzc0VudGl0eUlESW52YWxpZH0gPSAnIFNlcnZlckVycm9yJwogICAgICAgIGlmICggJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0gJiYgISRQYXJhbXtQcm9jZXNzTGlzdH0tPnsgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0gfSApOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJFBhcmFte1Byb2Nlc3NMaXN0fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkJyAuICggJFBhcmFte0Vycm9yc30tPntQcm9jZXNzRW50aXR5SURJbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1Byb2Nlc3NMaXN0fSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1Byb2Nlc3NFbnRpdHlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIEF1dG9Db21wbGV0ZSA9PiAnb2ZmJywKICAgICk7CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkU2VsZi0+e0NvbmZpZ30tPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPlNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17UHJlU2VsZWN0UHJvY2Vzc30gJiYgJFBhcmFte1Byb2Nlc3NJRH0gKSB7CgogICAgICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnUHJvY2Vzc0lEJywKICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFte1Byb2Nlc3NJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdQcm9jZXNzTGlzdCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIG9uIGluaXRpYWwgc2NyZWVuIGZyb20gbmF2YmFyIHRoZXJlIGlzIG5vIElzTWFpbldpbm93IGJ1dCBhbHNvIG5vIElzUHJvY2Vzc0Vucm9sbCwKICAgICMgdGhlbiBpdCBtdXN0IGJlIGEgTWFpbldpbmRvdwogICAgaWYgKCAhJFNlbGYtPntJc01haW5XaW5kb3d9ICYmICEkU2VsZi0+e0lzUHJvY2Vzc0Vucm9sbH0gKSB7CiAgICAgICAgJFNlbGYtPntJc01haW5XaW5kb3d9ID0gMTsKICAgIH0KCiAgICBteSAkVHlwZSA9ICRTZWxmLT57SXNNYWluV2luZG93fSA/ICcnIDogJ1NtYWxsJzsKCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFR5cGUgPT4gJFR5cGUsCiAgICApOwogICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICB9CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFByb2Nlc3MnIC4gJFR5cGUsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBGb3JtSUQgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBJc1Byb2Nlc3NFbnJvbGwgPT4gJFNlbGYtPntJc1Byb2Nlc3NFbnJvbGx9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgd29ya2Fyb3VuZCB3aGVuIGFjdGl2aXR5IGRpYWxvZyBpcyBsb2FkZWQgYnkgQUpBWCBhcyBmaXJzdCBhY3Rpdml0eSBkaWFsb2csIGlmIHRoZXJlIGlzCiAgICAjIGEgZGF0ZSBmaWVsZCBsaWtlIFBlbmRpbmcgVGltZSBvciBEeW5hbWljIEZpZWxkcyBEYXRlL1RpbWUgb3IgRGF0ZSwgdGhlcmUgaXMgbm8gd2F5IHRvIHNldAogICAgIyB0aGlzIG9wdGlvbnMgaW4gdGhlIGZvb3RlciBhZ2FpbgogICAgJExheW91dE9iamVjdC0+e0hhc0RhdGVwaWNrZXJ9ID0gMTsKCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAkVHlwZSApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgojID1jdXQKIwojIF9DaGVja0ZpZWxkKCkKIwojIGNoZWNrcyBhbGwgdGhlIHBvc3NpYmxlIHRpY2tldCBmaWVsZHMgYW5kIHJldHVybnMgdGhlIElEIChpZiBwb3NzaWJsZSkgdmFsdWUgb2YgdGhlIGZpZWxkLCBpZiB2YWxpZAojIGFuZCBjaGVja3MgYXJlIHN1Y2Nlc3NmdWwKIwojIGlmIERpc3BsYXkgcGFyYW0gaXMgc2V0IHRvIDAgb3Igbm90IGdpdmVuLCBpdCB1c2VzIEFjdGl2aXR5RGlhbG9nIGZpZWxkIGRlZmF1bHQgdmFsdWUgZm9yIGFsbCBmaWVsZHMKIyBvciBnbG9iYWwgZGVmYXVsdCB2YWx1ZSBhcyBmYWxsLWJhY2sgb25seSBmb3IgY2VydGFpbiBmaWVsZHMKIwojIGlmIERpc3BsYXkgcGFyYW0gaXMgc2V0IHRvIDEgb3IgMiBpdCB1c2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAojCiMgICAgIG15ICRQcmlvcml0eUlEID0gJEFnZW50VGlja2V0UHJvY2Vzc09iamVjdC0+X0NoZWNrRmllbGQoCiMgICAgICAgICBGaWVsZCAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAojICAgICAgICAgRGlzcGxheSAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwsIDAgb3IgMSBvciAyCiMgICAgICAgICBEZWZhdWx0VmFsdWUgPT4gJzMgbm9ybWFsJywgICAgICAgICAgIyBBY3Rpdml0eURpYWxvZyBmaWVsZCBkZWZhdWx0IHZhbHVlIChpdCB1c2VzIGdsb2JhbAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgZGVmYXVsdCB2YWx1ZSBhcyBmYWxsIGJhY2sgZm9yIG1hbmRhdG9yeSBmaWVsZHMKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIChRdWV1ZSwgU2F0ZSwgTG9jayBhbmQgUHJpb3JpdHkpCiMgICAgICk7CiMKIyBSZXR1cm5zOgojICAgICAkUHJpb3JpdHlJRCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgUHJpb3JpdHlJRCBpcyBzZXQgdG8gMSBpbiB0aGUgd2ViIHJlcXVlc3QKIwojICAgICBteSAkUHJpb3JpdHlJRCA9ICRBZ2VudFRpY2tldFByb2Nlc3NPYmplY3QtPl9DaGVja0ZpZWxkKAojICAgICAgICAgRmllbGQgICAgICAgID0+ICdQcmlvcml0eUlEJywKIyAgICAgICAgIERpc3BsYXkgICAgICA9PiAwLAojICAgICAgICAgRGVmYXVsdFZhbHVlID0+ICczIG5vcm1hbCcsCiMgICAgICk7CiMKIyBSZXR1cm5zOgojICAgICAkUHJpb3JpdHlJRCA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgIyBzaW5jZSBBY3Rpdml0eURpYWxvZyBkZWZhdWx0IHZhbHVlIGlzICczIG5vcm1hbCcgYW5kCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICBmaWVsZCBpcyBoaWRkZW4KIwojID1jdXQKCnN1YiBfQ2hlY2tGaWVsZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRmllbGQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlbW92ZSB0aGUgSUQgYW5kIGNoZWNrIGlmIHRoZSBnaXZlbiBmaWVsZCBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgYSB0aWNrZXQKICAgIG15ICRGaWVsZFdpdGhvdXRJRCA9ICRQYXJhbXtGaWVsZH07CiAgICAkRmllbGRXaXRob3V0SUQgPX4gc3tJRCR9e314bXM7CiAgICBteSAkVGlja2V0UmVxdWlyZWRGaWVsZCA9IHNjYWxhciBncmVwIHsgJF8gZXEgJEZpZWxkV2l0aG91dElEIH0gcXcoUXVldWUgU3RhdGUgTG9jayBQcmlvcml0eSk7CgogICAgbXkgJFZhbHVlOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGlmIG5vIERpc3BsYXkgKG9yIERpc3BsYXkgPT0gMCkgaXMgY29tbWl0dGVkCiAgICBpZiAoICEkUGFyYW17RGlzcGxheX0gKSB7CgogICAgICAgICMgQ2hlY2sgaWYgYSBEZWZhdWx0VmFsdWUgaXMgZ2l2ZW4KICAgICAgICBpZiAoICRQYXJhbXtEZWZhdWx0VmFsdWV9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgcGFyYW0gaXMgdmFsaWQKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPl9Mb29rdXBWYWx1ZSgKICAgICAgICAgICAgICAgIEZpZWxkID0+ICRGaWVsZFdpdGhvdXRJRCwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB3ZSBnb3QgYSByZXF1aXJlZCB0aWNrZXQgZmllbGQsIGNoZWNrIGlmIHdlIGdvdCBhIHZhbGlkIERlZmF1bHRWYWx1ZSBpbiB0aGUgU3lzQ29uZmlnCiAgICAgICAgaWYgKCAhJFZhbHVlICYmICRUaWNrZXRSZXF1aXJlZEZpZWxkICkgewogICAgICAgICAgICAkVmFsdWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlByb2Nlc3M6OkRlZmF1bHQkRmllbGRXaXRob3V0SUQiKTsKCiAgICAgICAgICAgIGlmICggISRWYWx1ZSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdEZWZhdWx0IENvbmZpZyBmb3IgUHJvY2Vzczo6RGVmYXVsdCVzIG1pc3NpbmchJywKICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkV2l0aG91dElELAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIGdpdmVuIGZpZWxkIHBhcmFtIGlzIHZhbGlkCiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+X0xvb2t1cFZhbHVlKAogICAgICAgICAgICAgICAgICAgIEZpZWxkID0+ICRGaWVsZFdpdGhvdXRJRCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFZhbHVlICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RlZmF1bHQgQ29uZmlnIGZvciBQcm9jZXNzOjpEZWZhdWx0JXMgaW52YWxpZCEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZpZWxkV2l0aG91dElELAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtEaXNwbGF5fSA9PSAxICkgewoKICAgICAgICAjIERpc3BsYXkgPT0gMSBpcyBsb2dpY2FsaXR5IG5vdCBwb3NzaWJsZSBmb3IgYSB0aWNrZXQgcmVxdWlyZWQgZmllbGQKICAgICAgICBpZiAoJFRpY2tldFJlcXVpcmVkRmllbGQpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdXcm9uZyBBY3Rpdml0eURpYWxvZyBGaWVsZCBjb25maWc6ICVzIGNhblwndCBiZSBEaXNwbGF5ID0+IDEgLyBTaG93IGZpZWxkIChQbGVhc2UgY2hhbmdlIGl0cyBjb25maWd1cmF0aW9uIHRvIGJlIERpc3BsYXkgPT4gMCAvIERvIG5vdCBzaG93IGZpZWxkIG9yIERpc3BsYXkgPT4gMiAvIFNob3cgZmllbGQgYXMgbWFuZGF0b3J5KSEnLAogICAgICAgICAgICAgICAgICAgICRQYXJhbXtGaWVsZH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgcGFyYW0gaXMgdmFsaWQKICAgICAgICBpZiAoICRQYXJhbXtGaWVsZH0gZXEgJ0FydGljbGUnICkgewoKICAgICAgICAgICAgJFZhbHVlID0gMTsKCiAgICAgICAgICAgIG15ICggJEJvZHksICRTdWJqZWN0LCAkQXR0YWNobWVudEV4aXN0cywgJFRpbWVVbml0cyApID0gKAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JvZHknICksCiAgICAgICAgICAgICAgICAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3ViamVjdCcgKSwKICAgICAgICAgICAgICAgICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBdHRhY2htZW50RXhpc3RzJyApLAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpbWVVbml0cycgKQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBJZiBhdHRhY2htZW50IGV4aXN0cyBhbmQgYm9keSBhbmQgc3ViamVjdCBub3QsIGl0IGlzIGVycm9yIChzZWUgYnVnIzEzMDgxKS4KICAgICAgICAgICAgaWYgKCAkQXR0YWNobWVudEV4aXN0cyAmJiAoICEkQm9keSAmJiAhJFN1YmplY3QgKSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgSWYgdGltZSB1bml0cyBleGlzdHMgYW5kIGJvZHkgYW5kIHN1YmplY3Qgbm90LCBpdCBpcyBlcnJvciAoc2VlIGJ1ZyMxMzI2NikuCiAgICAgICAgICAgIGlmICggJFRpbWVVbml0cyAmJiAoICEkQm9keSAmJiAhJFN1YmplY3QgKSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+X0xvb2t1cFZhbHVlKAogICAgICAgICAgICAgICAgRmllbGQgPT4gJFBhcmFte0ZpZWxkfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtGaWVsZH0gKSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtEaXNwbGF5fSA9PSAyICkgewoKICAgICAgICAjIGNoZWNrIGlmIHRoZSBnaXZlbiBmaWVsZCBwYXJhbSBpcyB2YWxpZAogICAgICAgIGlmICggJFBhcmFte0ZpZWxkfSBlcSAnQXJ0aWNsZScgKSB7CgogICAgICAgICAgICBteSAoICRCb2R5LCAkU3ViamVjdCApID0gKAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JvZHknICksCiAgICAgICAgICAgICAgICAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3ViamVjdCcgKQogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFZhbHVlID0gMDsKICAgICAgICAgICAgaWYgKCAkQm9keSAmJiAkU3ViamVjdCApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRTZWxmLT5fTG9va3VwVmFsdWUoCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkUGFyYW17RmllbGR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0ZpZWxkfSApIHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFZhbHVlOwp9CgojID1jdXQKIwojIF9Mb29rdXBWYWx1ZSgpCiMKIyByZXR1cm5zIHRoZSBJRCAoaWYgcG9zc2libGUpIG9mIG5lYXJseSBhbGwgdGlja2V0IGZpZWxkcyBhbmQvb3IgY2hlY2tzIGlmIGl0cyB2YWxpZC4KIyBDYW4gaGFuZGxlIElEcyBvciBTdHJpbmdzLgojIEN1cnJlbnRseSB3b3JraW5nIHdpdGg6IFN0YXRlLCBRdWV1ZSwgTG9jaywgUHJpb3JpdHkgKHBvc3NpYmxlIG1vcmUpLgojCiMgICAgIG15ICRQcmlvcml0eUlEID0gJEFnZW50VGlja2V0UHJvY2Vzc09iamVjdC0+X0xvb2t1cFZhbHVlKAojICAgICAgICAgUHJpb3JpdHlJRCA9PiAxLAojICAgICApOwojICAgICAkUHJpb3JpdHlJRCA9IDE7CiMKIyAgICAgbXkgJFN0YXRlSUQgPSAkQWdlbnRUaWNrZXRQcm9jZXNzT2JqZWN0LT5fTG9va3VwVmFsdWUoCiMgICAgICAgICBTdGF0ZSA9PiAnb3BlbicsCiMgICAgICk7CiMgICAgICRTdGF0ZUlEID0gMzsKIwojICAgICBteSAkUHJpb3JpdHlJRCA9ICRBZ2VudFRpY2tldFByb2Nlc3NPYmplY3QtPl9Mb29rdXBWYWx1ZSgKIyAgICAgICAgIFByaW9yaXR5ID0+ICd1bmtub3ducHJpb3JpdHkxMjM0JywKIyAgICAgKTsKIyAgICAgJFByaW9yaXR5SUQgPSB1bmRlZjsKIwojID1jdXQKCnN1YiBfTG9va3VwVmFsdWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRmllbGQgVmFsdWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkUGFyYW17RmllbGR9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZpZWxkIHNob3VsZCBub3QgYmUgZW1wdHkhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm8gdmFsdWUsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KICAgIHJldHVybiBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICAjIHJlbW92ZSB0aGUgSUQgZm9yIGZ1bmN0aW9uIG5hbWUgcHVycG9zZQogICAgbXkgJEZpZWxkV2l0aG91dElEID0gJFBhcmFte0ZpZWxkfTsKICAgICRGaWVsZFdpdGhvdXRJRCA9fiBze0lEJH17fXhtczsKCiAgICBteSAkTG9va3VwRmllbGROYW1lOwogICAgbXkgJE9iamVjdE5hbWU7CiAgICBteSAkRnVuY3Rpb25OYW1lOwoKICAgICMgb3duZXIoSUQpIGFuZCByZXNwb25zaWJsZShJRCkgbG9va3VwIG5lZWRzIFVzZXJJRCBhcyBwYXJhbWV0ZXIKICAgIGlmICggc2NhbGFyIGdyZXAgeyAkUGFyYW17RmllbGR9IGVxICRfIH0gcXcoIE93bmVySUQgUmVzcG9uc2libGVJRCApICkgewogICAgICAgICRMb29rdXBGaWVsZE5hbWUgPSAnVXNlcklEJzsKICAgICAgICAkT2JqZWN0TmFtZSAgICAgID0gJ1VzZXInOwogICAgICAgICRGdW5jdGlvbk5hbWUgICAgPSAnVXNlckxvb2t1cCc7CiAgICB9CgogICAgIyBvd25lciBhbmQgcmVzcG9uc2libGUgbG9va3VwIG5lZWRzIFVzZXJMb2dpbiBhcyBwYXJhbWV0ZXIKICAgIGVsc2lmICggc2NhbGFyIGdyZXAgeyAkUGFyYW17RmllbGR9IGVxICRfIH0gcXcoIE93bmVyIFJlc3BvbnNpYmxlICkgKSB7CiAgICAgICAgJExvb2t1cEZpZWxkTmFtZSA9ICdVc2VyTG9naW4nOwogICAgICAgICRPYmplY3ROYW1lICAgICAgPSAnVXNlcic7CiAgICAgICAgJEZ1bmN0aW9uTmFtZSAgICA9ICdVc2VyTG9va3VwJzsKICAgIH0KCiAgICAjIHNlcnZpY2UgYW5kIFNMQSBsb29rdXAgbmVlZHMgTmFtZSBhcyBwYXJhbWV0ZXIgKFdoaWxlIFNlcnZpY2VJRCBhbiBTTEFJRCB1c2VzIHN0YW5kYXJkKQogICAgZWxzaWYgKCBzY2FsYXIgZ3JlcCB7ICRQYXJhbXtGaWVsZH0gZXEgJF8gfSBxdyggU2VydmljZSBTTEEgKSApIHsKICAgICAgICAkTG9va3VwRmllbGROYW1lID0gJ05hbWUnOwogICAgICAgICRPYmplY3ROYW1lICAgICAgPSAkRmllbGRXaXRob3V0SUQ7CiAgICAgICAgJEZ1bmN0aW9uTmFtZSAgICA9ICRGaWVsZFdpdGhvdXRJRCAuICdMb29rdXAnOwogICAgfQoKICAgICMgb3RoZXIgZmllbGRzIGNhbiB1c2Ugc3RhbmRhcmQgcGFyYW1ldGVyIG5hbWVzIGFzIFByaW9yaXR5IG9yIFByaW9yaXR5SUQKICAgIGVsc2UgewogICAgICAgICRMb29rdXBGaWVsZE5hbWUgPSAkUGFyYW17RmllbGR9OwogICAgICAgICRPYmplY3ROYW1lICAgICAgPSAkRmllbGRXaXRob3V0SUQ7CiAgICAgICAgJEZ1bmN0aW9uTmFtZSAgICA9ICRGaWVsZFdpdGhvdXRJRCAuICdMb29rdXAnOwogICAgfQoKICAgICMgZ2V0IGFwcHJvcHJpYXRlIG9iamVjdCBvZiBmaWVsZAogICAgbXkgJEZpZWxkT2JqZWN0OwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAnS2VybmVsOjpTeXN0ZW06OicgLiAkT2JqZWN0TmFtZSwgU2lsZW50ID0+IDEgKSApIHsKICAgICAgICAkRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCAnS2VybmVsOjpTeXN0ZW06OicgLiAkT2JqZWN0TmFtZSApOwogICAgfQoKICAgIG15ICRWYWx1ZTsKCiAgICAjIGNoZWNrIGlmIHRoZSBiYWNrZW5kIG1vZHVsZSBoYXMgdGhlIG5lZWRlZCAqTG9va3VwIHN1YgogICAgaWYgKCAkRmllbGRPYmplY3QgJiYgJEZpZWxkT2JqZWN0LT5jYW4oJEZ1bmN0aW9uTmFtZSkgKSB7CgogICAgICAgICMgY2FsbCB0aGUgKkxvb2t1cCBzdWIgYW5kIGdldCB0aGUgdmFsdWUKICAgICAgICAkVmFsdWUgPSAkRmllbGRPYmplY3QtPiRGdW5jdGlvbk5hbWUoCiAgICAgICAgICAgICRMb29rdXBGaWVsZE5hbWUgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgd2UgZGlkbid0IGhhdmUgYW4gb2JqZWN0IGFuZCB0aGUgdmFsdWUgaGFzIG5vIHJlZiBhIHN0cmluZyBlLmcuIFRpdGxlIGFuZCBzbyBvbgogICAgIyByZXR1cm4gdHJ1ZQogICAgZWxzaWYgKCAkUGFyYW17RmllbGR9IGVxICRGaWVsZFdpdGhvdXRJRCAmJiAhcmVmICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFcnJvciB3aGlsZSBjaGVja2luZyB3aXRoICIgLiAkRmllbGRXaXRob3V0SUQgLiAiT2JqZWN0ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gaWYgKCAhJFZhbHVlICk7CgogICAgIyByZXR1cm4gdGhlIGdpdmVuIElEIHZhbHVlIGlmIHRoZSAqTG9va3VwIHJlc3VsdCB3YXMgYSBzdHJpbmcKICAgIGlmICggJFBhcmFte0ZpZWxkfSBuZSAkRmllbGRXaXRob3V0SUQgKSB7CiAgICAgICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07CiAgICB9CgogICAgIyByZXR1cm4gdGhlICpMb29rdXAgc3RyaW5nIHJldHVybiB2YWx1ZQogICAgcmV0dXJuICRWYWx1ZTsKfQoKc3ViIF9HZXRSZXNwb25zaWJsZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VycwogICAgbXkgJVNob3duVXNlcnM7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRHcm91cE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgR2V0IGF2YWlsYWJsZSBwZXJtaXNzaW9ucyBhbmQgc2V0IHBlcm1pc3Npb24gZ3JvdXAgdHlwZSBhY2NvcmRpbmdseS4KICAgIG15ICRDb25maWdQZXJtaXNzaW9ucyA9ICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtOjpQZXJtaXNzaW9uJyk7CiAgICBteSAkUGVybWlzc2lvbkdyb3VwVHlwZSA9ICggZ3JlcCB7ICRfIGVxICdyZXNwb25zaWJsZScgfSBAeyRDb25maWdQZXJtaXNzaW9uc30gKSA/ICdyZXNwb25zaWJsZScgOiAncncnOwoKICAgICMgaWYgd2UgYXJlIHVwZGF0aW5nIGEgdGlja2V0IHNob3cgdGhlIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSByZXNwb25zaWJsZXMKICAgIGlmICggJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte0FsbFVzZXJzfSApIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGVybWlzc2lvbkdyb3VwVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgdGhlIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZG9lcyBub3QgcHJvdmlkZSBhIFRpY2tldElEIGFuZCBpdCBjb3VsZCBiZSB0aGF0IGFsc28gdGhlcmUKICAgICAgICAjIGlzIG5vIFF1ZXVlSUQgaW5mb3JtYXRpb24uIEdldCB0aGUgZGVmYXVsdCBRdWV1ZUlEIGZvciB0aGlzIG1hdHRlcnMuCiAgICAgICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICAgICBteSAkUXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlByb2Nlc3M6OkRlZmF1bHRRdWV1ZSIpOwogICAgICAgICAgICBteSAkUXVldWVJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRRdWV1ZSApOwogICAgICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRRdWV1ZUlEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICAgICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtSZXNwb25zaWJsZUFsbH0gKSB7CiAgICAgICAgICAgIG15IEBVc2VySURzID0gJFRpY2tldE9iamVjdC0+R2V0U3Vic2NyaWJlZFVzZXJJRHNCeVF1ZXVlSUQoJVBhcmFtKTsKICAgICAgICAgICAgZm9yIG15ICRLZXlHcm91cE1lbWJlciAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICAgICAgZm9yIG15ICRVSUQgKEBVc2VySURzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRLZXlHcm91cE1lbWJlciApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJEFsbEdyb3Vwc01lbWJlcnN7JEtleUdyb3VwTWVtYmVyfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFsbCBzeXN0ZW0gdXNlcnMKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhbGwgc3Vic2NyaWJlZCB1c2VycyB3aG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgcGVybWlzc2lvbiBpbiB0aGUgcXVldWUgZ3JvdXAKICAgICAgICBlbHNpZiAoICRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGVybWlzc2lvbkdyb3VwVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRLZXlNZW1iZXIgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9ICkgewogICAgICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRPd25lcnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VycwogICAgbXkgJVNob3duVXNlcnM7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRHcm91cE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgR2V0IGF2YWlsYWJsZSBwZXJtaXNzaW9ucyBhbmQgc2V0IHBlcm1pc3Npb24gZ3JvdXAgdHlwZSBhY2NvcmRpbmdseS4KICAgIG15ICRDb25maWdQZXJtaXNzaW9ucyA9ICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtOjpQZXJtaXNzaW9uJyk7CiAgICBteSAkUGVybWlzc2lvbkdyb3VwVHlwZSA9ICggZ3JlcCB7ICRfIGVxICdvd25lcicgfSBAeyRDb25maWdQZXJtaXNzaW9uc30gKSA/ICdvd25lcicgOiAncncnOwoKICAgICMgaWYgd2UgYXJlIHVwZGF0aW5nIGEgdGlja2V0IHNob3cgdGhlIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSBvd25lcnMKICAgIGlmICggJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte0FsbFVzZXJzfSApIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGVybWlzc2lvbkdyb3VwVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgdGhlIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZG9lcyBub3QgcHJvdmlkZSBhIFRpY2tldElEIGFuZCBpdCBjb3VsZCBiZSB0aGF0IGFsc28gdGhlcmUKICAgICAgICAjIGlzIG5vIFF1ZXVlSUQgaW5mb3JtYXRpb24uIEdldCB0aGUgZGVmYXVsdCBRdWV1ZUlEIGZvciB0aGlzIG1hdHRlcnMuCiAgICAgICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICAgICBteSAkUXVldWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlByb2Nlc3M6OkRlZmF1bHRRdWV1ZSIpOwogICAgICAgICAgICBteSAkUXVldWVJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRRdWV1ZSApOwogICAgICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtRdWV1ZUlEfSA9ICRRdWV1ZUlEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGp1c3Qgc2hvdyBvbmx5IHVzZXJzIHdpdGggc2VsZWN0ZWQgY3VzdG9tIHF1ZXVlCiAgICAgICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtPd25lckFsbH0gKSB7CiAgICAgICAgICAgIG15IEBVc2VySURzID0gJFRpY2tldE9iamVjdC0+R2V0U3Vic2NyaWJlZFVzZXJJRHNCeVF1ZXVlSUQoJVBhcmFtKTsKICAgICAgICAgICAgZm9yIG15ICRLZXlHcm91cE1lbWJlciAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICAgICAgZm9yIG15ICRVSUQgKEBVc2VySURzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRLZXlHcm91cE1lbWJlciApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJEFsbEdyb3Vwc01lbWJlcnN7JEtleUdyb3VwTWVtYmVyfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFsbCBzeXN0ZW0gdXNlcnMKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhbGwgc3Vic2NyaWJlZCB1c2VycyB3aG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgcGVybWlzc2lvbiBpbiB0aGUgcXVldWUgZ3JvdXAKICAgICAgICBlbHNpZiAoICRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgbXkgJEdJRCA9ICRRdWV1ZU9iamVjdC0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkdyb3VwR2V0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGVybWlzc2lvbkdyb3VwVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRLZXlNZW1iZXIgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9ICkgewogICAgICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdPd25lcicsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIG15ICVTZXJ2aWNlOwoKICAgICMgY2hlY2sgbmVlZGVkCiAgICByZXR1cm4gXCVTZXJ2aWNlIGlmICEkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgIyBnZXQgb3B0aW9ucyBmb3IgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgdW5rbm93biBjdXN0b21lcnMKICAgIG15ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lcgogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgY2hlY2sgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2VsZWN0ZWQKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMCBsZWF2ZSBDdXN0b21lclVzZXJJRCBlbXB0eSwgaXQgd2lsbCBub3QgZ2V0IGFueSBzZXJ2aWNlcwogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAxIHNldCBDdXN0b21lclVzZXJJRCB0byBnZXQgZGVmYXVsdCBzZXJ2aWNlcwogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldExvY2tzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUxvY2tzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvY2snKS0+TG9ja0xpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIFwlTG9ja3M7Cn0KCnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVQcmlvcml0aWVzOwoKICAgICMgSW5pdGlhbGx5IHdlIGhhdmUganVzdCB0aGUgZGVmYXVsdCBRdWV1ZSBQYXJhbWV0ZXIKICAgICMgc28gbWFrZSBzdXJlIHRvIGdldCB0aGUgSUQgaW4gdGhhdCBjYXNlCiAgICBteSAkUXVldWVJRDsKICAgIGlmICggISRQYXJhbXtRdWV1ZUlEfSAmJiAkUGFyYW17UXVldWV9ICkgewogICAgICAgICRRdWV1ZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUGFyYW17UXVldWV9ICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUXVldWVJRCB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVQcmlvcml0aWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0UXVldWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB3aGljaCB0eXBlIG9mIHBlcm1pc3Npb24gaXMgbmVlZGVkOiBpZiB0aGUgcHJvY2VzcyB0aWNrZXQKICAgICMgYWxyZWFkeSBleGlzdHMgKD0gVGlja2V0SUQgaXMgcHJlc2VudCksIHdlIG5lZWQgdGhlICdtb3ZlX2ludG8nCiAgICAjIHBlcm1pc3Npb24gb3RoZXJ3aXNlIHRoZSAnY3JlYXRlJyBwZXJtaXNzaW9uCiAgICBteSAkUGVybWlzc2lvblR5cGUgPSAnY3JlYXRlJzsKICAgIGlmICggJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAkUGVybWlzc2lvblR5cGUgPSAnbW92ZV9pbnRvJzsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdRdWV1ZXM7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSApIHsKICAgICAgICAlTmV3UXVldWVzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpIH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBTZWxlY3Rpb25UeXBlIFF1ZXVlIG9yIFN5c3RlbUFkZHJlc3M/CiAgICAgICAgbXkgJVF1ZXVlczsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgJVF1ZXVlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+TW92ZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRQZXJtaXNzaW9uVHlwZSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlUXVldWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc1F1ZXVlTGlzdCgpOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGVybWlzc2lvbiBxdWV1ZXMKICAgICAgICBteSAlVXNlckdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRQZXJtaXNzaW9uVHlwZSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgICAgICBRVUVVRUlEOgogICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQga2V5cyAlUXVldWVzICkgewogICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgUVVFVUVJRCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uU3RyaW5nJykKICAgICAgICAgICAgICAgIHx8ICc8UmVhbG5hbWU+IDw8RW1haWw+PiAtIFF1ZXVlOiA8UXVldWU+JzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZT4vJFF1ZXVlRGF0YXtOYW1lfS9nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlQ29tbWVudD4vJFF1ZXVlRGF0YXtDb21tZW50fS9nOwoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgICRTdHJpbmcgPX4gc3tccytcen17fSBpZiAhJFF1ZXVlRGF0YXtDb21tZW50fTsKCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBuZSAnUXVldWUnICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJVN5c3RlbUFkZHJlc3NEYXRhID0gJFNlbGYtPntTeXN0ZW1BZGRyZXNzfS0+U3lzdGVtQWRkcmVzc0dldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkUXVldWVzeyRRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHMvPFJlYWxuYW1lPi8kU3lzdGVtQWRkcmVzc0RhdGF7UmVhbG5hbWV9L2c7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHMvPEVtYWlsPi8kU3lzdGVtQWRkcmVzc0RhdGF7TmFtZX0vZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTmV3UXVldWVzeyRRdWV1ZUlEfSA9ICRTdHJpbmc7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJU5ld1F1ZXVlczsKfQoKc3ViIF9HZXRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlU3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgJVBhcmFtLAoKICAgICAgICAjIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgbmV3IHByb2Nlc3MgdGlja2V0CiAgICAgICAgUXVldWVJRCAgPT4gJFBhcmFte1F1ZXVlSUR9ICB8fCAxLAogICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0gfHwgJycsCgogICAgICAgICMgcmVtb3ZlIHR5cGUsIHNpbmNlIGlmIFRpY2tldDo6VHlwZSBpcyBhY3RpdmUgaW4gc3lzY29uZmlnLCB0aGUgVHlwZSBwYXJhbWV0ZXIgd2lsbAogICAgICAgICMgYmUgc2VudCBhbmQgdGhlIFRpY2tldFN0YXRlTGlzdCB3aWxsIHNlbmQgdGhlIHBhcmFtZXRlciBhcyBTdGF0ZSBUeXBlCiAgICAgICAgVHlwZSA9PiB1bmRlZiwKCiAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gXCVTdGF0ZXM7Cn0KCnN1YiBfR2V0VHlwZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0eXBlCiAgICBteSAlVHlwZTsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVR5cGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0QUpBWFVwZGF0YWJsZUZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEZWZhdWx0VXBkYXRhYmxlRmllbGRzID0gKAogICAgICAgIFByaW9yaXR5SUQgICAgPT4gMSwKICAgICAgICBRdWV1ZUlEICAgICAgID0+IDEsCiAgICAgICAgUmVzcG9uc2libGVJRCA9PiAxLAogICAgICAgIFNlcnZpY2VJRCAgICAgPT4gMSwKICAgICAgICBTTEFJRCAgICAgICAgID0+IDEsCiAgICAgICAgU3RhdGVJRCAgICAgICA9PiAxLAogICAgICAgIE93bmVySUQgICAgICAgPT4gMSwKICAgICAgICBMb2NrSUQgICAgICAgID0+IDEsCiAgICAgICAgVHlwZUlEICAgICAgICA9PiAxLAogICAgKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgKTsKCiAgICAjIGNyZWF0ZSBhIER5bmFtaWNGaWVsZExvb2t1cFRhYmxlCiAgICBteSAlRHluYW1pY0ZpZWxkTG9va3VwID0gbWFwIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8tPntOYW1lfSA9PiAkXyB9IEB7JER5bmFtaWNGaWVsZH07CgogICAgbXkgQFVwZGF0YWJsZUZpZWxkczsKICAgIEZJRUxEOgogICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAleyAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZHN9IH0gKSB7CgogICAgICAgIG15ICRGaWVsZERhdGEgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZHN9LT57JEZpZWxkfTsKCiAgICAgICAgIyBza2lwIGhpZGRlbiBmaWVsZHMKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRmllbGREYXRhLT57RGlzcGxheX07CgogICAgICAgICMgZm9yIER5bmFtaWMgRmllbGRzIGNoZWNrIGlmIGlzIEFKQVhVcGRhdGFibGUKICAgICAgICBpZiAoICRGaWVsZCA9fiBte15EeW5hbWljRmllbGRfKC4qKX14bXMgKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkTG9va3VweyRGaWVsZH07CgogICAgICAgICAgICAjIHNraXAgYW55IGZpZWxkIHdpdGggd3JvbmcgY29uZmlnCiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgIyBza2lwIGZpZWxkIGlmIGlzIG5vdCBJc0FDTFJlZHVjaWJsZSAodXBkYXRhYmxlKQogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgcHVzaCBAVXBkYXRhYmxlRmllbGRzLCAkRmllbGQ7CiAgICAgICAgfQoKICAgICAgICAjIGZvciBhbGwgb3RoZXJzIHVzZSAlRGVmYXVsdFVwZGF0YWJsZUZpZWxkcyB0YWJsZQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBzdGFuZGFyaXplIHRoZSBmaWVsZCBuYW1lIChlLmcuIHVzZSBTdGF0ZUlEIGZvciBTdGF0ZSBmaWVsZCkKICAgICAgICAgICAgbXkgJEZpZWxkTmFtZSA9ICRTZWxmLT57TmFtZVRvSUR9LT57JEZpZWxkfTsKCiAgICAgICAgICAgICMgc2tpcCBpZiBmaWVsZCBuYW1lIGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgKHRoaXMgbWVhbnMgdGhhdCBmaWVsZCBpcyB1bmtub3duKQogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICEkRmllbGROYW1lOwoKICAgICAgICAgICAgIyBza2lwIGlmIHRoZSBmaWVsZCBpcyBub3QgdXBkYXRhYmxlIHZpYSBhamF4CiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISREZWZhdWx0VXBkYXRhYmxlRmllbGRzeyRGaWVsZE5hbWV9OwoKICAgICAgICAgICAgcHVzaCBAVXBkYXRhYmxlRmllbGRzLCAkRmllbGROYW1lOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXEBVcGRhdGFibGVGaWVsZHM7Cn0KCnN1YiBfR2V0RmllbGRzVG9VcGRhdGVTdHJnIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEZpZWxkc1RvVXBkYXRlID0gJyc7CiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9ICkgKSB7CiAgICAgICAgbXkgJEZpcnN0SXRlbSA9IDE7CiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfSB9ICkgewogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICRGaWVsZCBlcSAkUGFyYW17VHJpZ2dlckZpZWxkfTsKICAgICAgICAgICAgaWYgKCRGaXJzdEl0ZW0pIHsKICAgICAgICAgICAgICAgICRGaXJzdEl0ZW0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEZpZWxkc1RvVXBkYXRlIC49ICcsICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEZpZWxkc1RvVXBkYXRlIC49ICInIiAuICRGaWVsZCAuICInIjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJEZpZWxkc1RvVXBkYXRlOwp9CgpzdWIgX1Nob3dEaWFsb2dFcnJvciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkVycm9yKCVQYXJhbSk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSAwYTA0ZTcyMmZiY2JkMzljY2EzZmIwODljMjk0ZTcyYjMxNzBlNmIxIC0gS2VybmVsL01vZHVsZXMvQ3VzdG9tZXJUaWNrZXRQcm9jZXNzLnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6Q3VzdG9tZXJUaWNrZXRQcm9jZXNzOwojIyBub2ZpbHRlcihUaWR5QWxsOjpQbHVnaW46Ok9UUlM6OlBlcmw6OkRCT2JqZWN0KQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzICRTZWxmLCAkVHlwZTsKCiAgICAjIGdsb2JhbCBjb25maWcgaGFzaCBmb3IgaWQgZGlzc29sdXRpb24KICAgICRTZWxmLT57TmFtZVRvSUR9ID0gewogICAgICAgIFRpdGxlICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgU3RhdGUgICAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIFN0YXRlSUQgICAgICAgID0+ICdTdGF0ZUlEJywKICAgICAgICBMb2NrICAgICAgICAgICA9PiAnTG9ja0lEJywKICAgICAgICBMb2NrSUQgICAgICAgICA9PiAnTG9ja0lEJywKICAgICAgICBQcmlvcml0eSAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgUHJpb3JpdHlJRCAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFF1ZXVlICAgICAgICAgID0+ICdRdWV1ZUlEJywKICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgQ3VzdG9tZXIgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgIEN1c3RvbWVySUQgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICBDdXN0b21lck5vICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJ0N1c3RvbWVyVXNlcklEJywKICAgICAgICBUeXBlICAgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICBUeXBlSUQgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICBTTEEgICAgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgIFNMQUlEICAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgU2VydmljZSAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgU2VydmljZUlEICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgQXJ0aWNsZSAgICAgICAgPT4gJ0FydGljbGUnLAogICAgfTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQoKICAgICMgQ2hlY2sgaWYgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQgaXMgdXNlZC4KICAgIG15ICRPdXRwdXRGaWx0ZXJDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpPdXRwdXQ6OkZpbHRlckVsZW1lbnRQb3N0Jyk7CiAgICBpZiAoICRPdXRwdXRGaWx0ZXJDb25maWctPntJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudH0gKSB7CiAgICAgICAgJFNlbGYtPntJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudH0gPSAxOwogICAgfQojIC0tLQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIG15ICRUaWNrZXRJRCAgICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApOwogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCcgKTsKICAgIG15ICRBY3Rpdml0eURpYWxvZ0hhc2hSZWY7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRBY3Rpdml0eURpYWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2cnKTsKCiAgICAjIHNvbWUgZmllbGRzIHNob3VsZCBiZSBza2lwcGVkIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICBteSAkU2tpcEZpZWxkcyA9IFsgJ093bmVyJywgJ1Jlc3BvbnNpYmxlJywgJ0xvY2snLCAnUGVuZGluZ1RpbWUnLCAnQ3VzdG9tZXJJRCcgXTsKCiAgICBpZiAoJFRpY2tldElEKSB7CgogICAgICAgICMgaW5jbHVkZSBleHRyYSBmaWVsZHMgc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICBmb3IgbXkgJEl0ZW0gKHF3KFNlcnZpY2UgU0xBIFF1ZXVlKSkgewogICAgICAgICAgICBwdXNoIEB7JFNraXBGaWVsZHN9LCAkSXRlbTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgdGhlcmUgaXMgYSBjb25maWd1cmVkIHJlcXVpcmVkIHBlcm1pc3Npb24KICAgICAgICAjIGZvciB0aGUgQWN0aXZpdHlEaWFsb2cgKGlmIHRoZXJlIGlzIG9uZSkKICAgICAgICBteSAkQWN0aXZpdHlEaWFsb2dQZXJtaXNzaW9uID0gJ3J3JzsKICAgICAgICBpZiAoJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQpIHsKICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nSGFzaFJlZiA9ICRBY3Rpdml0eURpYWxvZ09iamVjdC0+QWN0aXZpdHlEaWFsb2dHZXQoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJbnRlcmZhY2UnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEFjdGl2aXR5RGlhbG9nSGFzaFJlZikgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdDb3VsZG5cJ3QgZ2V0IEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgIiVzIiEnLCAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nSGFzaFJlZi0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nUGVybWlzc2lvbiA9ICRBY3Rpdml0eURpYWxvZ0hhc2hSZWYtPntQZXJtaXNzaW9ufTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgICAgIG15ICRBY2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICRBY3Rpdml0eURpYWxvZ1Blcm1pc3Npb24sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICApOwoKICAgICAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgICAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnWW91IG5lZWQgJXMgcGVybWlzc2lvbnMhJywgJEFjdGl2aXR5RGlhbG9nUGVybWlzc2lvbiApLAogICAgICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgICAgICBteSAlUG9zc2libGVBY3Rpb25zID0gKCAxID0+ICRTZWxmLT57QWN0aW9ufSApOwoKICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJVBvc3NpYmxlQWN0aW9ucywKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ0FjdGlvbicsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICctJywKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgbXkgJUFjbEFjdGlvbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKCiAgICAgICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICAgICAgaWYgKCAkQUNMIHx8IElzSGFzaFJlZldpdGhEYXRhKCBcJUFjbEFjdGlvbiApICkgewoKICAgICAgICAgICAgbXkgJUFjbEFjdGlvbkxvb2t1cCA9IHJldmVyc2UgJUFjbEFjdGlvbjsKCiAgICAgICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgICAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eURpYWxvZ0hhc2hSZWYpICkgewoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlQWN0aXZpdHlEaWFsb2dzID0geyAxID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEIH07CgogICAgICAgICAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgICAgID0+ICRQb3NzaWJsZUFjdGl2aXR5RGlhbG9ncywKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgICAgICAgICAgPT4gJ0FjdGl2aXR5RGlhbG9nJywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgICAgICAgICAgPT4gJy0nLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAleyRQb3NzaWJsZUFjdGl2aXR5RGlhbG9nc30gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgQUNMIHJlc2N0aWN0aW9ucyBleGlzdAogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVBY3Rpdml0eURpYWxvZ3MpICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBsaXN0IG9ubHkgQWN0aXZlIHByb2Nlc3NlcyBieSBkZWZhdWx0CiAgICBteSBAUHJvY2Vzc1N0YXRlcyA9ICgnQWN0aXZlJyk7CgogICAgIyBzZXQgSXNNYWluV2luZG93IGFuZCBJc0FqYXhSZXF1ZXN0IGZvciBwcm9wZXIgZXJyb3IgcmVzcG9uc2VzLCBzY3JlZW4gZGlzcGxheSBhbmQgcHJvY2VzcyBsaXN0CiAgICAkU2VsZi0+e0lzTWFpbldpbmRvd30gID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lzTWFpbldpbmRvdycgKSAgfHwgJyc7CiAgICAkU2VsZi0+e0lzQWpheFJlcXVlc3R9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lzQWpheFJlcXVlc3QnICkgfHwgJyc7CgogICAgIyBmZXRjaCBhbHNvIEZhZGVBd2F5IHByb2Nlc3NlcyB0byBjb250aW51ZSB3b3JraW5nIHdpdGggZXhpc3RpbmcgdGlja2V0cywgYnV0IG5vdCB0byBzdGFydCBuZXcKICAgICMgICAgb25lcwogICAgaWYgKCAhJFNlbGYtPntJc01haW5XaW5kb3d9ICYmICRTZWxmLT57U3ViYWN0aW9ufSApIHsKICAgICAgICBwdXNoIEBQcm9jZXNzU3RhdGVzLCAnRmFkZUF3YXknOwogICAgfQoKICAgICMgZ2V0IHByb2Nlc3Mgb2JqZWN0CiAgICBteSAkUHJvY2Vzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycpOwoKICAgICMgZ2V0IHRoZSBsaXN0IG9mIHByb2Nlc3NlcyB0aGF0IGN1c3RvbWVyIGNhbiBzdGFydAogICAgbXkgJFByb2Nlc3NMaXN0ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NMaXN0KAogICAgICAgIFByb2Nlc3NTdGF0ZSA9PiBcQFByb2Nlc3NTdGF0ZXMsCiAgICAgICAgSW50ZXJmYWNlICAgID0+IFsnQ3VzdG9tZXJJbnRlcmZhY2UnXSwKICAgICk7CgogICAgIyBhbHNvIGdldCB0aGUgbGlzdCBvZiBwcm9jZXNzZXMgaW5pdGlhdGVkIGJ5IGFnZW50cywgYXMgYW4gYWN0aXZpdHkgZGlhbG9nIG1pZ2h0IGJlIGNvbmZpZ3VyZWQKICAgICMgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UKICAgIG15ICRGb2xsb3d1cFByb2Nlc3NMaXN0ID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NMaXN0KAogICAgICAgIFByb2Nlc3NTdGF0ZSA9PiBcQFByb2Nlc3NTdGF0ZXMsCiAgICAgICAgSW50ZXJmYWNlICAgID0+IFsgJ0FnZW50SW50ZXJmYWNlJywgJ0N1c3RvbWVySW50ZXJmYWNlJyBdLAogICAgKTsKCiAgICBteSAkUHJvY2Vzc0VudGl0eUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Byb2Nlc3NFbnRpdHlJRCcgKTsKCiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkUHJvY2Vzc0xpc3QpICYmICFJc0hhc2hSZWZXaXRoRGF0YSgkRm9sbG93dXBQcm9jZXNzTGlzdCkgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBQcm9jZXNzIGNvbmZpZ3VyZWQhJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgcHJlcGFyZSBwcm9jZXNzIGxpc3QgZm9yIEFDTHMsIHVzZSBvbmx5IGVudGl0aWVzIGluc3RlYWQgb2YgbmFtZXMsIGNvbnZlcnQgZnJvbQogICAgIyAgIFAxID0+IE5hbWUgdG8gUDEgPT4gUDEuIEFzIEFDTHMgc2hvdWxkIHdvcmsgb25seSBhZ2FpbnN0IGVudGl0aWVzCiAgICBteSAlUHJvY2Vzc0xpc3RBQ0wgPSBtYXAgeyAkXyA9PiAkXyB9IHNvcnQga2V5cyAleyRQcm9jZXNzTGlzdH07CgogICAgIyB2YWxpZGF0ZSB0aGUgUHJvY2Vzc0xpc3Qgd2l0aCBzdG9yZWQgQUNMcwogICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnUHJvY2VzcycsCiAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJy0nLAogICAgICAgIERhdGEgICAgICAgICAgID0+IFwlUHJvY2Vzc0xpc3RBQ0wsCiAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUHJvY2Vzc0xpc3QpICYmICRBQ0wgKSB7CgogICAgICAgICMgZ2V0IEFDTCByZXN1bHRzCiAgICAgICAgbXkgJUFDTERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICMgcmVjb3ZlciBwcm9jZXNzIG5hbWVzCiAgICAgICAgbXkgJVJlZHVjZWRQcm9jZXNzTGlzdCA9IG1hcCB7ICRfID0+ICRQcm9jZXNzTGlzdC0+eyRffSB9IHNvcnQga2V5cyAlQUNMRGF0YTsKCiAgICAgICAgIyByZXBsYWNlIG9yaWdpbmFsIHByb2Nlc3MgbGlzdCB3aXRoIHRoZSByZWR1Y2VkIG9uZQogICAgICAgICRQcm9jZXNzTGlzdCA9IFwlUmVkdWNlZFByb2Nlc3NMaXN0OwogICAgfQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyktPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICMgaWYgd2UgaGF2ZSBubyBzdWJhY3Rpb24gZGlzcGxheSB0aGUgcHJvY2VzcyBsaXN0IHRvIHN0YXJ0IGEgbmV3IG9uZQogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259ICkgewoKICAgICAgICAjIHRvIGRpc3BsYXkgdGhlIHByb2Nlc3MgbGlzdCBpcyBtYW5kYXRvcnkgdG8gaGF2ZSBwcm9jZXNzZXMgdGhhdCBjdXN0b21lciBjYW4gc3RhcnQKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkUHJvY2Vzc0xpc3QpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBQcm9jZXNzIGNvbmZpZ3VyZWQhJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwcm9jZXNzIGlkIChpZiBhbnksIGEgcHJvY2VzcyBzaG91bGQgYmUgcHJlLXNlbGVjdGVkKQogICAgICAgICRQYXJhbXtQcm9jZXNzSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApOwogICAgICAgIGlmICggJFBhcmFte1Byb2Nlc3NJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtQcmVTZWxlY3RQcm9jZXNzfSA9IDE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPl9EaXNwbGF5UHJvY2Vzc0xpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJvY2Vzc0xpc3QgICAgID0+ICRQcm9jZXNzTGlzdCwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQgfHwgJFBhcmFte1Byb2Nlc3NJRH0KICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgaWYgdGhlIHNlbGVjdGVkIHByb2Nlc3MgZnJvbSB0aGUgbGlzdCBpcyB2YWxpZCwgcHJldmVudCB0YW1wZXIgd2l0aCBwcm9jZXNzIHNlbGVjdGlvbgogICAgIyAgICBsaXN0IChub3QgZXhpc3RpbmcsIGludmFsaWQgYW4gZmFkZSBhd2F5IHByb2Nlc3NlcyBtdXN0IG5vdCBiZSBhYmxlIHRvIHN0YXJ0IGEgbmV3IHByb2Nlc3MKICAgICMgICAgdGlja2V0KQogICAgZWxzaWYgKAogICAgICAgICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGlzcGxheUFjdGl2aXR5RGlhbG9nQUpBWCcKICAgICAgICAmJiAhJFByb2Nlc3NMaXN0LT57JFByb2Nlc3NFbnRpdHlJRH0KICAgICAgICAmJiAkU2VsZi0+e0lzTWFpbldpbmRvd30KICAgICAgICApCiAgICB7CgogICAgICAgICMgdHJhbnNsYXRlIHRoZSBlcnJvciBtZXNzYWdlIChhcyBpdCB3aWxsIGJlIGluamVjdGVkIGluIHRoZSBIVE1MKQogICAgICAgIG15ICRFcnJvck1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlRoZSBzZWxlY3RlZCBwcm9jZXNzIGlzIGludmFsaWQhIik7CgogICAgICAgICMgcmV0dXJuIGEgcHJlZGVmaW5lZCBIVE1MIHNjdHJ1Y3R1cmUgYXMgdGhlIEFKQVggY2FsbCBpcyBleHBlY3RpbmcgYW5kIEhUTUwgcmVzcG9uc2UKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbDsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAnPGRpdiBjbGFzcz0iU2VydmVyRXJyb3IiIGRhdGEtbWVzc2FnZT0iJyAuICRFcnJvck1lc3NhZ2UgLiAnIj48L2Rpdj4nLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgaW52YWxpZCBwcm9jZXNzIGlzIGRldGVjdGVkIG9uIGEgQWN0aXZpdHlEaWxvZyBwb3B1cCBzY3JlZW4gc2hvdyBhbiBlcnJvciBtZXNzYWdlCiAgICBlbHNpZiAoCiAgICAgICAgJFNlbGYtPntTdWJhY3Rpb259IGVxICdEaXNwbGF5QWN0aXZpdHlEaWFsb2cnCiAgICAgICAgJiYgISRGb2xsb3d1cFByb2Nlc3NMaXN0LT57JFByb2Nlc3NFbnRpdHlJRH0KICAgICAgICAmJiAhJFNlbGYtPntJc01haW5XaW5kb3d9CiAgICAgICAgKQogICAgewogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdQcm9jZXNzICVzIGlzIGludmFsaWQhJywgJFByb2Nlc3NFbnRpdHlJRCApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMKICAgICMgY29sbGVjdHMgYSBtaXh0dXJlIG9mIHByZXNlbnQgdmFsdWVzIGJvdHRvbSB0byB0b3A6CiAgICAjIFN5c0NvbmZpZyBEZWZhdWx0VmFsdWVzLCBBY3Rpdml0eURpYWxvZyBEZWZhdWx0VmFsdWVzLCBUaWNrZXRWYWx1ZXMsIFN1Ym1pdHRlZFZhbHVlcwogICAgIyBpbmNsdWRpbmcgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCBhbmQgUHJvY2Vzc0VudGl0eUlECiAgICAjIGlzIHVzZWQgZm9yOgogICAgIyAtIFBhcmFtZXRlciBjaGVja2luZyBiZWZvcmUgc3RvcmluZwogICAgIyAtIHdpbGwgYmUgdXNlZCBmb3IgQUNMIGNoZWNraW5nIGxhdGVyIG9uCiAgICBteSAkR2V0UGFyYW0gPSAkU2VsZi0+X0dldFBhcmFtKAogICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmVBY3Rpdml0eURpYWxvZycgJiYgJFByb2Nlc3NFbnRpdHlJRCApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCBUeXBlID0+ICdDdXN0b21lcicgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT5fU3RvcmVBY3Rpdml0eURpYWxvZygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcm9jZXNzTmFtZSAgICAgPT4gJFByb2Nlc3NMaXN0LT57JFByb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRGlzcGxheUFjdGl2aXR5RGlhbG9nJyAmJiAkUHJvY2Vzc0VudGl0eUlEICkgewoKICAgICAgICByZXR1cm4gJFNlbGYtPl9PdXRwdXRBY3Rpdml0eURpYWxvZygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBQcm9jZXNzRW50aXR5SUQgPT4gJFByb2Nlc3NFbnRpdHlJRCwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgID0+ICRHZXRQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Rpc3BsYXlBY3Rpdml0eURpYWxvZ0FKQVgnICYmICRQcm9jZXNzRW50aXR5SUQgKSB7CgogICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ0hUTUwgPSAkU2VsZi0+X091dHB1dEFjdGl2aXR5RGlhbG9nKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgPT4gJEdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEFjdGl2aXR5RGlhbG9nSFRNTCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CgogICAgICAgIHJldHVybiAkU2VsZi0+X1JlbmRlckFqYXgoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICA9PiAkR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yU2NyZWVuKAogICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdTdWJhY3Rpb24gaXMgaW52YWxpZCEnKSwKICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICApOwp9CgpzdWIgX1JlbmRlckFqYXggewoKICAgICMgRmF0YWxFcnJvciBpcyBzYWZlIGJlY2F1c2UgYSBKU09OIHN0cnVjdHVyZSBpcyBleHBlY3RpbmcsIHRoZW4gaXQgd2lsbCByZXN1bHQgaW50byBhCiAgICAjIGNvbW11bmljYXRpb25zIGVycm9yCgogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhQcm9jZXNzRW50aXR5SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyQWpheCcgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBteSAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRQYXJhbXtHZXRQYXJhbX17QWN0aXZpdHlEaWFsb2dFbnRpdHlJRH07CiAgICBpZiAoICEkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCcsICdfUmVuZGVyQWpheCcgKSwKICAgICAgICApOwogICAgfQogICAgbXkgJEFjdGl2aXR5RGlhbG9nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpLT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgIEludGVyZmFjZSAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVySW50ZXJmYWNlJywKICAgICk7CgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEFjdGl2aXR5RGlhbG9nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdObyBBY3Rpdml0eURpYWxvZyBjb25maWd1cmVkIGZvciAlcyBpbiBfUmVuZGVyQWpheCEnLCAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCApLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICRUcmVlVmlldyA9IDE7CiAgICB9CgogICAgbXkgJUZpZWxkc1Byb2Nlc3NlZDsKICAgIG15IEBKU09OQ29sbGVjdG9yOwogICAgbXkgJFNlcnZpY2VzOwoKICAgICMgQWxsIHN1Ym1pdHRlZCBEeW5hbWljRmllbGRzCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIHZhbHVlcyBmb3JtIGh0dHAgcmVxdWVzdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICAjIGdldCBiYWNrZW5kIG9iamVjdAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICk7CgogICAgIyByZWR1Y2UgdGhlIGR5bmFtaWMgZmllbGRzIHRvIG9ubHkgdGhlIG9uZXMgdGhhdCBhcmUgZGVzaW5nZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgbXkgQEN1c3RvbWVyRHluYW1pY0ZpZWxkczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZTsKCiAgICAgICAgcHVzaCBAQ3VzdG9tZXJEeW5hbWljRmllbGRzLCAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgfQogICAgJER5bmFtaWNGaWVsZCA9IFxAQ3VzdG9tZXJEeW5hbWljRmllbGRzOwoKICAgICMgZ2V0IHBhcmFtIG9iamVjdAogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CiAgICB9CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRDaGVja1BhcmFtOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZDsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZENoZWNrUGFyYW17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGQgfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CiAgICB9CiAgICAkUGFyYW17R2V0UGFyYW19LT57RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQ2hlY2tQYXJhbTsKCiAgICAjIHNvbWUgZmllbGRzIHNob3VsZCBiZSBza2lwcGVkIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICBteSAkU2tpcEZpZWxkcyA9IFsgJ093bmVyJywgJ1Jlc3BvbnNpYmxlJywgJ0xvY2snLCAnUGVuZGluZ1RpbWUnLCAnQ3VzdG9tZXJJRCcgXTsKCiAgICAjIEdldCB0aGUgYWN0aXZpdHkgZGlhbG9nJ3MgU3VibWl0IFBhcmFtJ3Mgb3IgQ29uZmlnIFBhcmFtcwogICAgRElBTE9HRklFTEQ6CiAgICBmb3IgbXkgJEN1cnJlbnRGaWVsZCAoIEB7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkT3JkZXJ9IH0gKSB7CgogICAgICAgICMgc29tZSBmaWVsZHMgc2hvdWxkIGJlIHNraXBwZWQgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICggZ3JlcCB7ICRfIGVxICRDdXJyZW50RmllbGQgfSBAeyRTa2lwRmllbGRzfSApOwoKICAgICAgICAjIFNraXAgaWYgd2UncmUgd29ya2luZyBvbiBhIGZpZWxkIHRoYXQgd2FzIGFscmVhZHkgZG9uZSB3aXRoIG9yIHdpdGhvdXQgSUQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9CiAgICAgICAgICAgICYmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCA9fiBte15EeW5hbWljRmllbGRfKC4qKX14bXMgKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJDE7CgogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gKCBncmVwIHsgJF8tPntOYW1lfSBlcSAkRHluYW1pY0ZpZWxkTmFtZSB9IEB7JER5bmFtaWNGaWVsZH0gKVswXTsKCiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICAgICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9IGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICApIHx8ICRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIEpTT05Db2xsZWN0b3IKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1F1ZXVlSUQnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0UXVldWVzKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgUXVldWUgdG8gdGhlIEpTT05Db2xsZWN0b3IKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtHZXRQYXJhbX17ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdTdGF0ZUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFN0YXRlcygKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIFN0YXRlIHRvIHRoZSBKU09OQ29sbGVjdG9yCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBASlNPTkNvbGxlY3RvciwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte0dldFBhcmFtfXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdQcmlvcml0eUlEJyApIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgIyBjaGVjayBpZiBwcmlvcml0eSBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudH0KICAgICAgICAgICAgICAgICYmICggJFBhcmFte0dldFBhcmFtfS0+e0VsZW1lbnRDaGFuZ2VkfSBlcSAnU2VydmljZUlEJwogICAgICAgICAgICAgICAgfHwgJFBhcmFte0dldFBhcmFtfS0+e0VsZW1lbnRDaGFuZ2VkfSBlcSAnRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAmJiAkUGFyYW17R2V0UGFyYW19LT57U2VydmljZUlEfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0dldFBhcmFtfS0+e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0dldFBhcmFtfS0+e0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9CiAgICAgICAgICAgICkgewoKICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIHByaW9yaXR5IGZyb20gdGhlIENJUCBtYXRyaXgKICAgICAgICAgICAgICAgIG15ICRQcmlvcml0eUlERnJvbUltcGFjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUnKS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICRQYXJhbXtHZXRQYXJhbX0tPntEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fSwKICAgICAgICAgICAgICAgICAgICBJbXBhY3QgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LT57RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBQcmlvcml0eSB0byB0aGUgSlNPTkNvbGxlY3RvcgogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBASlNPTkNvbGxlY3RvciwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFByaW9yaXR5SURGcm9tSW1wYWN0LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRmllbGRzUHJvY2Vzc2VkeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwoKICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgIH0KIyAtLS0KCiAgICAgICAgICAgICMgYWRkIFByaW9yaXR5IHRvIHRoZSBKU09OQ29sbGVjdG9yCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBASlNPTkNvbGxlY3RvciwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkUGFyYW17R2V0UGFyYW19eyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1NlcnZpY2VJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICREYXRhID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlcnZpY2VzID0gJERhdGE7CgogICAgICAgICAgICAjIGFkZCBTZXJ2aWNlIHRvIHRoZSBKU09OQ29sbGVjdG9yIChVc2UgU2VydmljZUlEIGZyb20gd2ViIHJlcXVlc3QpCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBASlNPTkNvbGxlY3RvciwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICREYXRhLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRGaWVsZHNQcm9jZXNzZWR7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdTTEFJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgICMgaWYgU0xBIGlzIHJlbmRlciBiZWZvcmUgc2VydmljZSAoYnkgaXQgb3JkZXIgaW4gdGhlIGZpZWxkcykgaXQgbmVlZHMgdG8gY3JlYXRlCiAgICAgICAgICAgICMgdGhlIHNlcnZpY2UgbGlzdAogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkU2VydmljZXMpICkgewogICAgICAgICAgICAgICAgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIFNMQSB0byB0aGUgSlNPTkNvbGxlY3RvciAoVXNlIFNlbGVjdGVkSUQgZnJvbSB3ZWIgcmVxdWVzdCkKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBKU09OQ29sbGVjdG9yLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTTEFJRCcgKSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gZXEgJ1R5cGVJRCcgKSB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICREYXRhID0gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQWRkIFR5cGUgdG8gdGhlIEpTT05Db2xsZWN0b3IgKFVzZSBTZWxlY3RlZElEIGZyb20gd2ViIHJlcXVlc3QpLgogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEpTT05Db2xsZWN0b3IsCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRGF0YSwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1R5cGVJRCcgKSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEZpZWxkc1Byb2Nlc3NlZHsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKCBbQEpTT05Db2xsZWN0b3JdICk7CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRMYXlvdXRPYmplY3QtPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKfQoKIyA9aXRlbSBfR2V0UGFyYW0oKQojCiMgcmV0dXJucyB0aGUgY3VycmVudCBkYXRhIHN0YXRlIG9mIHRoZSBzdWJtaXR0ZWQgaW5mb3JtYXRpb24KIwojIFRoaXMgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkYXRhIGZvciB0aGUgZGlmZmVyZW50IGNhbGxlcnM6CiMKIyAgICAgSW5pdGlhbCBjYWxsIHdpdGggc2VsZWN0ZWQgUHJvY2VzczoKIyAgICAgICAgIFByb2Nlc3NFbnRpdHlJRAojICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAojICAgICAgICAgRGVmYXVsdFZhbHVlcyBmb3IgdGhlIGNvbmZpZ3VyZWQgRmllbGRzIGluIHRoYXQgQWN0aXZpdHlEaWFsb2cKIyAgICAgICAgIERlZmF1bHRWYWx1ZXMgZm9yIHRoZSA0IHJlcXVpcmVkIEZpZWxkcyBRdWV1ZSBTdGF0ZSBMb2NrIFByaW9yaXR5CiMKIyAgICAgRmlyc3QgU3RvcmUgY2FsbCBzdWJtaXR0aW5nIGFuIEFjdGl2aXR5IERpYWxvZzoKIyAgICAgICAgIFByb2Nlc3NFbnRpdHlJRAojICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAojICAgICAgICAgU3VibWl0dGVkVmFsdWVzIGZvciB0aGUgY3VycmVudCBBY3Rpdml0eURpYWxvZwojICAgICAgICAgQWN0aXZpdHlEaWFsb2cgRGVmYXVsdFZhbHVlcyBmb3IgaW52aXNpYmxlIGZpZWxkcyBvZiB0aGF0IEFjdGl2aXR5RGlhbG9nCiMgICAgICAgICBEZWZhdWx0VmFsdWVzIGZvciB0aGUgNCByZXF1aXJlZCBGaWVsZHMgUXVldWUgU3RhdGUgTG9jayBQcmlvcml0eQojICAgICAgICAgICAgIGlmIG5vdCBjb25maWd1cmVkIGluIHRoZSBBY3Rpdml0eURpYWxvZwojCiMgICAgIEFjdGl2aXR5RGlhbG9nIGZpbGxvdXQgcmVxdWVzdCBvbiBleGlzdGluZyBUaWNrZXQ6CiMgICAgICAgICBQcm9jZXNzRW50aXR5SUQKIyAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKIyAgICAgICAgIFRpY2tldFZhbHVlcwojCiMgICAgIEFjdGl2aXR5RGlhbG9nIHN0b3JlIHJlcXVlc3Qgb3IgQWpheFVwZGF0ZSByZXF1ZXN0IG9uIGV4aXN0aW5nIFRpY2tldHM6CiMgICAgICAgICBQcm9jZXNzRW50aXR5SUQKIyAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKIyAgICAgICAgIFRpY2tldFZhbHVlcyBmb3IgYWxsIG5vdC1TdWJtaXR0ZWQgVmFsdWVzCiMgICAgICAgICBTdWJtaXR0ZWQgVmFsdWVzCiMKIyAgICAgbXkgJEdldFBhcmFtID0gX0dldFBhcmFtKAojICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQcm9jZXNzRW50aXR5SUQsCiMgICAgICk7CiMKIyA9Y3V0CgpzdWIgX0dldFBhcmFtIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgI215ICRJc0FKQVhVcGRhdGUgPSAkUGFyYW17QUpBWH0gfHwgJyc7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhQcm9jZXNzRW50aXR5SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfR2V0UGFyYW0nICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgbXkgJUdldFBhcmFtOwogICAgbXkgJVRpY2tldDsKICAgIG15ICRQcm9jZXNzRW50aXR5SUQgICAgICAgID0gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH07CiAgICBteSAkVGlja2V0SUQgICAgICAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXRJRCcgKTsKICAgIG15ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAnQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCcsCiAgICApOwogICAgbXkgJEFjdGl2aXR5RW50aXR5SUQ7CiAgICBteSAlVmFsdWVzR290dGVuOwogICAgbXkgJFZhbHVlOwoKICAgICMgSWYgd2UgZ290IG5vIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgYW5kIG5vIFRpY2tldElECiAgICAjIHdlIGhhdmUgdG8gZ2V0IHRoZSBQcm9jZXNzZXMnIFN0YXJ0cG9pbnQKICAgIGlmICggISRBY3Rpdml0eURpYWxvZ0VudGl0eUlEICYmICEkVGlja2V0SUQgKSB7CiAgICAgICAgbXkgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2cKICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3MnKS0+UHJvY2Vzc1N0YXJ0cG9pbnRHZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICAgICApOwogICAgICAgIGlmICgKICAgICAgICAgICAgISRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9CiAgICAgICAgICAgIHx8ICEkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkTWVzc2FnZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdHb3Qgbm8gU3RhcnQgQWN0aXZpdHlFbnRpdHlJRCBvciBTdGFydCBBY3Rpdml0eURpYWxvZ0VudGl0eUlEIGZvciBQcm9jZXNzOiAlcyBpbiBfR2V0UGFyYW0hJywKICAgICAgICAgICAgICAgICRQcm9jZXNzRW50aXR5SUQKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9OwogICAgICAgICRBY3Rpdml0eUVudGl0eUlEICAgICAgID0gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eX07CiAgICB9CgogICAgbXkgJEFjdGl2aXR5RGlhbG9nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpLT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgIEludGVyZmFjZSAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVySW50ZXJmYWNlJywKICAgICk7CgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEFjdGl2aXR5RGlhbG9nKSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0NvdWxkblwndCBnZXQgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCAiJXMiIScsICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEICksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgaWYgdGhlcmUgaXMgYSB0aWNrZXQgdGhlbiBpcyBub3QgYW4gQUpBWCByZXF1ZXN0CiAgICBpZiAoJFRpY2tldElEKSB7CiAgICAgICAgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CgogICAgICAgICVHZXRQYXJhbSA9ICVUaWNrZXQ7CiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlR2V0UGFyYW0gKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdDb3VsZG5cJ3QgZ2V0IFRpY2tldCBmb3IgVGlja2V0SUQ6ICVzIGluIF9HZXRQYXJhbSEnLCAkVGlja2V0SUQgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRBY3Rpdml0eUVudGl0eUlEID0gJFRpY2tldHsKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgiUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRBY3Rpdml0eUlEIikKICAgICAgICB9OwogICAgICAgIGlmICggISRBY3Rpdml0eUVudGl0eUlEICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRhYmxlKCdDb3VsZG5cJ3QgZGV0ZXJtaW5lIEFjdGl2aXR5RW50aXR5SUQuIER5bmFtaWNGaWVsZCBvciBDb25maWcgaXNuXCd0IHNldCBwcm9wZXJseSEnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQogICAgJEdldFBhcmFte0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9ID0gJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQ7CiAgICAkR2V0UGFyYW17QWN0aXZpdHlFbnRpdHlJRH0gICAgICAgPSAkQWN0aXZpdHlFbnRpdHlJRDsKICAgICRHZXRQYXJhbXtQcm9jZXNzRW50aXR5SUR9ICAgICAgICA9ICRQcm9jZXNzRW50aXR5SUQ7CgogICAgIyBzb21lIGZpZWxkcyBzaG91bGQgYmUgc2tpcHBlZCBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZQogICAgbXkgJFNraXBGaWVsZHMgPSBbICdPd25lcicsICdSZXNwb25zaWJsZScsICdMb2NrJywgJ1BlbmRpbmdUaW1lJywgJ0N1c3RvbWVySUQnIF07CgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICk7CgogICAgIyBnZXQgYmFja2VuZCBvYmplY3QKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgcmVkdWNlIHRoZSBkeW5hbWljIGZpZWxkcyB0byBvbmx5IHRoZSBvbmVzIHRoYXQgYXJlIGRlc2luZ2VkIGZvciBjdXN0b21lciBpbnRlcmZhY2UKICAgIG15IEBDdXN0b21lckR5bmFtaWNGaWVsZHM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUgPSAkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlJywKICAgICAgICApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGU7CgogICAgICAgIHB1c2ggQEN1c3RvbWVyRHluYW1pY0ZpZWxkcywgJER5bmFtaWNGaWVsZENvbmZpZzsKICAgIH0KICAgICREeW5hbWljRmllbGQgPSBcQEN1c3RvbWVyRHluYW1pY0ZpZWxkczsKCiAgICAjIEdldCB0aGUgYWN0aXZpdHlkaWFsb2dzJ3MgU3VibWl0IFBhcmFtJ3Mgb3IgQ29uZmlnIFBhcmFtcwogICAgRElBTE9HRklFTEQ6CiAgICBmb3IgbXkgJEN1cnJlbnRGaWVsZCAoIEB7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkT3JkZXJ9IH0gKSB7CgogICAgICAgICMgc29tZSBmaWVsZHMgc2hvdWxkIGJlIHNraXBwZWQgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICggZ3JlcCB7ICRfIGVxICRDdXJyZW50RmllbGQgfSBAeyRTa2lwRmllbGRzfSApOwoKICAgICAgICAjIFNraXAgaWYgd2UncmUgd29ya2luZyBvbiBhIGZpZWxkIHRoYXQgd2FzIGFscmVhZHkgZG9uZSB3aXRoIG9yIHdpdGhvdXQgSUQKICAgICAgICBpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9ICYmICRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCA9fiBte15EeW5hbWljRmllbGRfKC4qKX14bXMgKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJDE7CgogICAgICAgICAgICAjIEdldCB0aGUgQ29uZmlnIG9mIHRoZSBjdXJyZW50IER5bmFtaWNGaWVsZCAodGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGdyZXAgcmVzdWx0IGFycmF5KQogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gKCBncmVwIHsgJF8tPntOYW1lfSBlcSAkRHluYW1pY0ZpZWxkTmFtZSB9IEB7JER5bmFtaWNGaWVsZH0gKVswXTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewoKICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiRHluYW1pY0ZpZWxkQ29uZmlnIG1pc3NpbmcgZm9yIGZpZWxkOiAkUGFyYW17RmllbGROYW1lfSwgb3IgaXMgbm90IGEgVGlja2V0IER5bmFtaWMgRmllbGQhIjsKCiAgICAgICAgICAgICAgICAjIGxvZyBlcnJvciBidXQgZG9lcyBub3Qgc3RvcCB0aGUgZXhlY3V0aW9uIGFzIGl0IGNvdWxkIGJlIGFuIG9sZCBBcnRpY2xlCiAgICAgICAgICAgICAgICAjIER5bmFtaWNGaWVsZCwgc2VlIGJ1ZyMxMTY2NgogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBHZXQgRHluYW1pY0ZpZWxkIFZhbHVlcwogICAgICAgICAgICAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAjIHNldCB0aGUgY3JpdGljYWxpdHkgZnJvbSB0aGUgc2VydmljZQogICAgICAgICAgICBpZiAoICRTZWxmLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9ICYmICREeW5hbWljRmllbGROYW1lIGVxICdJVFNNQ3JpdGljYWxpdHknICYmICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZXJ2aWNlSUQnICkgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICAgICAgICAgbXkgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IHRoZSBjcml0aWNhbGl0eQogICAgICAgICAgICAgICAgJFZhbHVlID0gJFNlcnZpY2V7Q3JpdGljYWxpdHl9OwogICAgICAgICAgICB9CiMgLS0tCgogICAgICAgICAgICAjIElmIHdlIGdvdCBhIHN1Ym1pdHRlZCBwYXJhbSwgdGFrZSBpdCBhbmQgbmV4dCBvdXQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkVmFsdWUKICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAkVmFsdWUgZXEgJycKICAgICAgICAgICAgICAgICAgICB8fCBJc1N0cmluZ1dpdGhEYXRhKCRWYWx1ZSkKICAgICAgICAgICAgICAgICAgICB8fCBJc0FycmF5UmVmV2l0aERhdGEoJFZhbHVlKQogICAgICAgICAgICAgICAgICAgIHx8IElzSGFzaFJlZldpdGhEYXRhKCRWYWx1ZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFZhbHVlOwogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBJZiB3ZSBkaWRuJ3QgaGF2ZSBhIFBhcmFtIFZhbHVlIHRyeSB0aGUgdGlja2V0IFZhbHVlCiAgICAgICAgICAgICMgbmV4dCBvdXQgaWYgaXQgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkVGlja2V0eyRDdXJyZW50RmllbGR9CiAgICAgICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHskQ3VycmVudEZpZWxkfSBlcSAnJwogICAgICAgICAgICAgICAgICAgIHx8IElzU3RyaW5nV2l0aERhdGEoICRUaWNrZXR7JEN1cnJlbnRGaWVsZH0gKQogICAgICAgICAgICAgICAgICAgIHx8IElzQXJyYXlSZWZXaXRoRGF0YSggJFRpY2tldHskQ3VycmVudEZpZWxkfSApCiAgICAgICAgICAgICAgICAgICAgfHwgSXNIYXNoUmVmV2l0aERhdGEoICRUaWNrZXR7JEN1cnJlbnRGaWVsZH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPSAkVGlja2V0eyRDdXJyZW50RmllbGR9OwogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBJZiB3ZSBoYWQgbmVpZ2h0ZXIgc3VibWl0dGVkIG5vciB0aWNrZXQgcGFyYW0gZ2V0IHRoZSBBY3Rpdml0eURpYWxvZydzIGRlZmF1bHQgVmFsdWUKICAgICAgICAgICAgIyBuZXh0IG91dCBpZiBpdCB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICAkVmFsdWUgPSAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIGlmICgkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRWYWx1ZTsKICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgSWYgd2UgaGFkIG5vIHN1Ym1pdHRlZCwgdGlja2V0IG9yIEFjdGl2aXR5RGlhbG9nIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgIyB1c2UgdGhlIER5bmFtaWNGaWVsZCdzIGRlZmF1bHQgdmFsdWUgYW5kIG5leHQgb3V0CiAgICAgICAgICAgICRWYWx1ZSA9ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIGlmICgkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRWYWx1ZTsKICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgYWxsIHRoYXQgZmFpbGVkIHRoZW4gdGhlIGZpZWxkIHNob3VsZCBub3QgaGF2ZSBhIGRlZmluZWQgdmFsdWUgb3RoZXJ3aXNlCiAgICAgICAgICAgICMgaWYgYSB2YWx1ZSAoZXZlbiBlbXB0eSkgaXMgc2VudCwgZmllbGRzIGxpa2UgRGF0ZSBvciBEYXRlVGltZSB3aWxsIG1hcmsgdGhlIGZpZWxkIGFzCiAgICAgICAgICAgICMgdXNlZCB3aXRoIHRoZSBmaWVsZCBkaXNwbGF5IHZhbHVlLCB0aGlzIGNvdWxkIGxlYWQgdG8gdW53YW50ZWQgZmllbGQgc2V0cywKICAgICAgICAgICAgIyBzZWUgYnVnIzkxNTkKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFydGljbGUgZmllbGRzCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkIGVxICdBcnRpY2xlJyApIHsKCiAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJqZWN0JyApOwogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQm9keScgKTsKICAgICAgICAgICAgQHsgJEdldFBhcmFte0luZm9ybVVzZXJJRH0gfSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnSW5mb3JtVXNlcklEJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRWYWx1ZXNHb3R0ZW57QXJ0aWNsZX0gPSAxIGlmICggJEdldFBhcmFte1N1YmplY3R9ICYmICRHZXRQYXJhbXtCb2R5fSApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkIGVxICdDdXN0b21lcklEJyApIHsKICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInLAogICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJVc2VySUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIE5vbiBEeW5hbWljRmllbGRzCiAgICAgICAgIyAxLiB0cnkgdG8gZ2V0IHRoZSByZXF1aXJlZCBwYXJhbQogICAgICAgIG15ICRWYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9ICk7CgogICAgICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBhbiBJRCBmaWVsZCBtYWtlIHN1cmUgdGhlIHZhbHVlIHdpdGhvdXQgSUQgd29uJ3QgYmUgaW4gdGhlCiAgICAgICAgICAgICMgJUdldFBhcmFtIEhhc2ggYW55IG1vcmUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSA9fiBteyguKilJRCR9eG1zICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyQxfSA9IHVuZGVmOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRHZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSAgICAgPSAkVmFsdWU7CiAgICAgICAgICAgICRWYWx1ZXNHb3R0ZW57ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBnb3QgdGlja2V0IHBhcmFtcywgdGhlIEdldFBhcmFtIEhhc2ggd2FzIGFscmVhZHkgZmlsbGVkIGJlZm9yZSB0aGUgbG9vcAogICAgICAgICMgYW5kIHdlIGNhbiBuZXh0IG91dAogICAgICAgIGlmICggJEdldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ICkgewogICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICB9CgogICAgICAgICMgaWYgbm8gU3VibWl0dGVkIG5vcmUgVGlja2V0IFBhcmFtIGdldCBBY3Rpdml0eURpYWxvZyBDb25maWcncyBQYXJhbQogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBuZSAnQ3VzdG9tZXJJRCcgKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVmYXVsdFZhbHVlfTsKICAgICAgICB9CiAgICAgICAgaWYgKCRWYWx1ZSkgewogICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICAgICAgJEdldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFZhbHVlOwogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgIH0KICAgIH0KICAgIFJFUVVJUkVERklFTERMT09QOgogICAgZm9yIG15ICRDdXJyZW50RmllbGQgKHF3KFF1ZXVlIFN0YXRlIExvY2sgUHJpb3JpdHkpKSB7CiAgICAgICAgJFZhbHVlID0gdW5kZWY7CiAgICAgICAgaWYgKCAhJFZhbHVlc0dvdHRlbnsgJFNlbGYtPntOYW1lVG9JRH17JEN1cnJlbnRGaWVsZH0gfSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJENvbmZpZ09iamVjdC0+R2V0KCJQcm9jZXNzOjpEZWZhdWx0JEN1cnJlbnRGaWVsZCIpOwogICAgICAgICAgICBpZiAoICEkVmFsdWUgKSB7CgogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQcm9jZXNzOjpEZWZhdWx0JXMgQ29uZmlnIFZhbHVlIG1pc3NpbmchJywgJEN1cnJlbnRGaWVsZCApOwoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEdldFBhcmFteyRDdXJyZW50RmllbGR9ID0gJFZhbHVlOwogICAgICAgICAgICAkVmFsdWVzR290dGVueyAkU2VsZi0+e05hbWVUb0lEfXskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYWxzbyB0aGUgSURzIGZvciB0aGUgUmVxdWlyZWQgZmlsZXMgKGlmIHRoZXkgYXJlIG5vdCBwcmVzZW50KQogICAgaWYgKCAkR2V0UGFyYW17UXVldWV9ICYmICEkR2V0UGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkR2V0UGFyYW17UXVldWV9ICk7CiAgICB9CiAgICBpZiAoICRHZXRQYXJhbXtTdGF0ZX0gJiYgISRHZXRQYXJhbXtTdGF0ZUlEfSApIHsKICAgICAgICAkR2V0UGFyYW17U3RhdGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVMb29rdXAoIFN0YXRlID0+ICRHZXRQYXJhbXtTdGF0ZX0gKTsKICAgIH0KICAgIGlmICggJEdldFBhcmFte0xvY2t9ICYmICEkR2V0UGFyYW17TG9ja0lEfSApIHsKICAgICAgICAkR2V0UGFyYW17TG9ja0lEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2NrJyktPkxvY2tMb29rdXAoIExvY2sgPT4gJEdldFBhcmFte0xvY2t9ICk7CiAgICB9CiAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eX0gJiYgISRHZXRQYXJhbXtQcmlvcml0eUlEfSApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHknKS0+UHJpb3JpdHlMb29rdXAoCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICRHZXRQYXJhbXtQcmlvcml0eX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFuZCBmaW5hbGx5IHdlJ2xsIGhhdmUgdGhlIHNwZWNpYWwgcGFyYW1ldGVyczoKICAgICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUmVzcG9uc2libGVBbGwnICk7CiAgICAkR2V0UGFyYW17T3duZXJBbGx9ICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ093bmVyQWxsJyApOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJyApOwojIC0tLQoKICAgIHJldHVybiBcJUdldFBhcmFtOwp9CgpzdWIgX091dHB1dEFjdGl2aXR5RGlhbG9nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkVGlja2V0SUQgICAgICAgICAgICAgICA9ICRQYXJhbXtHZXRQYXJhbX17VGlja2V0SUR9OwogICAgbXkgJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPSAkUGFyYW17R2V0UGFyYW19e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9OwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBDaGVjayBuZWVkZWQgcGFyYW1ldGVyczoKICAgICMgUHJvY2Vzc0VudGl0eUlEIG9ubHkKICAgICMgVGlja2V0SUQgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAogICAgaWYgKCAhJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0gfHwgKCAhJFRpY2tldElEICYmICEkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCApICkgewogICAgICAgIG15ICRNZXNzYWdlID0gVHJhbnNsYXRhYmxlKCdHb3Qgbm8gUHJvY2Vzc0VudGl0eUlEIG9yIFRpY2tldElEIGFuZCBBY3Rpdml0eURpYWxvZ0VudGl0eUlEIScpOwoKICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2c7CiAgICBteSAlVGlja2V0OwogICAgbXkgJUVycm9yICAgICAgICA9ICgpOwogICAgbXkgJUVycm9yTWVzc2FnZSA9ICgpOwoKICAgICMgSWYgd2UgaGFkIEVycm9ycywgd2UgZ290IGFuIEVycm9yIGhhc2gKICAgICVFcnJvciAgICAgICAgPSAleyAkUGFyYW17RXJyb3J9IH0gICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSApOwogICAgJUVycm9yTWVzc2FnZSA9ICV7ICRQYXJhbXtFcnJvck1lc3NhZ2V9IH0gaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yTWVzc2FnZX0gKSApOwoKICAgICMgZ2V0IHByb2Nlc3Mgb2JqZWN0CiAgICBteSAkUHJvY2Vzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycpOwogICAgbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIGlmICggISRUaWNrZXRJRCApIHsKICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZyA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzU3RhcnRwb2ludEdldCgKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nKSApIHsKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnQ2FuXCd0IGdldCBTdGFydEFjdGl2aXR5RGlhbG9nIGFuZCBTdGFydEFjdGl2aXR5RGlhbG9nIGZvciB0aGUgUHJvY2Vzc0VudGl0eUlEICIlcyIhJywKICAgICAgICAgICAgICAgICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBubyBBSkFYIHVwZGF0ZSBpbiB0aGlzIHBhcnQKICAgICAgICAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlVGlja2V0ICkgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ2FuXCd0IGdldCBUaWNrZXQgIiVzIiEnLCAkUGFyYW17VGlja2V0SUR9ICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRHluYW1pY0ZpZWxkUHJvY2Vzc0lEID0gJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudFByb2Nlc3NJRCcpOwogICAgICAgIG15ICREeW5hbWljRmllbGRBY3Rpdml0eUlEID0gJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudEFjdGl2aXR5SUQnKTsKCiAgICAgICAgaWYgKCAhJFRpY2tldHskRHluYW1pY0ZpZWxkUHJvY2Vzc0lEfSB8fCAhJFRpY2tldHskRHluYW1pY0ZpZWxkQWN0aXZpdHlJRH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdDYW5cJ3QgZ2V0IFByb2Nlc3NFbnRpdHlJRCBvciBBY3Rpdml0eUVudGl0eUlEIGZvciBUaWNrZXQgIiVzIiEnLCAkUGFyYW17VGlja2V0SUR9ICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZyA9IHsKICAgICAgICAgICAgQWN0aXZpdHkgICAgICAgPT4gJFRpY2tldHskRHluYW1pY0ZpZWxkQWN0aXZpdHlJRH0sCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgIH07CiAgICB9CgogICAgbXkgJEFjdGl2aXR5ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eScpLT5BY3Rpdml0eUdldCgKICAgICAgICBJbnRlcmZhY2UgICAgICAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5fQogICAgKTsKICAgIGlmICggISRBY3Rpdml0eSApIHsKICAgICAgICBteSAkTWVzc2FnZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgJ0NhblwndCBnZXQgQWN0aXZpdHkgY29uZmlndXJhdGlvbiBmb3IgQWN0aXZpdHlFbnRpdHlJRCAiJXMiIScsCiAgICAgICAgICAgICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHl9CiAgICAgICAgKTsKCiAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRBY3Rpdml0eURpYWxvZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2cnKS0+QWN0aXZpdHlEaWFsb2dHZXQoCiAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfSwKICAgICAgICBJbnRlcmZhY2UgICAgICAgICAgICAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICApOwogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEFjdGl2aXR5RGlhbG9nKSApIHsKICAgICAgICBteSAkTWVzc2FnZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgJ0NhblwndCBnZXQgQWN0aXZpdHlEaWFsb2cgY29uZmlndXJhdGlvbiBmb3IgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCAiJXMiIScsCiAgICAgICAgICAgICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9CiAgICAgICAgKTsKCiAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICApOwogICAgfQoKICAgICMgZ3JlcCBvdXQgT3ZlcndyaXRlcyBpZiBkZWZpbmVkIG9uIHRoZSBBY3Rpdml0eQogICAgbXkgQE92ZXJ3cml0ZUFjdGl2aXR5RGlhbG9nTnVtYmVyID0gZ3JlcCB7CiAgICAgICAgcmVmICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfXskX30gZXEgJ0hBU0gnCiAgICAgICAgICAgICYmICRBY3Rpdml0eS0+e0FjdGl2aXR5RGlhbG9nfXskX317QWN0aXZpdHlEaWFsb2dFbnRpdHlJRH0KICAgICAgICAgICAgJiYgJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9eyRffXtBY3Rpdml0eURpYWxvZ0VudGl0eUlEfSBlcQogICAgICAgICAgICAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfQogICAgICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEFjdGl2aXR5LT57QWN0aXZpdHlEaWFsb2d9eyRffXtPdmVyd3JpdGV9ICkKICAgIH0ga2V5cyAleyAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ30gfTsKCiAgICAjIGxldCB0aGUgT3ZlcndyaXRlcyBPdmVyd3JpdGUgdGhlIEFjdGl2aXR5RGlhbG9nJ3MgSGFzaCB2YWx1ZXMKICAgIGlmICggJE92ZXJ3cml0ZUFjdGl2aXR5RGlhbG9nTnVtYmVyWzBdICkgewogICAgICAgICV7JEFjdGl2aXR5RGlhbG9nfSA9ICgKICAgICAgICAgICAgJXskQWN0aXZpdHlEaWFsb2d9LAogICAgICAgICAgICAleyAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ317ICRPdmVyd3JpdGVBY3Rpdml0eURpYWxvZ051bWJlclswXSB9e092ZXJ3cml0ZX0gfQogICAgICAgICk7CiAgICB9CgogICAgIyBBZGQgUGFnZUhlYWRlciwgTmF2YmFyLCBGb3JtaGVhZGVyIChQcm9jZXNzL0FjdGl2aXR5RGlhbG9nSGVhZGVyKQogICAgbXkgJE91dHB1dDsKICAgIG15ICRNYWluQm94Q2xhc3M7CgogICAgaWYgKCAhJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtOdW1iZXJ9LAogICAgICAgICk7CgogICAgICAgICMgZGlzcGxheSBnaXZlbiBub3RpZnkgbWVzc2FnZXMgaWYgdGhpcyBpcyBub3QgYW4gQUpBWCByZXF1ZXN0CiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtOb3RpZnl9ICkgKSB7CgogICAgICAgICAgICBmb3IgbXkgJE5vdGlmeURhdGEgKCBAeyAkUGFyYW17Tm90aWZ5fSB9ICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoICV7JE5vdGlmeURhdGF9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXInLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRBY3Rpdml0eURpYWxvZy0+e05hbWV9ICkKICAgICAgICAgICAgICAgICAgICB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZGVzY3JpcHRpb25zCiAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQKICAgICAgICAgICAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nCiAgICAgICAgICAgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gJiYgSXNIYXNoUmVmV2l0aERhdGEoIFwlRXJyb3IgKSApIHsKCiAgICAgICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJFNlbGYtPntDb25maWd9LT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICAgICAjIHNldCB1cCBjdXN0b21lciByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyU2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkaXNwbGF5IGNvbXBsZXRlIGhlYWRlciBhbmQgbmF2IGJhciBpbiBhamF4IGRpYWxvZ3Mgd2hlbiB0aGVyZSBpcyBhIHNlcnZlciBlcnJvcgogICAgICAgICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgZGlzcGxheSBvcmlnaW5hbCBoZWFkZXIgdGV4dHMgKHRoZSBwcm9jZXNzIGxpc3QgbWF5YmUgaXMgbm90IG5lY2Vzc2FyeSkKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lclRpY2tldFByb2Nlc3MnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdGhlIE1haW5Cb3ggY2xhc3MgdG8gYWRkIGNvcnJlY3QgYm9yZGVycyB0byB0aGUgc2NyZWVuCiAgICAgICAgJE1haW5Cb3hDbGFzcyA9ICdNYWluQm94JzsKICAgIH0KCiAgICAjIFNob3cgZGVzY3JpcHRpb25zIGlmIGFjdGl2aXR5IGlzIGEgZmlyc3Qgc2NyZWVuLiBTZWUgYnVnIzEyNjQ5IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEZXNjcmlwdGlvblNob3J0QWx0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQKICAgICAgICAgICAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2ctPntEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEZXNjcmlwdGlvbkxvbmdBbHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nCiAgICAgICAgICAgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJEFjdGl2aXR5RGlhbG9nLT57RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBjbG9zZSAmIGNhbmNlbCBsaW5rIGlmIG5lY2Vzc2FyeQogICAgaWYgKCAhJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgIGlmICggJFBhcmFte1JlbmRlckxvY2tlZH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NhbmNlbExpbmsnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L0N1c3RvbWVyQWN0aXZpdHlEaWFsb2dIZWFkZXInLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEZvcm1OYW1lICAgICAgICAgICAgICAgPT4gJ0FjdGl2aXR5RGlhbG9nRGlhbG9nJyAuICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9LAogICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgU3ViYWN0aW9uICAgICAgICAgICAgICA9PiAnU3RvcmVBY3Rpdml0eURpYWxvZycsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgPT4gJFRpY2tldHtUaWNrZXRJRH0gfHwgJycsCiAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJEFjdGl2aXR5QWN0aXZpdHlEaWFsb2ctPntBY3Rpdml0eURpYWxvZ30sCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgICAgICAgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0KICAgICAgICAgICAgICAgIHx8ICRUaWNrZXR7CiAgICAgICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycKICAgICAgICAgICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgICAgICAnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRQcm9jZXNzSUQnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgSXNNYWluV2luZG93ID0+ICRTZWxmLT57SXNNYWluV2luZG93fSwKICAgICAgICAgICAgTWFpbkJveENsYXNzID0+ICRNYWluQm94Q2xhc3MgfHwgJycsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJVJlbmRlcmVkRmllbGRzID0gKCk7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2YgZmllbGRzIHdoZXJlIHRoZSBBSkFYIGxvYWRlciBpY29uIHNob3VsZCBhcHBlYXIgb24gQUpBWCB1cGRhdGVzIHRyaWdnZXJlZAogICAgIyBieSBBY3Rpdml0eURpYWxvZyBmaWVsZHMKICAgIG15ICRBSkFYVXBkYXRhYmxlRmllbGRzID0gJFNlbGYtPl9HZXRBSkFYVXBkYXRhYmxlRmllbGRzKAogICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGRzID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30sCiAgICApOwoKICAgICMgc29tZSBmaWVsZHMgc2hvdWxkIGJlIHNraXBwZWQgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UKICAgIG15ICRTa2lwRmllbGRzID0gWyAnT3duZXInLCAnUmVzcG9uc2libGUnLCAnTG9jaycsICdQZW5kaW5nVGltZScsICdDdXN0b21lcklEJyBdOwoKICAgICMgTG9vcCB0aHJvdWdoIEFjdGl2aXR5RGlhbG9nRmllbGRzIGFuZCByZW5kZXIgdGhlaXIgb3V0cHV0CiAgICBESUFMT0dGSUVMRDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKCiAgICAgICAgIyBzb21lIGZpZWxkcyBzaG91bGQgYmUgc2tpcHBlZCBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgKCBncmVwIHsgJF8gZXEgJEN1cnJlbnRGaWVsZCB9IEB7JFNraXBGaWVsZHN9ICk7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9ICkgKSB7CiAgICAgICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0NhblwndCBnZXQgZGF0YSBmb3IgRmllbGQgIiVzIiBvZiBBY3Rpdml0eURpYWxvZyAiJXMiIScsCiAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLCAkQWN0aXZpdHlBY3Rpdml0eURpYWxvZy0+e0FjdGl2aXR5RGlhbG9nfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJE1lc3NhZ2UsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlRmllbGREYXRhID0gJXsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAjIFdlIHJlbmRlciBqdXN0IHZpc2libGUgQWN0aXZpdHlEaWFsb2dGaWVsZHMKICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICEkRmllbGREYXRhe0Rpc3BsYXl9OwoKICAgICAgICAjIHJlbmRlciBEeW5hbWljRmllbGRzCiAgICAgICAgaWYgKCAkQ3VycmVudEZpZWxkID1+IG17XkR5bmFtaWNGaWVsZF8oLiopfXhtcyApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZE5hbWUgPSAkMTsKICAgICAgICAgICAgbXkgJFJlc3BvbnNlICAgICAgICAgPSAkU2VsZi0+X1JlbmRlckR5bmFtaWNGaWVsZCgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgICAgICAgID0+IFwlRXJyb3JNZXNzYWdlIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRBSkFYVXBkYXRhYmxlRmllbGRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3skQ3VycmVudEZpZWxkfSA9IDE7CgogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgU3RhdGUKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1N0YXRlSUQnICkKICAgICAgICB7CgogICAgICAgICAgICAjIFdlIGRvbid0IHJlbmRlciBGaWVsZHMgdHdpY2UsCiAgICAgICAgICAgICMgaWYgdGhlcmUgd2FzIGFscmVhZHkgYSBDb25maWcgd2l0aG91dCBJRCwgc2tpcCB0aGlzIGZpZWxkCiAgICAgICAgICAgICMgbmV4dCBESUFMT0dGSUVMRCBpZiAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXNwb25zZSA9ICRTZWxmLT5fUmVuZGVyU3RhdGUoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJEFKQVhVcGRhdGFibGVGaWVsZHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZW5kZXIgUXVldWUKICAgICAgICBlbHNpZiAoICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ1F1ZXVlSUQnICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclF1ZXVlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRhYmxlRmllbGRzID0+ICRBSkFYVXBkYXRhYmxlRmllbGRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFByaW9yaXR5CiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdQcmlvcml0eUlEJyApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJQcmlvcml0eSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBTZXJ2aWNlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdTZXJ2aWNlSUQnICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclNlcnZpY2UoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJEFKQVhVcGRhdGFibGVGaWVsZHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyRDdXJyZW50RmllbGR9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVuZGVyIFNMQQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnU0xBSUQnICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclNMQSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0YWJsZUZpZWxkcyA9PiAkQUpBWFVwZGF0YWJsZUZpZWxkcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXNwb25zZS0+e1N1Y2Nlc3N9ICkgewoKICAgICAgICAgICAgICAgICMgZG9lcyBub3Qgc2hvdyBoZWFkZXIgYW5kIGZvb3RlciBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0lzTWFpbldpbmRvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFJlc3BvbnNlLT57SFRNTH07CgogICAgICAgICAgICAkUmVuZGVyZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBUaXRsZQogICAgICAgIGVsc2lmICggJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnVGl0bGUnICkgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJUaXRsZSgKICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRmllbGQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfSwKICAgICAgICAgICAgICAgIEZpZWxkTmFtZSAgICAgICAgICAgPT4gJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyAgICAgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfXskQ3VycmVudEZpZWxkfXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgICA9PiBcJVRpY2tldCB8fCB7fSwKICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgICAgICAgPT4gXCVFcnJvciB8fCB7fSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3skQ3VycmVudEZpZWxkfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBBcnRpY2xlCiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdBcnRpY2xlJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRSZW5kZXJlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgJFJlc3BvbnNlID0gJFNlbGYtPl9SZW5kZXJBcnRpY2xlKAogICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dGaWVsZCA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgRmllbGROYW1lICAgICAgICAgICA9PiAkQ3VycmVudEZpZWxkLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9eyRDdXJyZW50RmllbGR9e0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICAgID0+IFwlVGlja2V0IHx8IHt9LAogICAgICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICA9PiBcJUVycm9yIHx8IHt9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgICAgICBJbmZvcm1BZ2VudHMgICAgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30tPntBcnRpY2xlfS0+e0NvbmZpZ30tPntJbmZvcm1BZ2VudHN9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFJlc3BvbnNlLT57U3VjY2Vzc30gKSB7CgogICAgICAgICAgICAgICAgIyBkb2VzIG5vdCBzaG93IGhlYWRlciBhbmQgZm9vdGVyIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57SXNNYWluV2luZG93fSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkUmVzcG9uc2UtPntNZXNzYWdlfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCAuPSAkUmVzcG9uc2UtPntIVE1MfTsKCiAgICAgICAgICAgICRSZW5kZXJlZEZpZWxkc3skQ3VycmVudEZpZWxkfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBUeXBlCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdUeXBlSUQnICkKICAgICAgICB7CgogICAgICAgICAgICAjIFdlIGRvbid0IHJlbmRlciBGaWVsZHMgdHdpY2UsCiAgICAgICAgICAgICMgaWYgdGhlcmUgd2FzIGFscmVhZHkgYSBDb25maWcgd2l0aG91dCBJRCwgc2tpcCB0aGlzIGZpZWxkCiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICBteSAkUmVzcG9uc2UgPSAkU2VsZi0+X1JlbmRlclR5cGUoCiAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0ZpZWxkID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBGaWVsZE5hbWUgICAgICAgICAgID0+ICRDdXJyZW50RmllbGQsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgICAgID0+ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc317JEN1cnJlbnRGaWVsZH17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgICAgPT4gXCVUaWNrZXQgfHwge30sCiAgICAgICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgID0+IFwlRXJyb3IgfHwge30sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGFibGVGaWVsZHMgPT4gJEFKQVhVcGRhdGFibGVGaWVsZHMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzcG9uc2UtPntTdWNjZXNzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvZXMgbm90IHNob3cgaGVhZGVyIGFuZCBmb290ZXIgYWdhaW4KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntJc01haW5XaW5kb3d9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRSZXNwb25zZS0+e01lc3NhZ2V9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFJlc3BvbnNlLT57TWVzc2FnZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRSZXNwb25zZS0+e0hUTUx9OwoKICAgICAgICAgICAgJFJlbmRlcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkRm9vdGVyQ1NTQ2xhc3MgPSAnRm9vdGVyJzsKCiAgICBpZiAoICRTZWxmLT57SXNBamF4UmVxdWVzdH0gKSB7CgogICAgICAgICMgRHVlIHRvIHRoZSBpbml0aWFsIGxvYWRpbmcgb2YKICAgICAgICAjIHRoZSBmaXJzdCBBY3Rpdml0eURpYWxvZyBhZnRlciBQcm9jZXNzIHNlbGVjdGlvbgogICAgICAgICMgd2UgaGF2ZSB0byBiaW5kIHRoZSBBamF4VXBkYXRlIEZ1bmN0aW9uIG9uCiAgICAgICAgIyB0aGUgc2VsZWN0cywgc28gd2UgZ2V0IHRoZSBjb21wbGV0ZSBKU09uRG9jdW1lbnRDb21wbGV0ZSBjb2RlCiAgICAgICAgIyBhbmQgZGVsaXZlciBpdCBpbiB0aGUgRm9vdGVySlMgYmxvY2suCiAgICAgICAgIyBUaGlzIEphdmFzY3JpcHQgUGFydCBpcyBleGVjdXRlZCBpbgogICAgICAgICMgQ3VzdG9tZXJUaWNrZXRQcm9jZXNzLnR0CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Zvb3RlckpTJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwoKICAgICAgICAkRm9vdGVyQ1NTQ2xhc3MgPSAnQ2VudGVyZWQnOwogICAgfQoKICAgICMgc2V0IHN1Ym1pdCBidXR0b24gZGF0YQogICAgbXkgJEJ1dHRvblRleHQgID0gJ1N1Ym1pdCc7CiAgICBteSAkQnV0dG9uVGl0bGUgPSAnU2F2ZSc7CiAgICBteSAkQnV0dG9uSUQgICAgPSAnU3VibWl0JyAuICRBY3Rpdml0eUFjdGl2aXR5RGlhbG9nLT57QWN0aXZpdHlEaWFsb2d9OwogICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRCdXR0b25UZXh0fSApIHsKICAgICAgICAkQnV0dG9uVGV4dCAgPSAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRCdXR0b25UZXh0fTsKICAgICAgICAkQnV0dG9uVGl0bGUgPSAkQWN0aXZpdHlEaWFsb2ctPntTdWJtaXRCdXR0b25UZXh0fTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdGb290ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBGb290ZXJDU1NDbGFzcyA9PiAkRm9vdGVyQ1NTQ2xhc3MsCiAgICAgICAgICAgIEJ1dHRvblRleHQgICAgID0+ICRCdXR0b25UZXh0LAogICAgICAgICAgICBCdXR0b25UaXRsZSAgICA9PiAkQnV0dG9uVGl0bGUsCiAgICAgICAgICAgIEJ1dHRvbklEICAgICAgID0+ICRCdXR0b25JRAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJEFjdGl2aXR5RGlhbG9nLT57U3VibWl0QWR2aWNlVGV4dH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N1Ym1pdEFkdmljZVRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEFkdmljZVRleHQgPT4gJEFjdGl2aXR5RGlhbG9nLT57U3VibWl0QWR2aWNlVGV4dH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEFkZCB0aGUgRm9ybUZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9DdXN0b21lckFjdGl2aXR5RGlhbG9nRm9vdGVyJywKICAgICAgICBEYXRhICAgICAgICAgPT4ge30sCiAgICApOwoKICAgICMgZGlzcGxheSByZWd1bGFyIGZvb3RlciBvbmx5IGluIG5vbi1hamF4IGNhc2UKICAgIGlmICggISRTZWxmLT57SXNBamF4UmVxdWVzdH0gKSB7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlciggVHlwZSA9PiAkU2VsZi0+e0lzTWFpbldpbmRvd30gPyAnJyA6ICdTbWFsbCcgKTsKICAgIH0KCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9SZW5kZXJEeW5hbWljRmllbGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0cwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEIEZpZWxkTmFtZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyRHluYW1pY0ZpZWxkJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBiYWNrZW5kIG9iamVjdAogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICk7CgogICAgIyByZWR1Y2UgdGhlIGR5bmFtaWMgZmllbGRzIHRvIG9ubHkgdGhlIG9uZXMgdGhhdCBhcmUgZGVzaW5nZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgbXkgQEN1c3RvbWVyRHluYW1pY0ZpZWxkczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZTsKCiAgICAgICAgcHVzaCBAQ3VzdG9tZXJEeW5hbWljRmllbGRzLCAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgfQogICAgJER5bmFtaWNGaWVsZCA9IFxAQ3VzdG9tZXJEeW5hbWljRmllbGRzOwoKICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAoIGdyZXAgeyAkXy0+e05hbWV9IGVxICRQYXJhbXtGaWVsZE5hbWV9IH0gQHskRHluYW1pY0ZpZWxkfSApWzBdOwoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewoKICAgICAgICBteSAkTWVzc2FnZSA9ICJEeW5hbWljRmllbGRDb25maWcgbWlzc2luZyBmb3IgZmllbGQ6ICRQYXJhbXtGaWVsZE5hbWV9LCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiOwoKICAgICAgICAjIGxvZyBlcnJvciBidXQgZG9lcyBub3Qgc3RvcCB0aGUgZXhlY3V0aW9uIGFzIGl0IGNvdWxkIGJlIGFuIG9sZCBBcnRpY2xlCiAgICAgICAgIyBEeW5hbWljRmllbGQsIHNlZSBidWcjMTE2NjYKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJE1lc3NhZ2UsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgICAgICBIVE1MICAgID0+ICcnLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICk7CgogICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgKTsKCiAgICAgICAgIyBBbGwgVGlja2V0IER5bmFtaWNGaWVsZHMKICAgICAgICAjIHVzZWQgZm9yIEFDTCBjaGVja2luZwogICAgICAgIG15ICVEeW5hbWljRmllbGRDaGVja1BhcmFtID0gbWFwIHsgJF8gPT4gJFBhcmFte0dldFBhcmFtfXskX30gfQogICAgICAgICAgICBncmVwIHtte15EeW5hbWljRmllbGRffXhtc30gKCBrZXlzICV7ICRQYXJhbXtHZXRQYXJhbX0gfSApOwoKICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICAgICAgICAgIG15ICRBQ0wgICAgICAgICAgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGQgICA9PiBcJUR5bmFtaWNGaWVsZENoZWNrUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJFNlcnZlckVycm9yOwogICAgbXkgJEVycm9yTWVzc2FnZTsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0Vycm9yfS0+eyAkUGFyYW17RmllbGROYW1lfSB9CiAgICAgICAgICAgICYmICRQYXJhbXtFcnJvcn0tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfSBuZSAnJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VydmVyRXJyb3IgPSAxOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtFcnJvck1lc3NhZ2V9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtFcnJvck1lc3NhZ2V9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yTWVzc2FnZSA9ICRQYXJhbXtFcnJvck1lc3NhZ2V9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgIFZhbHVlICAgICAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17ICdEeW5hbWljRmllbGRfJyAuICRQYXJhbXtGaWVsZE5hbWV9IH0sCiAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgQUpBWFVwZGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyLAogICAgICAgIFVwZGF0YWJsZUZpZWxkcyAgICAgID0+ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfSwKICAgICAgICBTZXJ2ZXJFcnJvciAgICAgICAgICA9PiAkU2VydmVyRXJyb3IsCiAgICAgICAgRXJyb3JNZXNzYWdlICAgICAgICAgPT4gJEVycm9yTWVzc2FnZSwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTmFtZSAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgTGFiZWwgICA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICBDb250ZW50ID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6RHluYW1pY0ZpZWxkJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30KICAgICAgICAgICAgICAgIHx8ICdydzpEeW5hbWljRmllbGQ6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkR5bmFtaWNGaWVsZDpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L0R5bmFtaWNGaWVsZCcgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyVGl0bGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclRpdGxlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyVGl0bGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiVGl0bGUiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBWYWx1ZSAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX17VGl0bGV9LAogICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQoKICAgICMgb3V0cHV0IHNlcnZlciBlcnJvcnMKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1RpdGxlJ30gKSB7CiAgICAgICAgJERhdGF7U2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6VGl0bGUnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlRpdGxlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlRpdGxlOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvVGl0bGUnICksCiAgICB9OwoKfQoKc3ViIF9SZW5kZXJBcnRpY2xlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEIFRpY2tldCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyQXJ0aWNsZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlckFydGljbGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICBteSBAQXR0YWNobWVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpLT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICk7CgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAmJiAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICB9CgogICAgICAgIHB1c2ggQHsgJFBhcmFte0F0dGFjaG1lbnRMaXN0fSB9LCAkQXR0YWNobWVudDsKICAgIH0KCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdBcnRpY2xlJywKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICAgICAgU3ViamVjdCAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19e1N1YmplY3R9LAogICAgICAgIEJvZHkgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfXtCb2R5fSwKICAgICAgICBMYWJlbFN1YmplY3QgICAgID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0NvbmZpZ30tPntMYWJlbFN1YmplY3R9CiAgICAgICAgICAgIHx8ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiU3ViamVjdCIpLAogICAgICAgIExhYmVsQm9keSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntDb25maWd9LT57TGFiZWxCb2R5fQogICAgICAgICAgICB8fCAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlRleHQiKSwKICAgICAgICBBdHRhY2htZW50TGlzdCA9PiAkUGFyYW17QXR0YWNobWVudExpc3R9LAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICAjIG91dHB1dCBzZXJ2ZXIgZXJyb3JzCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydBcnRpY2xlU3ViamVjdCd9ICkgewogICAgICAgICREYXRhe1N1YmplY3RTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgfQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn0tPnsnQXJ0aWNsZUJvZHknfSApIHsKICAgICAgICAkRGF0YXtCb2R5U2VydmVyRXJyb3J9ID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6QXJ0aWNsZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuU3ViamVjdCcsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuQm9keScsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJFNlbGYtPntDb25maWd9LT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAjIHNldCB1cCBjdXN0b21lciByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJTZXRSaWNoVGV4dFBhcmFtZXRlcnMoCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpBcnRpY2xlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6QXJ0aWNsZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0luZm9ybUFnZW50c30gKSB7CgogICAgICAgIG15ICVTaG93blVzZXJzOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIG15ICRHSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtUaWNrZXR9LT57UXVldWVJRH0gKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAnbm90ZScsCiAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFte09wdGlvblN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICcnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdJbmZvcm1Vc2VySUQnLAogICAgICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpBcnRpY2xlOkluZm9ybUFnZW50JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvQXJ0aWNsZScgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyQ3VzdG9tZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclJlc3BvbnNpYmxlJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyQ3VzdG9tZXInICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICgpOwoKICAgIG15ICRTdWJtaXR0ZWRDdXN0b21lclVzZXJJRCA9ICRQYXJhbXtHZXRQYXJhbX17Q3VzdG9tZXJVc2VySUR9OwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsQ3VzdG9tZXJVc2VyID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiQ3VzdG9tZXIgdXNlciIpLAogICAgICAgIExhYmVsQ3VzdG9tZXJJRCAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiQ3VzdG9tZXJJRCIpLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICAjIG91dHB1dCBzZXJ2ZXIgZXJyb3JzCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAkRGF0YXtDdXN0b21lclVzZXJJRFNlcnZlckVycm9yfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICB9CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+e0N1c3RvbWVySUR9ICkgewogICAgICAgICREYXRhe0N1c3RvbWVySURTZXJ2ZXJFcnJvcn0gPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgIGlmICgKICAgICAgICAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICYmICRQYXJhbXtUaWNrZXR9LT57Q3VzdG9tZXJVc2VySUR9ICkKICAgICAgICB8fCAkU3VibWl0dGVkQ3VzdG9tZXJVc2VySUQKICAgICAgICApCiAgICB7CiAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFN1Ym1pdHRlZEN1c3RvbWVyVXNlcklECiAgICAgICAgICAgICAgICB8fCAkUGFyYW17VGlja2V0fXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgY3VzdG9tZXIgZmllbGQgYXMgIkZpcnN0TmFtZSBMYXN0bmFtZSIgPE1haWxBZGRyZXNzPgogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVDdXN0b21lclVzZXJEYXRhICkgKSB7CiAgICAgICAgJERhdGF7Q3VzdG9tZXJVc2VySUR9ICAgICAgID0gIlwiJEN1c3RvbWVyVXNlckRhdGF7VXNlckZ1bGxuYW1lfSIgLiAiXCIgPCRDdXN0b21lclVzZXJEYXRhe1VzZXJFbWFpbH0+IjsKICAgICAgICAkRGF0YXtDdXN0b21lcklEfSAgICAgICAgICAgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gfHwgJyc7CiAgICAgICAgJERhdGF7U2VsZWN0ZWRDdXN0b21lclVzZXJ9ID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlcklEfSB8fCAnJzsKICAgIH0KCiAgICAjIHNldCBmaWVsZHMgdGhhdCB3aWxsIGdldCBhbiBBSkFYIGxvYWRlciBpY29uIHdoZW4gdGhpcyBmaWVsZCBjaGFuZ2VzCiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgRGF0YSAgICAgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9LAogICAgICAgIE5vUXVvdGVzID0+IDAsCiAgICApOwogICAgJERhdGF7RmllbGRzVG9VcGRhdGV9ID0gJEpTT047CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OkN1c3RvbWVyJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW5DdXN0b21lclVzZXInLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbkN1c3RvbWVySUQnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpDdXN0b21lcjpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OkN1c3RvbWVyOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvQ3VzdG9tZXInICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclNMQSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyU0xBJyApLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0gKSApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAnQWN0aXZpdHlEaWFsb2dGaWVsZCcsICdfUmVuZGVyU0xBJyApLAogICAgICAgIH07CiAgICB9CiAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICk7CgogICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgICAgIFNlcnZpY2VzID0+ICRTZXJ2aWNlcywKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlNMQSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CgogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgU0xBIG9iamVjdAogICAgbXkgJFNMQU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTTEEnKTsKCiAgICBteSAkU0xBSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17U0xBSUR9OwogICAgaWYgKCRTTEFJRFBhcmFtKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU0xBT2JqZWN0LT5TTEFMb29rdXAoIFNMQUlEID0+ICRTTEFJRFBhcmFtICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnU0xBJyApIHsKCiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CgogICAgICAgICAgICAjIEZldGNoIERlZmF1bHRWYWx1ZSBmcm9tIENvbmZpZwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU0xBT2JqZWN0LT5TTEFMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgU0xBID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU0xBT2JqZWN0LT5TTEFMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgU0xBID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IFRpY2tldFZhbHVlCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICYmICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtUaWNrZXR9LT57U0xBfTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1NMQUlEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGJ1aWxkIFNMQSBzdHJpbmcKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkU0xBcywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRWYWx1ZSwKICAgICAgICBQb3NzaWJsZU5vbmUgID0+IDEsCiAgICAgICAgU29ydCAgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMCwKICAgICAgICBDbGFzcyAgICAgICAgID0+ICJNb2Rlcm5pemUgJFNlcnZlckVycm9yIiwKICAgICAgICBNYXggICAgICAgICAgID0+IDIwMCwKICAgICk7CgogICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnU0xBRmllbGRzVG9VcGRhdGUnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfQogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6U0xBJywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpTTEE6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpTTEE6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9TTEEnICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclNlcnZpY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhGb3JtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdQYXJhbWV0ZXIgJXMgaXMgbWlzc2luZyBpbiAlcy4nLCAkTmVlZGVkLCAnX1JlbmRlclNlcnZpY2UnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJTZXJ2aWNlJyApLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAleyAkUGFyYW17R2V0UGFyYW19IH0sCiAgICApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJTZXJ2aWNlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CgogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgc2VydmljZSBvYmplY3QKICAgIG15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKCiAgICBteSAkU2VydmljZUlEUGFyYW0gPSAkUGFyYW17R2V0UGFyYW19e1NlcnZpY2VJRH07CiAgICBpZiAoJFNlcnZpY2VJRFBhcmFtKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSURQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0ZpZWxkTmFtZX0gZXEgJ1NlcnZpY2UnICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSBuZSAnJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgU2VydmljZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fS0+e1NlcnZpY2V9OwogICAgfQoKICAgICMgc2V0IHNlcnZlciBlcnJvcnMKICAgIG15ICRTZXJ2ZXJFcnJvciA9ICcnOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0Vycm9yfSApICYmICRQYXJhbXtFcnJvcn0tPnsnU2VydmljZUlEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIGJ1aWxkIFNlcnZpY2Ugc3RyaW5nCiAgICAkRGF0YXtDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplICRTZXJ2ZXJFcnJvciIsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkU2VsZWN0ZWRWYWx1ZSwKICAgICAgICBQb3NzaWJsZU5vbmUgID0+IDEsCiAgICAgICAgVHJlZVZpZXcgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgU29ydCAgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMCwKICAgICAgICBNYXggICAgICAgICAgID0+IDIwMCwKICAgICk7CgogICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnU2VydmljZUZpZWxkc1RvVXBkYXRlJywKICAgICAgICBWYWx1ZSA9PiAkUGFyYW17QUpBWFVwZGF0YWJsZUZpZWxkc30KICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlNlcnZpY2UnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlNlcnZpY2U6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpTZXJ2aWNlOkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvU2VydmljZScgKSwKICAgIH07Cgp9CgpzdWIgX1JlbmRlclByaW9yaXR5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJQcmlvcml0eScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclByaW9yaXR5JyApLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJFByaW9yaXRpZXMgPSAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgJXsgJFBhcmFte0dldFBhcmFtfSB9LAogICAgKTsKCiAgICBteSAlRGF0YSA9ICgKICAgICAgICBMYWJlbCAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiUHJpb3JpdHkiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRQYXJhbXtGb3JtSUR9LAogICAgICAgIE1hbmRhdG9yeUNsYXNzICAgPT4gJycsCiAgICAgICAgVmFsaWRhdGVSZXF1aXJlZCA9PiAnJywKICAgICk7CgogICAgIyBJZiBmaWVsZCBpcyByZXF1aXJlZCBwdXQgaW4gdGhlIG5lY2Vzc2FyeSB2YXJpYWJsZXMgZm9yCiAgICAjIFZhbGlkYXRlUmVxdWlyZWQgY2xhc3MgaW5wdXQgZmllbGQsIE1hbmRhdG9yeSBjbGFzcyBmb3IgdGhlIGxhYmVsCiAgICBpZiAoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0Rpc3BsYXl9ID09IDIgKSB7CiAgICAgICAgJERhdGF7VmFsaWRhdGVSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICREYXRhe01hbmRhdG9yeUNsYXNzfSAgID0gJ01hbmRhdG9yeSc7CiAgICB9CgogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgcHJpb3JpdHkgb2JqZWN0CiAgICBteSAkUHJpb3JpdHlPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHknKTsKCiAgICBteSAkUHJpb3JpdHlJRFBhcmFtID0gJFBhcmFte0dldFBhcmFtfXtQcmlvcml0eUlEfTsKICAgIGlmICgkUHJpb3JpdHlJRFBhcmFtKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUHJpb3JpdHlPYmplY3QtPlByaW9yaXR5TG9va3VwKAogICAgICAgICAgICBQcmlvcml0eUlEID0+ICRQcmlvcml0eUlEUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtGaWVsZE5hbWV9IGVxICdQcmlvcml0eScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUHJpb3JpdHlPYmplY3QtPlByaW9yaXR5TG9va3VwKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUHJpb3JpdHlPYmplY3QtPlByaW9yaXR5TG9va3VwKAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBUaWNrZXRWYWx1ZQogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte1RpY2tldH0gKSAmJiAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17VGlja2V0fS0+e1ByaW9yaXR5fTsKICAgIH0KCiAgICAjIHNldCBzZXJ2ZXIgZXJyb3JzCiAgICBteSAkU2VydmVyRXJyb3IgPSAnJzsKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtFcnJvcn0gKSAmJiAkUGFyYW17RXJyb3J9LT57J1ByaW9yaXR5SUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgYnVpbGQgbmV4dCBQcmlvcml0aWVzIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRQcmlvcml0aWVzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIENsYXNzICAgICAgICAgPT4gIk1vZGVybml6ZSAkU2VydmVyRXJyb3IiLAogICAgKTsKCiAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdQcmlvcml0eUZpZWxkc1RvVXBkYXRlJywKICAgICAgICBWYWx1ZSA9PiAkUGFyYW17QUpBWFVwZGF0YWJsZUZpZWxkc30KICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlByaW9yaXR5JywKICAgICAgICBEYXRhID0+IFwlRGF0YSwKICAgICk7CgogICAgIyBzZXQgbWFuZGF0b3J5IGxhYmVsIG1hcmtlcgogICAgaWYgKCAkRGF0YXtNYW5kYXRvcnlDbGFzc30gJiYgJERhdGF7TWFuZGF0b3J5Q2xhc3N9IG5lICcnICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMYWJlbFNwYW4nLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpQcmlvcml0eTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlByaW9yaXR5OkRlc2NyaXB0aW9uTG9uZycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25Mb25nID0+ICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBTdWNjZXNzID0+IDEsCiAgICAgICAgSFRNTCAgICA9PiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJvY2Vzc01hbmFnZW1lbnQvUHJpb3JpdHknICksCiAgICB9Owp9CgpzdWIgX1JlbmRlclF1ZXVlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbGF5b3V0IG9iamVjdAogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRm9ybUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJE5lZWRlZCwgJ19SZW5kZXJRdWV1ZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclF1ZXVlJyApLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJFF1ZXVlcyA9ICRTZWxmLT5fR2V0UXVldWVzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlRvIHF1ZXVlIiksCiAgICAgICAgRmllbGRJRCAgICAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkUGFyYW17Rm9ybUlEfSwKICAgICAgICBNYW5kYXRvcnlDbGFzcyAgID0+ICcnLAogICAgICAgIFZhbGlkYXRlUmVxdWlyZWQgPT4gJycsCiAgICApOwoKICAgICMgSWYgZmllbGQgaXMgcmVxdWlyZWQgcHV0IGluIHRoZSBuZWNlc3NhcnkgdmFyaWFibGVzIGZvcgogICAgIyBWYWxpZGF0ZVJlcXVpcmVkIGNsYXNzIGlucHV0IGZpZWxkLCBNYW5kYXRvcnkgY2xhc3MgZm9yIHRoZSBsYWJlbAogICAgaWYgKCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEaXNwbGF5fSA9PSAyICkgewogICAgICAgICREYXRhe1ZhbGlkYXRlUmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAkRGF0YXtNYW5kYXRvcnlDbGFzc30gICA9ICdNYW5kYXRvcnknOwogICAgfQogICAgbXkgJFNlbGVjdGVkVmFsdWU7CgogICAgIyBnZXQgcXVldWUgb2JqZWN0CiAgICBteSAkUXVldWVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAjIGlmIHdlIGdvdCBRdWV1ZUlEIGFzIFBhcmFtIGZyb20gdGhlIEdVSQogICAgbXkgJFF1ZXVlSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17UXVldWVJRH07CiAgICBpZiAoJFF1ZXVlSURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgUXVldWVJRCA9PiAkUXVldWVJRFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnUXVldWUnICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFF1ZXVlID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntRdWV1ZX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydRdWV1ZUlEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIGJ1aWxkIG5leHQgcXVldWVzIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRRdWV1ZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplICRTZXJ2ZXJFcnJvciIsCiAgICAgICAgVHJlZVZpZXcgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgU29ydCAgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgIFBvc3NpYmxlTm9uZSAgPT4gMSwKICAgICk7CgogICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnUXVldWVGaWVsZHNUb1VwZGF0ZScsCiAgICAgICAgVmFsdWUgPT4gJFBhcmFte0FKQVhVcGRhdGFibGVGaWVsZHN9CiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57TGF5b3V0QmxvY2t9IHx8ICdydzpRdWV1ZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6UXVldWU6RGVzY3JpcHRpb25TaG9ydCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRGVzY3JpcHRpb25TaG9ydCA9PiAkUGFyYW17RGVzY3JpcHRpb25TaG9ydH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvbkxvbmd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdydzpRdWV1ZTpEZXNjcmlwdGlvbkxvbmcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uTG9uZyA9PiAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIEhUTUwgICAgPT4gJExheW91dE9iamVjdC0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1Byb2Nlc3NNYW5hZ2VtZW50L1F1ZXVlJyApLAogICAgfTsKfQoKc3ViIF9SZW5kZXJTdGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyU3RhdGUnICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfSApICkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICdBY3Rpdml0eURpYWxvZ0ZpZWxkJywgJ19SZW5kZXJTdGF0ZScgKSwKICAgICAgICB9OwogICAgfQoKICAgIG15ICRTdGF0ZXMgPSAkU2VsZi0+X0dldFN0YXRlcyggJXsgJFBhcmFte1RpY2tldH0gfSApOwoKICAgIG15ICVEYXRhID0gKAogICAgICAgIExhYmVsICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJOZXh0IHRpY2tldCBzdGF0ZSIpLAogICAgICAgIEZpZWxkSUQgICAgICAgICAgPT4gJ1N0YXRlSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KICAgIG15ICRTZWxlY3RlZFZhbHVlOwoKICAgICMgZ2V0IHN0YXRlIG9iamVjdAogICAgbXkgJFN0YXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyk7CgogICAgbXkgJFN0YXRlSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17U3RhdGVJRH07CiAgICBpZiAoJFN0YXRlSURQYXJhbSkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUxvb2t1cCggU3RhdGVJRCA9PiAkU3RhdGVJRFBhcmFtICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnU3RhdGUnICkgewoKICAgICAgICBpZiAoICEkU2VsZWN0ZWRWYWx1ZSApIHsKCiAgICAgICAgICAgICMgRmV0Y2ggRGVmYXVsdFZhbHVlIGZyb20gQ29uZmlnCiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFN0YXRlID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkU2VsZWN0ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKCAhJFNlbGVjdGVkVmFsdWUgKSB7CiAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFN0YXRlT2JqZWN0LT5TdGF0ZUxvb2t1cCgKICAgICAgICAgICAgICAgIFN0YXRlSUQgPT4gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBHZXQgVGlja2V0VmFsdWUKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtUaWNrZXR9ICkgJiYgISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte1RpY2tldH0tPntTdGF0ZX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydTdGF0ZUlEJ30gKSB7CiAgICAgICAgJFNlcnZlckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgJERhdGF7Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRTdGF0ZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnU3RhdGVJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFNlbGVjdGVkVmFsdWUsCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAiTW9kZXJuaXplICRTZXJ2ZXJFcnJvciIsCiAgICApOwoKICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgS2V5ICAgPT4gJ1N0YXRlRmllbGRzVG9VcGRhdGUnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfQogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6U3RhdGUnLAogICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgKTsKCiAgICAjIHNldCBtYW5kYXRvcnkgbGFiZWwgbWFya2VyCiAgICBpZiAoICREYXRhe01hbmRhdG9yeUNsYXNzfSAmJiAkRGF0YXtNYW5kYXRvcnlDbGFzc30gbmUgJycgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xhYmVsU3BhbicsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntMYXlvdXRCbG9ja30gfHwgJ3J3OlN0YXRlOkRlc2NyaXB0aW9uU2hvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uU2hvcnQgPT4gJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RGVzY3JpcHRpb25Mb25nfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAncnc6U3RhdGU6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9TdGF0ZScgKSwKICAgIH07Cn0KCnN1YiBfUmVuZGVyVHlwZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZvcm1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ1BhcmFtZXRlciAlcyBpcyBtaXNzaW5nIGluICVzLicsICROZWVkZWQsICdfUmVuZGVyVHlwZScgKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9ICkgKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnUGFyYW1ldGVyICVzIGlzIG1pc3NpbmcgaW4gJXMuJywgJ0FjdGl2aXR5RGlhbG9nRmllbGQnLCAnX1JlbmRlclR5cGUnICksCiAgICAgICAgfTsKICAgIH0KCiAgICBteSAkVHlwZXMgPSAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICV7ICRQYXJhbXtHZXRQYXJhbX0gfSwKICAgICk7CgogICAgbXkgJURhdGEgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIlR5cGUiKSwKICAgICAgICBGaWVsZElEICAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgIEZvcm1JRCAgICAgICAgICAgPT4gJFBhcmFte0Zvcm1JRH0sCiAgICAgICAgTWFuZGF0b3J5Q2xhc3MgICA9PiAnJywKICAgICAgICBWYWxpZGF0ZVJlcXVpcmVkID0+ICcnLAogICAgKTsKCiAgICAjIElmIGZpZWxkIGlzIHJlcXVpcmVkIHB1dCBpbiB0aGUgbmVjZXNzYXJ5IHZhcmlhYmxlcyBmb3IKICAgICMgVmFsaWRhdGVSZXF1aXJlZCBjbGFzcyBpbnB1dCBmaWVsZCwgTWFuZGF0b3J5IGNsYXNzIGZvciB0aGUgbGFiZWwKICAgIGlmICggJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gJiYgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAkRGF0YXtWYWxpZGF0ZVJlcXVpcmVkfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICAgPSAnTWFuZGF0b3J5JzsKICAgIH0KCiAgICBteSAkU2VsZWN0ZWRWYWx1ZTsKCiAgICAjIGdldCB0eXBlIG9iamVjdAogICAgbXkgJFR5cGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpOwoKICAgIG15ICRUeXBlSURQYXJhbSA9ICRQYXJhbXtHZXRQYXJhbX17VHlwZUlEfTsKICAgIGlmICgkVHlwZUlEUGFyYW0pIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRUeXBlT2JqZWN0LT5UeXBlTG9va3VwKAogICAgICAgICAgICBUeXBlSUQgPT4gJFR5cGVJRFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17RmllbGROYW1lfSBlcSAnVHlwZScgKSB7CgogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewoKICAgICAgICAgICAgIyBGZXRjaCBEZWZhdWx0VmFsdWUgZnJvbSBDb25maWcKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9CiAgICAgICAgICAgICAgICAmJiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9IG5lICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFR5cGVPYmplY3QtPlR5cGVMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkUGFyYW17QWN0aXZpdHlEaWFsb2dGaWVsZH0tPntEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJFNlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFZhbHVlID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGR9LT57RGVmYXVsdFZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmICggISRTZWxlY3RlZFZhbHVlICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0gbmUgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWUgPSAkVHlwZU9iamVjdC0+VHlwZUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IFRpY2tldFZhbHVlCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17VGlja2V0fSApICYmICEkU2VsZWN0ZWRWYWx1ZSApIHsKICAgICAgICAkU2VsZWN0ZWRWYWx1ZSA9ICRQYXJhbXtUaWNrZXR9LT57VHlwZX07CiAgICB9CgogICAgIyBzZXQgc2VydmVyIGVycm9ycwogICAgbXkgJFNlcnZlckVycm9yID0gJyc7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RXJyb3J9ICkgJiYgJFBhcmFte0Vycm9yfS0+eydUeXBlSUQnfSApIHsKICAgICAgICAkU2VydmVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICMgYnVpbGQgU2VydmljZSBzdHJpbmcKICAgICREYXRhe0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkVHlwZXMsCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICBDbGFzcyAgICAgICAgID0+ICJNb2Rlcm5pemUgJFNlcnZlckVycm9yIiwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRTZWxlY3RlZFZhbHVlLAogICAgICAgIFBvc3NpYmxlTm9uZSAgPT4gMSwKICAgICAgICBTb3J0ICAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAwLAogICAgICAgIE1heCAgICAgICAgICAgPT4gMjAwLAogICAgKTsKCiAgICAjIHNlbmQgZGF0YSB0byBKUwogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdUeXBlRmllbGRzVG9VcGRhdGUnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfQogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6VHlwZScsCiAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICApOwoKICAgICMgc2V0IG1hbmRhdG9yeSBsYWJlbCBtYXJrZXIKICAgIGlmICggJERhdGF7TWFuZGF0b3J5Q2xhc3N9ICYmICREYXRhe01hbmRhdG9yeUNsYXNzfSBuZSAnJyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGFiZWxTcGFuJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uU2hvcnR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtBY3Rpdml0eURpYWxvZ0ZpZWxkfS0+e0xheW91dEJsb2NrfSB8fCAncnc6VHlwZTpEZXNjcmlwdGlvblNob3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblNob3J0ID0+ICRQYXJhbXtEZXNjcmlwdGlvblNob3J0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ3J3OlR5cGU6RGVzY3JpcHRpb25Mb25nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkxvbmcgPT4gJFBhcmFte0Rlc2NyaXB0aW9uTG9uZ30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBIVE1MICAgID0+ICRMYXlvdXRPYmplY3QtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdQcm9jZXNzTWFuYWdlbWVudC9UeXBlJyApLAogICAgfTsKfQoKc3ViIF9TdG9yZUFjdGl2aXR5RGlhbG9nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRpY2tldElEID0gJFBhcmFte0dldFBhcmFtfS0+e1RpY2tldElEfTsKICAgIG15ICRQcm9jZXNzU3RhcnRwb2ludDsKICAgIG15ICVUaWNrZXQ7CiAgICBteSAkUHJvY2Vzc0VudGl0eUlEOwogICAgbXkgJEFjdGl2aXR5RW50aXR5SUQ7CiAgICBteSAlRXJyb3I7CiAgICBteSAlRXJyb3JNZXNzYWdlOwoKICAgIG15ICVUaWNrZXRQYXJhbTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIG15ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0gJFBhcmFte0dldFBhcmFtfS0+e0FjdGl2aXR5RGlhbG9nRW50aXR5SUR9OwogICAgaWYgKCAhJEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCBtaXNzaW5nIScpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEFjdGl2aXR5RGlhbG9nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpLT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlELAogICAgICAgIEludGVyZmFjZSAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVySW50ZXJmYWNlJywKICAgICk7CgogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJEFjdGl2aXR5RGlhbG9nKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdDb3VsZG5cJ3QgZ2V0IENvbmZpZyBmb3IgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCAiJXMiIScsICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEICksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICMgZ2V0IGJhY2tlbmQgb2JqZWN0CiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIHNvbWUgZmllbGRzIHNob3VsZCBiZSBza2lwcGVkIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICBteSAkU2tpcEZpZWxkcyA9IFsgJ093bmVyJywgJ1Jlc3BvbnNpYmxlJywgJ0xvY2snLCAnUGVuZGluZ1RpbWUnLCAnQ3VzdG9tZXJJRCcgXTsKCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgKTsKCiAgICAjIHJlZHVjZSB0aGUgZHluYW1pYyBmaWVsZHMgdG8gb25seSB0aGUgb25lcyB0aGF0IGFyZSBkZXNpZ25lZCBmb3IgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICBteSBAQ3VzdG9tZXJEeW5hbWljRmllbGRzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICBwdXNoIEBDdXN0b21lckR5bmFtaWNGaWVsZHMsICREeW5hbWljRmllbGRDb25maWc7CiAgICB9CiAgICAkRHluYW1pY0ZpZWxkID0gXEBDdXN0b21lckR5bmFtaWNGaWVsZHM7CgogICAgIyBjaGVjayBlYWNoIEZpZWxkIG9mIGFuIEFjdGl2aXR5IERpYWxvZyBhbmQgZmlsbCB0aGUgZXJyb3IgaGFzaCBpZiBzb21ldGhpbmcgZ29lcyBob3JyaWJseSB3cm9uZwogICAgbXkgJUNoZWNrZWRGaWVsZHM7CiAgICBESUFMT0dGSUVMRDoKICAgIGZvciBteSAkQ3VycmVudEZpZWxkICggQHsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRPcmRlcn0gfSApIHsKCiAgICAgICAgIyBzb21lIGZpZWxkcyBzaG91bGQgYmUgc2tpcHBlZCBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgKCBncmVwIHsgJF8gZXEgJEN1cnJlbnRGaWVsZCB9IEB7JFNraXBGaWVsZHN9ICk7CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCA9fiBte15EeW5hbWljRmllbGRfKC4qKX14bXMgKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJDE7CgogICAgICAgICAgICAjIEdldCB0aGUgQ29uZmlnIG9mIHRoZSBjdXJyZW50IER5bmFtaWNGaWVsZCAodGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGdyZXAgcmVzdWx0IGFycmF5KQogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gKCBncmVwIHsgJF8tPntOYW1lfSBlcSAkRHluYW1pY0ZpZWxkTmFtZSB9IEB7JER5bmFtaWNGaWVsZH0gKVswXTsKCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewoKICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlCiAgICAgICAgICAgICAgICAgICAgPSAiRHluYW1pY0ZpZWxkQ29uZmlnIG1pc3NpbmcgZm9yIGZpZWxkOiAkUGFyYW17RmllbGROYW1lfSwgb3IgaXMgbm90IGEgVGlja2V0IER5bmFtaWMgRmllbGQhIjsKCiAgICAgICAgICAgICAgICAjIGxvZyBlcnJvciBidXQgZG9lcyBub3Qgc3RvcCB0aGUgZXhlY3V0aW9uIGFzIGl0IGNvdWxkIGJlIGFuIG9sZCBBcnRpY2xlCiAgICAgICAgICAgICAgICAjIER5bmFtaWNGaWVsZCwgc2VlIGJ1ZyMxMTY2NgogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBESUFMT0dGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBXaWxsIGJlIGV4dGVuZGVkIGxhdGVyIG9uIGZvciBBQ0wgQ2hlY2tpbmc6CiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBhbiBpbnZpc2libGUgZmllbGQsIHVzZSBjb25maWd1cmF0aW9uIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH17RGlzcGxheX0gPT0gMCApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXskQ3VycmVudEZpZWxkfSA9ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30tPnskQ3VycmVudEZpZWxkfS0+e0RlZmF1bHRWYWx1ZX0KICAgICAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvbmx5IHZhbGlkYXRlIHZpc2libGUgZmllbGRzCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIyBDaGVjayBEeW5hbWljRmllbGQgVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH0tPntEaXNwbGF5fSA9PSAyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAlcyEnLCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAkRXJyb3JNZXNzYWdleyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSB8fCAnJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17JEN1cnJlbnRGaWVsZH0gPQogICAgICAgICAgICAgICAgICAgICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgSW4gY2FzZSBvZiBEeW5hbWljRmllbGRzIHRoZXJlIGlzIG5vIE5hbWVUb0lEIHRyYW5zbGF0aW9uCiAgICAgICAgICAgICMgc28ganVzdCB0YWtlIHRoZSBEeW5hbWljRmllbGQgbmFtZQogICAgICAgICAgICAkQ2hlY2tlZEZpZWxkc3skQ3VycmVudEZpZWxkfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnQ3VzdG9tZXJJRCcKICAgICAgICAgICAgfHwgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSBlcSAnQ3VzdG9tZXJVc2VySUQnCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRDaGVja2VkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eydDdXN0b21lcklEJ30gfTsKCiAgICAgICAgICAgIG15ICRDdXN0b21lcklEID0gJFBhcmFte0dldFBhcmFtfS0+e0N1c3RvbWVySUR9IHx8ICRTZWxmLT57VXNlckN1c3RvbWVySUR9OwogICAgICAgICAgICBpZiAoICEkQ3VzdG9tZXJJRCApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQ3VzdG9tZXJJRCd9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkVGlja2V0UGFyYW17Q3VzdG9tZXJJRH0gPSAkQ3VzdG9tZXJJRDsKCiAgICAgICAgICAgICMgVW5mb3J0dW5hdGVseSBUaWNrZXRDcmVhdGUgbmVlZHMgJ0N1c3RvbWVyVXNlcicgYXMgcGFyYW0gaW5zdGVhZCBvZiAnQ3VzdG9tZXJVc2VySUQnCiAgICAgICAgICAgIG15ICRDdXN0b21lclVzZXJJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICAgICAgfHwgJFNlbGYtPntVc2VySUR9OwogICAgICAgICAgICBpZiAoICEkQ3VzdG9tZXJVc2VySUQgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRVc2VySUQnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEN1c3RvbWVyVXNlcklEICkgewogICAgICAgICAgICAgICAgJEVycm9yeydDdXN0b21lclVzZXJJRCd9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXtDdXN0b21lclVzZXJ9ID0gJEN1c3RvbWVyVXNlcklEOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDaGVja2VkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eydDdXN0b21lcklEJ30gfSAgICAgPSAxOwogICAgICAgICAgICAkQ2hlY2tlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnsnQ3VzdG9tZXJVc2VySUQnfSB9ID0gMTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBza2lwIGlmIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBJRCBvciBOYW1lCiAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQgaWYgJENoZWNrZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfTsKCiAgICAgICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+X0NoZWNrRmllbGQoCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9LAogICAgICAgICAgICAgICAgJXsgJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkUmVzdWx0ICkgewoKICAgICAgICAgICAgICAgICMgc3BlY2lhbCBjYXNlIGZvciBBcnRpY2xlIChTdWJqZWN0ICYgQm9keSkKICAgICAgICAgICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCBlcSAnQXJ0aWNsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBcnRpY2xlUGFydCAocXcoU3ViamVjdCBCb2R5KSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17R2V0UGFyYW19LT57JEFydGljbGVQYXJ0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNldCBlcnJvciBmb3IgZWFjaCBwYXJ0IChpZiBhbnkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICdBcnRpY2xlJyAuICRBcnRpY2xlUGFydCB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGFsbCBvdGhlciBmaWVsZHMKICAgICAgICAgICAgICAgIGVsc2lmICggJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+eyRDdXJyZW50RmllbGR9LT57RGlzcGxheX0gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVGlja2V0UGFyYW17ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9ICRSZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENoZWNrZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkUHJvY2Vzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6UHJvY2VzcycpOwogICAgbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgbXkgQE5vdGlmeTsKCiAgICBteSAkTmV3VGlja2V0SUQ7CiAgICBpZiAoICEkVGlja2V0SUQgKSB7CgogICAgICAgICRQcm9jZXNzRW50aXR5SUQgPSAkUGFyYW17R2V0UGFyYW19LT57UHJvY2Vzc0VudGl0eUlEfTsKICAgICAgICBpZiAoICEkUHJvY2Vzc0VudGl0eUlEICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTWlzc2luZyBQcm9jZXNzRW50aXR5SUQsIGNoZWNrIHlvdXIgQWN0aXZpdHlEaWFsb2dIZWFkZXIudHQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkUHJvY2Vzc1N0YXJ0cG9pbnQgPSAkUHJvY2Vzc09iamVjdC0+UHJvY2Vzc1N0YXJ0cG9pbnRHZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUHJvY2Vzc1N0YXJ0cG9pbnQKICAgICAgICAgICAgfHwgIUlzSGFzaFJlZldpdGhEYXRhKCRQcm9jZXNzU3RhcnRwb2ludCkKICAgICAgICAgICAgfHwgISRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5fSB8fCAhJFByb2Nlc3NTdGFydHBvaW50LT57QWN0aXZpdHlEaWFsb2d9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdObyBTdGFydEFjdGl2aXR5RGlhbG9nIG9yIFN0YXJ0QWN0aXZpdHlEaWFsb2cgZm9yIFByb2Nlc3MgIiVzIiBjb25maWd1cmVkIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQWN0aXZpdHlFbnRpdHlJRCA9ICRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5fTsKCiAgICAgICAgTkVFREVETE9PUDoKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoUXVldWUgU3RhdGUgTG9jayBQcmlvcml0eSkpIHsKCiAgICAgICAgICAgIGlmICggISRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH0tPnskTmVlZGVkfSB9ICkgewoKICAgICAgICAgICAgICAgICMgaWYgYSByZXF1aXJlZCBmaWVsZCBoYXMgbm8gdmFsdWUgY2FsbCBfQ2hlY2tGaWVsZCBhcyBmaWxlZCBpcyBoaWRkZW4KICAgICAgICAgICAgICAgICMgKE5vIERpc3BsYXkgcGFyYW0gPSBEaXNwbGF5ID0+IDApIGFuZCBubyBEZWZhdWx0VmFsdWUsIHRvIHVzZSBnbG9iYWwgZGVmYXVsdCBhcwogICAgICAgICAgICAgICAgIyBmYWxsLWJhY2suIE9uZSByZWFzb24gZm9yIHRoaXMgdG8gaGFwcGVuIGlzIHRoYXQgQWN0aXZpdHlEaWFsb2cgRGVmYXVsdFZhbHVlIHRyaWVkCiAgICAgICAgICAgICAgICAjIHRvIHNldCBiZWZvcmUsIHdhcyBub3QgdmFsaWQuCiAgICAgICAgICAgICAgICBteSAkUmVzdWx0ID0gJFNlbGYtPl9DaGVja0ZpZWxkKAogICAgICAgICAgICAgICAgICAgIEZpZWxkID0+ICRTZWxmLT57TmFtZVRvSUR9LT57JE5lZWRlZH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRSZXN1bHQgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkU2VsZi0+e05hbWVUb0lEfS0+eyROZWVkZWR9IH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgJFRpY2tldFBhcmFteyAkU2VsZi0+e05hbWVUb0lEfS0+eyROZWVkZWR9IH0gPSAkUmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIElmIHdlIGhhZCBubyBFcnJvcnMsIHdlIGNhbiBjcmVhdGUgdGhlIFRpY2tldCBhbmQgU2V0IEFjdGl2aXR5RW50aXR5SUQgYXMgd2VsbCBhcwogICAgICAgICMgUHJvY2Vzc0VudGl0eUlECiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlRXJyb3IgKSApIHsKCiAgICAgICAgICAgICRUaWNrZXRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwoKICAgICAgICAgICAgJFRpY2tldFBhcmFte0N1c3RvbWVySUR9ICAgPSAkU2VsZi0+e1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgJFRpY2tldFBhcmFte0N1c3RvbWVyVXNlcn0gPSAkU2VsZi0+e1VzZXJMb2dpbn07CiAgICAgICAgICAgICRUaWNrZXRQYXJhbXtPd25lcklEfSAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyk7CiAgICAgICAgICAgICRUaWNrZXRQYXJhbXtVc2VySUR9ICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyk7CgogICAgICAgICAgICBpZiAoICEkVGlja2V0UGFyYW17T3duZXJJRH0gKSB7CgogICAgICAgICAgICAgICAgJFRpY2tldFBhcmFte093bmVySUR9ID0gJFBhcmFte0dldFBhcmFtfS0+e093bmVySUR9IHx8IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgU3RhcnRBY3Rpdml0eURpYWxvZyBkb2VzIG5vdCBwcm92aWRlIGEgdGlja2V0IHRpdGxlIHNldCBhIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgaWYgKCAhJFRpY2tldFBhcmFte1RpdGxlfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB0aGUgY3VycmVudCBzZXJ2ZXIgVGltZXN0YW1wCiAgICAgICAgICAgICAgICBteSAkQ3VycmVudFRpbWVTdGFtcCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgJFRpY2tldFBhcmFte1RpdGxlfSA9ICIkUGFyYW17UHJvY2Vzc05hbWV9IC0gJEN1cnJlbnRUaW1lU3RhbXAiOwoKICAgICAgICAgICAgICAgICMgdXNlIGFydGljbGUgc3ViamVjdCBmcm9tIHRoZSB3ZWIgcmVxdWVzdCBpZiBhbnkKICAgICAgICAgICAgICAgIGlmICggSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0dldFBhcmFtfS0+e1N1YmplY3R9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJFRpY2tldFBhcmFte1RpdGxlfSA9ICRQYXJhbXtHZXRQYXJhbX0tPntTdWJqZWN0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjcmVhdGUgYSBuZXcgdGlja2V0CiAgICAgICAgICAgICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSglVGlja2V0UGFyYW0pOwoKICAgICAgICAgICAgaWYgKCAhJFRpY2tldElEICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IGNyZWF0ZSB0aWNrZXQgZm9yIFByb2Nlc3Mgd2l0aCBQcm9jZXNzRW50aXR5SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRQcm9jZXNzT2JqZWN0LT5Qcm9jZXNzVGlja2V0UHJvY2Vzc1NldCgKICAgICAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IHNldCBQcm9jZXNzRW50aXR5SUQgIiVzIiBvbiBUaWNrZXRJRCAiJXMiIScsCiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9LCAkVGlja2V0SUQKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFN1Y2Nlc3MgPSB1bmRlZjsKCiAgICAgICAgICAgICRTdWNjZXNzID0gJFByb2Nlc3NPYmplY3QtPlByb2Nlc3NUaWNrZXRBY3Rpdml0eVNldCgKICAgICAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgPT4gJFBhcmFte1Byb2Nlc3NFbnRpdHlJRH0sCiAgICAgICAgICAgICAgICBBY3Rpdml0eUVudGl0eUlEID0+ICRQcm9jZXNzU3RhcnRwb2ludC0+e0FjdGl2aXR5fSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGRuXCd0IHNldCBBY3Rpdml0eUVudGl0eUlEICIlcyIgb24gVGlja2V0SUQgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwgJFRpY2tldElECiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlVGlja2V0ICkgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHN0b3JlIEFjdGl2aXR5RGlhbG9nLCBpbnZhbGlkIFRpY2tldElEOiAlcyEnLCAkVGlja2V0SUQgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICgKCiAgICAgICAgICAgICAgICAjIDIuIHJlbW92ZSAiRHluYW1pY0ZpZWxkXyIgZnJvbSBzdHJpbmcKICAgICAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEZpZWxkID0gJF87CiAgICAgICAgICAgICAgICAgICAgJEZpZWxkID1+IHN7XkR5bmFtaWNGaWVsZF8oLiopfXskMX14bXM7CgogICAgICAgICAgICAgICAgICAgICMgMy4gZ3JlcCBmcm9tIHRoZSBEeW5hbWljRmllbGRDb25maWdzIHRoZSByZXN1bHRpbmcgRHluYW1pY0ZpZWxkcyB3aXRob3V0CiAgICAgICAgICAgICAgICAgICAgIyAiRHluYW1pY0ZpZWxkXyIKICAgICAgICAgICAgICAgICAgICBncmVwIHsgJF8tPntOYW1lfSBlcSAkRmllbGQgfSBAeyREeW5hbWljRmllbGR9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyAxLiBncmVwIGFsbCBEeW5hbWljRmllbGRzCiAgICAgICAgICAgICAgICBncmVwIHtte15EeW5hbWljRmllbGRfKC4qKX14bXN9IEB7ICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkT3JkZXJ9IH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgYW5kIG5vdyBpdCdzIGVhc3ksIGp1c3Qgc3RvcmUgdGhlIGR5bmFtaWMgRmllbGQgVmFsdWVzIDspCiAgICAgICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFRpY2tldFBhcmFteyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbWVtYmVyIG5ldyBjcmVhdGVkIFRpY2tldElECiAgICAgICAgICAgICROZXdUaWNrZXRJRCA9ICRUaWNrZXRJRDsKICAgICAgICB9CiAgICB9CgogICAgIyBJZiB3ZSBoYWQgYSBUaWNrZXRJRCwgZ2V0IHRoZSBUaWNrZXQKICAgIGVsc2UgewoKICAgICAgICAjIEdldCBUaWNrZXQgdG8gY2hlY2sgVGlja2V0SUQgd2FzIHZhbGlkCiAgICAgICAgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVUaWNrZXQgKSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdDb3VsZCBub3Qgc3RvcmUgQWN0aXZpdHlEaWFsb2csIGludmFsaWQgVGlja2V0SUQ6ICVzIScsICRUaWNrZXRJRCApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJEFjdGl2aXR5RW50aXR5SUQgPSAkVGlja2V0ewogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycKICAgICAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCdQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudEFjdGl2aXR5SUQnKQogICAgICAgIH07CiAgICAgICAgaWYgKCAhJEFjdGl2aXR5RW50aXR5SUQgKQogICAgICAgIHsKCiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X1Nob3dEaWFsb2dFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdNaXNzaW5nIEFjdGl2aXR5RW50aXR5SUQgaW4gVGlja2V0ICVzIScsCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGFjdGl2aXR5IGRpYWxvZyB0byBzYXZlIGlzIHN0aWxsIHRoZSBjb3JyZWN0IGFjdGl2aXR5CiAgICAgICAgbXkgJEFjdGl2aXR5ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eScpLT5BY3Rpdml0eUdldCgKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAkQWN0aXZpdHlFbnRpdHlJRCwKICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICA9PiBbJ0N1c3RvbWVySW50ZXJmYWNlJ10sCiAgICAgICAgKTsKICAgICAgICBteSAlQWN0aXZpdHlEaWFsb2dzID0gcmV2ZXJzZSAleyAkQWN0aXZpdHktPntBY3Rpdml0eURpYWxvZ30gLy8ge30gfTsKICAgICAgICBpZiAoICEkQWN0aXZpdHlEaWFsb2dzeyRBY3Rpdml0eURpYWxvZ0VudGl0eUlEfSApIHsKICAgICAgICAgICAgbXkgJFRpY2tldEhvb2sgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKTsKICAgICAgICAgICAgbXkgJFRpY2tldEhvb2tEaXZpZGVyID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2tEaXZpZGVyJyk7CgogICAgICAgICAgICAkRXJyb3J7V3JvbmdBY3Rpdml0eX0gPSAxOwogICAgICAgICAgICBwdXNoIEBOb3RpZnksIHsKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1RoaXMgc3RlcCBkb2VzIG5vdCBiZWxvbmcgYW55bW9yZSB0byB0aGUgY3VycmVudCBhY3Rpdml0eSBpbiBwcm9jZXNzIGZvciB0aWNrZXQgXCclcyVzJXNcJyEgQW5vdGhlciB1c2VyIGNoYW5nZWQgdGhpcyB0aWNrZXQgaW4gdGhlIG1lYW50aW1lLiBQbGVhc2UgY2xvc2UgdGhpcyB3aW5kb3cgYW5kIHJlbG9hZCB0aGUgdGlja2V0LicsCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldEhvb2ssCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldEhvb2tEaXZpZGVyLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAkUHJvY2Vzc0VudGl0eUlEID0gJFRpY2tldHsKICAgICAgICAgICAgJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAuICRDb25maWdPYmplY3QtPkdldCgnUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRQcm9jZXNzSUQnKQogICAgICAgIH07CgogICAgICAgIGlmICggISRQcm9jZXNzRW50aXR5SUQgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fU2hvd0RpYWxvZ0Vycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ01pc3NpbmcgUHJvY2Vzc0VudGl0eUlEIGluIFRpY2tldCAlcyEnLAogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBpZiB3ZSBnb3QgZXJyb3JzIGdvIGJhY2sgdG8gZGlzcGxheWluZyB0aGUgQWN0aXZpdHlEaWFsb2cKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlRXJyb3IgKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9PdXRwdXRBY3Rpdml0eURpYWxvZygKICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEICAgICAgICA9PiAkUHJvY2Vzc0VudGl0eUlELAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgID0+ICRUaWNrZXRJRCB8fCB1bmRlZiwKICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgRXJyb3IgICAgICAgICAgICAgICAgICA9PiBcJUVycm9yLAogICAgICAgICAgICBFcnJvck1lc3NhZ2UgICAgICAgICAgID0+IFwlRXJyb3JNZXNzYWdlLAogICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgIE5vdGlmeSAgICAgICAgICAgICAgICAgPT4gXEBOb3RpZnksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENoZWNrIGlmIHdlIGRlYWwgd2l0aCBhIFRpY2tldCBVcGRhdGUKICAgIG15ICRVcGRhdGVUaWNrZXRJRCA9ICRQYXJhbXtHZXRQYXJhbX0tPntUaWNrZXRJRH07CgogICAgIyBXZSBzYXZlIG9ubHkgb25jZSwgbm8gbWF0dGVyIGlmIG9uZSBvciBtb3JlIGNvbmZpZ3VyYXRpb25zIGFyZSBzZXQgZm9yIHRoZSBzYW1lIHBhcmFtCiAgICBteSAlU3RvcmVkRmllbGRzOwoKICAgICMgU2F2ZSBsb29wIGZvciBzdG9yaW5nIFRpY2tldCBWYWx1ZXMgdGhhdCB3ZXJlIG5vdCByZXF1aXJlZCBvbiB0aGUgaW5pdGlhbCBUaWNrZXRDcmVhdGUKICAgIERJQUxPR0ZJRUxEOgogICAgZm9yIG15ICRDdXJyZW50RmllbGQgKCBAeyAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZE9yZGVyfSB9ICkgewoKICAgICAgICAjIHNvbWUgZmllbGRzIHNob3VsZCBiZSBza2lwcGVkIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICAgICAgbmV4dCBESUFMT0dGSUVMRCBpZiAoIGdyZXAgeyAkXyBlcSAkQ3VycmVudEZpZWxkIH0gQHskU2tpcEZpZWxkc30gKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoICRBY3Rpdml0eURpYWxvZy0+e0ZpZWxkc30tPnskQ3VycmVudEZpZWxkfSApICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAnQ2FuXCd0IGdldCBkYXRhIGZvciBGaWVsZCAiJXMiIG9mIEFjdGl2aXR5RGlhbG9nICIlcyIhJywgJEN1cnJlbnRGaWVsZCwKICAgICAgICAgICAgICAgICAgICAkQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEN1cnJlbnRGaWVsZCA9fiBte15EeW5hbWljRmllbGRfKC4qKX14bXMgKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJDE7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAoIGdyZXAgeyAkXy0+e05hbWV9IGVxICREeW5hbWljRmllbGROYW1lIH0gQHskRHluYW1pY0ZpZWxkfSApWzBdOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CgogICAgICAgICAgICAgICAgbXkgJE1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICJEeW5hbWljRmllbGRDb25maWcgbWlzc2luZyBmb3IgZmllbGQ6ICRQYXJhbXtGaWVsZE5hbWV9LCBvciBpcyBub3QgYSBUaWNrZXQgRHluYW1pYyBGaWVsZCEiOwoKICAgICAgICAgICAgICAgICMgbG9nIGVycm9yIGJ1dCBkb2VzIG5vdCBzdG9wIHRoZSBleGVjdXRpb24gYXMgaXQgY291bGQgYmUgYW4gb2xkIEFydGljbGUKICAgICAgICAgICAgICAgICMgRHluYW1pY0ZpZWxkLCBzZWUgYnVnIzExNjY2CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRNZXNzYWdlLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGlja2V0UGFyYW17JEN1cnJlbnRGaWVsZH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IHNldCBEeW5hbWljRmllbGQgdmFsdWUgZm9yICVzIG9mIFRpY2tldCB3aXRoIElEICIlcyIgaW4gQWN0aXZpdHlEaWFsb2cgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLCAkVGlja2V0SUQsICRBY3Rpdml0eURpYWxvZ0VudGl0eUlECiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkQ3VycmVudEZpZWxkIGVxICdBcnRpY2xlJyAmJiAoICRVcGRhdGVUaWNrZXRJRCB8fCAkTmV3VGlja2V0SUQgKSApIHsKCiAgICAgICAgICAgIG15ICRUaWNrZXRJRCA9ICRVcGRhdGVUaWNrZXRJRCB8fCAkTmV3VGlja2V0SUQ7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX0tPntTdWJqZWN0fSAmJiAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0gKSB7CgogICAgICAgICAgICAgICAgIyBhZGQgbm90ZQogICAgICAgICAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgICAgICAgICAgbXkgJE1pbWVUeXBlICA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0gPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQ29tbXVuaWNhdGlvbkNoYW5uZWwgPSAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57QXJ0aWNsZX0tPntDb25maWd9LT57Q29tbXVuaWNhdGlvbkNoYW5uZWx9CiAgICAgICAgICAgICAgICAgICAgLy8gJ0ludGVybmFsJzsKCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JDaGFubmVsKAogICAgICAgICAgICAgICAgICAgIENoYW5uZWxOYW1lID0+ICRDb21tdW5pY2F0aW9uQ2hhbm5lbCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBDaGFuZ2UgaGlzdG9yeSB0eXBlIGFuZCBjb21tZW50IGFjY29yZGluZ2x5IHRvIHRoZSBwcm9jZXNzIGFydGljbGUuCiAgICAgICAgICAgICAgICAjIEluaXRpYWwgaW50ZXJuYWwgc2hvdWxkIGJlIGEgd2ViIHJlcXVlc3QsIHdoaWxlIGZvbGxvdy11cHMgc2hvdWxkIGJlIG5vdGVzCiAgICAgICAgICAgICAgICBteSAkSGlzdG9yeVR5cGUgICAgPSAnV2ViUmVxdWVzdEN1c3RvbWVyJzsKICAgICAgICAgICAgICAgIG15ICRIaXN0b3J5Q29tbWVudCA9ICclJSc7CiAgICAgICAgICAgICAgICBpZiAoICRDb21tdW5pY2F0aW9uQ2hhbm5lbCBlcSAnUGhvbmUnICkgewogICAgICAgICAgICAgICAgICAgICRIaXN0b3J5VHlwZSA9ICdQaG9uZUNhbGxDdXN0b21lcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoJFVwZGF0ZVRpY2tldElEKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlUeXBlID0gJ0ZvbGxvd1VwJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkRnJvbSA9ICIkU2VsZi0+e1VzZXJGdWxsbmFtZX0gPCRTZWxmLT57VXNlckVtYWlsfT4iOwogICAgICAgICAgICAgICAgJEFydGljbGVJRCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJ2N1c3RvbWVyJywKICAgICAgICAgICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57QXJ0aWNsZX0tPntDb25maWd9LT57SXNWaXNpYmxlRm9yQ3VzdG9tZXJ9IC8vIDAsCiAgICAgICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJEhpc3RvcnlUeXBlLAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICRIaXN0b3J5Q29tbWVudCwKICAgICAgICAgICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJFBhcmFte0dldFBhcmFtfS0+e1N1YmplY3R9LAogICAgICAgICAgICAgICAgICAgIEZvcmNlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gJEFjdGl2aXR5RGlhbG9nLT57RmllbGRzfS0+e0FydGljbGV9LT57Q29uZmlnfS0+e0luZm9ybUFnZW50c30KICAgICAgICAgICAgICAgICAgICA/ICRQYXJhbXtHZXRQYXJhbX17SW5mb3JtVXNlcklEfQogICAgICAgICAgICAgICAgICAgIDogW10sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvclNjcmVlbigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgICAgIFBhcmFtID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAQXR0YWNobWVudHMsIFwlVXBsb2FkU3R1ZmY7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAgICAgICAgICMgc2tpcCwgZGVsZXRlZCBub3QgdXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+e0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBhdHRhY2htZW50IGlmIG5vdCBsaW5rZWQgaW4gYm9keQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtHZXRQYXJhbX0tPntCb2R5fSAhfiAvKFxRJENvbnRlbnRJREhUTUxRdW90ZVxFfFxRJENvbnRlbnRJRFxFKS9pICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHdyaXRlIGV4aXN0aW5nIGZpbGUgdG8gYmFja2VuZAogICAgICAgICAgICAgICAgICAgICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0dGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIElmIHdlIGhhdmUgdG8gVXBkYXRlIGEgdGlja2V0LCB1cGRhdGUgdGhlIHRyYW5zbWl0dGVkIHZhbHVlcwogICAgICAgIGVsc2lmICgkVXBkYXRlVGlja2V0SUQpIHsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzOwogICAgICAgICAgICBpZiAoICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IGVxICdUaXRsZScgKSB7CgogICAgICAgICAgICAgICAgIyBpZiB0aGVyZSBpcyBubyB0aXRsZSwgbm90aGlnIGlzIG5lZWRlZCB0byBiZSBkb25lCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgIWRlZmluZWQgJFRpY2tldFBhcmFteydUaXRsZSd9CiAgICAgICAgICAgICAgICAgICAgfHwgKCBkZWZpbmVkICRUaWNrZXRQYXJhbXsnVGl0bGUnfSAmJiAkVGlja2V0UGFyYW17J1RpdGxlJ30gZXEgJycgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBvdGhlcndpc2Ugc2V0IHRoZSB0aWNrZXQgdGl0bGUKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRUaWNrZXRQYXJhbXsnVGl0bGUnfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e05hbWVUb0lEfS0+eyRDdXJyZW50RmllbGR9IGVxICdDdXN0b21lcklEJwogICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH0gZXEgJ0N1c3RvbWVyVXNlcklEJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICAgICAgaWYgKCAkQWN0aXZpdHlEaWFsb2ctPntGaWVsZHN9LT57JEN1cnJlbnRGaWVsZH17RGlzcGxheX0gPT0gMSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dyb25nIEFjdGl2aXR5RGlhbG9nIEZpZWxkIGNvbmZpZzogJXMgY2FuXCd0IGJlIERpc3BsYXkgPT4gMSAvIFNob3cgZmllbGQgKFBsZWFzZSBjaGFuZ2UgaXRzIGNvbmZpZ3VyYXRpb24gdG8gYmUgRGlzcGxheSA9PiAwIC8gRG8gbm90IHNob3cgZmllbGQgb3IgRGlzcGxheSA9PiAyIC8gU2hvdyBmaWVsZCBhcyBtYW5kYXRvcnkpIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNraXAgVGlja2V0Q3VzdG9tZXJTZXQoKSBpZiB0aGVyZSBpcyBubyBjaGFuZ2UgaW4gdGhlIGN1c3RvbWVyCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFRpY2tldHtDdXN0b21lcklEfSBlcSAkVGlja2V0UGFyYW17Q3VzdG9tZXJJRH0KICAgICAgICAgICAgICAgICAgICAmJiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSBlcSAkVGlja2V0UGFyYW17Q3VzdG9tZXJVc2VyfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgIyBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byBjYWxsIGFueSBhZGRpdGlvbmFsIHN0b3JlcwogICAgICAgICAgICAgICAgICAgICMgb24gQ3VzdG9tZXIsIEN1c3RvbWVyTm8sIEN1c3RvbWVySUQgb3IgQ3VzdG9tZXJVc2VySUQKICAgICAgICAgICAgICAgICAgICAjIHNvIG1ha2Ugc3VyZSBib3RoIGZpZWxkcyBhcmUgc2V0IHRvICJTdG9yZWQiIDspCiAgICAgICAgICAgICAgICAgICAgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnsnQ3VzdG9tZXJJRCd9IH0gICAgID0gMTsKICAgICAgICAgICAgICAgICAgICAkU3RvcmVkRmllbGRzeyAkU2VsZi0+e05hbWVUb0lEfS0+eydDdXN0b21lclVzZXJJRCd9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgIG5leHQgRElBTE9HRklFTEQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDdXN0b21lclNldCgKICAgICAgICAgICAgICAgICAgICBObyA9PiAkVGlja2V0UGFyYW17Q3VzdG9tZXJJRH0sCgogICAgICAgICAgICAgICAgICAgICMgaGVyZSB0b286IHVuZm9ydHVuYXRlbHkgVGlja2V0Q3JlYXRlIHRha2VzIFBhcmFtICdDdXN0b21lclVzZXInCiAgICAgICAgICAgICAgICAgICAgIyBpbnN0ZWFkIG9mIEN1c3RvbWVyVXNlcklELCBzbyBvdXIgVGlja2V0UGFyYW0gaGFzaAogICAgICAgICAgICAgICAgICAgICMgaGFzIHRoZSBDdXN0b21lclVzZXIgS2V5IGluc3RlYWQgb2YgJ0N1c3RvbWVyVXNlcklEJwogICAgICAgICAgICAgICAgICAgIFVzZXIgICAgID0+ICRUaWNrZXRQYXJhbXtDdXN0b21lclVzZXJ9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBJbiB0aGlzIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byBjYWxsIGFueSBhZGRpdGlvbmFsIHN0b3JlcwogICAgICAgICAgICAgICAgIyBvbiBDdXN0b21lciwgQ3VzdG9tZXJObywgQ3VzdG9tZXJJRCBvciBDdXN0b21lclVzZXJJRAogICAgICAgICAgICAgICAgIyBzbyBtYWtlIHN1cmUgYm90aCBmaWVsZHMgYXJlIHNldCB0byAiU3RvcmVkIiA7KQogICAgICAgICAgICAgICAgJFN0b3JlZEZpZWxkc3sgJFNlbGYtPntOYW1lVG9JRH0tPnsnQ3VzdG9tZXJJRCd9IH0gICAgID0gMTsKICAgICAgICAgICAgICAgICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9LT57J0N1c3RvbWVyVXNlcklEJ30gfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0IERJQUxPR0ZJRUxEIGlmICRTdG9yZWRGaWVsZHN7ICRTZWxmLT57TmFtZVRvSUR9eyRDdXJyZW50RmllbGR9IH07CgogICAgICAgICAgICAgICAgbXkgJFRpY2tldEZpZWxkU2V0U3ViID0gJEN1cnJlbnRGaWVsZDsKICAgICAgICAgICAgICAgICRUaWNrZXRGaWVsZFNldFN1YiA9fiBze0lEJH17fXhtczsKICAgICAgICAgICAgICAgICRUaWNrZXRGaWVsZFNldFN1YiA9ICdUaWNrZXQnIC4gJFRpY2tldEZpZWxkU2V0U3ViIC4gJ1NldCc7CgogICAgICAgICAgICAgICAgaWYgKCAkVGlja2V0T2JqZWN0LT5jYW4oJFRpY2tldEZpZWxkU2V0U3ViKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFVwZGF0ZUZpZWxkTmFtZTsKCiAgICAgICAgICAgICAgICAgICAgJFVwZGF0ZUZpZWxkTmFtZSA9ICRTZWxmLT57TmFtZVRvSUR9LT57JEN1cnJlbnRGaWVsZH07CgogICAgICAgICAgICAgICAgICAgICMgdG8gc3RvcmUgaWYgdGhlIGZpZWxkIG5lZWRzIHRvIGJlIHVwZGF0ZWQKICAgICAgICAgICAgICAgICAgICBteSAkRmllbGRVcGRhdGU7CgogICAgICAgICAgICAgICAgICAgICMgb25seSBTZXJ2aWNlIGFuZCBTTEEgZmllbGRzIGFjY2VwdHMgZW1wdHkgdmFsdWVzIGlmIHRoZSBoYXNoIGtleSBpcyBub3QKICAgICAgICAgICAgICAgICAgICAjIGRlZmluZWQgc2V0IGl0IHRvIGVtcHR5IHNvIHRoZSBUaWNrZXQqU2V0IGZ1bmN0aW9uIGNhbGwgd2lsbCBnZXQgdGhlIGVtcHR5CiAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZQogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgKCAkVXBkYXRlRmllbGROYW1lIGVxICdTZXJ2aWNlSUQnIHx8ICRVcGRhdGVGaWVsZE5hbWUgZXEgJ1NMQUlEJyApCiAgICAgICAgICAgICAgICAgICAgICAgICYmICFkZWZpbmVkICRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRGaWVsZFVwZGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHVwZGF0ZSBTZXJ2aWNlIGFuIFNMQSBmaWVsZHMgaWYgdGhleSBoYXZlIGEgZGVmaW5lZCB2YWx1ZSAoZXZlbiBlbXB0eSkKICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRVcGRhdGVGaWVsZE5hbWUgZXEgJ1NlcnZpY2VJRCcgfHwgJFVwZGF0ZUZpZWxkTmFtZSBlcSAnU0xBSUQnICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGaWVsZFVwZGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHVwZGF0ZSBhbnkgb3RoZXIgZmllbGQgdGhhdCBpdHMgdmFsdWUgaXMgZGVmaW5lZCBhbmQgbm90IGVtcHR5CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkVXBkYXRlRmllbGROYW1lIG5lICdTZXJ2aWNlSUQnCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRVcGRhdGVGaWVsZE5hbWUgbmUgJ1NMQUlEJwogICAgICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9IG5lICcnCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGaWVsZFVwZGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkU3VjY2VzcyA9IDE7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgbmVlZHMgdG8gYmUgdXBkYXRlZAogICAgICAgICAgICAgICAgICAgIGlmICgkRmllbGRVcGRhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT4kVGlja2V0RmllbGRTZXRTdWIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVXBkYXRlRmllbGROYW1lID0+ICRUaWNrZXRQYXJhbXsgJFNlbGYtPntOYW1lVG9JRH0tPnskQ3VycmVudEZpZWxkfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBzZXQgJXMgZm9yIFRpY2tldCB3aXRoIElEICIlcyIgaW4gQWN0aXZpdHlEaWFsb2cgIiVzIiEnLAogICAgICAgICAgICAgICAgICAgICAgICAkQ3VycmVudEZpZWxkLCAkVGlja2V0SUQsICRBY3Rpdml0eURpYWxvZ0VudGl0eUlECiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBUcmFuc2l0aW9ucyB3aWxsIGJlIGhhbmRsZWQgYnkgdGlja2V0IGV2ZW50IG1vZHVsZSAoVGlja2V0UHJvY2Vzc1RyYW5zaXRpb25zLnBtKS4KCiAgICAjIGlmIHdlIHdlcmUgdXBkYXRpbmcgYSB0aWNrZXQsIGNsb3NlIHRoZSBwb3B1cCBhbmQgcmV0dXJuIHRvIHpvb20KICAgICMgZWxzZSAobmV3IHRpY2tldCkganVzdCBnbyB0byB6b29tIHRvIHNob3cgdGhlIG5ldyB0aWNrZXQKICAgIGlmICgkVXBkYXRlVGlja2V0SUQpIHsKCiAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgVVJMID0+ICJBY3Rpb249Q3VzdG9tZXJUaWNrZXRab29tO1RpY2tldElEPSRVcGRhdGVUaWNrZXRJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgT1AgPT4gIkFjdGlvbj1DdXN0b21lclRpY2tldFpvb207VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICk7Cn0KCnN1YiBfRGlzcGxheVByb2Nlc3NMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBJZiB3ZSBoYXZlIGEgUHJvY2Vzc0VudGl0eUlECiAgICAkUGFyYW17RXJyb3JzfS0+e1Byb2Nlc3NFbnRpdHlJREludmFsaWR9ID0gJyBTZXJ2ZXJFcnJvcicKICAgICAgICBpZiAoICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9ICYmICEkUGFyYW17UHJvY2Vzc0xpc3R9LT57ICRQYXJhbXtQcm9jZXNzRW50aXR5SUR9IH0gKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRQYXJhbXtQcm9jZXNzTGlzdH0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9LT57UHJvY2Vzc0VudGl0eUlESW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtQcm9jZXNzTGlzdH0sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICdQcm9jZXNzRW50aXR5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17UHJvY2Vzc0VudGl0eUlEfSwKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICBBdXRvQ29tcGxldGUgPT4gJ29mZicsCiAgICApOwoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkU2VsZi0+e0NvbmZpZ30tPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJFNlbGYtPntDb25maWd9LT57UmljaFRleHRXaWR0aH0gIHx8IDA7CgogICAgICAgICMgc2V0IHVwIGN1c3RvbWVyIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lclNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17UHJlU2VsZWN0UHJvY2Vzc30gJiYgJFBhcmFte1Byb2Nlc3NJRH0gKSB7CgogICAgICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnUHJlU2VsZWN0ZWRQcm9jZXNzSUQnLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17UHJvY2Vzc0lEfSwKICAgICAgICApOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NMaXN0JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgIH0sCiAgICApOwogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTmF2aWdhdGlvbkJhcigpOwoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJUaWNrZXRQcm9jZXNzJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyB3b3JrYXJvdW5kIHdoZW4gYWN0aXZpdHkgZGlhbG9nIGlzIGxvYWRlZCBieSBBSkFYIGFzIGZpcnN0IGFjdGl2aXR5IGRpYWxvZywgaWYgdGhlcmUgaXMKICAgICMgYSBkYXRlIGZpZWxkIGxpa2UgUGVuZGluZyBUaW1lIG9yIER5bmFtaWMgRmllbGRzIERhdGUvVGltZSBvciBEYXRlLCB0aGVyZSBpcyBubyB3YXkgdG8gc2V0CiAgICAjIHRoaXMgb3B0aW9ucyBpbiB0aGUgZm9vdGVyIGFnYWluCiAgICAkTGF5b3V0T2JqZWN0LT57SGFzRGF0ZXBpY2tlcn0gPSAxOwoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKIyA9aXRlbSBfQ2hlY2tGaWVsZCgpCiMKIyBjaGVja3MgYWxsIHRoZSBwb3NzaWJsZSB0aWNrZXQgZmllbGRzIGFuZCByZXR1cm5zIHRoZSBJRCAoaWYgcG9zc2libGUpIHZhbHVlIG9mIHRoZSBmaWVsZCwgaWYgdmFsaWQKIyBhbmQgY2hlY2tzIGFyZSBzdWNjZXNzZnVsbAojCiMgaWYgRGlzcGxheSBwYXJhbSBpcyBzZXQgdG8gMCBvciBub3QgZ2l2ZW4sIGl0IHVzZXMgQWN0aXZpdHlEaWFsb2cgZmllbGQgZGVmYXVsdCB2YWx1ZSBmb3IgYWxsIGZpZWxkcwojIG9yIGdsb2JhbCBkZWZhdWx0IHZhbHVlIGFzIGZhbGxiYWNrIG9ubHkgZm9yIGNlcnRhaW4gZmllbGRzCiMKIyBpZiBEaXNwbGF5IHBhcmFtIGlzIHNldCB0byAxIG9yIDIgaXQgdXNlcyB0aGUgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKIwojICAgICBteSAkUHJpb3JpdHlJRCA9ICRDdXN0b21lclRpY2tldFByb2Nlc3NPYmplY3QtPl9DaGVja0ZpZWxkKAojICAgICAgICAgRmllbGQgICAgICAgID0+ICdQcmlvcml0eUlEJywKIyAgICAgICAgIERpc3BsYXkgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsLCAwIG9yIDEgb3IgMgojICAgICAgICAgRGVmYXVsdFZhbHVlID0+ICczIG5vcm1hbCcsICAgICAgICAgICMgQWN0aXZpdHlEaWFsb2cgZmllbGQgZGVmYXVsdCB2YWx1ZSAoaXQgdXNlcyBnbG9iYWwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIGRlZmF1bHQgdmFsdWUgYXMgZmFsbCBiYWNrIGZvciBtYW5kYXRvcnkgZmllbGRzCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAoUXVldWUsIFNhdGUsIExvY2sgYW5kIFByaW9yaXR5KQojICAgICApOwojCiMgUmV0dXJuczoKIyAgICAgJFByaW9yaXR5SUQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIFByaW9yaXR5SUQgaXMgc2V0IHRvIDEgaW4gdGhlIHdlYiByZXF1ZXN0CiMKIyAgICAgbXkgJFByaW9yaXR5SUQgPSAkQ3VzdG9tZXJUaWNrZXRQcm9jZXNzT2JqZWN0LT5fQ2hlY2tGaWVsZCgKIyAgICAgICAgIEZpZWxkICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiMgICAgICAgICBEaXNwbGF5ICAgICAgPT4gMCwKIyAgICAgICAgIERlZmF1bHRWYWx1ZSA9PiAnMyBub3JtYWwnLAojICAgICApOwojCiMgUmV0dXJuczoKIyAgICAgJFByaW9yaXR5SUQgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICMgc2luY2UgQWN0aXZpdHlEaWFsb2cgZGVmYXVsdCB2YWx1ZSBpcyAnMyBub3JtYWwnIGFuZAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgZmllbGQgaXMgaGlkZGVuCiMKIyA9Y3V0CgpzdWIgX0NoZWNrRmllbGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZpZWxkKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyByZW1vdmUgdGhlIElEIGFuZCBjaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgaXMgcmVxdWlyZWQgZm9yIGNyZWF0aW5nIGEgdGlja2V0CiAgICBteSAkRmllbGRXaXRob3V0SUQgPSAkUGFyYW17RmllbGR9OwogICAgJEZpZWxkV2l0aG91dElEID1+IHN7SUQkfXt9eG1zOwogICAgbXkgJFRpY2tldFJlcXVpcmVkRmllbGQgPSBzY2FsYXIgZ3JlcCB7ICRfIGVxICRGaWVsZFdpdGhvdXRJRCB9IHF3KFF1ZXVlIFN0YXRlIExvY2sgUHJpb3JpdHkpOwoKICAgIG15ICRWYWx1ZTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBpZiBubyBEaXNwbGF5IChvciBEaXNwbGF5ID09IDApIGlzIGNvbW1pdGVkCiAgICBpZiAoICEkUGFyYW17RGlzcGxheX0gKSB7CgogICAgICAgICMgQ2hlY2sgaWYgYSBEZWZhdWx0VmFsdWUgaXMgZ2l2ZW4KICAgICAgICBpZiAoICRQYXJhbXtEZWZhdWx0VmFsdWV9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgcGFyYW0gaXMgdmFsaWQKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPl9Mb29rdXBWYWx1ZSgKICAgICAgICAgICAgICAgIEZpZWxkID0+ICRGaWVsZFdpdGhvdXRJRCwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbXtEZWZhdWx0VmFsdWV9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB3ZSBnb3QgYSByZXF1aXJlZCB0aWNrZXQgZmllbGQsIGNoZWNrIGlmIHdlIGdvdCBhIHZhbGlkIERlZmF1bHRWYWx1ZSBpbiB0aGUgU3lzQ29uZmlnCiAgICAgICAgaWYgKCAhJFZhbHVlICYmICRUaWNrZXRSZXF1aXJlZEZpZWxkICkgewogICAgICAgICAgICAkVmFsdWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoIlByb2Nlc3M6OkRlZmF1bHQkRmllbGRXaXRob3V0SUQiKTsKCiAgICAgICAgICAgIGlmICggISRWYWx1ZSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0KICAgICAgICAgICAgICAgICAgICAgICAgLT5UcmFuc2xhdGUoICdEZWZhdWx0IENvbmZpZyBmb3IgUHJvY2Vzczo6RGVmYXVsdCVzIG1pc3NpbmchJywgJEZpZWxkV2l0aG91dElEICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIGdpdmVuIGZpZWxkIHBhcmFtIGlzIHZhbGlkCiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+X0xvb2t1cFZhbHVlKAogICAgICAgICAgICAgICAgICAgIEZpZWxkID0+ICRGaWVsZFdpdGhvdXRJRCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFZhbHVlICkgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRyYW5zbGF0ZSggJ0RlZmF1bHQgQ29uZmlnIGZvciBQcm9jZXNzOjpEZWZhdWx0JXMgaW52YWxpZCEnLCAkRmllbGRXaXRob3V0SUQgKSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17RGlzcGxheX0gPT0gMSApIHsKCiAgICAgICAgIyBEaXNwbGF5ID09IDEgaXMgbG9naWNhbGl5IG5vdCBwb3NzaWJsZSBmb3IgYSB0aWNrZXQgcmVxdWlyZWQgZmllbGQKICAgICAgICBpZiAoJFRpY2tldFJlcXVpcmVkRmllbGQpIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1dyb25nIEFjdGl2aXR5RGlhbG9nIEZpZWxkIGNvbmZpZzogJXMgY2FuXCd0IGJlIERpc3BsYXkgPT4gMSAvIFNob3cgZmllbGQgKFBsZWFzZSBjaGFuZ2UgaXRzIGNvbmZpZ3VyYXRpb24gdG8gYmUgRGlzcGxheSA9PiAwIC8gRG8gbm90IHNob3cgZmllbGQgb3IgRGlzcGxheSA9PiAyIC8gU2hvdyBmaWVsZCBhcyBtYW5kYXRvcnkpIScsCiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0ZpZWxkfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgdGhlIGdpdmVuIGZpZWxkIHBhcmFtIGlzIHZhbGlkCiAgICAgICAgaWYgKCAkUGFyYW17RmllbGR9IGVxICdBcnRpY2xlJyApIHsKCiAgICAgICAgICAgICMgaW4gY2FzZSBvZiBhcnRpY2xlIGZpZWxkcyB3ZSBuZWVkIHRvIGZha2UgYSB2YWx1ZQogICAgICAgICAgICAkVmFsdWUgPSAxOwoKICAgICAgICAgICAgbXkgKCAkQm9keSwgJFN1YmplY3QsICRBdHRhY2htZW50RXhpc3RzICkgPSAoCiAgICAgICAgICAgICAgICAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQm9keScgKSwKICAgICAgICAgICAgICAgICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJqZWN0JyApLAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRFeGlzdHMnICkKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgSWYgYXR0YWNobWVudCBleGlzdHMgYW5kIGJvZHkgYW5kIHN1YmplY3Qgbm90LCBpdCBpcyBlcnJvciAoc2VlIGJ1ZyMxMzA4MSkuCiAgICAgICAgICAgIGlmICggJEF0dGFjaG1lbnRFeGlzdHMgJiYgKCAhJEJvZHkgJiYgISRTdWJqZWN0ICkgKSB7CiAgICAgICAgICAgICAgICAkVmFsdWUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPl9Mb29rdXBWYWx1ZSgKICAgICAgICAgICAgICAgIEZpZWxkID0+ICRQYXJhbXtGaWVsZH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17RmllbGR9ICkgfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17RGlzcGxheX0gPT0gMiApIHsKCiAgICAgICAgIyBjaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgcGFyYW0gaXMgdmFsaWQKICAgICAgICBpZiAoICRQYXJhbXtGaWVsZH0gZXEgJ0FydGljbGUnICkgewoKICAgICAgICAgICAgbXkgKCAkQm9keSwgJFN1YmplY3QgKSA9ICgKICAgICAgICAgICAgICAgICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdCb2R5JyApLAogICAgICAgICAgICAgICAgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1YmplY3QnICkKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRWYWx1ZSA9IDA7CiAgICAgICAgICAgIGlmICggJEJvZHkgJiYgJFN1YmplY3QgKSB7CiAgICAgICAgICAgICAgICAkVmFsdWUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+X0xvb2t1cFZhbHVlKAogICAgICAgICAgICAgICAgRmllbGQgPT4gJFBhcmFte0ZpZWxkfSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtGaWVsZH0gKSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKIyA9aXRlbSBfTG9va3VwVmFsdWUoKQojCiMgcmV0dXJucyB0aGUgSUQgKGlmIHBvc3NpYmxlKSBvZiBuZWFybHkgYWxsIHRpY2tldCBmaWVsZHMgYW5kL29yIGNoZWNrcyBpZiBpdHMgdmFsaWQuCiMgQ2FuIGhhbmRsZSBJRHMgb3IgU3RyaW5ncy4KIyBDdXJyZW50bHkgd29ya2luZyB3aXRoOiBTdGF0ZSwgUXVldWUsIExvY2ssIFByaW9yaXR5IChwb3NzaWJsZSBtb3JlKS4KIwojICAgICBteSAkUHJpb3JpdHlJRCA9ICRDdXN0b21lclRpY2tldFByb2Nlc3NPYmplY3QtPl9Mb29rdXBWYWx1ZSgKIyAgICAgICAgIFByaW9yaXR5SUQgPT4gMSwKIyAgICAgKTsKIyAgICAgJFByaW9yaXR5SUQgPSAxOwojCiMgICAgIG15ICRTdGF0ZUlEID0gJEN1c3RvbWVyVGlja2V0UHJvY2Vzc09iamVjdC0+X0xvb2t1cFZhbHVlKAojICAgICAgICAgU3RhdGUgPT4gJ29wZW4nLAojICAgICApOwojICAgICAkU3RhdGVJRCA9IDM7CiMKIyAgICAgbXkgJFByaW9yaXR5SUQgPSAkQ3VzdG9tZXJUaWNrZXRQcm9jZXNzT2JqZWN0LT5fTG9va3VwVmFsdWUoCiMgICAgICAgICBQcmlvcml0eSA9PiAndW5rbm93bnByaW9yaXR5MTIzNCcsCiMgICAgICk7CiMgICAgICRQcmlvcml0eUlEID0gdW5kZWY7CiMKIyA9Y3V0CgpzdWIgX0xvb2t1cFZhbHVlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEZpZWxkIFZhbHVlKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFBhcmFte0ZpZWxkfSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGaWVsZCBzaG91bGQgbm90IGJlIGVtcHR5ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGlmIHRoZXJlIGlzIG5vIHZhbHVlLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCiAgICByZXR1cm4gaWYgISRQYXJhbXtWYWx1ZX07CgogICAgIyByZW1vdmUgdGhlIElEIGZvciBmdW5jdGlvbiBuYW1lIHB1cnBvc2UKICAgIG15ICRGaWVsZFdpdGhvdXRJRCA9ICRQYXJhbXtGaWVsZH07CiAgICAkRmllbGRXaXRob3V0SUQgPX4gc3tJRCR9e314bXM7CgogICAgbXkgJExvb2t1cEZpZWxkTmFtZTsKICAgIG15ICRPYmplY3ROYW1lOwogICAgbXkgJEZ1bmN0aW9uTmFtZTsKCiAgICAjIHNlcnZpY2UgYW5kIFNMQSBsb29rdXAgbmVlZHMgTmFtZSBhcyBwYXJhbWV0ZXIgKFdoaWxlIFNlcnZpY2VJRCBhbiBTTEFJRCB1c2VzIHN0YW5kYXJkKQogICAgaWYgKCBzY2FsYXIgZ3JlcCB7ICRQYXJhbXtGaWVsZH0gZXEgJF8gfSBxdyggU2VydmljZSBTTEEgKSApIHsKICAgICAgICAkTG9va3VwRmllbGROYW1lID0gJ05hbWUnOwogICAgICAgICRPYmplY3ROYW1lICAgICAgPSAkRmllbGRXaXRob3V0SUQ7CiAgICAgICAgJEZ1bmN0aW9uTmFtZSAgICA9ICRGaWVsZFdpdGhvdXRJRCAuICdMb29rdXAnOwogICAgfQoKICAgICMgb3RoZXIgZmllbGRzIGNhbiB1c2Ugc3RhbmRhcmQgcGFyYW1ldGVyIG5hbWVzIGFzIFByaW9yaXR5IG9yIFByaW9yaXR5SUQKICAgIGVsc2UgewogICAgICAgICRMb29rdXBGaWVsZE5hbWUgPSAkUGFyYW17RmllbGR9OwogICAgICAgICRPYmplY3ROYW1lICAgICAgPSAkRmllbGRXaXRob3V0SUQ7CiAgICAgICAgJEZ1bmN0aW9uTmFtZSAgICA9ICRGaWVsZFdpdGhvdXRJRCAuICdMb29rdXAnOwogICAgfQoKICAgIG15ICRWYWx1ZTsKCiAgICBteSAkRmllbGRPYmplY3Q7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6JyAuICRPYmplY3ROYW1lLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICRGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoICdLZXJuZWw6OlN5c3RlbTo6JyAuICRPYmplY3ROYW1lICk7CiAgICB9CgogICAgIyBjaGVjayBpZiB0aGUgYmFja2VuZCBtb2R1bGUgaGFzIHRoZSBuZWVkZWQgKkxvb2t1cCBzdWIKICAgIGlmICggJEZpZWxkT2JqZWN0ICYmICRGaWVsZE9iamVjdC0+Y2FuKCRGdW5jdGlvbk5hbWUpICkgewoKICAgICAgICAjIGNhbGwgdGhlICpMb29rdXAgc3ViIGFuZCBnZXQgdGhlIHZhbHVlCiAgICAgICAgJFZhbHVlID0gJEZpZWxkT2JqZWN0LT4kRnVuY3Rpb25OYW1lKAogICAgICAgICAgICAkTG9va3VwRmllbGROYW1lID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGlmIHdlIGRpZG4ndCBoYXZlIGFuIG9iamVjdCBhbmQgdGhlIHZhbHVlIGhhcyBubyByZWYgYSBzdHJpbmcgZS5nLiBUaXRsZSBhbmQgc28gb24KICAgICMgcmV0dXJuIHRydWUKICAgIGVsc2lmICggJFBhcmFte0ZpZWxkfSBlcSAkRmllbGRXaXRob3V0SUQgJiYgIXJlZiAkUGFyYW17VmFsdWV9ICkgewogICAgICAgIHJldHVybiAkUGFyYW17VmFsdWV9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRXJyb3Igd2hpbGUgY2hlY2tpbmcgd2l0aCAiIC4gJEZpZWxkV2l0aG91dElEIC4gIk9iamVjdCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGlmICggISRWYWx1ZSApOwoKICAgICMgcmV0dXJuIHRoZSBnaXZlbiBJRCB2YWx1ZSBpZiB0aGUgKkxvb2t1cCByZXN1bHQgd2FzIGEgc3RyaW5nCiAgICBpZiAoICRQYXJhbXtGaWVsZH0gbmUgJEZpZWxkV2l0aG91dElEICkgewogICAgICAgIHJldHVybiAkUGFyYW17VmFsdWV9OwogICAgfQoKICAgICMgcmV0dXJuIHRoZSAqTG9va3VwIHN0cmluZyByZXR1cm4gdmFsdWUKICAgIHJldHVybiAkVmFsdWU7Cn0KCnN1YiBfR2V0U0xBcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgcHJlc2VudCwgY29uc2lkZXIgdGhlIGxvZ2dlZCBpbiBjdXN0b21lcgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgfQoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQTsKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gJiYgJFBhcmFte1NlcnZpY2VzfSAmJiAleyAkUGFyYW17U2VydmljZXN9IH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZXN9LT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIG15ICVTZXJ2aWNlOwoKICAgICMgY2hlY2sgbmVlZGVkCiAgICByZXR1cm4gXCVTZXJ2aWNlIGlmICEkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgIyBnZXQgb3B0aW9ucyBmb3IgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgdW5rbm93biBjdXN0b21lcnMKICAgIG15ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lcgogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgcHJlc2VudCwgY29uc2lkZXIgdGhlIGxvZ2dlZCBpbiBjdXN0b21lcgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgfQoKICAgICMgY2hlY2sgaWYgc3RpbGwgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2VsZWN0ZWQKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMCBsZWF2ZSBDdXN0b21lclVzZXJJRCBlbXB0eSwgaXQgd2lsbCBub3QgZ2V0IGFueSBzZXJ2aWNlcwogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAxIHNldCBDdXN0b21lclVzZXJJRCB0byBnZXQgZGVmYXVsdCBzZXJ2aWNlcwogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldFByaW9yaXRpZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlUHJpb3JpdGllczsKCiAgICAjIEluaXRpYWxseSB3ZSBoYXZlIGp1c3QgdGhlIGRlZmF1bHQgUXVldWUgUGFyYW1ldGVyCiAgICAjIHNvIG1ha2Ugc3VyZSB0byBnZXQgdGhlIElEIGluIHRoYXQgY2FzZQogICAgbXkgJFF1ZXVlSUQ7CiAgICBpZiAoICEkUGFyYW17UXVldWVJRH0gJiYgJFBhcmFte1F1ZXVlfSApIHsKICAgICAgICAkUXVldWVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFBhcmFte1F1ZXVlfSApOwogICAgfQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFF1ZXVlSUQgfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlUHJpb3JpdGllcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgfQogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRRdWV1ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdRdWV1ZXM7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSApIHsKICAgICAgICAlTmV3UXVldWVzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpIH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBTZWxlY3Rpb25UeXBlIFF1ZXVlIG9yIFN5c3RlbUFkZHJlc3M/CiAgICAgICAgbXkgJVF1ZXVlczsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgJVF1ZXVlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+TW92ZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAnY3JlYXRlJywKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlUXVldWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc1F1ZXVlTGlzdCgpOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3JlYXRlIHBlcm1pc3Npb24gcXVldWVzCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcpLT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgICAgICBRVUVVRUlEOgogICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQga2V5cyAlUXVldWVzICkgewogICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgUVVFVUVJRCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uU3RyaW5nJykKICAgICAgICAgICAgICAgIHx8ICc8UmVhbG5hbWU+IDw8RW1haWw+PiAtIFF1ZXVlOiA8UXVldWU+JzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZT4vJFF1ZXVlRGF0YXtOYW1lfS9nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlQ29tbWVudD4vJFF1ZXVlRGF0YXtDb21tZW50fS9nOwoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgICRTdHJpbmcgPX4gc3tccytcen17fSBpZiAhJFF1ZXVlRGF0YXtDb21tZW50fTsKCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBuZSAnUXVldWUnICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJVN5c3RlbUFkZHJlc3NEYXRhID0gJFNlbGYtPntTeXN0ZW1BZGRyZXNzfS0+U3lzdGVtQWRkcmVzc0dldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkUXVldWVzeyRRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHMvPFJlYWxuYW1lPi8kU3lzdGVtQWRkcmVzc0RhdGF7UmVhbG5hbWV9L2c7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHMvPEVtYWlsPi8kU3lzdGVtQWRkcmVzc0RhdGF7TmFtZX0vZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTmV3UXVldWVzeyRRdWV1ZUlEfSA9ICRTdHJpbmc7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJU5ld1F1ZXVlczsKfQoKc3ViIF9HZXRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlU3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgJVBhcmFtLAoKICAgICAgICAjIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgbmV3IHByb2Nlc3MgdGlja2V0CiAgICAgICAgUXVldWVJRCAgPT4gJFBhcmFte1F1ZXVlSUR9ICB8fCAxLAogICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0gfHwgJycsCgogICAgICAgICMgcmVtb3ZlIHR5cGUsIHNpbmNlIGlmIFRpY2tldDo6VHlwZSBpcyBhY3RpdmUgaW4gc3lzY29uZmlnLCB0aGUgVHlwZSBwYXJhbWV0ZXIgd2lsbAogICAgICAgICMgYmUgc2VudCBhbmQgdGhlIFRpY2tldFN0YXRlTGlzdCB3aWxsIHNlbmQgdGhlIHBhcmFtZXRlciBhcyBTdGF0ZSBUeXBlCiAgICAgICAgVHlwZSA9PiB1bmRlZiwKCiAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIFwlU3RhdGVzOwp9CgpzdWIgX0dldFR5cGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlVHlwZTsKfQoKc3ViIF9HZXRBSkFYVXBkYXRhYmxlRmllbGRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJURlZmF1bHRVcGRhdGFibGVGaWVsZHMgPSAoCiAgICAgICAgUHJpb3JpdHlJRCAgICA9PiAxLAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gMSwKICAgICAgICBSZXNwb25zaWJsZUlEID0+IDEsCiAgICAgICAgU2VydmljZUlEICAgICA9PiAxLAogICAgICAgIFNMQUlEICAgICAgICAgPT4gMSwKICAgICAgICBTdGF0ZUlEICAgICAgID0+IDEsCiAgICAgICAgT3duZXJJRCAgICAgICA9PiAxLAogICAgICAgIExvY2tJRCAgICAgICAgPT4gMSwKICAgICAgICBUeXBlSUQgICAgICAgID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGJhY2tlbmQgb2JqZWN0CiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgKTsKCiAgICAjIHJlZHVjZSB0aGUgZHluYW1pYyBmaWVsZHMgdG8gb25seSB0aGUgb25lcyB0aGF0IGFyZSBkZXNpbmdlZCBmb3IgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICBteSBAQ3VzdG9tZXJEeW5hbWljRmllbGRzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICBwdXNoIEBDdXN0b21lckR5bmFtaWNGaWVsZHMsICREeW5hbWljRmllbGRDb25maWc7CiAgICB9CiAgICAkRHluYW1pY0ZpZWxkID0gXEBDdXN0b21lckR5bmFtaWNGaWVsZHM7CgogICAgIyBjcmVhdGUgYSBEeW5hbWljRmllbGRMb29rdXBUYWJsZQogICAgbXkgJUR5bmFtaWNGaWVsZExvb2t1cCA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGR9OwoKICAgIG15IEBVcGRhdGFibGVGaWVsZHM7CiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKCBzb3J0IGtleXMgJXsgJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGRzfSB9ICkgewoKICAgICAgICBteSAkRmllbGREYXRhID0gJFBhcmFte0FjdGl2aXR5RGlhbG9nRmllbGRzfS0+eyRGaWVsZH07CgogICAgICAgICMgc2tpcCBoaWRkZW4gZmllbGRzCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhJEZpZWxkRGF0YS0+e0Rpc3BsYXl9OwoKICAgICAgICAjIGZvciBEeW5hbWljIEZpZWxkcyBjaGVjayBpZiBpcyBBSkFYVXBkYXRhYmxlCiAgICAgICAgaWYgKCAkRmllbGQgPX4gbXteRHluYW1pY0ZpZWxkXyguKil9eG1zICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJER5bmFtaWNGaWVsZExvb2t1cHskRmllbGR9OwoKICAgICAgICAgICAgIyBza2lwIGFueSBmaWVsZCB3aXRoIHdyb25nIGNvbmZpZwogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICMgc2tpcCBmaWVsZCBpZiBpcyBub3QgSXNBQ0xSZWR1Y2libGUgKHVwZGF0YWJsZSkKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRklFTEQgaWYgISRJc0FDTFJlZHVjaWJsZTsKCiAgICAgICAgICAgIHB1c2ggQFVwZGF0YWJsZUZpZWxkcywgJEZpZWxkOwogICAgICAgIH0KCiAgICAgICAgIyBmb3IgYWxsIG90aGVycyB1c2UgJURlZmF1bHRVcGRhdGFibGVGaWVsZHMgdGFibGUKICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgc3RhbmRhcml6ZSB0aGUgZmllbGQgbmFtZSAoZS5nLiB1c2UgU3RhdGVJRCBmb3IgU3RhdGUgZmllbGQpCiAgICAgICAgICAgIG15ICRGaWVsZE5hbWUgPSAkU2VsZi0+e05hbWVUb0lEfS0+eyRGaWVsZH07CgogICAgICAgICAgICAjIHNraXAgaWYgZmllbGQgbmFtZSBjb3VsZCBub3QgYmUgY29udmVydGVkICh0aGlzIG1lYW5zIHRoYXQgZmllbGQgaXMgdW5rbm93bikKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhJEZpZWxkTmFtZTsKCiAgICAgICAgICAgICMgc2tpcCBpZiB0aGUgZmllbGQgaXMgbm90IHVwZGF0YWJsZSB2aWEgYWpheAogICAgICAgICAgICBuZXh0IEZJRUxEIGlmICEkRGVmYXVsdFVwZGF0YWJsZUZpZWxkc3skRmllbGROYW1lfTsKCiAgICAgICAgICAgIHB1c2ggQFVwZGF0YWJsZUZpZWxkcywgJEZpZWxkTmFtZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFxAVXBkYXRhYmxlRmllbGRzOwp9CgpzdWIgX0dldEZpZWxkc1RvVXBkYXRlU3RyZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRGaWVsZHNUb1VwZGF0ZSA9ICcnOwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtBSkFYVXBkYXRhYmxlRmllbGRzfSApICkgewogICAgICAgIG15ICRGaXJzdEl0ZW0gPSAxOwogICAgICAgIEZJRUxEOgogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkUGFyYW17QUpBWFVwZGF0YWJsZUZpZWxkc30gfSApIHsKICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAkRmllbGQgZXEgJFBhcmFte1RyaWdnZXJGaWVsZH07CiAgICAgICAgICAgIGlmICgkRmlyc3RJdGVtKSB7CiAgICAgICAgICAgICAgICAkRmlyc3RJdGVtID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRGaWVsZHNUb1VwZGF0ZSAuPSAnLCAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRGaWVsZHNUb1VwZGF0ZSAuPSAiJyIgLiAkRmllbGQgLiAiJyI7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRGaWVsZHNUb1VwZGF0ZTsKfQoKc3ViIF9TaG93RGlhbG9nRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoJVBhcmFtKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZpbHRlckVsZW1lbnRQb3N0OjpJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBkYXRhCiAgICByZXR1cm4gaWYgISRQYXJhbXtEYXRhfTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte0RhdGF9IG5lICdTQ0FMQVInOwogICAgcmV0dXJuIGlmICEkeyAkUGFyYW17RGF0YX0gfTsKICAgIHJldHVybiBpZiAhJFBhcmFte1RlbXBsYXRlRmlsZX07CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgYWxsb3dlZCB0ZW1wbGF0ZSBuYW1lcwogICAgbXkgJFZhbGlkVGVtcGxhdGVzCiAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpPdXRwdXQ6OkZpbHRlckVsZW1lbnRQb3N0JyktPntJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudH0tPntUZW1wbGF0ZXN9OwoKICAgICMgY2hlY2sgdGVtcGxhdGUgbmFtZQogICAgcmV0dXJuIGlmICEkVmFsaWRUZW1wbGF0ZXMtPnsgJFBhcmFte1RlbXBsYXRlRmlsZX0gfTsKCiAgICAjIGhhbmRsaW5nIG9mIEFnZW50VGlja2V0Wm9vbSByZWxhdGVkIElUU00gY2hhbmdlcwogICAgaWYgKCAkUGFyYW17VGVtcGxhdGVGaWxlfSBlcSAnQWdlbnRUaWNrZXRab29tJyApIHsKCiAgICAgICAgIyBnZXQgdGlja2V0IGlkCiAgICAgICAgbXkgJFRpY2tldElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApOwoKICAgICAgICAjIEdldCB0aWNrZXQgYXR0cmlidXRlcy4KICAgICAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICggJFRpY2tldHtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAgICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICAgICAgICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICAgICAgICAgIG9wZXJhdGlvbmFsID0+ICdncmVlbmxlZCcsCiAgICAgICAgICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICAgICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICAgICAgICAgIG15ICVTZXJ2aWNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKS0+U2VydmljZUdldCgKICAgICAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gMSwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFRpY2tldHtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFRyYW5zbGF0ZWRTZXJ2aWNlSW5jaWRlbnRTdGF0ZUxhYmVsCiAgICAgICAgICAgICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnU2VydmljZSBJbmNpZGVudCBTdGF0ZScpOwogICAgICAgICAgICBteSAkVHJhbnNsYXRlZEN1ckluY2lTdGF0ZSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFNlcnZpY2V7Q3VySW5jaVN0YXRlfSApOwoKICAgICAgICAgICAgbXkgJFNlcnZpY2VJbmNpZGVudFN0YXRlSFRNTCA9IDw8IkVORCI7CgogICAgICAgICAgICA8bGFiZWw+JFRyYW5zbGF0ZWRTZXJ2aWNlSW5jaWRlbnRTdGF0ZUxhYmVsOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWcgU21hbGwiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSIkSW5jaVNpZ25hbHN7ICRTZXJ2aWNle0N1ckluY2lTdGF0ZVR5cGV9IH0iIHRpdGxlPSIkVHJhbnNsYXRlZEN1ckluY2lTdGF0ZSI+PC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8c3Bhbj4kVHJhbnNsYXRlZEN1ckluY2lTdGF0ZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CkVORAoKICAgICAgICAgICAgIyBBZGQgbGluayB0byBzZXJ2aWNlIGFuZCBhZGQgU2VydmljZSBpbmNpZGVudCBzdGF0ZS4KICAgICAgICAgICAgbXkgJFRyYW5zbGF0ZWRTZXJ2aWNlTGFiZWwgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1NlcnZpY2UnKTsKICAgICAgICAgICAgJHsgJFBhcmFte0RhdGF9IH0KICAgICAgICAgICAgICAgID1+IHN7KDxsYWJlbD4kVHJhbnNsYXRlZFNlcnZpY2VMYWJlbDo8L2xhYmVsPilbXjw+XSooPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iW148Pl0rIj4pKFtePD5dKyk8L3A+fXskMSQyPGEgaHJlZj0iJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfUFjdGlvbj1BZ2VudElUU01TZXJ2aWNlWm9vbTtTZXJ2aWNlSUQ9JFRpY2tldHtTZXJ2aWNlSUR9OyIgdGFyZ2V0PSJfYmxhbmsiPiQzPC9hPjwvcD5cbiRTZXJ2aWNlSW5jaWRlbnRTdGF0ZUhUTUx9bXM7CgogICAgICAgICAgICAjIEFkZCBsaW5rIHRvIHNsYS4KICAgICAgICAgICAgbXkgJFRyYW5zbGF0ZWRTTEFMYWJlbCA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQnKTsKICAgICAgICAgICAgJHsgJFBhcmFte0RhdGF9IH0KICAgICAgICAgICAgICAgID1+IHN7KDxsYWJlbD4kVHJhbnNsYXRlZFNMQUxhYmVsOjwvbGFiZWw+KVtePD5dKig8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbXjw+XSsiPikoW148Pl0rKTwvcD59eyQxJDI8YSBocmVmPSIkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9QWN0aW9uPUFnZW50SVRTTVNMQVpvb207U0xBSUQ9JFRpY2tldHtTTEFJRH07IiB0YXJnZXQ9Il9ibGFuayI+JDM8L2E+PC9wPn1tczsKICAgICAgICB9CgogICAgICAgICMgTW92ZSBDcml0aWNhbGl0eSBJbXBhY3QgUHJpb3JpdHkgYW5kIG90aGVyIElUU00gRHluYW1pYyBGaWVsZHMgYmVmb3JlIHRoZSBDdXN0b21lcklEIGZpZWxkCiAgICAgICAgZm9yIG15ICRGaWVsZE5hbWUgKAogICAgICAgICAgICAnQ3JpdGljYWxpdHknLAogICAgICAgICAgICAnSW1wYWN0JywKICAgICAgICAgICAgJ1ByaW9yaXR5JywKICAgICAgICAgICAgJ1JldmlldyBSZXF1aXJlZCcsCiAgICAgICAgICAgICdEZWNpc2lvbiBSZXN1bHQnLAogICAgICAgICAgICAnRGVjaXNpb24gRGF0ZScsCiAgICAgICAgICAgICdSZXBhaXIgU3RhcnQgVGltZScsCiAgICAgICAgICAgICdSZWNvdmVyeSBTdGFydCBUaW1lJywKICAgICAgICAgICAgJ0R1ZSBEYXRlJywKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgIG15ICRUcmFuc2xhdGVkRmllbGRMYWJlbCA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkRmllbGROYW1lKTsKICAgICAgICAgICAgbXkgJEZpZWxkUGF0dGVybiAgICAgICAgID0gJzxsYWJlbD4nIC4gJFRyYW5zbGF0ZWRGaWVsZExhYmVsIC4gJzo8L2xhYmVsPi4rPzxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4nOwogICAgICAgICAgICBpZiAoICR7ICRQYXJhbXtEYXRhfSB9ID1+IG17KCRGaWVsZFBhdHRlcm4pfW1zICkgewoKICAgICAgICAgICAgICAgIG15ICRGaWVsZCA9ICQxOwoKICAgICAgICAgICAgICAgICMgcmVtb3ZlIGZpZWxkIGZyb20gdGhlIG9sZCBwb3NpdGlvbgogICAgICAgICAgICAgICAgJHsgJFBhcmFte0RhdGF9IH0gPX4gc3skRmllbGRQYXR0ZXJufXt9bXM7CgogICAgICAgICAgICAgICAgbXkgJFRyYW5zbGF0ZWRDdXN0b21lcklETGFiZWwgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0N1c3RvbWVyIElEJyk7CgogICAgICAgICAgICAgICAgIyBhZGQgYmVmb3JlIHRoZSBDdXN0b21lciBJRCBmaWVsZAogICAgICAgICAgICAgICAgJHsgJFBhcmFte0RhdGF9IH0gPX4gc3soPGxhYmVsPiRUcmFuc2xhdGVkQ3VzdG9tZXJJRExhYmVsOjwvbGFiZWw+KX17JEZpZWxkXG4kMX1tczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBhZGQgdHdvIGhpZGRlbiBmaWVsZHMgZm9yIEltcGFjdFJDIGFuZCBQcmlvcml0eVJDCiAgICAkeyAkUGFyYW17RGF0YX0gfQogICAgICAgID1+IHN7KDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIpfXs8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iSW1wYWN0UkMiIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPlxuJDF9bXM7CiAgICAkeyAkUGFyYW17RGF0YX0gfQogICAgICAgID1+IHN7KDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIpfXs8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUHJpb3JpdHlSQyIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz5cbiQxfW1zOwoKICAgICMgRGVmaW5lIFByaW9yaXR5IGZpZWxkIG5hbWUgZm9yIGFsbCBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbiBiYXNlZCB0ZW1wbGF0ZXMuCiAgICBteSAkUHJpb3JpdHlGaWVsZE5hbWUgPSAnTmV3UHJpb3JpdHlJRCc7CgogICAgaWYgKCAkUGFyYW17VGVtcGxhdGVGaWxlfSBlcSAnQWdlbnRUaWNrZXRQaG9uZScgfHwgJFBhcmFte1RlbXBsYXRlRmlsZX0gZXEgJ0FnZW50VGlja2V0RW1haWwnICkgewoKICAgICAgICAjIFVzZSBhbm90aGVyIGZpZWxkIG5hbWUgKHdpbGwgYmUgdXNlZCBsYXRlcikKICAgICAgICAkUHJpb3JpdHlGaWVsZE5hbWUgPSAnUHJpb3JpdHlJRCc7CgogICAgICAgICMgZ2V0IEZvcm1JRAogICAgICAgIG15ICRGb3JtSUQ7CiAgICAgICAgaWYgKCAkeyAkUGFyYW17RGF0YX0gfSA9fiBtezxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IihbXjw+XSspIi8+fW1zICkgewogICAgICAgICAgICAkRm9ybUlEID0gJDE7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCAiTGluayBUaWNrZXQiIGxpbmsKICAgICAgICBteSAkVHJhbnNsYXRlZFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTGluayB0aWNrZXQnKTsKICAgICAgICAkeyAkUGFyYW17RGF0YX0gfQogICAgICAgICAgICA9fiBzeyg8IS0tIE91dHB1dEZpbHRlckhvb2tfVGlja2V0T3B0aW9uc0VuZCAtLT4pfXs8YSBocmVmPSIkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9QWN0aW9uPUFnZW50TGlua09iamVjdDtNb2RlPVRlbXBvcmFyeTtTb3VyY2VPYmplY3Q9VGlja2V0O1NvdXJjZUtleT0kRm9ybUlEO1RhcmdldElkZW50aWZpZXI9SVRTTUNvbmZpZ0l0ZW0iIGlkPSJPcHRpb25MaW5rVGlja2V0IiBjbGFzcz0iQXNQb3B1cCI+WyAkVHJhbnNsYXRlZFN0cmluZyBdPC9hPlxuJDF9bXM7CiAgICB9CgogICAgIyBGb3IgYWxsIEFnZW50VGlja2V0QWN0aW9uQ29tbW9uIGJhc2VkIHRlbXBsYXRlcwogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IFRpY2tldCBOdW1iZXIKICAgICAgICBteSAkVGlja2V0TnVtYmVyOwogICAgICAgIGlmICggJHsgJFBhcmFte0RhdGF9IH0gPX4gbXs8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IihbXjw+XSspIi8+fW1zICkgewogICAgICAgICAgICBteSAkVGlja2V0SUQgPSAkMTsKICAgICAgICAgICAgJFRpY2tldE51bWJlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGhlYWRsaW5lIGZvciBBZ2VudFRpY2tldERlY2lzaW9uCiAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVGaWxlfSBlcSAnQWdlbnRUaWNrZXREZWNpc2lvbicgKSB7CgogICAgICAgICAgICAjIFRyYW5zbGF0ZSB0aGUgc3RyaW5nCiAgICAgICAgICAgIG15ICRUcmFuc2xhdGVkU3RyaW5nID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0NoYW5nZSBEZWNpc2lvbiBvZiAlcyVzJXMnLAogICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Okhvb2snKSwKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rRGl2aWRlcicpLAogICAgICAgICAgICAgICAgJFRpY2tldE51bWJlciwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICR7ICRQYXJhbXtEYXRhfSB9ID1+IHN7KDxoMT4pfXskMVxuJFRyYW5zbGF0ZWRTdHJpbmd9bXM7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBoZWFkbGluZSBmb3IgQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZAogICAgICAgIGVsc2lmICggJFBhcmFte1RlbXBsYXRlRmlsZX0gZXEgJ0FnZW50VGlja2V0QWRkdGxJVFNNRmllbGQnICkgewoKICAgICAgICAgICAgIyBUcmFuc2xhdGUgdGhlIHN0cmluZwogICAgICAgICAgICBteSAkVHJhbnNsYXRlZFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgJXMlcyVzJywKICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJyksCiAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6SG9va0RpdmlkZXInKSwKICAgICAgICAgICAgICAgICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkeyAkUGFyYW17RGF0YX0gfSA9fiBzeyg8aDE+KX17JDFcbiRUcmFuc2xhdGVkU3RyaW5nfW1zOwogICAgICAgIH0KICAgIH0KCiAgICAjIERlZmluZSBpbXBhY3QgZmllbGQgc2VhcmNoIHBhdHRlcm4sIHVzZSB3aXRob3V0IHRoZSB4IG1vZGlmaWVyIGFuZCBub24gZ3JlZWR5IG1hdGNoICguKz8pCiAgICBteSAkSW1wYWN0RmllbGRQYXR0ZXJuID0gJzxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QiPi4rPzxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj5ccyo8L2Rpdj4nOwoKICAgICMgRmluZCBJbXBhY3QgZmllbGQgYW5kIG1vdmUgYmVmb3JlIHRoZSBwcmlvcml0eSBmaWVsZAogICAgaWYgKCAkeyAkUGFyYW17RGF0YX0gfSA9fiBteygkSW1wYWN0RmllbGRQYXR0ZXJuKX1tcyApIHsKCiAgICAgICAgbXkgJEltcGFjdEZpZWxkID0gJDE7CgogICAgICAgICMgT25seSBpZiBwcmlvcml0eSBpcyB2aXNpYmxlIG9uIHRoZSBzY3JlZW4KICAgICAgICBpZiAoICR7ICRQYXJhbXtEYXRhfSB9ID1+IG17PGxhYmVsIGZvcj0iJFByaW9yaXR5RmllbGROYW1lIj4uKz88L2xhYmVsPn1tcyApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIEltcGFjdCBmcm9tIHRoZSBvbGQgcG9zaXRpb24KICAgICAgICAgICAgJHsgJFBhcmFte0RhdGF9IH0gPX4gc3skSW1wYWN0RmllbGRQYXR0ZXJufXt9bXM7CgogICAgICAgICAgICAjIGFkZCBiZWZvcmUgdGhlIHByaW9yaXR5IGZpZWxkCiAgICAgICAgICAgICR7ICRQYXJhbXtEYXRhfSB9ID1+IHN7KDxsYWJlbCBmb3I9IiRQcmlvcml0eUZpZWxkTmFtZSI+Lis/PC9sYWJlbD4pfXskSW1wYWN0RmllbGRcbiQxfW1zOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIEluc2VydFRlbXBsYXRlKCJBZ2VudFRpY2tldEFjdGlvbkNvbW1vbi50dCIpICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9BZ2VudFRpY2tldE5vdGUudHQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIEluc2VydFRlbXBsYXRlKCJBZ2VudFRpY2tldEFjdGlvbkNvbW1vbi50dCIpICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9BZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtLnR0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50QWN0aW9uUm93IikgJV0KPHVsIGNsYXNzPSJBY3Rpb25zIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRBY3Rpb25Sb3dCdWxrIikgJV0KICAgIDxsaSBjbGFzcz0iQWx3YXlzUHJlc2VudCI+CiAgICAgICAgPHNwYW4+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IGFsbCIpIHwgaHRtbCAlXSIgaWQ9IlNlbGVjdEFsbFRpY2tldHMiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICA8bGFiZWwgY2xhc3M9IkludmlzaWJsZVRleHQiIGZvcj0iU2VsZWN0QWxsVGlja2V0cyI+WyUgVHJhbnNsYXRlKCJTZWxlY3QgYWxsIikgfCBodG1sICVdPC9sYWJlbD4KICAgICAgICA8L3NwYW4+CiAgICA8L2xpPgogICAgPGxpIGlkPSJCdWxrQWN0aW9uIiBjbGFzcz0iQWx3YXlzUHJlc2VudCBJbmFjdGl2ZSBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgIDxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT4KICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEFjdGlvblJvd0J1bGsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEFjdGlvblJvd0l0ZW0iKSAlXQogICAgPGxpPjxhIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5MaW5rIHwgaHRtbCAlXSIgdGl0bGU9IlslIERhdGEuRGVzY3JpcHRpb24gfCBodG1sICVdIj5bJSBEYXRhLk5hbWUgfCBodG1sICVdPC9hPjwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEFjdGlvblJvd0l0ZW0iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEFjdGlvblJvd0hUTUwiKSAlXQogICAgWyUgRGF0YS5IVE1MICVdClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEFjdGlvblJvd0hUTUwiKSAlXQo8L3VsPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRBY3Rpb25Sb3ciKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRIZWFkZXIiKSAlXQo8dWwgaWQ9IlRpY2tldE92ZXJ2aWV3TWVkaXVtIiBjbGFzcz0iT3ZlcnZpZXcgT3ZlcnZpZXdNZWRpdW0iPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRIZWFkZXIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9UaWNrZXRGb3VuZCIpICVdCiAgICA8bGkgaWQ9IkVtcHR5TWVzc2FnZU1lZGl1bSI+CiAgICAgICAgWyUgVHJhbnNsYXRlKCJObyB0aWNrZXQgZGF0YSBmb3VuZC4iKSB8IGh0bWwgJV0KICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJOb1RpY2tldEZvdW5kIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50Q29udGVudCIpICVdCiAgICA8bGkgaWQ9IlRpY2tldElEX1slIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5saW5lQWN0aW9uUm93IikgJV0KICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIElubGluZUFjdGlvbnMiPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJSZXNwb25zaXZlQWN0aW9uTWVudSI+PGEgaHJlZj0iIyIgaWQ9IlJlc3BvbnNpdmVBY3Rpb25NZW51WyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk9wZW4gLyBDbG9zZSB0aWNrZXQgYWN0aW9uIG1lbnUiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1iYXJzIj48L2k+PC9hPjwvbGk+ClslIFJlbmRlckJsb2NrU3RhcnQoIklubGluZUFjdGlvblJvd0l0ZW0iKSAlXQogICAgICAgICAgICAgICAgPGxpPjxhIGlkPSJbJSBEYXRhLklEIHwgaHRtbCAlXVslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW5saW5lQWN0aW9uUm93SXRlbSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIklubGluZUFjdGlvblJvd0l0ZW1IVE1MIikgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuSFRNTCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiSW5saW5lQWN0aW9uUm93SXRlbUhUTUwiKSAlXQogICAgICAgICAgICA8L3VsPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW5saW5lQWN0aW9uUm93IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQnVsayIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNoZWNrYm94Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ2hlY2tib3giIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJUaWNrZXRJRCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgdGlja2V0IikgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkJ1bGsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YUljb24iKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ2xhc3NTcGFuIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPgogICAgICAgICAgICAgICAgICAgIDxlbT5bJSBUcmFuc2xhdGUoRGF0YS5UaXRsZSkgfCBodG1sICVdPC9lbT4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNZXRhSWNvbiIpICVdClslIFJlbmRlckJsb2NrRW5kKCJNZXRhIikgJV0KICAgICAgICAgICAgPGgyPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayI+WyUgQ29uZmlnKCJUaWNrZXQ6Okhvb2siKSAlXVslIENvbmZpZygiVGlja2V0OjpIb29rRGl2aWRlciIpICVdWyUgRGF0YS5UaWNrZXROdW1iZXIgJV0gJm5kYXNoOyBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9oMj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWVudUl0ZW0iKSAlXQogICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkxpbmsgJV0iIFslIERhdGEuTGlua1BhcmFtICVdIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvbikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJNZW51SXRlbSIpICVdCiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iSW5mb3MiPgogICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2VuZGVyIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBEYXRhLkFydGljbGVGaWVsZHMuU2VuZGVyLlZhbHVlIHwgaHRtbCAlXSI+WyUgRGF0YS5BcnRpY2xlRmllbGRzLlNlbmRlci5SZWFsbmFtZSB8IHRydW5jYXRlKDM2KSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWdlIikgfCBodG1sICVdPC9sYWJlbD5bJSBEYXRhLkFnZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUXVldWUiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuUXVldWUgfCBodG1sICVdIj5bJSBEYXRhLlF1ZXVlIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tClslIElGICFEYXRhLklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50ICVdCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJJRFJXIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkN1c3RvbWVyIElEIikgfCBodG1sICVdPC9sYWJlbD5bJSBJRiBEYXRhLkN1c3RvbWVySUQgJV08YSBocmVmPSJbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rIikgfCBJbnRlcnBvbGF0ZSAlXSIgY2xhc3M9IkFzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbiIgWyUgQ29uZmlnKCJDdXN0b21lckRCTGlua1RhcmdldCIpICVdPlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV08L2E+WyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lcklEUlciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lcklEUk8iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3VzdG9tZXIgSUQiKSB8IGh0bWwgJV08L2xhYmVsPlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVySURSTyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz48ZGl2IHRpdGxlPSJbJSBEYXRhLkN1c3RvbWVyTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuQ3VzdG9tZXJOYW1lIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tClslIEVORCAlXQojIC0tLQojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgaXMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMUxpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDFMaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDFQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxzcGFuPlslIERhdGEuVmFsdWUgJV08L3NwYW4+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMVBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkZpcnN0IFJlc3BvbnNlIFRpbWUiKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaXJzdFJlc3BvbnNlVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlcnZpY2UgVGltZSIpIHwgaHRtbCAlXTogWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuRmlyc3RSZXNwb25zZVRpbWVDbGFzcyB8IGh0bWwgJV0iPlslIERhdGEuRmlyc3RSZXNwb25zZVRpbWVIdW1hbiB8IGh0bWwgJV0gLyBbJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJGaXJzdFJlc3BvbnNlVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KWyUgSUYgRGF0YS5JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJVcGRhdGUgVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIlVwZGF0ZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuVXBkYXRlVGltZVdvcmtpbmdUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuVXBkYXRlVGltZUNsYXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5VcGRhdGVUaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5VcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU29sdXRpb24gVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlcnZpY2UgVGltZSIpIHwgaHRtbCAlXTogWyUgRGF0YS5Tb2x1dGlvblRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLlNvbHV0aW9uVGltZUNsYXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5Tb2x1dGlvblRpbWVIdW1hbiB8IGh0bWwgJV0gLyBbJSBEYXRhLlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU29sdXRpb25UaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgRU5EICVdCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV08L2xhYmVsPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlN0YXRlIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdIj5bJSBEYXRhLlR5cGUgfCBodG1sICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUeXBlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQpbJSBJRiBEYXRhLklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50ICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyaXRpY2FsaXR5IikgfCBodG1sICVdPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuQ3JpdGljYWxpdHkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Dcml0aWNhbGl0eSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkltcGFjdCIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkltcGFjdCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkltcGFjdCkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIEVORCAlXQojIC0tLQojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDIgaXMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMkxpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDJMaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDJQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxzcGFuPlslIERhdGEuVmFsdWUgJV08L3NwYW4+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMlBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KWyUgSUYgIURhdGEuSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQgJV0KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVXBkYXRlIFRpbWUiKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLlVwZGF0ZVRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLlVwZGF0ZVRpbWVDbGFzcyB8IGh0bWwgJV0iPlslIERhdGEuVXBkYXRlVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVXBkYXRlVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KWyUgRU5EICVdCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuQXJ0aWNsZUZpZWxkcy5TdWJqZWN0LlZhbHVlIHwgaHRtbCAlXSI+WyUgRGF0YS5BcnRpY2xlRmllbGRzLlN1YmplY3QuVmFsdWUgfCB0cnVuY2F0ZSgzNikgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIk93bmVyUmVzcG9uc2libGUiKSAlXQpbJSBJRiBDb25maWcoJ1RpY2tldDo6UmVzcG9uc2libGUnKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXSAvIFslIFRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuT3duZXJGdWxsbmFtZSB8IGh0bWwgJV0gKFslIERhdGEuT3duZXIgfCBodG1sICVdKSAvIFslIERhdGEuUmVzcG9uc2libGVGdWxsbmFtZSB8IGh0bWwgJV0gKFslIERhdGEuUmVzcG9uc2libGUgfCBodG1sICVdKSI+WyUgRGF0YS5Pd25lckZ1bGxuYW1lIHwgaHRtbCAlXSAvIFslIERhdGEuUmVzcG9uc2libGVGdWxsbmFtZSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5Pd25lckZ1bGxuYW1lIHwgaHRtbCAlXSAoWyUgRGF0YS5Pd25lciB8IGh0bWwgJV0pIj5bJSBEYXRhLk93bmVyRnVsbG5hbWUgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiT3duZXJSZXNwb25zaWJsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkxvY2siKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkxvY2spIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTG9jaykgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiU2VydmljZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBEYXRhLlNlcnZpY2UgfCBodG1sICVdIj5bJSBEYXRhLlNlcnZpY2UgfCBodG1sICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTZXJ2aWNlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU0xBIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgTGV2ZWwgQWdyZWVtZW50IikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBEYXRhLlNMQSB8IGh0bWwgJV0iPlslIERhdGEuU0xBIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU0xBIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQpbJSBJRiBEYXRhLklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50ICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJJRFJXIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkN1c3RvbWVySUQiKSB8IGh0bWwgJV08L2xhYmVsPjxhIGhyZWY9IlslIENvbmZpZygiQ3VzdG9tZXJEQkxpbmsiKSAlXSIgY2xhc3M9IkFzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbiIgWyUgQ29uZmlnKCJDdXN0b21lckRCTGlua1RhcmdldCIpICVdPlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lcklEUlciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lcklEUk8iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3VzdG9tZXJJRCIpIHwgaHRtbCAlXTwvbGFiZWw+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJJRFJPIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPjxkaXYgdGl0bGU9IlslIERhdGEuQ3VzdG9tZXJOYW1lIHwgaHRtbCAlXSI+WyUgRGF0YS5DdXN0b21lck5hbWUgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIEVORCAlXQojIC0tLQojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDMgaXMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMyIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkM0xpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDNMaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDNQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxzcGFuPlslIERhdGEuVmFsdWUgJV08L3NwYW4+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkM1BsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMyIpICVdCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KWyUgSUYgIURhdGEuSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQgJV0KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU29sdXRpb24gVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlcnZpY2UgVGltZSIpIHwgaHRtbCAlXTogWyUgRGF0YS5Tb2x1dGlvblRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLlNvbHV0aW9uVGltZUNsYXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5Tb2x1dGlvblRpbWVIdW1hbiB8IGh0bWwgJV0gLyBbJSBEYXRhLlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU29sdXRpb25UaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQpbJSBFTkQgJV0KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcCBDZW50ZXIgRHluYW1pY0ZpZWxkU2VwYXJhdG9yIj48L2Rpdj4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJJbmZvcyI+CiAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlUm93IikgJV0KICAgICAgICAgICAgICAgICAgICA8dHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZExpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48c3Bhbj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZFRhYmxlUm93IikgJV0KICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgIDwvdGFibGU+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZSIpICVdCiAgICAgICAgPC9kaXY+CiAgICA8L2xpPgoKWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50Q29udGVudCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEZvb3RlciIpICVdCjwvdWw+Cgo8Zm9ybSBuYW1lPSJidWxrIiBhY3Rpb249IiI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgo8L2Zvcm0+Cgo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0ibWF0cml4Ij4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50VGlja2V0QnVsayIvPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEZvb3RlckJ1bGtJdGVtIikgJV0KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iIi8+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEZvb3RlckJ1bGtJdGVtIikgJV0KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iIi8+CjwvZm9ybT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50Rm9vdGVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50TWVudUl0ZW1Nb3ZlRm9ybSIpICVdCjxsaSBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iPgogICAgPGZvcm0gdGl0bGU9IlslIFRyYW5zbGF0ZSgiTW92ZSB0aWNrZXQgdG8gYSBkaWZmZXJlbnQgcXVldWUiKSB8IGh0bWwgJV0iIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSB8IGh0bWwgJV0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRUaWNrZXRNb3ZlIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIi8+CiAgICAgICAgPGxhYmVsIGZvcj0iRGVzdFF1ZXVlSUQiIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkNoYW5nZSBxdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgIFslIERhdGEuTW92ZVF1ZXVlc1N0cmcgJV0KICAgIDwvZm9ybT4KPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50TWVudUl0ZW1Nb3ZlRm9ybSIpICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9BZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldy50dAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEFjdGlvblJvdyIpICVdCjx1bCBjbGFzcz0iQWN0aW9ucyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50QWN0aW9uUm93QnVsayIpICVdCiAgICA8bGkgY2xhc3M9IkFsd2F5c1ByZXNlbnQiPgogICAgICAgIDxzcGFuPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlbGVjdCBhbGwiKSB8IGh0bWwgJV0iIGlkPSJTZWxlY3RBbGxUaWNrZXRzIiBhdXRvY29tcGxldGU9Im9mZiIgLz4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJJbnZpc2libGVUZXh0IiBmb3I9IlNlbGVjdEFsbFRpY2tldHMiPlslIFRyYW5zbGF0ZSgiU2VsZWN0IGFsbCIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgPC9zcGFuPgogICAgPC9saT4KICAgIDxsaSBpZD0iQnVsa0FjdGlvbiIgY2xhc3M9IkFsd2F5c1ByZXNlbnQgSW5hY3RpdmUgWyUgRGF0YS5DU1MgfCBodG1sICVdIj4KICAgICAgICA8YSBocmVmPSIjIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+CiAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRBY3Rpb25Sb3dCdWxrIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRBY3Rpb25Sb3dJdGVtIikgJV0KICAgIDxsaT48YSBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuTGluayB8IGh0bWwgJV0iIHRpdGxlPSJbJSBEYXRhLkRlc2NyaXB0aW9uIHwgaHRtbCAlXSI+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvYT48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRBY3Rpb25Sb3dJdGVtIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRBY3Rpb25Sb3dIVE1MIikgJV0KICAgIFslIERhdGEuSFRNTCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRBY3Rpb25Sb3dIVE1MIikgJV0KPC91bD4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50QWN0aW9uUm93IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50SGVhZGVyIikgJV0KPHVsIGlkPSJUaWNrZXRPdmVydmlld0xhcmdlIiBjbGFzcz0iT3ZlcnZpZXcgT3ZlcnZpZXdMYXJnZSBbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSI+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEhlYWRlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb1RpY2tldEZvdW5kIikgJV0KICAgIDxsaSBpZD0iRW1wdHlNZXNzYWdlTGFyZ2UiPgogICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gdGlja2V0IGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9UaWNrZXRGb3VuZCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudENvbnRlbnQiKSAlXQogICAgPGxpIGlkPSJUaWNrZXRJRF9bJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgY2xhc3M9Ik1hc3RlckFjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCBbJSBEYXRhLkFkZGl0aW9uYWxDbGFzc2VzIHwgaHRtbCAlXSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIklubGluZUFjdGlvblJvdyIpICVdCiAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9ucyBJbmxpbmVBY3Rpb25zIj4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iUmVzcG9uc2l2ZUFjdGlvbk1lbnUiPjxhIGhyZWY9IiMiIGlkPSJSZXNwb25zaXZlQWN0aW9uTWVudVslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJPcGVuIC8gQ2xvc2UgdGlja2V0IGFjdGlvbiBtZW51IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtYmFycyI+PC9pPjwvYT48L2xpPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmxpbmVBY3Rpb25Sb3dJdGVtIikgJV0KICAgICAgICAgICAgICAgIDxsaT48YSBpZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV1bJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvbikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIklubGluZUFjdGlvblJvd0l0ZW0iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmxpbmVBY3Rpb25Sb3dJdGVtSFRNTCIpICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLkhUTUwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIklubGluZUFjdGlvblJvd0l0ZW1IVE1MIikgJV0KICAgICAgICAgICAgPC91bD4KWyUgUmVuZGVyQmxvY2tFbmQoIklubGluZUFjdGlvblJvdyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJ1bGsiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDaGVja2JveCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9IkNoZWNrYm94IiB0eXBlPSJjaGVja2JveCIgbmFtZT0iVGlja2V0SUQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlbGVjdCB0aGlzIHRpY2tldCIpIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiBhdXRvY29tcGxldGU9Im9mZiIgLz4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJCdWxrIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk1ldGFJY29uIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5UaXRsZSkgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkNsYXNzU3BhbiB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICA8ZW0+WyUgVHJhbnNsYXRlKERhdGEuVGl0bGUpIHwgaHRtbCAlXTwvZW0+CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YUljb24iKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkluZm9zIj4KICAgICAgICAgICAgICAgIDxoMj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ik1hc3RlckFjdGlvbkxpbmsiPlslIENvbmZpZygiVGlja2V0OjpIb29rIikgJV1bJSBDb25maWcoIlRpY2tldDo6SG9va0RpdmlkZXIiKSAlXVslIERhdGEuVGlja2V0TnVtYmVyICVdICZuZGFzaDsgWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L2gyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZW51SXRlbSIpICVdCiAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkxpbmsgJV0iIFslIERhdGEuTGlua1BhcmFtICVdIGNsYXNzPSJtZW51aXRlbSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkRlc2NyaXB0aW9uKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIk1lbnVJdGVtIikgJV0KICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBZ2UiKSB8IGh0bWwgJV08L2xhYmVsPlslIERhdGEuQWdlIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJRdWV1ZSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5RdWV1ZSB8IGh0bWwgJV0iPlslIERhdGEuUXVldWUgfCB0cnVuY2F0ZSgyNikgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTwvbGFiZWw+WyUgRGF0YS5DcmVhdGVkIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlN0YXRlKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlN0YXRlKSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5TZXJ2aWNlIHwgaHRtbCAlXSI+WyUgRGF0YS5TZXJ2aWNlIHwgdHJ1bmNhdGUoMjYpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiU0xBIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5TTEEgfCBodG1sICVdIj5bJSBEYXRhLlNMQSB8IHRydW5jYXRlKDI2KSB8IGh0bWwgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNMQSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiU2VydmljZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3duZXJSZXNwb25zaWJsZSIpICVdClslIElGIENvbmZpZygnVGlja2V0OjpSZXNwb25zaWJsZScpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiT3duZXIiKSB8IGh0bWwgJV0gLyBbJSBUcmFuc2xhdGUoIlJlc3BvbnNpYmxlIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBEYXRhLk93bmVyRnVsbG5hbWUgfCBodG1sICVdIChbJSBEYXRhLk93bmVyIHwgaHRtbCAlXSkgLyBbJSBEYXRhLlJlc3BvbnNpYmxlRnVsbG5hbWUgfCBodG1sICVdIChbJSBEYXRhLlJlc3BvbnNpYmxlIHwgaHRtbCAlXSkiPlslIERhdGEuT3duZXJGdWxsbmFtZSB8IHRydW5jYXRlKDMwKSB8IGh0bWwgJV0gLyBbJSBEYXRhLlJlc3BvbnNpYmxlRnVsbG5hbWUgfCB0cnVuY2F0ZSgzMCkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiT3duZXIiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuT3duZXJGdWxsbmFtZSB8IGh0bWwgJV0gKFslIERhdGEuT3duZXIgfCBodG1sICVdKSI+WyUgRGF0YS5Pd25lckZ1bGxuYW1lIHwgdHJ1bmNhdGUoMzApIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJPd25lclJlc3BvbnNpYmxlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJMb2NrIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5Mb2NrKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkxvY2spIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJNaWRkbGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lcklEIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDdXN0b21lciBJRCIpIHwgaHRtbCAlXTwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVySURSVyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgQ29uZmlnKCJDdXN0b21lckRCTGluayIpIHwgSW50ZXJwb2xhdGUgJV0iIGNsYXNzPSJBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24iIFslIENvbmZpZygiQ3VzdG9tZXJEQkxpbmtUYXJnZXQiKSAlXT5bJSBEYXRhLkN1c3RvbWVySUQgfCBodG1sICVdPC9hPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJJRFJXIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJJRFJPIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkN1c3RvbWVySUQgfCBodG1sICVdIj5bJSBEYXRhLkN1c3RvbWVySUQgfCBodG1sICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lcklEUk8iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lck5hbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuQ3VzdG9tZXJOYW1lIHwgaHRtbCAlXSI+WyUgRGF0YS5DdXN0b21lck5hbWUgfCBodG1sICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lck5hbWUiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJJRCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaXJzdFJlc3BvbnNlVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRmlyc3QgUmVzcG9uc2UgVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuRmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lQ2xhc3MgfCBodG1sICVdIj5bJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUeXBlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdIj5bJSBEYXRhLlR5cGUgfCBodG1sICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUeXBlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIlVwZGF0ZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlVwZGF0ZSBUaW1lIikgfCBodG1sICVdPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlcnZpY2UgVGltZSIpIHwgaHRtbCAlXTogWyUgRGF0YS5VcGRhdGVUaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5VcGRhdGVUaW1lQ2xhc3MgfCBodG1sICVdIj5bJSBEYXRhLlVwZGF0ZVRpbWVIdW1hbiB8IGh0bWwgJV0gLyBbJSBEYXRhLlVwZGF0ZVRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlVwZGF0ZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU29sdXRpb24gVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuU29sdXRpb25UaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5Tb2x1dGlvblRpbWVDbGFzcyB8IGh0bWwgJV0iPlslIERhdGEuU29sdXRpb25UaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5Tb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tClslIElGIERhdGEuSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyaXRpY2FsaXR5IikgfCBodG1sICVdPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkNyaXRpY2FsaXR5IHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuQ3JpdGljYWxpdHkpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJJbXBhY3QiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuSW1wYWN0IHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuSW1wYWN0KSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgRU5EICVdCiMgLS0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iWyUgRGF0YS5DbGFzcyAlXSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZExpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PHNwYW4+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZFRhYmxlUm93IikgJV0KCiMgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZpeGVkIGR5bmFtaWMgZmllbGQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojIE5vdGU6IEZpZWxkMSBhbmQgRmllbGQyIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWVzCiMgICAgICAgICAgICAgICAgICAgIDx0cj4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDFfVGFibGVSb3dSZWNvcmQiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdPC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDFfVGFibGVSb3dSZWNvcmRMaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxX1RhYmxlUm93UmVjb3JkTGluayIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQxX1RhYmxlUm93UmVjb3JkUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48c3Bhbj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDFfVGFibGVSb3dSZWNvcmRQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDFfVGFibGVSb3dSZWNvcmQiKSAlXQojICAgICAgICAgICAgICAgICAgICA8L3RyPgojICAgICAgICAgICAgICAgICAgICA8dHI+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQyX1RhYmxlUm93UmVjb3JkIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTwvbGFiZWw+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQyX1RhYmxlUm93UmVjb3JkTGluayIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMl9UYWJsZVJvd1JlY29yZExpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMl9UYWJsZVJvd1JlY29yZFBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PHNwYW4+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQyX1RhYmxlUm93UmVjb3JkUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQyX1RhYmxlUm93UmVjb3JkIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPC90cj4KCiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZXNQcmV2aWV3QXJlYSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByZXZpZXciPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVQcmV2aWV3IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIElGIERhdGEuQ2hhbm5lbEludmFsaWQgJV1bJSBUcmFuc2xhdGUoIk1pc3NpbmcgY2hhbm5lbCIpIHwgaHRtbCAlXVslIEVMU0UgJV1bJSBEYXRhLkFydGljbGVGaWVsZHMuU2VuZGVyLlZhbHVlIHwgaHRtbCAlXSAmbmRhc2g7IFslIERhdGEuQXJ0aWNsZUZpZWxkcy5TdWJqZWN0LlZhbHVlIHwgaHRtbCAlXVslIEVORCAlXSAmbmRhc2g7IFslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkhlYWRsaW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLkNoYW5uZWxJbnZhbGlkICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi10cmlhbmdsZSBXYXJuaW5nIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk1pc3NpbmcgY2hhbm5lbCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5BcnRpY2xlRmllbGRzLlNlbmRlci5WYWx1ZSB8IHRydW5jYXRlKDUwKSB8IGh0bWwgJV0gJm5kYXNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iU3ViamVjdCI+WyUgRGF0YS5BcnRpY2xlRmllbGRzLlN1YmplY3QuVmFsdWUgfCB0cnVuY2F0ZSg3MCkgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iRGF0ZVRpbWUiPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iQ2xlYXIiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuQmxvY2siPgpbJSBQUk9DRVNTIEFydGljbGVBY3Rpb25NZW51LnR0ICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50IEFydGljbGVCb2R5Ij4KWyUgRGF0YS5Cb2R5Tm90ZSAlXQpbJSBEYXRhLkJvZHkgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZVByZXZpZXciKSAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlc1ByZXZpZXdBcmVhIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50Q29udGVudCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEZvb3RlciIpICVdCjwvdWw+CgoKPGZvcm0gbmFtZT0iYnVsayIgYWN0aW9uPSIiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIiLz4KPC9mb3JtPgoKPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9Im1hdHJpeCI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldEJ1bGsiLz4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRGb290ZXJCdWxrSXRlbSIpICVdCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRGb290ZXJCdWxrSXRlbSIpICVdCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgo8L2Zvcm0+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEZvb3RlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudE1lbnVJdGVtTW92ZUZvcm0iKSAlXQo8bGkgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KICAgIDxmb3JtIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1vdmUgdGlja2V0IHRvIGEgZGlmZmVyZW50IHF1ZXVlIikgfCBodG1sICVdIiBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgfCBodG1sICVdIiBtZXRob2Q9ImdldCI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRUaWNrZXRNb3ZlIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUXVldWVJRCIgdmFsdWU9IlslIERhdGEuUXVldWVJRCB8IGh0bWwgJV0iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIi8+CiAgICAgICAgPGxhYmVsIGZvcj0iRGVzdFF1ZXVlSUQiIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIkNoYW5nZSBxdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgIFslIERhdGEuTW92ZVF1ZXVlc1N0cmcgJV0KICAgIDwvZm9ybT4KPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50TWVudUl0ZW1Nb3ZlRm9ybSIpICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA3Njk3ZGQ2OGRiNjJhMDNiYmEzM2FjMTM4Y2UwYmNkMjBjNzFlNWVmIC0gS2VybmVsL091dHB1dC9IVE1ML1RpY2tldE92ZXJ2aWV3L01lZGl1bS5wbQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0T3ZlcnZpZXc6Ok1lZGl1bTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJwopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBcJVBhcmFtOwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IFVzZXJJRCBwYXJhbQogICAgJFNlbGYtPntVc2VySUR9ID0gJFBhcmFte1VzZXJJRH0gfHwgZGllICJHb3Qgbm8gVXNlcklEISI7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KCiAgICAjIENoZWNrIGlmIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50IGlzIHVzZWQuCiAgICBteSAkT3V0cHV0RmlsdGVyQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UG9zdCcpOwogICAgaWYgKCAkT3V0cHV0RmlsdGVyQ29uZmlnLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9ICkgewogICAgICAgICRTZWxmLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9ID0gMTsKICAgIH0KIyAtLS0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBY3Rpb25Sb3cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgbXkgJEJ1bGtGZWF0dXJlID0gMDsKICAgIGlmICggJFBhcmFte0J1bGt9ICYmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmUnKSApIHsKICAgICAgICBteSBAR3JvdXBzOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgKSB7CiAgICAgICAgICAgIEBHcm91cHMgPSBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSB9OwogICAgICAgIH0KICAgICAgICBpZiAoICFAR3JvdXBzICkgewogICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICBmb3IgbXkgJEdyb3VwIChAR3JvdXBzKSB7CiAgICAgICAgICAgICAgICBteSAkSGFzUGVybWlzc2lvbiA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgR3JvdXBOYW1lID0+ICRHcm91cCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ3J3JywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoJEhhc1Blcm1pc3Npb24pIHsKICAgICAgICAgICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3QgR1JPVVA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRBY3Rpb25Sb3cnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgaWYgKCRCdWxrRmVhdHVyZSkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudEFjdGlvblJvd0J1bGsnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdCdWxrJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJ1biB0aWNrZXQgb3ZlcnZpZXcgZG9jdW1lbnQgaXRlbSBtZW51IG1vZHVsZXMKICAgIGlmICgKICAgICAgICAkUGFyYW17Q29uZmlnfS0+e092ZXJ2aWV3TWVudU1vZHVsZXN9CiAgICAgICAgJiYgcmVmICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXdNZW51TW9kdWxlJykgZXEgJ0hBU0gnCiAgICAgICAgKQogICAgewoKICAgICAgICBteSAlTWVudXMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok92ZXJ2aWV3TWVudU1vZHVsZScpIH07CiAgICAgICAgTUVOVU1PRFVMRToKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJE1lbnVzeyRNZW51fSApOwogICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgKCAkTWVudXN7JE1lbnV9LT57Vmlld30gJiYgJE1lbnVzeyRNZW51fS0+e1ZpZXd9IG5lICRQYXJhbXtWaWV3fSApOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSAkSXRlbSA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRJdGVtKTsKCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntCbG9ja30gZXEgJ0RvY3VtZW50QWN0aW9uUm93SXRlbScgKSB7CgogICAgICAgICAgICAgICAgIyBhZGQgc2Vzc2lvbiBpZCBpZiBuZWVkZWQKICAgICAgICAgICAgICAgIGlmICggISRMYXlvdXRPYmplY3QtPntTZXNzaW9uSURDb29raWV9ICYmICRJdGVtLT57TGlua30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntMaW5rfQogICAgICAgICAgICAgICAgICAgICAgICAuPSAnOycKICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57U2Vzc2lvbk5hbWV9IC4gJz0nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e1Nlc3Npb25JRH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgaWQKICAgICAgICAgICAgICAgICRJdGVtLT57SUR9ID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICAgICAgICAgICRJdGVtLT57SUR9ID1+IHMvKFxzfCZ8OykvL2lnOwoKICAgICAgICAgICAgICAgIG15ICRMaW5rID0gJEl0ZW0tPntMaW5rfTsKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntUYXJnZXR9ICkgewogICAgICAgICAgICAgICAgICAgICRMaW5rID0gJyMnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDbGFzcyA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1BvcHVwVHlwZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJENsYXNzID0gJ0FzUG9wdXAgUG9wdXBUeXBlXycgLiAkSXRlbS0+e1BvcHVwVHlwZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJEl0ZW0tPntJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEl0ZW0tPntOYW1lfSApLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9IC4gJEl0ZW0tPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrICAgICAgID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkSXRlbS0+e0Jsb2NrfSBlcSAnRG9jdW1lbnRBY3Rpb25Sb3dIVE1MJyApIHsKCiAgICAgICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgISRJdGVtLT57SFRNTH07CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgU29ydE9yZGVyQmFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkSXRlbSAocXcoVGlja2V0SURzIFBhZ2VTaG93biBTdGFydEhpdCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEl0ZW19ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkSXRlbSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAjIGNoZWNrIGlmIGJ1bGsgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBteSAkQnVsa0ZlYXR1cmUgPSAwOwogICAgaWYgKCAkUGFyYW17QnVsa30gJiYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZScpICkgewogICAgICAgIG15IEBHcm91cHM7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSApIHsKICAgICAgICAgICAgQEdyb3VwcyA9IEB7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpIH07CiAgICAgICAgfQogICAgICAgIGlmICggIUBHcm91cHMgKSB7CiAgICAgICAgICAgICRCdWxrRmVhdHVyZSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgIG15ICRIYXNQZXJtaXNzaW9uID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAncncnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkSGFzUGVybWlzc2lvbikgewogICAgICAgICAgICAgICAgICAgICRCdWxrRmVhdHVyZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBHUk9VUDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdEb2N1bWVudEhlYWRlcicsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkT3V0cHV0TWV0YSA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0nLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgIG15ICRPdXRwdXRSYXcgPSAnJzsKICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXRNZXRhICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXRNZXRhOwogICAgfQogICAgbXkgJE91dHB1dCAgICAgICAgPSAnJzsKICAgIG15ICRDb3VudGVyICAgICAgID0gMDsKICAgIG15ICRDb3VudGVyT25TaXRlID0gMDsKICAgIG15IEBUaWNrZXRJRHNTaG93bjsKCiAgICAjIGNoZWNrIGlmIHRoZXJlIGFyZSB0aWNrZXRzIHRvIHNob3cKICAgIGlmICggc2NhbGFyIEB7ICRQYXJhbXtUaWNrZXRJRHN9IH0gKSB7CgogICAgICAgIGZvciBteSAkVGlja2V0SUQgKCBAeyAkUGFyYW17VGlja2V0SURzfSB9ICkgewogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ291bnRlciA+PSAkUGFyYW17U3RhcnRIaXR9CiAgICAgICAgICAgICAgICAmJiAkQ291bnRlciA8ICggJFBhcmFte1BhZ2VTaG93bn0gKyAkUGFyYW17U3RhcnRIaXR9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAVGlja2V0SURzU2hvd24sICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+X1Nob3coCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudGVyT25TaXRlLAogICAgICAgICAgICAgICAgICAgIEJ1bGsgICAgID0+ICRCdWxrRmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkUGFyYW17Q29uZmlnfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ291bnRlck9uU2l0ZSsrOwogICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UHJpbnQoIE91dHB1dCA9PiAkT3V0cHV0ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0UmF3IC49ICR7JE91dHB1dH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnQWN0aW9uUm93VGlja2V0cycsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57QWN0aW9uUm93VGlja2V0c30sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdOb1RpY2tldEZvdW5kJyApOwogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICgkQnVsa0ZlYXR1cmUpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRGb290ZXInLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzU2hvd24pIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudEZvb3RlckJ1bGtJdGVtJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJE91dHB1dE1ldGEgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXRNZXRhICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXRNZXRhOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhY3Rpb24gcm93IGpzIGRhdGEKCiAgICByZXR1cm4gJE91dHB1dFJhdzsKfQoKc3ViIF9TaG93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRpY2tldElEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJExheW91dE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRBcnRpY2xlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwoKICAgICMgR2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZS4KICAgIG15IEBBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICBUaWNrZXRJRCAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgU2VuZGVyVHlwZSA9PiAnY3VzdG9tZXInLAogICAgICAgIE9ubHlMYXN0ICAgPT4gMSwKICAgICk7CgogICAgIyBJZiB0aGUgdGlja2V0IGhhcyBubyBjdXN0b21lciBhcnRpY2xlLCBnZXQgdGhlIGxhc3QgYWdlbnQgYXJ0aWNsZS4KICAgIGlmICggIUBBcnRpY2xlcyApIHsKICAgICAgICBAQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgU2VuZGVyVHlwZSA9PiAnYWdlbnQnLAogICAgICAgICAgICBPbmx5TGFzdCAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEZpbmFsbHksIGlmIGV2ZXJ5dGhpbmcgZmFpbGVkLCBnZXQgbGF0ZXN0IGFydGljbGUuCiAgICBpZiAoICFAQXJ0aWNsZXMgKSB7CiAgICAgICAgQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBPbmx5TGFzdCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJUFydGljbGU7CiAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlcykgewogICAgICAgICVBcnRpY2xlID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyRBcnRpY2xlfSApLT5BcnRpY2xlR2V0KAogICAgICAgICAgICAleyRBcnRpY2xlfSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICk7CgogICAgICAgIG15ICVBcnRpY2xlRmllbGRzID0gJExheW91dE9iamVjdC0+QXJ0aWNsZUZpZWxkcygKICAgICAgICAgICAgJXskQXJ0aWNsZX0sCiAgICAgICAgKTsKCiAgICAgICAgJEFydGljbGV7QXJ0aWNsZUZpZWxkc30gPSBcJUFydGljbGVGaWVsZHM7CiAgICB9CgogICAgIyBHZXQgdGlja2V0IGRhdGEuCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQojICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAojIC0tLQogICAgKTsKCiAgICAlQXJ0aWNsZSA9ICggJUFydGljbGUsICVUaWNrZXQgKTsKCiAgICAjIEZhbGxiYWNrIGZvciB0aWNrZXRzIHdpdGhvdXQgYXJ0aWNsZXM6IGdldCBhdCBsZWFzdCBiYXNpYyB0aWNrZXQgZGF0YS4KICAgIGlmICggISVBcnRpY2xlICkgewogICAgICAgICVBcnRpY2xlID0gJVRpY2tldDsKICAgICAgICBpZiAoICEkQXJ0aWNsZXtUaXRsZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1RpdGxlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdUaGlzIHRpY2tldCBoYXMgbm8gdGl0bGUgb3Igc3ViamVjdCcKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJEFydGljbGV7U3ViamVjdH0gPSAkQXJ0aWNsZXtUaXRsZX07CiAgICB9CgogICAgIyBzaG93IHRpY2tldCBjcmVhdGUgdGltZSBpbiBjdXJyZW50IHZpZXcKICAgICRBcnRpY2xle0NyZWF0ZWR9ID0gJFRpY2tldHtDcmVhdGVkfTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgIyBzZXQgY3JpdGljYWxpdHkgYW5kIGltcGFjdAogICAgJEFydGljbGV7Q3JpdGljYWxpdHl9ID0gJEFydGljbGV7RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eX0gfHwgJy0nOwogICAgJEFydGljbGV7SW1wYWN0fSAgICAgID0gJEFydGljbGV7RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICAgICAgfHwgJy0nOwojIC0tLQoKICAgICMgdXNlciBpbmZvCiAgICBteSAlVXNlckluZm8gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEFydGljbGV7T3duZXJJRH0sCiAgICApOwogICAgJUFydGljbGUgPSAoICVVc2VySW5mbywgJUFydGljbGUgKTsKCiAgICAjIGdldCByZXNwb25zaWJsZSBpbmZvIGZyb20gVGlja2V0CiAgICBteSAlVGlja2V0UmVzcG9uc2libGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFRpY2tldHtSZXNwb25zaWJsZUlEfSwKICAgICk7CgogICAgIyBjcmVhdGUgaHVtYW4gYWdlCiAgICAkQXJ0aWNsZXtBZ2V9ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgQWdlICAgPT4gJEFydGljbGV7QWdlfSwKICAgICAgICBTcGFjZSA9PiAnICcsCiAgICApOwoKICAgICMgZmV0Y2ggYWxsIHN0ZC4gdGVtcGxhdGVzIC4uLgogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgUXVldWVJRCAgICAgICA9PiAkQXJ0aWNsZXtRdWV1ZUlEfSwKICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICApOwoKICAgICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgRGF0YSA9PiAkU3RhbmRhcmRUZW1wbGF0ZXN7QW5zd2VyfSB8fCB7fSwKICAgICk7CgogICAgIyBjdXN0b21lciBpbmZvCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57Q3VzdG9tZXJJbmZvfSApIHsKICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJEFydGljbGV7Q3VzdG9tZXJOYW1lfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJOYW1lKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9uczsKICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBhbGwgcmVnaXN0ZXJlZCBBY3Rpb25zCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgIG15ICVBY3Rpb25zID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykgfTsKCiAgICAgICAgIyBvbmx5IHVzZSB0aG9zZSBBY3Rpb25zIHRoYXQgc3RhdHMgd2l0aCBBZ2VudFRpY2tldAogICAgICAgICVQb3NzaWJsZUFjdGlvbnMgPSBtYXAgeyArKyRDb3VudGVyID0+ICRfIH0KICAgICAgICAgICAgZ3JlcCB7IHN1YnN0ciggJF8sIDAsIGxlbmd0aCAnQWdlbnRUaWNrZXQnICkgZXEgJ0FnZW50VGlja2V0JyB9CiAgICAgICAgICAgIHNvcnQga2V5cyAlQWN0aW9uczsKICAgIH0KCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJUFjbEFjdGlvbiA9ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBpZiAoJEFDTCkgewogICAgICAgICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CiAgICB9CgogICAgIyBnZXQgbWFpbiBvYmplY3QKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIHJ1biB0aWNrZXQgcHJlIG1lbnUgbW9kdWxlcwogICAgbXkgQEFjdGlvbkl0ZW1zOwogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNZW51cyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZScpIH07CiAgICAgICAgTUVOVToKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJEl0ZW0gPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXQgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgQUNMICAgID0+IFwlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgQ29uZmlnID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgTUVOVSBpZiAhJEl0ZW07CiAgICAgICAgICAgIG5leHQgTUVOVSBpZiByZWYgJEl0ZW0gbmUgJ0hBU0gnOwoKICAgICAgICAgICAgIyBhZGQgc2Vzc2lvbiBpZCBpZiBuZWVkZWQKICAgICAgICAgICAgaWYgKCAhJExheW91dE9iamVjdC0+e1Nlc3Npb25JRENvb2tpZX0gJiYgJEl0ZW0tPntMaW5rfSApIHsKICAgICAgICAgICAgICAgICRJdGVtLT57TGlua30KICAgICAgICAgICAgICAgICAgICAuPSAnOycKICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntTZXNzaW9uTmFtZX0gLiAnPScKICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntTZXNzaW9uSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSBpZAogICAgICAgICAgICAkSXRlbS0+e0lEfSA9ICRJdGVtLT57TmFtZX07CiAgICAgICAgICAgICRJdGVtLT57SUR9ID1+IHMvKFxzfCZ8OykvL2lnOwoKICAgICAgICAgICAgbXkgJE91dHB1dDsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Jsb2NrfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgPSAnPGxpIGlkPSInCiAgICAgICAgICAgICAgICAgICAgLiAkSXRlbS0+e0lEfQogICAgICAgICAgICAgICAgICAgIC4gJyI+PGEgaHJlZj0iIyIgdGl0bGU9IicKICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEl0ZW0tPntEZXNjcmlwdGlvbn0gKQogICAgICAgICAgICAgICAgICAgIC4gJyI+JwogICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkSXRlbS0+e05hbWV9ICkKICAgICAgICAgICAgICAgICAgICAuICc8L2E+PC9saT4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0ID1+IHMvXG4rLy9nOwogICAgICAgICAgICAkT3V0cHV0ID1+IHMvXHMrLyAvZzsKICAgICAgICAgICAgJE91dHB1dCA9fiBzLzxcIS0tLis/LS0+Ly9nOwoKICAgICAgICAgICAgcHVzaCBAQWN0aW9uSXRlbXMsIHsKICAgICAgICAgICAgICAgIEhUTUwgICAgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9IC4gJEl0ZW0tPntMaW5rfSwKICAgICAgICAgICAgICAgIFRhcmdldCAgICAgID0+ICRJdGVtLT57VGFyZ2V0fSwKICAgICAgICAgICAgICAgIFBvcHVwVHlwZSAgID0+ICRJdGVtLT57UG9wdXBUeXBlfSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgPT4gJEl0ZW0tPntCbG9ja30sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBzdWJqZWN0CiAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJEFydGljbGV7VGlja2V0TnVtYmVyfSwKICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50Q29udGVudCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUFydGljbGUsCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQgPT4gJFNlbGYtPntJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudH0sCiMgLS0tCiAgICAgICAgfSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3duZXJSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIE93bmVyICAgICAgICAgICAgICAgPT4gJFVzZXJJbmZveydVc2VyTG9naW4nfSwKICAgICAgICAgICAgT3duZXJGdWxsbmFtZSAgICAgICA9PiAkVXNlckluZm97J1VzZXJGdWxsbmFtZSd9LAogICAgICAgICAgICBSZXNwb25zaWJsZSAgICAgICAgID0+ICRUaWNrZXRSZXNwb25zaWJsZXsnVXNlckxvZ2luJ30sCiAgICAgICAgICAgIFJlc3BvbnNpYmxlRnVsbG5hbWUgPT4gJFRpY2tldFJlc3BvbnNpYmxleydVc2VyRnVsbG5hbWUnfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGlmICJBY3Rpb25zIHBlciBUaWNrZXQiIChJbmxpbmUgQWN0aW9uIFJvdykgaXMgYWN0aXZlCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57VGlja2V0QWN0aW9uc1BlclRpY2tldH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0lubGluZUFjdGlvblJvdycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIEFkZCBsaXN0IGVudHJpZXMgZm9yIGV2ZXJ5IGFjdGlvbgogICAgICAgIGZvciBteSAkSXRlbSAoQEFjdGlvbkl0ZW1zKSB7CiAgICAgICAgICAgIG15ICRMaW5rID0gJEl0ZW0tPntMaW5rfTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1RhcmdldH0gKSB7CiAgICAgICAgICAgICAgICAkTGluayA9ICcjJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENsYXNzID0gJyc7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntQb3B1cFR5cGV9ICkgewogICAgICAgICAgICAgICAgJENsYXNzID0gJ0FzUG9wdXAgUG9wdXBUeXBlXycgLiAkSXRlbS0+e1BvcHVwVHlwZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRJdGVtLT57QmxvY2t9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5saW5lQWN0aW9uUm93SXRlbScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgID0+ICRBcnRpY2xle1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJExpbmssCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkVGlja2V0SUQgICA9ICRQYXJhbXtUaWNrZXRJRH07CiAgICAgICAgICAgICAgICBteSAkU2VsZWN0SFRNTCA9ICRJdGVtLT57SFRNTH07CiAgICAgICAgICAgICAgICAkU2VsZWN0SFRNTCA9fiBzL2lkPSJEZXN0UXVldWVJRCIvaWQ9IkRlc3RRdWV1ZUlEJFRpY2tldElEIi94bWlnOwogICAgICAgICAgICAgICAgJFNlbGVjdEhUTUwgPX4gcy9mb3I9IkRlc3RRdWV1ZUlEIi9mb3I9IkRlc3RRdWV1ZUlEJFRpY2tldElEIi94bWlnOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5saW5lQWN0aW9uUm93SXRlbUhUTUwnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBIVE1MID0+ICRTZWxlY3RIVE1MLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFBhcmFte0J1bGt9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0YWJsZSgnQnVsaycpLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdGlja2V0IGZsYWdzCiAgICBteSBAVGlja2V0TWV0YUl0ZW1zID0gJExheW91dE9iamVjdC0+VGlja2V0TWV0YUl0ZW1zKAogICAgICAgIFRpY2tldCA9PiBcJUFydGljbGUsCiAgICApOwogICAgZm9yIG15ICRJdGVtIChAVGlja2V0TWV0YUl0ZW1zKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ01ldGEnLAogICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICk7CiAgICAgICAgaWYgKCRJdGVtKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTWV0YUljb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gYXJ0aWNsZSBtb2R1bGVzCiAgICBpZiAoICRBcnRpY2xle0FydGljbGVJRH0gKSB7CiAgICAgICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlUHJlVmlld01vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVQcmVWaWV3TW9kdWxlJykgfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbXkgQERhdGEgPSAkT2JqZWN0LT5DaGVjaygKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnID0+ICRKb2JzeyRKb2J9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJERhdGFSZWYgKEBEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVPcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRhUmVmLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmaWx0ZXIgb3B0aW9uCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5GaWx0ZXIoCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkSm9ic3skSm9ifSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICVBY2xBY3Rpb24sCiAgICAgICAgfSwKICAgICk7CiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldENvbXBvc2V9CiAgICAgICAgJiYgKCAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0gfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldENvbXBvc2V9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDb21wb3NlIik7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgIG15ICRPayA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9rICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyQ29tcG9zZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgJiYgKAogICAgICAgICAgICAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAgICAgfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFBob25lT3V0Ym91bmQiKTsKICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgbXkgJE9LID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkT0sgKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyUGhvbmVPdXRib3VuZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IHR5cGUKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBzZXJ2aWNlCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJEFydGljbGV7U2VydmljZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtTTEF9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgZmlyc3QgcmVzcG9uc2UgdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVIdW1hbn0gPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZSgKICAgICAgICAgICAgQWdlICAgICAgICAgICAgICAgID0+ICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSwKICAgICAgICAgICAgVGltZVNob3dBbHdheXNMb25nID0+IDEsCiAgICAgICAgICAgIFNwYWNlICAgICAgICAgICAgICA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFRpbWVTaG93QWx3YXlzTG9uZyA9PiAxLAogICAgICAgICAgICBTcGFjZSAgICAgICAgICAgICAgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSApIHsKICAgICAgICAgICAgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGaXJzdFJlc3BvbnNlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdXBkYXRlIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7VXBkYXRlVGltZUh1bWFufSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7VXBkYXRlVGltZX0sCiAgICAgICAgICAgIFRpbWVTaG93QWx3YXlzTG9uZyA9PiAxLAogICAgICAgICAgICBTcGFjZSAgICAgICAgICAgICAgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7VXBkYXRlVGltZVdvcmtpbmdUaW1lfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7VXBkYXRlVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgVGltZVNob3dBbHdheXNMb25nID0+IDEsCiAgICAgICAgICAgIFNwYWNlICAgICAgICAgICAgICA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJEFydGljbGV7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1VwZGF0ZVRpbWVDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzb2x1dGlvbiB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle1NvbHV0aW9uVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7U29sdXRpb25UaW1lSHVtYW59ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgICAgIEFnZSAgICAgICAgICAgICAgICA9PiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9LAogICAgICAgICAgICBUaW1lU2hvd0Fsd2F5c0xvbmcgPT4gMSwKICAgICAgICAgICAgU3BhY2UgICAgICAgICAgICAgID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7U29sdXRpb25UaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBUaW1lU2hvd0Fsd2F5c0xvbmcgPT4gMSwKICAgICAgICAgICAgU3BhY2UgICAgICAgICAgICAgID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtTb2x1dGlvblRpbWVDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTb2x1dGlvblRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBEeW5hbWljIGZpZWxkcwogICAgJENvdW50ZXIgPSAwOwogICAgbXkgJERpc3BsYXlEeW5hbWljRmllbGRUYWJsZSA9IDE7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJER5bmFtaWNGaWVsZEZpbHRlcgogICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpPdmVydmlld01lZGl1bSIpLT57RHluYW1pY0ZpZWxkfTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBteSAkRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWydUaWNrZXQnXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkRHluYW1pY0ZpZWxkRmlsdGVyIHx8IHt9LAogICAgKTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBnZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdAogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICAjIGdldCBmaWVsZCB2YWx1ZQogICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggIWRlZmluZWQgJFZhbHVlICk7CgogICAgICAgICRDb3VudGVyKys7CgogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+IDIwLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwoKICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwoKICAgICAgICAjIHNob3cgZHluYW1pYyBmaWVsZCB0YWJsZSBpZiBhdCBsZWFzdCBvbmUgZmllbGQgaXMgZGlzcGxheWVkCiAgICAgICAgaWYgKCAkRGlzcGxheUR5bmFtaWNGaWVsZFRhYmxlID09IDEgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJERpc3BsYXlEeW5hbWljRmllbGRUYWJsZSA9IDA7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBhIG5ldyByb3cgaWYgY291bnRlciBpcyBzdGFydGluZwogICAgICAgIGlmICggJENvdW50ZXIgPT0gMSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCBsYWJlbAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFZhbHVlU3RyZy0+e0xpbmt9ICkgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBsaW5rCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgcGxhaW4KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZFBsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG9ubHkgNSBkeW5hbWljIGZpZWxkcyBieSByb3cgYXJlIGFsbG93ZWQsIHJlc2V0IGNvdXRlciBpZiBuZWVkZWQKICAgICAgICBpZiAoICRDb3VudGVyID09IDUgKSB7CiAgICAgICAgICAgICRDb3VudGVyID0gMDsKICAgICAgICB9CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCBsYWJlbAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCcgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFZhbHVlU3RyZy0+e0xpbmt9ICkgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBsaW5rCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmQnIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ0xpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBwbGFpbgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdQbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZpbGwgdGhlIHJlc3Qgb2YgdGhlIER5bmFtaWMgRmllbGRzIHJvdyB3aXRoIGVtcHR5IGNlbGxzLCB0aGlzIHdpbGwgbG9vayBiZXR0ZXIKICAgIGlmICggJENvdW50ZXIgPiAwICYmICRDb3VudGVyIDwgNSApIHsKCiAgICAgICAgZm9yICggJENvdW50ZXIgKyAxIC4uLiA1ICkgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCBsYWJlbAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExhYmVsID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgcGxhaW4KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZFBsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICcnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0ZXN0IGFjY2VzcyB0byBmcm9udGVuZCBtb2R1bGUgZm9yIEN1c3RvbWVyCiAgICBteSAkQWNjZXNzID0gJExheW91dE9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBBY3Rpb24gPT4gJ0FnZW50VGlja2V0Q3VzdG9tZXInLAogICAgICAgIFR5cGUgICA9PiAncncnLAogICAgKTsKICAgIGlmICgkQWNjZXNzKSB7CgogICAgICAgICMgdGVzdCBhY2Nlc3MgdG8gdGlja2V0CiAgICAgICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDdXN0b21lcicpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT0sgPSAkVGlja2V0T2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRPSyApIHsKICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZGVmaW5lIHByb3BlciB0dCBibG9jayBiYXNlZCBvbiBwZXJtaXNzaW9ucwogICAgbXkgJEN1c3RvbWVySURCbG9jayA9ICRBY2Nlc3MgPyAnQ3VzdG9tZXJJRFJXJyA6ICdDdXN0b21lcklEUk8nOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAkQ3VzdG9tZXJJREJsb2NrLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICVBY3Rpb25Sb3dUaWNrZXRzOwoKICAgICMgYWRkIGFjdGlvbiBpdGVtcyBhcyBqcwogICAgaWYgKCBAQWN0aW9uSXRlbXMgJiYgISRQYXJhbXtDb25maWd9LT57VGlja2V0QWN0aW9uc1BlclRpY2tldH0gKSB7CgogICAgICAgICMgcmVwbGFjZSBUVCBkaXJlY3RpdmVzIGZyb20gc3RyaW5nIHdpdGggdmFsdWVzCiAgICAgICAgZm9yIG15ICRBY3Rpb25JdGVtIChAQWN0aW9uSXRlbXMpIHsKICAgICAgICAgICAgJEFjdGlvbkl0ZW0tPntMaW5rfSA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRBY3Rpb25JdGVtLT57TGlua30sCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57QWN0aW9uUm93VGlja2V0c30tPnsgJFBhcmFte1RpY2tldElEfSB9ID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiBcQEFjdGlvbkl0ZW1zLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgJUFjbEFjdGlvbiwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gXCRPdXRwdXQ7Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSAwYTA0ZTcyMmZiY2JkMzljY2EzZmIwODljMjk0ZTcyYjMxNzBlNmIxIC0gS2VybmVsL091dHB1dC9IVE1ML1RpY2tldE92ZXJ2aWV3L1ByZXZpZXcucG0KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE92ZXJ2aWV3OjpQcmV2aWV3OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSBxdyhUcmFuc2xhdGFibGUpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDb21tdW5pY2F0aW9uQ2hhbm5lbCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UXVldWUnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBcJVBhcmFtOwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IFVzZXJJRCBwYXJhbQogICAgJFNlbGYtPntVc2VySUR9ID0gJFBhcmFte1VzZXJJRH0gfHwgZGllICJHb3Qgbm8gVXNlcklEISI7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KCiAgICAjIENoZWNrIGlmIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50IGlzIHVzZWQuCiAgICBteSAkT3V0cHV0RmlsdGVyQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UG9zdCcpOwogICAgaWYgKCAkT3V0cHV0RmlsdGVyQ29uZmlnLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9ICkgewogICAgICAgICRTZWxmLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9ID0gMTsKICAgIH0KIyAtLS0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBBY3Rpb25Sb3cgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRCdWxrRmVhdHVyZSA9IDA7CiAgICBpZiAoICRQYXJhbXtCdWxrfSAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlJykgKSB7CiAgICAgICAgbXkgQEdyb3VwczsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpICkgewogICAgICAgICAgICBAR3JvdXBzID0gQHsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhQEdyb3VwcyApIHsKICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgICAgICAgICBHUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoQEdyb3VwcykgewogICAgICAgICAgICAgICAgbXkgJEhhc1Blcm1pc3Npb24gPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdydycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRIYXNQZXJtaXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50QWN0aW9uUm93JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIGlmICgkQnVsa0ZlYXR1cmUpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRBY3Rpb25Sb3dCdWxrJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBOYW1lID0+IFRyYW5zbGF0YWJsZSgnQnVsaycpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBydW4gdGlja2V0IG92ZXJ2aWV3IGRvY3VtZW50IGl0ZW0gbWVudSBtb2R1bGVzCiAgICBpZiAoCiAgICAgICAgJFBhcmFte0NvbmZpZ30tPntPdmVydmlld01lbnVNb2R1bGVzfQogICAgICAgICYmIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok92ZXJ2aWV3TWVudU1vZHVsZScpIGVxICdIQVNIJwogICAgICAgICkKICAgIHsKCiAgICAgICAgbXkgJU1lbnVzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpPdmVydmlld01lbnVNb2R1bGUnKSB9OwogICAgICAgIE1FTlVNT0RVTEU6CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgIG5leHQgTUVOVU1PRFVMRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRNZW51c3skTWVudX0gKTsKICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICggJE1lbnVzeyRNZW51fS0+e1ZpZXd9ICYmICRNZW51c3skTWVudX0tPntWaWV3fSBuZSAkUGFyYW17Vmlld30gKTsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJEl0ZW0gPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDb25maWcgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkSXRlbSk7CgogICAgICAgICAgICBpZiAoICRJdGVtLT57QmxvY2t9IGVxICdEb2N1bWVudEFjdGlvblJvd0l0ZW0nICkgewoKICAgICAgICAgICAgICAgICMgYWRkIHNlc3Npb24gaWQgaWYgbmVlZGVkCiAgICAgICAgICAgICAgICBpZiAoICEkTGF5b3V0T2JqZWN0LT57U2Vzc2lvbklEQ29va2llfSAmJiAkSXRlbS0+e0xpbmt9ICkgewogICAgICAgICAgICAgICAgICAgICRJdGVtLT57TGlua30KICAgICAgICAgICAgICAgICAgICAgICAgLj0gJzsnCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e1Nlc3Npb25OYW1lfSAuICc9JwogICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntTZXNzaW9uSUR9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGlkCiAgICAgICAgICAgICAgICAkSXRlbS0+e0lEfSA9ICRJdGVtLT57TmFtZX07CiAgICAgICAgICAgICAgICAkSXRlbS0+e0lEfSA9fiBzLyhcc3wmfDspLy9pZzsKCiAgICAgICAgICAgICAgICBteSAkTGluayA9ICRJdGVtLT57TGlua307CiAgICAgICAgICAgICAgICBpZiAoICRJdGVtLT57VGFyZ2V0fSApIHsKICAgICAgICAgICAgICAgICAgICAkTGluayA9ICcjJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQ2xhc3MgPSAnJzsKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntQb3B1cFR5cGV9ICkgewogICAgICAgICAgICAgICAgICAgICRDbGFzcyA9ICdBc1BvcHVwIFBvcHVwVHlwZV8nIC4gJEl0ZW0tPntQb3B1cFR5cGV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIElEICAgICAgICAgID0+ICRJdGVtLT57SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRJdGVtLT57TmFtZX0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfSAuICRJdGVtLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBCbG9jayAgICAgICA9PiAkSXRlbS0+e0Jsb2NrfSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEl0ZW0tPntCbG9ja30gZXEgJ0RvY3VtZW50QWN0aW9uUm93SFRNTCcgKSB7CgogICAgICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICEkSXRlbS0+e0hUTUx9OwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBTb3J0T3JkZXJCYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIHJldHVybiAnJzsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEl0ZW0gKHF3KFRpY2tldElEcyBQYWdlU2hvd24gU3RhcnRIaXQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRJdGVtfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEl0ZW0hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRCdWxrRmVhdHVyZSA9IDA7CiAgICBpZiAoICRQYXJhbXtCdWxrfSAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlJykgKSB7CiAgICAgICAgbXkgQEdyb3VwczsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpICkgewogICAgICAgICAgICBAR3JvdXBzID0gQHsgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhQEdyb3VwcyApIHsKICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgICAgICAgICBHUk9VUDoKICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoQEdyb3VwcykgewogICAgICAgICAgICAgICAgbXkgJEhhc1Blcm1pc3Npb24gPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25DaGVjaygKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdydycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRIYXNQZXJtaXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50SGVhZGVyJywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIG15ICRPdXRwdXRNZXRhID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgIG15ICRPdXRwdXRSYXcgPSAnJzsKICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXRNZXRhICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXRNZXRhOwogICAgfQogICAgbXkgJE91dHB1dCAgICAgICAgPSAnJzsKICAgIG15ICRDb3VudGVyICAgICAgID0gMDsKICAgIG15ICRDb3VudGVyT25TaXRlID0gMDsKICAgIG15IEBUaWNrZXRJRHNTaG93bjsKCiAgICAjIGNoZWNrIGlmIHRoZXJlIGFyZSB0aWNrZXRzIHRvIHNob3cKICAgIGlmICggc2NhbGFyIEB7ICRQYXJhbXtUaWNrZXRJRHN9IH0gKSB7CgogICAgICAgIGZvciBteSAkVGlja2V0SUQgKCBAeyAkUGFyYW17VGlja2V0SURzfSB9ICkgewogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ291bnRlciA+PSAkUGFyYW17U3RhcnRIaXR9CiAgICAgICAgICAgICAgICAmJiAkQ291bnRlciA8ICggJFBhcmFte1BhZ2VTaG93bn0gKyAkUGFyYW17U3RhcnRIaXR9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAVGlja2V0SURzU2hvd24sICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+X1Nob3coCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudGVyT25TaXRlLAogICAgICAgICAgICAgICAgICAgIEJ1bGsgICAgID0+ICRCdWxrRmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkUGFyYW17Q29uZmlnfSwKICAgICAgICAgICAgICAgICAgICBPdXRwdXQgICA9PiAkUGFyYW17T3V0cHV0fSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ291bnRlck9uU2l0ZSsrOwogICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UHJpbnQoIE91dHB1dCA9PiAkT3V0cHV0ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0UmF3IC49ICR7JE91dHB1dH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2VuZCBkYXRhIHRvIEpTCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnUmVwbHlGaWVsZHNGb3JtSUQnLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e1JlcGx5RmllbGRzRm9ybUlEfSwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0FjdGlvblJvd1RpY2tldHMnLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0FjdGlvblJvd1RpY2tldHN9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnTm9UaWNrZXRGb3VuZCcgKTsKICAgIH0KCiAgICBpZiAoJEJ1bGtGZWF0dXJlKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50Rm9vdGVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEc1Nob3duKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRGb290ZXJCdWxrSXRlbScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICRPdXRwdXRNZXRhID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dE1ldGEgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXRSYXcgLj0gJE91dHB1dE1ldGE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRPdXRwdXRSYXc7Cn0KCnN1YiBfU2hvdyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUaWNrZXRJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkUGFyYW17QnVsa30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdCdWxrJyksCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICRQcmV2aWV3QXJ0aWNsZUxpbWl0ID0gaW50ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXc6OlByZXZpZXdBcnRpY2xlTGltaXQnKSB8fCA1OwoKICAgIG15ICRUaWNrZXRPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKIyAtLS0KICAgICk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICMgc2V0IGNyaXRpY2FsaXR5IGFuZCBpbXBhY3QKICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJFRpY2tldHtEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fSB8fCAnLSc7CiAgICAkVGlja2V0e0ltcGFjdH0gICAgICA9ICRUaWNrZXR7RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICAgICAgfHwgJy0nOwojIC0tLQoKICAgICMgR2V0IGNvbmZpZ3VyZWQgbnVtYmVyIG9mIGxhc3QgYXJ0aWNsZXMuCiAgICBteSBAQXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICk7CiAgICBAQXJ0aWNsZXMgPSByZXZlcnNlIEBBcnRpY2xlczsKICAgIGlmICggc2NhbGFyIEBBcnRpY2xlcyA+ICRQcmV2aWV3QXJ0aWNsZUxpbWl0ICkgewogICAgICAgIEBBcnRpY2xlcyA9IEBBcnRpY2xlc1sgMCAuLiAkUHJldmlld0FydGljbGVMaW1pdCAtIDEgXTsKICAgIH0KCiAgICBteSBAQXJ0aWNsZUJvZHk7CiAgICBteSAlQXJ0aWNsZTsKICAgIGZvciBteSAkQXJ0aWNsZSAoQEFydGljbGVzKSB7CiAgICAgICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyRBcnRpY2xlfSApOwoKICAgICAgICBteSAlQXJ0aWNsZURhdGEgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVHZXQoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICA9PiAkQXJ0aWNsZS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwogICAgICAgICVBcnRpY2xlRGF0YSA9ICggJUFydGljbGVEYXRhLCAlVGlja2V0ICk7CgogICAgICAgIG15ICVBcnRpY2xlRmllbGRzID0gJExheW91dE9iamVjdC0+QXJ0aWNsZUZpZWxkcygKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZS0+e0FydGljbGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJEFydGljbGVEYXRhe0FydGljbGVGaWVsZHN9ID0gXCVBcnRpY2xlRmllbGRzOwoKICAgICAgICBwdXNoIEBBcnRpY2xlQm9keSwgXCVBcnRpY2xlRGF0YTsKCiAgICAgICAgaWYgKCAhJUFydGljbGUgKSB7CiAgICAgICAgICAgICVBcnRpY2xlID0gJUFydGljbGVEYXRhOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQXJ0aWNsZUNvdW50ID0gc2NhbGFyIEBBcnRpY2xlQm9keTsKCiAgICAjIEZhbGxiYWNrIGZvciB0aWNrZXRzIHdpdGhvdXQgYXJ0aWNsZXM6IGdldCBhdCBsZWFzdCBiYXNpYyB0aWNrZXQgZGF0YS4KICAgIGlmICggISVBcnRpY2xlICkgewogICAgICAgICVBcnRpY2xlID0gJVRpY2tldDsKICAgICAgICBpZiAoICEkQXJ0aWNsZXtUaXRsZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1RpdGxlfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICdUaGlzIHRpY2tldCBoYXMgbm8gdGl0bGUgb3Igc3ViamVjdCcKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJEFydGljbGV7U3ViamVjdH0gPSAkQXJ0aWNsZXtUaXRsZX07CiAgICB9CgogICAgIyB1c2VyIGluZm8KICAgIG15ICVVc2VySW5mbyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkQXJ0aWNsZXtPd25lcklEfSwKICAgICk7CiAgICAlQXJ0aWNsZSA9ICggJVVzZXJJbmZvLCAlQXJ0aWNsZSApOwoKICAgICMgZ2V0IHJlc3BvbnNpYmxlIGluZm8gZnJvbSB0aWNrZXQKICAgIG15ICVUaWNrZXRSZXNwb25zaWJsZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9LAogICAgKTsKCiAgICAjIGNyZWF0ZSBodW1hbiBhZ2UKICAgICRBcnRpY2xle0FnZX0gPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZSgKICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtBZ2V9LAogICAgICAgIFNwYWNlID0+ICcgJwogICAgKTsKCiAgICAjIGdldCBxdWV1ZSBvYmplY3QKICAgIG15ICRRdWV1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwoKICAgICMgZmV0Y2ggYWxsIHN0ZC4gdGVtcGxhdGVzIC4uLgogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJEFydGljbGV7UXVldWVJRH0sCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAkUGFyYW17U3RhbmRhcmRSZXNwb25zZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIE5hbWUgID0+ICdSZXNwb25zZUlEJywKICAgICAgICBDbGFzcyA9PiAnTW9kZXJuaXplJywKICAgICAgICBEYXRhICA9PiAkU3RhbmRhcmRUZW1wbGF0ZXN7QW5zd2VyfSB8fCB7fSwKICAgICk7CgogICAgIyBjdXN0b21lciBpbmZvCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57Q3VzdG9tZXJJbmZvfSApIHsKICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJEFydGljbGV7Q3VzdG9tZXJOYW1lfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJOYW1lKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9uczsKICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAjIGdldCBhbGwgcmVnaXN0ZXJlZCBBY3Rpb25zCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgIG15ICVBY3Rpb25zID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykgfTsKCiAgICAgICAgIyBvbmx5IHVzZSB0aG9zZSBBY3Rpb25zIHRoYXQgc3RhdHMgd2l0aCBBZ2VudFRpY2tldAogICAgICAgICVQb3NzaWJsZUFjdGlvbnMgPSBtYXAgeyArKyRDb3VudGVyID0+ICRfIH0KICAgICAgICAgICAgZ3JlcCB7IHN1YnN0ciggJF8sIDAsIGxlbmd0aCAnQWdlbnRUaWNrZXQnICkgZXEgJ0FnZW50VGlja2V0JyB9CiAgICAgICAgICAgIHNvcnQga2V5cyAlQWN0aW9uczsKICAgIH0KCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJUFjbEFjdGlvbiA9ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBpZiAoJEFDTCkgewogICAgICAgICVBY2xBY3Rpb24gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CiAgICB9CgogICAgIyBnZXQgbWFpbiBvYmplY3QKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAjIHJ1biB0aWNrZXQgcHJlIG1lbnUgbW9kdWxlcwogICAgbXkgQEFjdGlvbkl0ZW1zOwogICAgaWYgKCByZWYgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNZW51cyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZScpIH07CiAgICAgICAgTUVOVToKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgJEl0ZW0gPSAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXQgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgQUNMICAgID0+IFwlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgQ29uZmlnID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IE1FTlUgaWYgISRJdGVtOwogICAgICAgICAgICBuZXh0IE1FTlUgaWYgcmVmICRJdGVtIG5lICdIQVNIJzsKCiAgICAgICAgICAgICMgYWRkIHNlc3Npb24gaWQgaWYgbmVlZGVkCiAgICAgICAgICAgIGlmICggISRMYXlvdXRPYmplY3QtPntTZXNzaW9uSURDb29raWV9ICYmICRJdGVtLT57TGlua30gKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0xpbmt9CiAgICAgICAgICAgICAgICAgICAgLj0gJzsnCiAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57U2Vzc2lvbk5hbWV9IC4gJz0nCiAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57U2Vzc2lvbklEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjcmVhdGUgaWQKICAgICAgICAgICAgJEl0ZW0tPntJRH0gPSAkSXRlbS0+e05hbWV9OwogICAgICAgICAgICAkSXRlbS0+e0lEfSA9fiBzLyhcc3wmfDspLy9pZzsKCiAgICAgICAgICAgIG15ICRPdXRwdXQ7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntCbG9ja30gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJE91dHB1dCA9ICc8bGkgaWQ9IicKICAgICAgICAgICAgICAgICAgICAuICRJdGVtLT57SUR9CiAgICAgICAgICAgICAgICAgICAgLiAnIj48YSBocmVmPSIjIiB0aXRsZT0iJwogICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkSXRlbS0+e0Rlc2NyaXB0aW9ufSApCiAgICAgICAgICAgICAgICAgICAgLiAnIj4nCiAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRJdGVtLT57TmFtZX0gKQogICAgICAgICAgICAgICAgICAgIC4gJzwvYT48L2xpPic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgPX4gcy9cbisvL2c7CiAgICAgICAgICAgICRPdXRwdXQgPX4gcy9ccysvIC9nOwogICAgICAgICAgICAkT3V0cHV0ID1+IHMvPFwhLS0uKz8tLT4vL2c7CgogICAgICAgICAgICBwdXNoIEBBY3Rpb25JdGVtcywgewogICAgICAgICAgICAgICAgSFRNTCAgICAgICAgPT4gJE91dHB1dCwKICAgICAgICAgICAgICAgIElEICAgICAgICAgID0+ICRJdGVtLT57SUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntCYXNlbGlua30gLiAkSXRlbS0+e0xpbmt9LAogICAgICAgICAgICAgICAgVGFyZ2V0ICAgICAgPT4gJEl0ZW0tPntUYXJnZXR9LAogICAgICAgICAgICAgICAgUG9wdXBUeXBlICAgPT4gJEl0ZW0tPntQb3B1cFR5cGV9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICA9PiAkSXRlbS0+e0Jsb2NrfSwKCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgIG15ICRBZGRpdGlvbmFsQ2xhc3NlcyA9ICRQYXJhbXtDb25maWd9LT57VGlja2V0QWN0aW9uc1BlclRpY2tldH0gPyAnU2hvd0lubGluZUFjdGlvbnMnIDogJyc7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRDb250ZW50JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50ID0+ICRTZWxmLT57SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnR9LAojIC0tLQogICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgPT4gJ0FydGljbGVDb3VudCcgLiAkQXJ0aWNsZUNvdW50LAogICAgICAgICAgICBBZGRpdGlvbmFsQ2xhc3NlcyA9PiAkQWRkaXRpb25hbENsYXNzZXMsCiAgICAgICAgICAgIENyZWF0ZWQgICAgICAgICAgID0+ICRUaWNrZXR7Q3JlYXRlZH0sICAgICAgICAgICAgICAgICAjIHVzZSB2YWx1ZSBmcm9tIHRpY2tldCwgbm90IGFydGljbGUKICAgICAgICB9LAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPd25lclJlc3BvbnNpYmxlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgT3duZXIgICAgICAgICAgICAgICA9PiAkVXNlckluZm97J1VzZXJMb2dpbid9LAogICAgICAgICAgICBPd25lckZ1bGxuYW1lICAgICAgID0+ICRVc2VySW5mb3snVXNlckZ1bGxuYW1lJ30sCiAgICAgICAgICAgIFJlc3BvbnNpYmxlICAgICAgICAgPT4gJFRpY2tldFJlc3BvbnNpYmxleydVc2VyTG9naW4nfSwKICAgICAgICAgICAgUmVzcG9uc2libGVGdWxsbmFtZSA9PiAkVGlja2V0UmVzcG9uc2libGV7J1VzZXJGdWxsbmFtZSd9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgaWYgIkFjdGlvbnMgcGVyIFRpY2tldCIgKElubGluZSBBY3Rpb24gUm93KSBpcyBhY3RpdmUKICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntUaWNrZXRBY3Rpb25zUGVyVGlja2V0fSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW5saW5lQWN0aW9uUm93JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgQWRkIGxpc3QgZW50cmllcyBmb3IgZXZlcnkgYWN0aW9uCiAgICAgICAgZm9yIG15ICRJdGVtIChAQWN0aW9uSXRlbXMpIHsKICAgICAgICAgICAgbXkgJExpbmsgPSAkSXRlbS0+e0xpbmt9OwogICAgICAgICAgICBpZiAoICRJdGVtLT57VGFyZ2V0fSApIHsKICAgICAgICAgICAgICAgICRMaW5rID0gJyMnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ2xhc3MgPSAnJzsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1BvcHVwVHlwZX0gKSB7CiAgICAgICAgICAgICAgICAkQ2xhc3MgPSAnQXNQb3B1cCBQb3B1cFR5cGVfJyAuICRJdGVtLT57UG9wdXBUeXBlfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAhJEl0ZW0tPntCbG9ja30gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmxpbmVBY3Rpb25Sb3dJdGVtJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgPT4gJEFydGljbGV7UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIElEICAgICAgICAgID0+ICRJdGVtLT57SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkSXRlbS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGluaywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG15ICRUaWNrZXRJRCAgID0gJFBhcmFte1RpY2tldElEfTsKICAgICAgICAgICAgICAgIG15ICRTZWxlY3RIVE1MID0gJEl0ZW0tPntIVE1MfTsKICAgICAgICAgICAgICAgICRTZWxlY3RIVE1MID1+IHMvaWQ9IkRlc3RRdWV1ZUlEIi9pZD0iRGVzdFF1ZXVlSUQkVGlja2V0SUQiL3htaWc7CiAgICAgICAgICAgICAgICAkU2VsZWN0SFRNTCA9fiBzL2Zvcj0iRGVzdFF1ZXVlSUQiL2Zvcj0iRGVzdFF1ZXVlSUQkVGlja2V0SUQiL3htaWc7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmxpbmVBY3Rpb25Sb3dJdGVtSFRNTCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUwgPT4gJFNlbGVjdEhUTUwsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkUGFyYW17QnVsa30gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdCdWxrJyksCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB0aWNrZXQgZmxhZ3MKICAgIG15IEBUaWNrZXRNZXRhSXRlbXMgPSAkTGF5b3V0T2JqZWN0LT5UaWNrZXRNZXRhSXRlbXMoCiAgICAgICAgVGlja2V0ID0+IFwlQXJ0aWNsZSwKICAgICk7CiAgICBmb3IgbXkgJEl0ZW0gKEBUaWNrZXRNZXRhSXRlbXMpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTWV0YScsCiAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJEl0ZW0pIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNZXRhSWNvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJ1biBhcnRpY2xlIG1vZHVsZXMKICAgIGlmICggJEFydGljbGV7QXJ0aWNsZUlEfSApIHsKICAgICAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVQcmVWaWV3TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZVByZVZpZXdNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIERlYnVnICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICBteSBARGF0YSA9ICRPYmplY3QtPkNoZWNrKAogICAgICAgICAgICAgICAgICAgIEFydGljbGUgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgPT4gJEpvYnN7JEpvYn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkRGF0YVJlZiAoQERhdGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRhUmVmLT57U3VjY2Vzc2Z1bH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhUmVmLT57UmVzdWx0fSA9ICdFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YVJlZi0+e1Jlc3VsdH0gPSAnU3VjY2Vzcyc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZU9wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGZpbHRlciBvcHRpb24KICAgICAgICAgICAgICAgICRPYmplY3QtPkZpbHRlcigKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnID0+ICRKb2JzeyRKb2J9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBvdXRwdXQKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgJUFjbEFjdGlvbiwKICAgICAgICB9LAogICAgKTsKICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAmJiAoICFkZWZpbmVkICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0gKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldENvbXBvc2UnKTsKICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgbXkgJE9rID0gJFRpY2tldE9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkT2sgKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBbnN3ZXJDb21wb3NlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICAgICAgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAmJiAoCiAgICAgICAgICAgICFkZWZpbmVkICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kfQogICAgICAgICAgICB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmVPdXRib3VuZCcpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT0sgPSAkVGlja2V0T2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRPSyApIHsKICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBbnN3ZXJQaG9uZU91dGJvdW5kJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgdHlwZQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHNlcnZpY2UKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkQXJ0aWNsZXtTZXJ2aWNlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICRBcnRpY2xle1NMQX0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgQ3VzdG9tZXJJRCBhbmQgQ3VzdG9tZXJOYW1lCiAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgdGVzdCBhY2Nlc3MgdG8gZnJvbnRlbmQgbW9kdWxlCiAgICAgICAgbXkgJEFjY2VzcyA9ICRMYXlvdXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRDdXN0b21lcicsCiAgICAgICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgICk7CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKCiAgICAgICAgICAgICMgdGVzdCBhY2Nlc3MgdG8gdGlja2V0CiAgICAgICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q3VzdG9tZXInKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICBteSAkT0sgPSAkVGlja2V0T2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRPSyApIHsKICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkZWZpbmUgcHJvcGVyIHR0IGJsb2NrIGJhc2VkIG9uIHBlcm1pc3Npb25zCiAgICAgICAgbXkgJEN1c3RvbWVySURCbG9jayA9ICRBY2Nlc3MgPyAnQ3VzdG9tZXJJRFJXJyA6ICdDdXN0b21lcklEUk8nOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAkQ3VzdG9tZXJJREJsb2NrLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXtDdXN0b21lck5hbWV9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyTmFtZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgZmlyc3QgcmVzcG9uc2UgdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVIdW1hbn0gPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZSgKICAgICAgICAgICAgQWdlICAgICAgICAgICAgICAgID0+ICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSwKICAgICAgICAgICAgVGltZVNob3dBbHdheXNMb25nID0+IDEsCiAgICAgICAgICAgIFNwYWNlICAgICAgICAgICAgICA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFRpbWVTaG93QWx3YXlzTG9uZyA9PiAxLAogICAgICAgICAgICBTcGFjZSAgICAgICAgICAgICAgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSApIHsKICAgICAgICAgICAgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGaXJzdFJlc3BvbnNlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdXBkYXRlIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7VXBkYXRlVGltZUh1bWFufSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7VXBkYXRlVGltZX0sCiAgICAgICAgICAgIFRpbWVTaG93QWx3YXlzTG9uZyA9PiAxLAogICAgICAgICAgICBTcGFjZSAgICAgICAgICAgICAgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7VXBkYXRlVGltZVdvcmtpbmdUaW1lfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7VXBkYXRlVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgVGltZVNob3dBbHdheXNMb25nID0+IDEsCiAgICAgICAgICAgIFNwYWNlICAgICAgICAgICAgICA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJEFydGljbGV7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1VwZGF0ZVRpbWVDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzb2x1dGlvbiB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle1NvbHV0aW9uVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7U29sdXRpb25UaW1lSHVtYW59ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgICAgIEFnZSAgICAgICAgICAgICAgICA9PiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9LAogICAgICAgICAgICBUaW1lU2hvd0Fsd2F5c0xvbmcgPT4gMSwKICAgICAgICAgICAgU3BhY2UgICAgICAgICAgICAgID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7U29sdXRpb25UaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBUaW1lU2hvd0Fsd2F5c0xvbmcgPT4gMSwKICAgICAgICAgICAgU3BhY2UgICAgICAgICAgICAgID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtTb2x1dGlvblRpbWVDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTb2x1dGlvblRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBEeW5hbWljIGZpZWxkcwogICAgJENvdW50ZXIgPSAwOwogICAgbXkgJENsYXNzID0gJ01pZGRsZSc7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgbXkgJER5bmFtaWNGaWVsZEZpbHRlciA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXdQcmV2aWV3IiktPntEeW5hbWljRmllbGR9OwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIG15ICREeW5hbWljRmllbGQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ1RpY2tldCddLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICREeW5hbWljRmllbGRGaWx0ZXIgfHwge30sCiAgICApOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGdldCBkeW5hbWljIGZpZWxkIGJhY2tlbmQgb2JqZWN0CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgICMgZ2V0IGZpZWxkIHZhbHVlCiAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIWRlZmluZWQgJFZhbHVlOwoKICAgICAgICAkQ291bnRlcisrOwoKICAgICAgICBteSAkVmFsdWVTdHJnID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIFZhbHVlTWF4Q2hhcnMgICAgICA9PiAyMCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhYmVsID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgcm93IGlmIGNvdW50ZXIgaXMgc3RhcnRpbmcKICAgICAgICBpZiAoICRDb3VudGVyID09IDEgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZGlzcGxheSBzZXBhcmF0aW9uIHJvdyBqdXN0IG9uY2UKICAgICAgICAkQ2xhc3MgPSAnJzsKCiAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCBsYWJlbAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFZhbHVlU3RyZy0+e0xpbmt9ICkgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBsaW5rCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgcGxhaW4KICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZFBsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG9ubHkgMiBkeW5hbWljIGZpZWxkcyBieSByb3cgYXJlIGFsbG93ZWQsIHJlc2V0IGNvdXRlciBpZiBuZWVkZWQKICAgICAgICBpZiAoICRDb3VudGVyID09IDIgKSB7CiAgICAgICAgICAgICRDb3VudGVyID0gMDsKICAgICAgICB9CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCBsYWJlbAogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdfVGFibGVSb3dSZWNvcmQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRWYWx1ZVN0cmctPntMaW5rfSApIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgbGluawogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19UYWJsZVJvd1JlY29yZExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBwbGFpbgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19UYWJsZVJvd1JlY29yZFBsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZmlsbCB0aGUgcmVzdCBvZiB0aGUgRHluYW1pYyBGaWVsZHMgcm93IHdpdGggZW1wdHkgY2VsbHMsIHRoaXMgd2lsbCBsb29rIGJldHRlcgogICAgaWYgKCAkQ291bnRlciA+IDAgJiYgJENvdW50ZXIgPCAyICkgewoKICAgICAgICBmb3IgKCAkQ291bnRlciArIDEgLi4uIDIgKSB7CgogICAgICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIGxhYmVsCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBwbGFpbgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoQEFydGljbGVCb2R5KSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIGZpcnN0IGFydGljbGUgc2hvdWxkIGJlIGRpc3BsYXllZCBhcyBleHBhbmRlZCwgdGhhdCBpcyB2aXNpYmxlIGZvciB0aGUgcmVsYXRlZCBjdXN0b21lcgogICAgICAgIG15ICRQcmV2aWV3SXNWaXNpYmxlRm9yQ3VzdG9tZXJFeHBhbmRlZAogICAgICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXc6OlByZXZpZXdJc1Zpc2libGVGb3JDdXN0b21lckV4cGFuZGVkJykgfHwgMDsKCiAgICAgICAgIyBpZiBhIGNlcnRhaW4gYXJ0aWNsZSB0eXBlIHNob3VsZCBiZSBzaG93biBhcyBleHBhbmRlZCwgc2V0IHRoZSBsYXN0IGFydGljbGUgb2YgdGhpcyB0eXBlIGFzIGFjdGl2ZQogICAgICAgIGlmICgkUHJldmlld0lzVmlzaWJsZUZvckN1c3RvbWVyRXhwYW5kZWQpIHsKCiAgICAgICAgICAgIG15ICRDbGFzc0NvdW50ID0gMDsKICAgICAgICAgICAgQVJUSUNMRUlURU06CiAgICAgICAgICAgIGZvciBteSAkQXJ0aWNsZUl0ZW0gKEBBcnRpY2xlQm9keSkgewoKICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRUlURU0gaWYgISRBcnRpY2xlSXRlbTsKICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRUlURU0gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBcnRpY2xlSXRlbSk7CiAgICAgICAgICAgICAgICBuZXh0IEFSVElDTEVJVEVNIGlmICEkQXJ0aWNsZUl0ZW0tPntJc1Zpc2libGVGb3JDdXN0b21lcn07CgogICAgICAgICAgICAgICAgJEFydGljbGVJdGVtLT57Q2xhc3N9ID0gJ0FjdGl2ZSc7CiAgICAgICAgICAgICAgICBsYXN0IEFSVElDTEVJVEVNOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIERpc3BsYXkgdGhlIGxhc3QgYXJ0aWNsZSBpbiB0aGUgbGlzdCBhcyBleHBhbmRlZCAoZGVmYXVsdCkuCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICBteSAkQXJ0aWNsZVNlbGVjdGVkOwogICAgICAgICAgICBteSAkSWdub3JlU3lzdGVtU2VuZGVyID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6Ok5ld0FydGljbGVJZ25vcmVTeXN0ZW1TZW5kZXInKTsKCiAgICAgICAgICAgIEFSVElDTEVJVEVNOgogICAgICAgICAgICBmb3IgbXkgJEFydGljbGVJdGVtIChAQXJ0aWNsZUJvZHkpIHsKCiAgICAgICAgICAgICAgICAjIGlnbm9yZSBzeXN0ZW0gc2VuZGVyIHR5cGUKICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRUlURU0gaWYgJElnbm9yZVN5c3RlbVNlbmRlciAmJiAkQXJ0aWNsZUl0ZW0tPntTZW5kZXJUeXBlfSBlcSAnc3lzdGVtJzsKCiAgICAgICAgICAgICAgICAkQXJ0aWNsZUl0ZW0tPntDbGFzc30gPSAnQWN0aXZlJzsKICAgICAgICAgICAgICAgICRBcnRpY2xlU2VsZWN0ZWQgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBBUlRJQ0xFSVRFTTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgc2VsZWN0ZWQgYXJ0aWNsZQogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZVNlbGVjdGVkICkgewogICAgICAgICAgICAgICAgJEFydGljbGVCb2R5WzBdLT57Q2xhc3N9ID0gJ0FjdGl2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlc1ByZXZpZXdBcmVhJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICVBY2xBY3Rpb24sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ29tbXVuaWNhdGlvbkNoYW5uZWxPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q29tbXVuaWNhdGlvbkNoYW5uZWwnKTsKCiAgICAjIFNhdmUgY29tbXVuaWNhdGlvbiBjaGFubmVsIGRhdGEgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KICAgIG15ICVDb21tdW5pY2F0aW9uQ2hhbm5lbERhdGE7CgogICAgIyBzaG93IGlubGluZSBhcnRpY2xlCiAgICBmb3IgbXkgJEFydGljbGVJdGVtICggcmV2ZXJzZSBAQXJ0aWNsZUJvZHkgKSB7CgogICAgICAgICRBcnRpY2xlSXRlbS0+e0JvZHl9ID0gJExheW91dE9iamVjdC0+QXJ0aWNsZVByZXZpZXcoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJEFydGljbGVJdGVtLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgID0+ICRBcnRpY2xlSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFJlc3VsdFR5cGUgPT4gJ3BsYWluJywKICAgICAgICApOwoKICAgICAgICAjIGh0bWwgcXVvdGluZwogICAgICAgICRBcnRpY2xlSXRlbS0+e0JvZHl9ID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgTmV3TGluZSAgICAgICAgID0+ICRQYXJhbXtDb25maWd9LT57RGVmYXVsdFZpZXdOZXdMaW5lfSB8fCA5MCwKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgID0+ICRBcnRpY2xlSXRlbS0+e0JvZHl9LAogICAgICAgICAgICBWTWF4ICAgICAgICAgICAgPT4gJFBhcmFte0NvbmZpZ30tPntEZWZhdWx0UHJlVmlld0xpbmVzfSB8fCAyNSwKICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgID0+IDEsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlICA9PiAxLAogICAgICAgICAgICBTdHJpcEVtcHR5TGluZXMgPT4gJFBhcmFte0NvbmZpZ30tPntTdHJpcEVtcHR5TGluZXN9LAogICAgICAgICk7CgogICAgICAgICMgSW5jbHVkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IGNvbW11bmljYXRpb24gY2hhbm5lbC4KICAgICAgICBpZiAoICEkQ29tbXVuaWNhdGlvbkNoYW5uZWxEYXRheyAkQXJ0aWNsZUl0ZW0tPntDb21tdW5pY2F0aW9uQ2hhbm5lbElEfSB9ICkgewoKICAgICAgICAgICAgIyBDb21tdW5pY2F0aW9uIGNoYW5uZWwgZGlzcGxheSBuYW1lIGlzIHBhcnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICAgIG15ICVDb21tdW5pY2F0aW9uQ2hhbm5lbCA9ICRDb21tdW5pY2F0aW9uQ2hhbm5lbE9iamVjdC0+Q2hhbm5lbEdldCgKICAgICAgICAgICAgICAgIENoYW5uZWxJRCA9PiAkQXJ0aWNsZUl0ZW0tPntDb21tdW5pY2F0aW9uQ2hhbm5lbElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgUHJlc2VuY2Ugb2YgY29tbXVuaWNhdGlvbiBjaGFubmVsIG9iamVjdCBpbmRpY2F0ZXMgaXRzIHZhbGlkaXR5LgogICAgICAgICAgICBteSAkQ2hhbm5lbE9iamVjdCA9ICRDb21tdW5pY2F0aW9uQ2hhbm5lbE9iamVjdC0+Q2hhbm5lbE9iamVjdEdldCgKICAgICAgICAgICAgICAgIENoYW5uZWxJRCA9PiAkQXJ0aWNsZUl0ZW0tPntDb21tdW5pY2F0aW9uQ2hhbm5lbElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDb21tdW5pY2F0aW9uQ2hhbm5lbERhdGF7ICRBcnRpY2xlSXRlbS0+e0NvbW11bmljYXRpb25DaGFubmVsSUR9IH0gPSB7CiAgICAgICAgICAgICAgICBDaGFubmVsRGlzcGxheU5hbWUgPT4gJENvbW11bmljYXRpb25DaGFubmVse0Rpc3BsYXlOYW1lfSwKICAgICAgICAgICAgICAgIENoYW5uZWxJbnZhbGlkICAgICA9PiAhJENoYW5uZWxPYmplY3QsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBteSBAQXJ0aWNsZUFjdGlvbnMgPSAkTGF5b3V0T2JqZWN0LT5BcnRpY2xlQWN0aW9ucygKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRBcnRpY2xlSXRlbS0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICAgICA9PiAnU3RhdGljJywKICAgICAgICApOwoKICAgICAgICAjIFJlbW92ZSB0aGUgJ01hcmsnIGFjdGlvbiwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgb25seSBpbiBBZ2VudFRpY2tldFpvb20uCiAgICAgICAgQEFydGljbGVBY3Rpb25zID0gZ3JlcCB7ICRfLT57TmFtZX0gbmUgJ01hcmsnIH0gQEFydGljbGVBY3Rpb25zOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVByZXZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JEFydGljbGVJdGVtfSwKICAgICAgICAgICAgICAgICV7ICRDb21tdW5pY2F0aW9uQ2hhbm5lbERhdGF7ICRBcnRpY2xlSXRlbS0+e0NvbW11bmljYXRpb25DaGFubmVsSUR9IH0gfSwKICAgICAgICAgICAgICAgIE1lbnVJdGVtcyA9PiBcQEFydGljbGVBY3Rpb25zLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgY29tcG9zZSBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldENvbXBvc2V9CiAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICFkZWZpbmVkICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICAgICAgICAgfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldENvbXBvc2V9CiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZScpOwogICAgICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgIG15ICRPayA9ICRUaWNrZXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICAgICAgICAgIG15ICRMb2NrZWQgPSAkVGlja2V0T2JqZWN0LT5Mb2NrSXNUaWNrZXRMb2NrZWQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkTG9ja2VkKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFRpY2tldE9iamVjdC0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhY3Rpb24gaXRlbXMgYXMganMKICAgIGlmICggQEFjdGlvbkl0ZW1zICYmICEkUGFyYW17Q29uZmlnfS0+e1RpY2tldEFjdGlvbnNQZXJUaWNrZXR9ICkgewoKICAgICAgICAjIHJlcGxhY2UgVFQgZGlyZWN0aXZlcyBmcm9tIHN0cmluZyB3aXRoIHZhbHVlcwogICAgICAgIGZvciBteSAkQWN0aW9uSXRlbSAoQEFjdGlvbkl0ZW1zKSB7CiAgICAgICAgICAgICRBY3Rpb25JdGVtLT57TGlua30gPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkQWN0aW9uSXRlbS0+e0xpbmt9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0FjdGlvblJvd1RpY2tldHN9LT57ICRQYXJhbXtUaWNrZXRJRH0gfSA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoIERhdGEgPT4gXEBBY3Rpb25JdGVtcyApOwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAlQWNsQWN0aW9uLAogICAgICAgIH0sCiAgICApOwogICAgcmV0dXJuIFwkT3V0cHV0Owp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjxsYWJlbCBmb3I9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPnt7ICJTZXJ2aWNlIEluY2lkZW50IFN0YXRlIiB8IFRyYW5zbGF0ZSB9fTo8L2xhYmVsPgo8ZGl2IGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciIgY2xhc3M9IlZhbHVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlU2lnbmFsIj48L3NwYW4+CiAgICA8L2Rpdj4KICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZSI+Jm5ic3A7PC9zcGFuPgo8L2Rpdj4K
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNVGlja2V0Rmlyc3RMZXZlbFNvbHV0aW9uUmF0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JywKICAgICdLZXJuZWw6OlN5c3RlbTo6UXVldWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTTEEnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0gPSAkUGFyYW17REJTbGF2ZU9iamVjdH0gfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gWydUaWNrZXQnXSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgR2V0T2JqZWN0TmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnSVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGUnOwp9CgpzdWIgR2V0T2JqZWN0QmVoYXZpb3VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVCZWhhdmlvdXJzID0gKAogICAgICAgIFByb3ZpZGVzRGFzaGJvYXJkV2lkZ2V0ID0+IDEsCiAgICApOwoKICAgIHJldHVybiAlQmVoYXZpb3VyczsKfQoKc3ViIEdldE9iamVjdEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VyIGxpc3QKICAgIG15ICVVc2VyTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICAjIGdldCBzdGF0ZSBsaXN0CiAgICBteSAlU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlR2V0U3RhdGVzQnlUeXBlKAogICAgICAgIFN0YXRlVHlwZSA9PiBbJ2Nsb3NlZCddLAogICAgICAgIFJlc3VsdCAgICA9PiAnSEFTSCcsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHF1ZXVlIGxpc3QKICAgIG15ICVRdWV1ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+R2V0QWxsUXVldWVzKCk7CgogICAgIyBnZXQgcHJpb3JpdHkgbGlzdAogICAgbXkgJVByaW9yaXR5TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScpLT5Qcmlvcml0eUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSB0byBmaXggYnVnIzM4MzAKICAgIG15ICRUb2RheSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Gb3JtYXQoIEZvcm1hdCA9PiAnJVktJW0tJWQgMjM6NTk6NTknICk7CgogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdRdWV1ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1F1ZXVlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVF1ZXVlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1ByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgaW4gUXVldWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkUXVldWVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlUXVldWVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIFByaW9yaXR5JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlZFByaW9yaXR5SURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgU3RhdGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkU3RhdGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lclVzZXJMb2dpbicsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlckxvZ2luJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0Zyb20nLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdGcm9tJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RvJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVG8nLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ2MnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDYycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU3ViamVjdCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQm9keScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGUgVGltZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZVRpbWUnLAogICAgICAgICAgICBUaW1lUGVyaW9kRm9ybWF0ID0+ICdEYXRlSW5wdXRGb3JtYXQnLCAgICAjICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnVGltZScsCiAgICAgICAgICAgIFRpbWVTdG9wICAgICAgICAgPT4gJFRvZGF5LAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIFRpbWVTdGFydCA9PiAnVGlja2V0Q3JlYXRlVGltZU5ld2VyRGF0ZScsCiAgICAgICAgICAgICAgICBUaW1lU3RvcCAgPT4gJ1RpY2tldENyZWF0ZVRpbWVPbGRlckRhdGUnLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2xhIGxpc3QKICAgICAgICBteSAlU0xBID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpLT5TTEFMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSBAT2JqZWN0QXR0cmlidXRlQWRkID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1NlcnZpY2VJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU0xBJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1NMQUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgdW5zaGlmdCBAT2JqZWN0QXR0cmlidXRlcywgQE9iamVjdEF0dHJpYnV0ZUFkZDsKICAgIH0KCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCB0eXBlIGxpc3QKICAgICAgICBteSAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlMSA9ICgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVHlwZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1R5cGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICApOwoKICAgICAgICB1bnNoaWZ0IEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTE7CiAgICB9CgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1N0YXRzOjpVc2VBZ2VudEVsZW1lbnRJblN0YXRzJykgKSB7CgogICAgICAgIG15IEBPYmplY3RBdHRyaWJ1dGVBZGQgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0FnZW50L093bmVyJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ093bmVySURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIGJ5IEFnZW50L093bmVyJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZWRVc2VySURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdSZXNwb25zaWJsZUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVVc2VyTGlzdCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBAT2JqZWN0QXR0cmlidXRlQWRkOwogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTdGF0czo6Q3VzdG9tZXJJREFzTXVsdGlTZWxlY3QnKSApIHsKCiAgICAgICAgIyBHZXQgQ3VzdG9tZXJJRAogICAgICAgICMgKFRoaXMgd2F5IGFsc28gY2FuIGJlIHRoZSBzb2x1dGlvbiBmb3IgdGhlIEN1c3RvbWVyVXNlcklEKQogICAgICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnU0VMRUNUIERJU1RJTkNUIGN1c3RvbWVyX2lkIEZST00gdGlja2V0JywKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAlQ3VzdG9tZXJJRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCU2xhdmVPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEeyAkUm93WzBdIH0gPSAkUm93WzBdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlQ3VzdG9tZXJJRCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgfQoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgIG15ICRBQ0wgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEFjbCgKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAnQWdlbnRTdGF0cycsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSB8fCB7fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICAkUG9zc2libGVWYWx1ZXNGaWx0ZXIgPSBcJUZpbHRlcjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICBteSAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXIKICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyktPlN0YXRzRmllbGRQYXJhbWV0ZXJCdWlsZCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICApOwoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlcikgKSB7CiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e1ZhbHVlc30gKSApIHsKCiAgICAgICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXItPntFbGVtZW50fSwKICAgICAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e1ZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57RWxlbWVudH0sCiAgICAgICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBPYmplY3RBdHRyaWJ1dGVzOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnRQcmV2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGludCByYW5kIDUwOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBhbGwgY2xvc2VkIHN0YXRzIGlmIG5vIHN0YXRlcyBhcmUgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtTdGF0ZUlEc30gKSB7CiAgICAgICAgJFBhcmFte1N0YXRlVHlwZX0gPSBbJ2Nsb3NlZCddOwogICAgfQoKICAgICMgc3RhcnQgdGlja2V0IHNlYXJjaAogICAgbXkgQFRpY2tldFNlYXJjaElEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VhcmNoKAogICAgICAgICVQYXJhbSwKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICAgICAgTGltaXQgICAgICA9PiAxMDBfMDAwXzAwMCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgKTsKCiAgICByZXR1cm4gMCBpZiAhQFRpY2tldFNlYXJjaElEczsKCiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICBteSAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cyA9IDA7CiAgICBUSUNLRVRJRDoKICAgIGZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRTZWFyY2hJRHMpIHsKCiAgICAgICAgbXkgQEFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBUSUNLRVRJRCBpZiAhQEFydGljbGVzOwogICAgICAgIG5leHQgVElDS0VUSUQgaWYgc2NhbGFyIEBBcnRpY2xlcyA+IDI7CgogICAgICAgICMgZ2V0IHNlbmRlciB0eXBlIG9mIGZpcnN0IGFydGljbGUKICAgICAgICBteSAkU2VuZGVyVHlwZUZpcnN0QXJ0aWNsZSA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlU2VuZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgU2VuZGVyVHlwZUlEID0+ICRBcnRpY2xlc1swXS0+e1NlbmRlclR5cGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBUSUNLRVRJRCBpZiAkU2VuZGVyVHlwZUZpcnN0QXJ0aWNsZSBlcSAnc3lzdGVtJzsKCiAgICAgICAgIyBpZiB0aGUgdGlja2V0IGNvdWxkIGJlIHNvbHZlZCB3aXRoaW4gdGhlIGZpcnN0IGNvbnRhY3QKICAgICAgICBpZiAoICEkQXJ0aWNsZXNbMV0gKSB7CiAgICAgICAgICAgICRGaXJzdExldmVsU29sdXRpb25UaWNrZXRzKys7CiAgICAgICAgICAgIG5leHQgVElDS0VUSUQ7CiAgICAgICAgfQoKICAgICAgICAjIG5vZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpcnN0IGFydGljbGUgaXMgZnJvbSB0aGUgY3VzdG9tZXIKICAgICAgICBuZXh0IFRJQ0tFVElEIGlmICRTZW5kZXJUeXBlRmlyc3RBcnRpY2xlIG5lICdjdXN0b21lcic7CgogICAgICAgICMgZ2V0IHNlbmRlciB0eXBlIG9mIHNlY29uZCBhcnRpY2xlCiAgICAgICAgbXkgJFNlbmRlclR5cGVTZWNvbmRBcnRpY2xlID0gJEFydGljbGVPYmplY3QtPkFydGljbGVTZW5kZXJUeXBlTG9va3VwKAogICAgICAgICAgICBTZW5kZXJUeXBlSUQgPT4gJEFydGljbGVzWzFdLT57U2VuZGVyVHlwZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIHRoZSBzY29uZCBhcnRpY2xlIGlzIGZyb20gdGhlIGFnZW50CiAgICAgICAgbmV4dCBUSUNLRVRJRCBpZiAkU2VuZGVyVHlwZVNlY29uZEFydGljbGUgbmUgJ2FnZW50JzsKCiAgICAgICAgJEZpcnN0TGV2ZWxTb2x1dGlvblRpY2tldHMrKzsKICAgIH0KCiAgICByZXR1cm4gJEZpcnN0TGV2ZWxTb2x1dGlvblRpY2tldHM7Cn0KCnN1YiBFeHBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCnN1YiBJbXBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JywKICAgICdLZXJuZWw6OlN5c3RlbTo6UXVldWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTTEEnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRzJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntEQlNsYXZlT2JqZWN0fSA9ICRQYXJhbXtEQlNsYXZlT2JqZWN0fSB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSA9PiBbJ1RpY2tldCddLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPYmplY3ROYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICdJVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZSc7Cn0KCnN1YiBHZXRPYmplY3RCZWhhdmlvdXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUJlaGF2aW91cnMgPSAoCiAgICAgICAgUHJvdmlkZXNEYXNoYm9hcmRXaWRnZXQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICVCZWhhdmlvdXJzOwp9CgpzdWIgR2V0T2JqZWN0QXR0cmlidXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXIgbGlzdAogICAgbXkgJVVzZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgZ2V0IHN0YXRlIGxpc3QKICAgIG15ICVTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgU3RhdGVUeXBlID0+IFsnY2xvc2VkJ10sCiAgICAgICAgUmVzdWx0ICAgID0+ICdIQVNIJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgIyBnZXQgcXVldWUgbGlzdAogICAgbXkgJVF1ZXVlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRBbGxRdWV1ZXMoKTsKCiAgICAjIGdldCBwcmlvcml0eSBsaXN0CiAgICBteSAlUHJpb3JpdHlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JyktPlByaW9yaXR5TGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgY3VycmVudCB0aW1lIHRvIGZpeCBidWcjMzgzMAogICAgbXkgJFRvZGF5ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPkZvcm1hdCggRm9ybWF0ID0+ICclWS0lbS0lZCAyMzo1OTo1OScgKTsKCiAgICBteSBAT2JqZWN0QXR0cmlidXRlcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnUXVldWVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlUXVldWVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1N0YXRlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnUHJpb3JpdHlJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlZCBpbiBRdWV1ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZWRRdWV1ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVRdWV1ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgUHJpb3JpdHknLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkUHJpb3JpdHlJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlZCBTdGF0ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZWRTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlckxvZ2luJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyTG9naW4nLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnRnJvbScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0Zyb20nLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVG8nLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUbycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDYycsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NjJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1N1YmplY3QnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdCb2R5JywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZSBUaW1lJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlVGltZScsCiAgICAgICAgICAgIFRpbWVQZXJpb2RGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsICAgICMgJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdUaW1lJywKICAgICAgICAgICAgVGltZVN0b3AgICAgICAgICA9PiAkVG9kYXksCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICdUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAnVGlja2V0Q3JlYXRlVGltZU9sZGVyRGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewoKICAgICAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgICAgICBteSAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzbGEgbGlzdAogICAgICAgIG15ICVTTEEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U0xBJyktPlNMQUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15IEBPYmplY3RBdHRyaWJ1dGVBZGQgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU2VydmljZUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVTZXJ2aWNlLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTTEEnLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU0xBSURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICB1bnNoaWZ0IEBPYmplY3RBdHRyaWJ1dGVzLCBAT2JqZWN0QXR0cmlidXRlQWRkOwogICAgfQoKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKCiAgICAgICAgIyBnZXQgdGlja2V0IHR5cGUgbGlzdAogICAgICAgIG15ICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKS0+VHlwZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUxID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUeXBlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVHlwZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICk7CgogICAgICAgIHVuc2hpZnQgQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlMTsKICAgIH0KCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU3RhdHM6OlVzZUFnZW50RWxlbWVudEluU3RhdHMnKSApIHsKCiAgICAgICAgbXkgQE9iamVjdEF0dHJpYnV0ZUFkZCA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQWdlbnQvT3duZXInLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnT3duZXJJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlVXNlckxpc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgYnkgQWdlbnQvT3duZXInLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlZFVzZXJJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlVXNlckxpc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1Jlc3BvbnNpYmxlSURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgICA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIEBPYmplY3RBdHRyaWJ1dGVBZGQ7CiAgICB9CgogICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1N0YXRzOjpDdXN0b21lcklEQXNNdWx0aVNlbGVjdCcpICkgewoKICAgICAgICAjIEdldCBDdXN0b21lcklECiAgICAgICAgIyAoVGhpcyB3YXkgYWxzbyBjYW4gYmUgdGhlIHNvbHV0aW9uIGZvciB0aGUgQ3VzdG9tZXJVc2VySUQpCiAgICAgICAgJFNlbGYtPntEQlNsYXZlT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgRElTVElOQ1QgY3VzdG9tZXJfaWQgRlJPTSB0aWNrZXQnLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICVDdXN0b21lcklEOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzBdICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVySUR7ICRSb3dbMF0gfSA9ICRSb3dbMF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVDdXN0b21lcklELAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICB9CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgbXkgJEFDTCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0QWNsKAogICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICdBZ2VudFN0YXRzJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9IHx8IHt9LAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICBteSAlRmlsdGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgICAgICRQb3NzaWJsZVZhbHVlc0ZpbHRlciA9IFwlRmlsdGVyOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgIG15ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlcgogICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKS0+U3RhdHNGaWVsZFBhcmFtZXRlckJ1aWxkKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICk7CgogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyKSApIHsKICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57VmFsdWVzfSApICkgewoKICAgICAgICAgICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXItPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICREeW5hbWljRmllbGRTdGF0c1BhcmFtZXRlci0+e0VsZW1lbnR9LAogICAgICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57VmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICAgID0+IDAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkU3RhdHNQYXJhbWV0ZXItPntFbGVtZW50fSwKICAgICAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIEdldFN0YXRFbGVtZW50UHJldmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpbnQgcmFuZCA1MDsKfQoKc3ViIEdldFN0YXRFbGVtZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1c2UgYWxsIGNsb3NlZCBzdGF0cyBpZiBubyBzdGF0ZXMgYXJlIGdpdmVuCiAgICBpZiAoICEkUGFyYW17U3RhdGVJRHN9ICkgewogICAgICAgICRQYXJhbXtTdGF0ZVR5cGV9ID0gWydjbG9zZWQnXTsKICAgIH0KCiAgICAjIHN0YXJ0IHRpY2tldCBzZWFyY2gKICAgIG15IEBUaWNrZXRTZWFyY2hJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlYXJjaCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgICAgIExpbWl0ICAgICAgPT4gMTAwXzAwMF8wMDAsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICk7CgogICAgcmV0dXJuICctJyBpZiAhQFRpY2tldFNlYXJjaElEczsKCiAgICBteSAkVGltZSA9IDA7CgogICAgVElDS0VUSUQ6CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0U2VhcmNoSURzKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICAgICAgbXkgJFRpY2tldERhdGEgPSAkU2VsZi0+X1RpY2tldERhdGFHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJ0VSUk9SJyBpZiAhJXskVGlja2V0RGF0YX07CgogICAgICAgICMgZ2V0IHJlbGV2YW50IHRpY2tldCBoaXN0b3J5CiAgICAgICAgbXkgJEhpc3RvcnlEYXRhID0gJFNlbGYtPl9UaWNrZXRIaXN0b3J5RGF0YUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnRVJST1InIGlmICEkSGlzdG9yeURhdGE7CgogICAgICAgICMgaWYgdGlja2V0IGlzIGNsb3NlZCBpbiB0aGUgdGlja2V0IGNyZWF0ZSBtYXNrCiAgICAgICAgaWYgKCBAeyRIaXN0b3J5RGF0YX0gPT0gMSApIHsKICAgICAgICAgICAgJFRpbWUgKz0gKCAzICogNjAgKTsKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICB9CgogICAgICAgIG15ICVUaW1lc3BhbnM7CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwoKICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHskSGlzdG9yeURhdGF9ICkgewoKICAgICAgICAgICAgaWYgKCAkVGltZXNwYW5zeyRDb3VudGVyfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+e1ZpZXdhYmxlfTsKCiAgICAgICAgICAgICAgICAjIHNldCBzdG9wIHRpbWUKICAgICAgICAgICAgICAgICRUaW1lc3BhbnN7JENvdW50ZXJ9LT57U3RvcFRpbWV9ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEVudHJ5LT57Q3JlYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICktPlRvRXBvY2goKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISRFbnRyeS0+e1ZpZXdhYmxlfTsKCiAgICAgICAgICAgICAgICAjIHNldCBzdGFydCB0aW1lCiAgICAgICAgICAgICAgICAkVGltZXNwYW5zeyRDb3VudGVyfS0+e1N0YXJ0VGltZX0gPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkRW50cnktPntDcmVhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKS0+VG9FcG9jaCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjYWxlbmRhcgogICAgICAgIG15ICRDYWxlbmRhciA9ICRTZWxmLT5fQ2FsZW5kYXJHZXQoCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gJFRpY2tldERhdGEsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRDb3VudCAoIHNvcnQga2V5cyAlVGltZXNwYW5zICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IHRpbWVzdGFtcAogICAgICAgICAgICBteSAkVGltZXNwYW4gPSAkVGltZXNwYW5zeyRDb3VudH07CgogICAgICAgICAgICAkVGltZXNwYW4tPntTdG9wVGltZX0gfHw9ICRUaW1lc3Bhbi0+e1N0YXJ0VGltZX0gKyAoIDMgKiA2MCApOwoKICAgICAgICAgICAgbXkgJFdvcmtpbmdUaW1lU3RhcnREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXBvY2ggPT4gJFRpbWVzcGFuLT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkV29ya2luZ1RpbWVTdG9wRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIEVwb2NoID0+ICRUaW1lc3Bhbi0+e1N0b3BUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkRGVsdGEgPSAkV29ya2luZ1RpbWVTdGFydERhdGVUaW1lT2JqZWN0LT5EZWx0YSgKICAgICAgICAgICAgICAgIERhdGVUaW1lT2JqZWN0ID0+ICRXb3JraW5nVGltZVN0b3BEYXRlVGltZU9iamVjdCwKICAgICAgICAgICAgICAgIEZvcldvcmtpbmdUaW1lID0+IDEsCiAgICAgICAgICAgICAgICBDYWxlbmRhciAgICAgICA9PiAkQ2FsZW5kYXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkVGltZSArPSAkRGVsdGEtPntBYnNvbHV0ZVNlY29uZHN9OwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVGlja2V0Q291bnQgPSBAVGlja2V0U2VhcmNoSURzOwogICAgbXkgJEF2ZXJhZ2VUaW1lID0gJFRpbWUgLyAkVGlja2V0Q291bnQ7CgogICAgIyB0cmFuc2xhdGUgc2Vjb25kcyBpbiBhIHJlYWRhYmxlIGZvcm1hdAogICAgbXkgJFZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyktPl9IdW1hblJlYWRhYmxlQWdlR2V0KAogICAgICAgIEFnZSA9PiBpbnQgJEF2ZXJhZ2VUaW1lLAogICAgKTsKCiAgICByZXR1cm4gJFZhbHVlOwp9CgpzdWIgX1RpY2tldERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4ge30gaWYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgcXVldWVfaWQsIHNsYV9pZCwgY3JlYXRlX3RpbWUKICAgICAgICAgICAgRlJPTSB0aWNrZXQKICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGlja2V0SUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlVGlja2V0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGlja2V0RGF0YXtRdWV1ZUlEfSAgICA9ICRSb3dbMF07CiAgICAgICAgJFRpY2tldERhdGF7U0xBSUR9ICAgICAgPSAkUm93WzFdOwogICAgICAgICRUaWNrZXREYXRhe0NyZWF0ZVRpbWV9ID0gJFJvd1syXTsKICAgIH0KCiAgICByZXR1cm4gXCVUaWNrZXREYXRhOwp9CgpzdWIgX0NhbGVuZGFyR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIG9wdGlvbgogICAgJFNlbGYtPntUaWNrZXRTZXJ2aWNlRmVhdHVyZX0gfHw9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpTZXJ2aWNlJyk7CgogICAgbXkgJUVzY2FsYXRpb25EYXRhOwogICAgaWYgKCAkU2VsZi0+e1RpY2tldFNlcnZpY2VGZWF0dXJlfSAmJiAkUGFyYW17VGlja2V0RGF0YX0tPntTTEFJRH0gKSB7CiAgICAgICAgJUVzY2FsYXRpb25EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpLT5TTEFHZXQoCiAgICAgICAgICAgIFNMQUlEICA9PiAkUGFyYW17VGlja2V0RGF0YX0tPntTTEFJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICBDYWNoZSAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJUVzY2FsYXRpb25EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlR2V0KAogICAgICAgICAgICBJRCAgICAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57UXVldWVJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICBDYWNoZSAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkRXNjYWxhdGlvbkRhdGF7Q2FsZW5kYXJ9IHx8IHVuZGVmOwp9CgpzdWIgX1RpY2tldEhpc3RvcnlEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICMgZ2V0IGlkIG9mIGhpc3RveSB0eXBlIFN0YXRlVXBkYXRlCiAgICBpZiAoICEkU2VsZi0+e1N0YXRlVXBkYXRlSUR9ICkgewogICAgICAgICRTZWxmLT57U3RhdGVVcGRhdGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPkhpc3RvcnlUeXBlTG9va3VwKAogICAgICAgICAgICBUeXBlID0+ICdTdGF0ZVVwZGF0ZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpZCBvZiBoaXN0b3kgdHlwZSBOZXdUaWNrZXQKICAgIGlmICggISRTZWxmLT57TmV3VGlja2V0SUR9ICkgewogICAgICAgICRTZWxmLT57TmV3VGlja2V0SUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICAgICAgVHlwZSA9PiAnTmV3VGlja2V0JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHZpZXdhYmxlIHN0YXRlIGlkcwogICAgaWYgKCAhJFNlbGYtPntWaWV3YWJsZVN0YXRlSURzfSApIHsKICAgICAgICBteSBAVmlld2FibGVTdGF0ZUlEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldFN0YXRlc0J5VHlwZSgKICAgICAgICAgICAgVHlwZSAgID0+ICdWaWV3YWJsZScsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSUQnLAogICAgICAgICk7CgogICAgICAgIG15ICVWaWV3YWJsZVN0YXRlSURMaXN0OwogICAgICAgIGZvciBteSAkU3RhdGVJRCAoQFZpZXdhYmxlU3RhdGVJRHMpIHsKICAgICAgICAgICAgJFZpZXdhYmxlU3RhdGVJRExpc3R7JFN0YXRlSUR9ID0gMTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57Vmlld2FibGVTdGF0ZUlEc30gPSBcJVZpZXdhYmxlU3RhdGVJRExpc3Q7CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1Qgc3RhdGVfaWQsIGNyZWF0ZV90aW1lCiAgICAgICAgICAgIEZST00gdGlja2V0X2hpc3RvcnkKICAgICAgICAgICAgV0hFUkUgdGlja2V0X2lkID0gPwogICAgICAgICAgICBBTkQgaGlzdG9yeV90eXBlX2lkIElOICggPywgPyApCiAgICAgICAgICAgIE9SREVSIEJZIGNyZWF0ZV90aW1lJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIFwkU2VsZi0+e1N0YXRlVXBkYXRlSUR9LAogICAgICAgICAgICBcJFNlbGYtPntOZXdUaWNrZXRJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAVGlja2V0SGlzdG9yeUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCU2xhdmVPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgIG15ICVIaXN0b3J5RGF0YTsKICAgICAgICAkSGlzdG9yeURhdGF7U3RhdGVJRH0gICAgPSAkUm93WzBdOwogICAgICAgICRIaXN0b3J5RGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbMV07CgogICAgICAgIHB1c2ggQFRpY2tldEhpc3RvcnlMaXN0LCBcJUhpc3RvcnlEYXRhOwogICAgfQoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoQFRpY2tldEhpc3RvcnlMaXN0KSB7CgogICAgICAgICRFbnRyeS0+e1ZpZXdhYmxlfSA9IDA7CiAgICAgICAgbmV4dCBFTlRSWSBpZiAhJFNlbGYtPntWaWV3YWJsZVN0YXRlSURzfS0+eyAkRW50cnktPntTdGF0ZUlEfSB9OwogICAgICAgICRFbnRyeS0+e1ZpZXdhYmxlfSA9IDE7CiAgICB9CgogICAgcmV0dXJuIFxAVGlja2V0SGlzdG9yeUxpc3Q7Cn0KCnN1YiBFeHBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCnN1YiBJbXBvcnRXcmFwcGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIFwlUGFyYW07Cn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA0ZmUyMThiZWNjZGI5MjZhMjlkZDdiZWQ5ZGU0ODIxMTQzMGQ2OWQwIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL0FnZW50L0FnZW50VGlja2V0UGhvbmUvU2VydmljZURyb3Bkb3duLnQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IGNvbmZpZyBvYmplY3QKbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgojIGRvIG5vdCBjaGVja214CiRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyktPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICBWYWxpZCA9PiAxLAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgojIHRoaXMgdGVzdCBpcyB0byBjaGVjayB0aGF0IHdoZW4gQWdlbnRUaWNrZXRQaG9uZSBpcyBsb2FkZWQgYWxyZWFkeSB3aXRoCiMgY3VzdG9tZXIgZGF0YSBvbiBpdCAobGlrZSB3aGVuIGRvaW5nIFNwbGl0KSwgdGhlIGRyb3Bkb3duIG9mIFNlcnZpY2UgaXMKIyBwcmVmaWxsZWQgd2l0aCB0aGUgY29ycmVjdCBkYXRhLiBUaGlzIGlzIGJlY2F1c2Ugb2YgYnVnCiMgaHR0cDovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTcwNjAKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgICMgZ2V0IGhlbHBlciBvYmplY3QKICAgICAgICBteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiAgICAgICAgIyB1cGRhdGUgc3lzY29uZmlnIHNldHRpbmdzCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6U2VydmljZScsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB1c2VyIGFuZCBsb2dpbgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbJ3VzZXJzJ10sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBhIGN1c3RvbWVyIGFuZCBhIHRpY2tldCBmcm9tIHRoYXQgY3VzdG9tZXIgYXMgcHJldmlvdXMKICAgICAgICAjIHN0ZXBzIHRvIGRvIHRoZSBzZWxlbml1bSB0ZXN0aW5nCgogICAgICAgIG15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKICAgICAgICBteSAkVGlja2V0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAgICAgIyBjcmVhdGUgYSB0ZXN0IGN1c3RvbWVyCiAgICAgICAgbXkgJFRlc3RVc2VyQ3VzdG9tZXIgPSAkSGVscGVyLT5UZXN0Q3VzdG9tZXJVc2VyQ3JlYXRlKCkKICAgICAgICAgICAgfHwgZGllICJEaWQgbm90IGdldCB0ZXN0IGN1c3RvbWVyIHVzZXIiOwoKICAgICAgICAjIGNyZWF0ZSBhIHRpY2tldCBmcm9tIHRoZSBqdXN0IGNyZWF0ZWQgY3VzdG9tZXIKICAgICAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnU2VsZW5pdW0gVGVzdC1Tb21lIFRpY2tldCBUaXRsZScsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBQcmlvcml0eSAgICAgPT4gJzMgbm9ybWFsJywKICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdjbG9zZWQgc3VjY2Vzc2Z1bCcsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkVGVzdFVzZXJDdXN0b21lciwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICJUaWNrZXQgaXMgY3JlYXRlZCAtICRUaWNrZXRJRCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFRlc3RTZXJ2aWNlID0gIlNlcnZpY2UtIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgY3JlYXRlIGEgdGVzdCBzZXJ2aWNlCiAgICAgICAgbXkgJFNlcnZpY2VJRCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgICAgICAgICBOYW1lICAgID0+ICRUZXN0U2VydmljZSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnU2VsZW5pdW0gVGVzdCBTZXJ2aWNlJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDEsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlcnZpY2VJRCwKICAgICAgICAgICAgIlNlcnZpY2UgaXMgY3JlYXRlZCAtICRTZXJ2aWNlSUQiLAogICAgICAgICk7CgogICAgICAgICMgYWxsb3cgYWNjZXNzIHRvIHRoZSBqdXN0IGNyZWF0ZWQgc2VydmljZSB0byB0aGUgdGVzdCB1c2VyCiAgICAgICAgJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICAgICAgICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRUZXN0VXNlckN1c3RvbWVyLAogICAgICAgICAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICBBY3RpdmUgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGFuIGFydGljbGUgZm9yIHRoZSB0ZXN0IHRpY2tldAogICAgICAgIG15ICRBcnRpY2xlQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKS0+QmFja2VuZEZvckNoYW5uZWwoCiAgICAgICAgICAgIENoYW5uZWxOYW1lID0+ICdJbnRlcm5hbCcsCiAgICAgICAgKTsKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDAsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdhZ2VudCcsCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICdTZWxlbml1bSB0ZXN0JywKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJ0p1c3QgYSB0ZXN0IGJvZHkgZm9yIHNlbGVuaXVtIHRlc3RpbmcnLAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgICAgICA9PiAnSVNPLTg4NTktMTUnLAogICAgICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICdBZGROb3RlJywKICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gJ1NlbGVuaXVtIHRlc3RpbmcnLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQXJ0aWNsZUlELAogICAgICAgICAgICAiQXJ0aWNsZSBpcyBjcmVhdGVkIC0gJEFydGljbGVJRCIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIHJlYWwgc2VsZW5pdW0gdGVzdCBzdGFydAogICAgICAgICMgb3BlbiB0aGUgcGFnZSB0aGF0IGNsaWNraW5nIG9uIFNwbGl0IGxpbmsgb2YgdGhlIHpvb20gdmlldyBvZiB0aGUKICAgICAgICAjIGp1c3QgY3JlYXRlZCB0aWNrZXQgd291bGQgb3BlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoCiAgICAgICAgICAgICIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFBob25lO1RpY2tldElEPSRUaWNrZXRJRDtBcnRpY2xlSUQ9JEFydGljbGVJRCIKICAgICAgICApOwoKICAgICAgICAjIHZlcmlmeSB0aGF0IHRoZSBzZXJ2aWNlcyBkcm9wZG93biBoYXMganVzdCBjcmVhdGVkIHNlcnZpY2UKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICJzZWxlY3QjU2VydmljZUlEIG9wdGlvblt2YWx1ZT0nJFNlcnZpY2VJRCddIiwgJ2NzcycgKSwKICAgICAgICAgICAgIlRoZSBzZXJ2aWNlcyBkcm9wZG93biBoYXMgY3JlYXRlZCBzZXJ2aWNlIC0gJFRlc3RTZXJ2aWNlIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBEQiBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBjbGVhbiB1cCB0ZXN0IGRhdGEKICAgICAgICAjIGRlbGV0ZSB0aGUgdGVzdCB0aWNrZXQKICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgdGlja2V0IC0gJFRpY2tldElEIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0aGUgdGVzdCBzZXJ2aWNlCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2VfY3VzdG9tZXJfdXNlciBXSEVSRSBzZXJ2aWNlX2lkID0gJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJTZXJ2aWNlQ3VzdG9tZXJVc2VyIGRlbGV0ZWQgLSAkU2VydmljZUlEIiwKICAgICAgICApOwoKICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZSBXSEVSRSBpZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlZCBTZXJ2aWNlIC0gJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QuCiAgICAgICAgZm9yIG15ICRDYWNoZSAoCiAgICAgICAgICAgIHF3IChTZXJ2aWNlIFRpY2tldCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRDYWNoZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CgogICAgICAgIG15ICRIZWxwZXIgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwogICAgICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgICAgICMgRG8gbm90IGNoZWNrIFJpY2hUZXh0LgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdGcm9udGVuZDo6UmljaFRleHQnLAogICAgICAgICAgICBWYWx1ZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycsICdpdHNtLXNlcnZpY2UnIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIEdldCB0ZXN0IHVzZXIgSUQuCiAgICAgICAgbXkgJFRlc3RVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdHdvIHRlc3QgdGlja2V0cy4KICAgICAgICBteSBAVGlja2V0SURzOwogICAgICAgIG15IEBUaWNrZXROdW1iZXJzOwogICAgICAgIG15ICRUaWNrZXRUaXRsZSA9ICJTZWxlbml1bSBUaWNrZXQiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBmb3IgbXkgJFRpY2tldCAoIDEgLi4gMiApIHsKICAgICAgICAgICAgbXkgJFRpY2tldE51bWJlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZU51bWJlcigpOwogICAgICAgICAgICBteSAkVGlja2V0SUQgICAgID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgICAgICAgICAgVE4gICAgICAgICAgID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJFRpY2tldFRpdGxlLAogICAgICAgICAgICAgICAgUXVldWUgICAgICAgID0+ICdSYXcnLAogICAgICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ25ldycsCiAgICAgICAgICAgICAgICBDdXN0b21lcklEICAgPT4gJ1NlbGVuaXVtQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICJTZWxlbml1bUN1c3RvbWVyXEBsb2NhbGhvc3QuY29tIiwKICAgICAgICAgICAgICAgIE93bmVySUQgICAgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAiVGlja2V0IGlzIGNyZWF0ZWQgLSBJRCAkVGlja2V0SUQiLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBUaWNrZXRJRHMsICAgICAkVGlja2V0SUQ7CiAgICAgICAgICAgIHB1c2ggQFRpY2tldE51bWJlcnMsICRUaWNrZXROdW1iZXI7CiAgICAgICAgfQoKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gem9vbSB2aWV3IG9mIGZpcnN0IGNyZWF0ZWQgdGVzdCB0aWNrZXQuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRHNbMF0iKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIGEgbGluayBoYXMgbG9hZGVkIHRvIHRoZSBlbGVtZW50LgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCdhW2hyZWYqPVwiQWN0aW9uPUFnZW50VGlja2V0Q2xvc2U7VGlja2V0SUQ9JFRpY2tldElEc1swXVwiXScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIFNldCByZXZpZXcgcmVxdWlyZWQgdmlhIENsb3NlIG1lbnUuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50VGlja2V0Q2xvc2U7VGlja2V0SUQ9JFRpY2tldElEc1swXScgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgIyBTd2l0Y2ggdG8gQ2xvc2Ugd2luZG93LgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyBXYWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5LgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0R5bmFtaWNGaWVsZF9JVFNNUmV2aWV3UmVxdWlyZWQiKS5sZW5ndGggJiYgJCgiI1N1YmplY3QiKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyBDbG9zZSB0aWNrZXQgYW5kIHNldCByZXZpZXcgcmVxdWlyZWQuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjRHluYW1pY0ZpZWxkX0lUU01SZXZpZXdSZXF1aXJlZCcpLnZhbCgnWWVzJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJqZWN0IiwgICdjc3MnICktPnNlbmRfa2V5cygnU2VsZW5pdW0gVGVzdCcpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1JpY2hUZXh0IiwgJ2NzcycgKS0+c2VuZF9rZXlzKCdSZXZpZXdSZXF1aXJlZCcpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2J1dHRvbltcQHR5cGU9J3N1Ym1pdCddIiktPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMSApOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlswXSApOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIHpvb20gdmlldyBvZiBzZWNvbmQgY3JlYXRlZCB0ZXN0IHRpY2tldC4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFRpY2tldElEc1sxXSIpOwoKICAgICAgICAjIFdhaXQgdW50aWwgYSBsaW5rIGhhcyBsb2FkZWQgdG8gdGhlIGVsZW1lbnQuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJ2FbaHJlZio9XCJBY3Rpb249QWdlbnRUaWNrZXRDbG9zZTtUaWNrZXRJRD0kVGlja2V0SURzWzFdXCJdJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgU2V0IHJldmlldyByZXF1aXJlZCB2aWEgQ2xvc2UgbWVudS4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRUaWNrZXRDbG9zZTtUaWNrZXRJRD0kVGlja2V0SURzWzFdJyApXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgV2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeS4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNEeW5hbWljRmllbGRfSVRTTVJldmlld1JlcXVpcmVkIikubGVuZ3RoICYmICQoIiNTdWJqZWN0IikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICMgQ2xvc2UgdGlja2V0IGFuZCBzZXQgcmV2aWV3IHJlcXVpcmVkLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0R5bmFtaWNGaWVsZF9JVFNNUmV2aWV3UmVxdWlyZWQnKS52YWwoJ1llcycpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU3ViamVjdCIsICAnY3NzJyApLT5zZW5kX2tleXMoJ1NlbGVuaXVtIFRlc3QnKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNSaWNoVGV4dCIsICdjc3MnICktPnNlbmRfa2V5cygnUmV2aWV3UmVxdWlyZWQnKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB0eXBlPSdzdWJtaXQnXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZFJlZnJlc2goKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0dsb2JhbFNlYXJjaE5hdiIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBDbGljayBvbiBzZWFyY2guCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjR2xvYmFsU2VhcmNoTmF2IiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiBcJCgnI0F0dHJpYnV0ZScpLmxlbmd0aCAmJiBcJCgnI1NlYXJjaEZvcm1TdWJtaXQnKS5sZW5ndGgiCiAgICAgICAgKTsKCiAgICAgICAgIyBTZWxlY3QgcmV2aWV3IHJlcXVpcmVkIGFuZCB0aXRsZSBzZWFyY2ggZmllbGQuCiAgICAgICAgbXkgJFJldmlld1JlcXVpcmVkSUQgPSAiU2VhcmNoX0R5bmFtaWNGaWVsZF9JVFNNUmV2aWV3UmVxdWlyZWQiOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0F0dHJpYnV0ZScpLnZhbCgnJFJldmlld1JlcXVpcmVkSUQnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjU2VhcmNoSW5zZXJ0ICMkUmV2aWV3UmVxdWlyZWRJRCcpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0F0dHJpYnV0ZScpLnZhbCgnVGl0bGUnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjU2VhcmNoSW5zZXJ0IGlucHV0W25hbWU9XCJUaXRsZVwiXScpLmxlbmd0aCIKICAgICAgICApOwoKICAgICAgICAjIFNlYXJjaCB0aWNrZXRzIGJ5IHJldmlldyByZXF1aXJlZCBhbmQgdGlja2V0IHRpdGxlLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2lucHV0W1xAbmFtZT0nVGl0bGUnXSIpLT5zZW5kX2tleXMoJFRpY2tldFRpdGxlKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyMkUmV2aWV3UmVxdWlyZWRJRCcpLnZhbCgnWWVzJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTZWFyY2hGb3JtU3VibWl0IiwgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICJyZXR1cm4gdHlwZW9mKFwkKSA9PT0gJ2Z1bmN0aW9uJyAmJiAhXCQoJy5EaWFsb2cuTW9kYWwnKS5sZW5ndGgiICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJ2E6Y29udGFpbnMoXCIkVGlja2V0TnVtYmVyc1swXVwiKScpLmxlbmd0aCAmJiBcJCgnYTpjb250YWlucyhcIiRUaWNrZXROdW1iZXJzWzFdXCIpJykubGVuZ3RoIgogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgZm9yIHRlc3QgY3JlYXRlZCB0aWNrZXRzIG9uIHNjcmVlbi4KICAgICAgICBmb3IgbXkgJFRpY2tldE51bWJlciAoQFRpY2tldE51bWJlcnMpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJ2E6Y29udGFpbnMoXCIkVGlja2V0TnVtYmVyXCIpJykubGVuZ3RoIiksCiAgICAgICAgICAgICAgICAiVGVzdCB0aWNrZXQgbnVtYmVyICRUaWNrZXROdW1iZXIgLSBmb3VuZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3QgdGlja2V0cy4KICAgICAgICBmb3IgbXkgJFRpY2tldERlbGV0ZSAoQFRpY2tldElEcykgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXREZWxldGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJUaWNrZXQgaXMgZGVsZXRlZCAtIElEICRUaWNrZXREZWxldGUiCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgY2FjaGUgaXMgY29ycmVjdC4KICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgVHlwZSA9PiAnVGlja2V0JywKICAgICAgICApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA5ZWEwN2E5Nzk2MDMwODU0ZmJjN2NhNWYwNDJmNTUwMWMyZGRkZDliIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL0FnZW50L0FnZW50VGlja2V0QWN0aW9uQ29tbW9uQUNMLnQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKdXNlIHZhcnMgKHF3KCRTZWxmKSk7CgojIE5vdGU6IHRoaXMgVVQgY292ZXJzIGJ1ZyAjMTE4NzQgLSBSZXN0cmljdCBzZXJ2aWNlIGJhc2VkIG9uIHN0YXRlIHdoZW4gcG9zdGluZyBhIG5vdGUKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCiRTZWxlbml1bS0+UnVuVGVzdCgKICAgIHN1YiB7CiAgICAgICAgbXkgJEhlbHBlciAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEFDTE9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBQ0w6OkRCOjpBQ0wnKTsKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnQ2hlY2tNWFJlY29yZCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6U2VydmljZScsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Tm90ZSMjI1NlcnZpY2UnLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAogICAgICAgICk7CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Tm90ZSMjI1F1ZXVlJywKICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICApOwogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldE5vdGUjIyNQcmlvcml0eScsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB0aWNrZXQgZHluYW1pYyBmaWVsZC4KICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgICAgIG15ICREeW5hbWljRmllbGRJRCAgICAgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0ZpZWxkJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAnRmllbGQnIC4gJFJhbmRvbUlELAogICAgICAgICAgICBGaWVsZE9yZGVyID0+IDk5OTk4LAogICAgICAgICAgICBGaWVsZFR5cGUgID0+ICdEcm9wZG93bicsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlICAgPT4gJycsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gewogICAgICAgICAgICAgICAgICAgIDAgPT4gJ05vJywKICAgICAgICAgICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgICAgICBSZW9yZGVyID0+IDAsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICREeW5hbWljRmllbGRJRCwKICAgICAgICAgICAgIkR5bmFtaWNGaWVsZEFkZCAtIEFkZGVkIGR5bmFtaWMgZmllbGQgKCREeW5hbWljRmllbGRJRCkiLAogICAgICAgICk7CgogICAgICAgIG15ICREeW5hbWljRmllbGRJRDIgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0ZpZWxkMicgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gJ0ZpZWxkMicgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gOTk5OTksCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ0Ryb3Bkb3duJywKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgICA9PiAnJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgID0+IDEsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgYSA9PiAnYScsCiAgICAgICAgICAgICAgICAgICAgYiA9PiAnYicsCiAgICAgICAgICAgICAgICAgICAgYyA9PiAnYycsCiAgICAgICAgICAgICAgICAgICAgZCA9PiAnZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRhYmxlVmFsdWVzID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFJlb3JkZXIgPT4gMCwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJER5bmFtaWNGaWVsZElEMiwKICAgICAgICAgICAgIkR5bmFtaWNGaWVsZEFkZCAtIEFkZGVkIGR5bmFtaWMgZmllbGQgKCREeW5hbWljRmllbGRJRCkiLAogICAgICAgICk7CgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldE5vdGUjIyNEeW5hbWljRmllbGQnLAogICAgICAgICAgICBWYWx1ZSA9PiB7CiAgICAgICAgICAgICAgICAnRmllbGQnIC4gJFJhbmRvbUlEICA9PiAxLAogICAgICAgICAgICAgICAgJ0ZpZWxkMicgLiAkUmFuZG9tSUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDbG9zZSMjI0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgICAgICdGaWVsZCcgLiAkUmFuZG9tSUQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIEltcG9ydCB0ZXN0IEFDTC4KICAgICAgICAkQUNMT2JqZWN0LT5BQ0xJbXBvcnQoCiAgICAgICAgICAgIENvbnRlbnQgPT4gPDwiRU9GIiwKLSBDaGFuZ2VCeTogcm9vdFxAbG9jYWxob3N0CiAgQ2hhbmdlVGltZTogMjAxNi0wMi0xNiAwMzowODo1OAogIENvbW1lbnQ6ICcnCiAgQ29uZmlnQ2hhbmdlOgogICAgUG9zc2libGU6CiAgICAgIFRpY2tldDoKICAgICAgICBTZXJ2aWNlOgogICAgICAgIC0gVVQgVGVzdCBTZXJ2aWNlIDEgJFJhbmRvbUlECiAgQ29uZmlnTWF0Y2g6CiAgICBQcm9wZXJ0aWVzOgogICAgICBUaWNrZXQ6CiAgICAgICAgU3RhdGU6CiAgICAgICAgLSBuZXcKICBDcmVhdGVCeTogcm9vdFxAbG9jYWxob3N0CiAgQ3JlYXRlVGltZTogMjAxNi0wMi0xNiAwMjo1NTozNQogIERlc2NyaXB0aW9uOiAnJwogIElEOiAnMScKICBOYW1lOiBUaGlzSXNBVW5pdFRlc3RBQ0wtMQogIFN0b3BBZnRlck1hdGNoOiAwCiAgVmFsaWRJRDogJzEnCi0gQ2hhbmdlQnk6IHJvb3RcQGxvY2FsaG9zdAogIENoYW5nZVRpbWU6IDIwMTYtMDItMTYgMDM6MTA6MDUKICBDb21tZW50OiAnJwogIENvbmZpZ0NoYW5nZToKICAgIFBvc3NpYmxlOgogICAgICBUaWNrZXQ6CiAgICAgICAgU0xBOgogICAgICAgIC0gVVQgVGVzdCBTTEEgMSAkUmFuZG9tSUQKICBDb25maWdNYXRjaDoKICAgIFByb3BlcnRpZXM6CiAgICAgIER5bmFtaWNGaWVsZDoKICAgICAgICBEeW5hbWljRmllbGRfRmllbGQkUmFuZG9tSUQ6CiAgICAgICAgLSAnMCcKICBDcmVhdGVCeTogcm9vdFxAbG9jYWxob3N0CiAgQ3JlYXRlVGltZTogMjAxNi0wMi0xNiAwMzoxMDowNQogIERlc2NyaXB0aW9uOiAnJwogIElEOiAnMicKICBOYW1lOiBUaGlzSXNBVW5pdFRlc3RBQ0wtMgogIFN0b3BBZnRlck1hdGNoOiAwCiAgVmFsaWRJRDogJzEnCi0gQ2hhbmdlQnk6IHJvb3RcQGxvY2FsaG9zdAogIENoYW5nZVRpbWU6IDIwMTYtMDItMTYgMDM6MTE6MDUKICBDb21tZW50OiAnJwogIENvbmZpZ0NoYW5nZToKICAgIFBvc3NpYmxlTm90OgogICAgICBUaWNrZXQ6CiAgICAgICAgUXVldWU6CiAgICAgICAgLSAnSnVuaycKICBDb25maWdNYXRjaDoKICAgIFByb3BlcnRpZXM6CiAgICAgIFRpY2tldDoKICAgICAgICBQcmlvcml0eToKICAgICAgICAtICcyIGxvdycKICBDcmVhdGVCeTogcm9vdFxAbG9jYWxob3N0CiAgQ3JlYXRlVGltZTogMjAxNi0wMi0xNiAwMzoxMTowNQogIERlc2NyaXB0aW9uOiAnJwogIElEOiAnMycKICBOYW1lOiBUaGlzSXNBVW5pdFRlc3RBQ0wtMwogIFN0b3BBZnRlck1hdGNoOiAwCiAgVmFsaWRJRDogJzEnCi0gQ2hhbmdlQnk6IHJvb3RcQGxvY2FsaG9zdAogIENoYW5nZVRpbWU6IDIwMTctMDctMDcgMDk6NDY6MzgKICBDb21tZW50OiAnJwogIENvbmZpZ0NoYW5nZToKICAgIFBvc3NpYmxlTm90OgogICAgICBUaWNrZXQ6CiAgICAgICAgU3RhdGU6CiAgICAgICAgLSBjbG9zZWQgc3VjY2Vzc2Z1bAogIENvbmZpZ01hdGNoOgogICAgUHJvcGVydGllczoKICAgICAgRHluYW1pY0ZpZWxkOgogICAgICAgIER5bmFtaWNGaWVsZF9GaWVsZCRSYW5kb21JRDoKICAgICAgICAtICcwJwogIENyZWF0ZUJ5OiByb290XEBsb2NhbGhvc3QKICBDcmVhdGVUaW1lOiAyMDE3LTA3LTA3IDA5OjQ1OjM4CiAgRGVzY3JpcHRpb246ICcnCiAgSUQ6ICc0JwogIE5hbWU6IFRoaXNJc0FVbml0VGVzdEFDTC00CiAgU3RvcEFmdGVyTWF0Y2g6IDAKICBWYWxpZElEOiAnMScKLSBDaGFuZ2VCeTogcm9vdFxAbG9jYWxob3N0CiAgQ2hhbmdlVGltZTogMjAxNy0wNy0xMCAwOTowMDowMAogIENvbW1lbnQ6ICcnCiAgQ29uZmlnQ2hhbmdlOgogICAgUG9zc2libGU6CiAgICAgIFRpY2tldDoKICAgICAgICBEeW5hbWljRmllbGRfRmllbGQyJFJhbmRvbUlEOgogICAgICAgIC0gJ2EnCiAgICAgICAgLSAnYicKICBDb25maWdNYXRjaDoKICAgIFByb3BlcnRpZXM6CiAgICAgIER5bmFtaWNGaWVsZDoKICAgICAgICBEeW5hbWljRmllbGRfRmllbGQkUmFuZG9tSUQ6CiAgICAgICAgLSAnMCcKICBDcmVhdGVCeTogcm9vdFxAbG9jYWxob3N0CiAgQ3JlYXRlVGltZTogMjAxNy0wNy0xMCAwOTowMDowMAogIERlc2NyaXB0aW9uOiAnJwogIElEOiAnNScKICBOYW1lOiBUaGlzSXNBVW5pdFRlc3RBQ0wtNQogIFN0b3BBZnRlck1hdGNoOiAwCiAgVmFsaWRJRDogJzEnCkVPRgogICAgICAgICAgICBPdmVyd3JpdGVFeGlzdGluZ0VudGl0aWVzID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBBZnRlciBsb2dpbiwgd2UgbmVlZCB0byBuYXZpZ2F0ZSB0byB0aGUgQUNMIGRlcGxveW1lbnQgdG8gbWFrZSB0aGUgaW1wb3J0ZWQgQUNMIHdvcmsuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWRtaW5BQ0w7U3ViYWN0aW9uPUFDTERlcGxveSIpOwogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgaW5kZXgoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLAogICAgICAgICAgICAgICAgJ0FDTCBpbmZvcm1hdGlvbiBmcm9tIGRhdGFiYXNlIGlzIG5vdCBpbiBzeW5jIHdpdGggdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uLCBwbGVhc2UgZGVwbG95IGFsbCBBQ0xzLicKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgID4gLTEsCiAgICAgICAgICAgICJBQ0wgZGVwbG95bWVudCBzdWNjZXNzZnVsLiIKICAgICAgICApOwoKICAgICAgICAjIEFkZCBhIGN1c3RvbWVyLgogICAgICAgIG15ICRDdXN0b21lclVzZXJMb2dpbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgICAgICBVc2VyRmlyc3RuYW1lICA9PiAnSHViZXInLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAnTWFuZnJlZCcsCiAgICAgICAgICAgIFVzZXJDdXN0b21lcklEID0+ICdBMTI0JywKICAgICAgICAgICAgVXNlckxvZ2luICAgICAgPT4gJ2N1c3RvbWVydXNlcl8nIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgICAgICAgICAgVXNlclBhc3N3b3JkICAgPT4gJ3NvbWUtcGFzcycsCiAgICAgICAgICAgIFVzZXJFbWFpbCAgICAgID0+ICRIZWxwZXItPkdldFJhbmRvbUlEKCkgLiAnQGxvY2FsaG9zdC5jb20nLAogICAgICAgICAgICBWYWxpZElEICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHRlc3QgdGlja2V0LgogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICdTZWxlbml1bSBUaWNrZXQnLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnbmV3JywKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICcxMjM0NjUnLAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAiVGlja2V0Q3JlYXRlIC0gSUQgJFRpY2tldElEIiwKICAgICAgICApOwoKICAgICAgICAjIFNldCB0ZXN0IHRpY2tldCBkeW5hbWljIGZpZWxkIHRvIHplcm8tdmFsdWUsIHBsZWFzZSBzZWUgYnVnIzEyMjczIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgIG15ICREeW5hbWljRmllbGRWYWx1ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGRWYWx1ZScpOwoKICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRWYWx1ZU9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgIEZpZWxkSUQgID0+ICREeW5hbWljRmllbGRJRCwKICAgICAgICAgICAgT2JqZWN0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBWYWx1ZSAgICA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWVUZXh0ID0+ICcwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgQ3JlYXRlIHNvbWUgdGVzdCBzZXJ2aWNlcy4KICAgICAgICBteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAjIEdldCB0aGUgbGlzdCBvZiBzZXJ2aWNlIHR5cGVzIGZyb20gZ2VuZXJhbCBjYXRhbG9nLgogICAgICAgIG15ICRTZXJ2aWNlVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICApOwoKICAgICAgICAjIEJ1aWxkIGEgbG9va3VwIGhhc2guCiAgICAgICAgbXkgJVNlcnZpY2VUeXBlTmFtZTJJRCA9IHJldmVyc2UgJXsgJFNlcnZpY2VUeXBlTGlzdCB9OwoKICAgICAgICAjIEdldCB0aGUgbGlzdCBvZiBzbGEgdHlwZXMgZnJvbSBnZW5lcmFsIGNhdGFsb2cuCiAgICAgICAgbXkgJFNMQVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U0xBOjpUeXBlJywKICAgICAgICApOwoKICAgICAgICAjIEJ1aWxkIGEgbG9va3VwIGhhc2guCiAgICAgICAgbXkgJVNMQVR5cGVOYW1lMklEID0gcmV2ZXJzZSAleyAkU0xBVHlwZUxpc3QgfTsKIyAtLS0KCiAgICAgICAgbXkgJFNlcnZpY2VJRDsKICAgICAgICBteSBAU2VydmljZXM7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgJFNlcnZpY2VJRCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlQWRkKAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAiVVQgVGVzdCBTZXJ2aWNlICRDb3VudCAkUmFuZG9tSUQiLAojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICA9PiAkU2VydmljZVR5cGVOYW1lMklEe1RyYWluaW5nfSwKICAgICAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICczIG5vcm1hbCcsCiMgLS0tCiAgICAgICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQFNlcnZpY2VzLCAkU2VydmljZUlEOwoKICAgICAgICAgICAgJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICAiVGVzdCBzZXJ2aWNlICRDb3VudCAoJFNlcnZpY2VJRCkgY3JlYXRlZCBhbmQgYXNzaWduZWQgdG8gY3VzdG9tZXIgdXNlciIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENyZWF0ZSBzZXZlcmFsIHRlc3QgU0xBcy4KICAgICAgICBteSAkU0xBT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpOwoKICAgICAgICBteSBAU0xBczsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICBteSAkU0xBSUQgPSAkU0xBT2JqZWN0LT5TTEFBZGQoCiAgICAgICAgICAgICAgICBTZXJ2aWNlSURzID0+IFxAU2VydmljZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICJVVCBUZXN0IFNMQSAkQ291bnQgJFJhbmRvbUlEIiwKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICAgICAgICAgVHlwZUlEID0+ICRTTEFUeXBlTmFtZTJJRHtPdGhlcn0sCiMgLS0tCiAgICAgICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQFNMQXMsICRTTEFJRDsKICAgICAgICB9CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRUaWNrZXRab29tIHNjcmVlbiBvZiBjcmVhdGVkIHRlc3QgdGlja2V0LgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyBXYWl0IGZvciBkaXNwbGF5aW5nIHN1Ym1lbnUgaXRlbXMgZm9yICdQZW9wbGUnIHRpY2tldCBtZW51IGl0ZW0uCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjbmF2LUNvbW11bmljYXRpb24gdWwiKS5jc3MoeyAiaGVpZ2h0IjogImF1dG8iLCAib3BhY2l0eSI6ICIxMDAiIH0pOycKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uICdOb3RlJyBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudFRpY2tldE5vdGU7VGlja2V0SUQ9JFRpY2tldElEJyApXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICBteSAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgV2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1NlcnZpY2VJRCIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBDaGVjayBmb3IgZW50cmllcyBpbiB0aGUgc2VydmljZSBzZWxlY3Rpb24sIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZQogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNTZXJ2aWNlSUQgb3B0aW9uOm5vdChbdmFsdWU9XCJcIl0pJykubGVuZ3RoIgogICAgICAgICAgICApLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGhlcmUgaXMgb25seSBvbmUgZW50cnkgaW4gdGhlIHNlcnZpY2Ugc2VsZWN0aW9uIiwKICAgICAgICApOwoKICAgICAgICAjIFNldCB0ZXN0IHNlcnZpY2UgYW5kIHRyaWdnZXIgQUpBWCByZWZyZXNoLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1NlcnZpY2VJRCBvcHRpb246bm90KFt2YWx1ZT1cIlwiXSknKS5hdHRyKCdzZWxlY3RlZCcsIHRydWUpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQUpBWExvYWRlcjp2aXNpYmxlIikubGVuZ3RoJyApOwoKICAgICAgICAjIENoZWNrIGZvciByZXN0cmljdGVkIGVudHJpZXMgaW4gdGhlIFNMQSBzZWxlY3Rpb24sIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZS4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICAgICAicmV0dXJuIFwkKCcjU0xBSUQgb3B0aW9uOm5vdChbdmFsdWU9XCJcIl0pJykubGVuZ3RoIgogICAgICAgICAgICApLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGhlcmUgaXMgb25seSBvbmUgZW50cnkgaW4gdGhlIFNMQSBzZWxlY3Rpb24iLAogICAgICAgICk7CgogICAgICAgICMgVmVyaWZ5IHF1ZXVlIGlzIHVwZGF0ZWQgb24gQUNMIHRyaWdnZXIsIHNlZSBidWcjMTI4NjIgKCBodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTEyODYyICkuCiAgICAgICAgbXkgJUp1bmtRdWV1ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUdldCgKICAgICAgICAgICAgTmFtZSA9PiAnSnVuaycsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgicmV0dXJuIFwkKCcjTmV3UXVldWVJRCBvcHRpb25bdmFsdWU9XCIkSnVua1F1ZXVle1F1ZXVlSUR9XCJdJykubGVuZ3RoID4gMCIpLAogICAgICAgICAgICAiSnVuayBxdWV1ZSBpcyBhdmFpbGFibGUgaW4gc2VsZWN0aW9uIGJlZm9yZSBBQ0wgdHJpZ2dlciIKICAgICAgICApOwoKICAgICAgICAjIFRyaWdnZXIgQUNMIG9uIHByaW9yaXR5IGNoYW5nZS4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI05ld1ByaW9yaXR5SUQnKS52YWwoJzInKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkFKQVhMb2FkZXI6dmlzaWJsZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNOZXdRdWV1ZUlEIG9wdGlvblt2YWx1ZT1cIiRKdW5rUXVldWV7UXVldWVJRH1cIl0nKS5sZW5ndGggPiAwIiksCiAgICAgICAgICAgICJKdW5rIHF1ZXVlIGlzIG5vdCBhdmFpbGFibGUgaW4gc2VsZWN0aW9uIGFmdGVyIEFDTCB0cmlnZ2VyIgogICAgICAgICk7CgogICAgICAgICMgVHVybiBvZmYgcHJpb3JpdHkgYW5kIHRyeSBhZ2Fpbi4gUGxlYXNlIHNlZSBidWcjMTMzMTIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Tm90ZSMjI1ByaW9yaXR5JywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIENsb3NlIHRoZSBuZXcgbm90ZSBwb3B1cC4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJy5DYW5jZWxDbG9zZVBvcHVwJywgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CgogICAgICAgICMgQ2xpY2sgb24gJ05vdGUnIGFuZCBzd2l0Y2ggd2luZG93LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudFRpY2tldE5vdGU7VGlja2V0SUQ9JFRpY2tldElEJyApXSIpLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgV2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNTZXJ2aWNlSUQiKS5sZW5ndGgnICk7CgogICAgICAgICMgQ2hlY2sgZm9yIGVudHJpZXMgaW4gdGhlIHNlcnZpY2Ugc2VsZWN0aW9uLCB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI1NlcnZpY2VJRCBvcHRpb246bm90KFt2YWx1ZT1cIlwiXSknKS5sZW5ndGgiCiAgICAgICAgICAgICksCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICdUaGVyZSBpcyBvbmx5IG9uZSBlbnRyeSBpbiB0aGUgc2VydmljZSBzZWxlY3Rpb24nCiAgICAgICAgKTsKCiAgICAgICAgIyBTZXQgdGVzdCBzZXJ2aWNlIGFuZCB0cmlnZ2VyIEFKQVggcmVmcmVzaC4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNTZXJ2aWNlSUQgb3B0aW9uOm5vdChbdmFsdWU9XCJcIl0pJykuYXR0cignc2VsZWN0ZWQnLCB0cnVlKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkFKQVhMb2FkZXI6dmlzaWJsZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBDaGVjayBmb3IgcmVzdHJpY3RlZCBlbnRyaWVzIGluIHRoZSBTTEEgc2VsZWN0aW9uLCB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI1NMQUlEIG9wdGlvbjpub3QoW3ZhbHVlPVwiXCJdKScpLmxlbmd0aCIKICAgICAgICAgICAgKSwKICAgICAgICAgICAgMSwKICAgICAgICAgICAgJ1RoZXJlIGlzIG9ubHkgb25lIGVudHJ5IGluIHRoZSBTTEEgc2VsZWN0aW9uJwogICAgICAgICk7CgogICAgICAgICMgQ2xvc2UgdGhlIG5ldyBub3RlIHBvcHVwLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkNhbmNlbENsb3NlUG9wdXAnLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgIyBQbGVhc2Ugc2VlIGJ1ZyMxMjg3MSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRWYWx1ZU9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgIEZpZWxkSUQgID0+ICREeW5hbWljRmllbGRJRDIsCiAgICAgICAgICAgIE9iamVjdElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVmFsdWUgICAgPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFZhbHVlVGV4dCA9PiAnYScsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIENsaWNrIG9uICdOb3RlJyBhbmQgc3dpdGNoIHdpbmRvdy4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdBY3Rpb249QWdlbnRUaWNrZXROb3RlO1RpY2tldElEPSRUaWNrZXRJRCcgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIFdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZihDb3JlKSA9PSAib2JqZWN0IiAmJiB0eXBlb2YoQ29yZS5BcHApID09ICJvYmplY3QiICYmIENvcmUuQXBwLlBhZ2VMb2FkQ29tcGxldGUnCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI0R5bmFtaWNGaWVsZF9GaWVsZDIkUmFuZG9tSUQgb3B0aW9uOm5vdChbdmFsdWU9XCJcIl0pJykubGVuZ3RoIgogICAgICAgICAgICApLAogICAgICAgICAgICAyLAogICAgICAgICAgICAiVGhlcmUgYXJlIG9ubHkgdHdvIGVudHJpZXMgaW4gdGhlIGR5bmFtaWMgZmllbGQgMiBzZWxlY3Rpb24iLAogICAgICAgICk7CgogICAgICAgICMgRGUtc2VsZWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZvciB0aGUgZmlyc3QgZmllbGQuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjRHluYW1pY0ZpZWxkX0ZpZWxkJFJhbmRvbUlEJykudmFsKCcnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkFKQVhMb2FkZXI6dmlzaWJsZSIpLmxlbmd0aCcgKTsKCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAgICAgInJldHVybiBcJCgnI0R5bmFtaWNGaWVsZF9GaWVsZDIkUmFuZG9tSUQgb3B0aW9uOm5vdChbdmFsdWU9XCJcIl0pJykubGVuZ3RoIgogICAgICAgICAgICApLAogICAgICAgICAgICA0LAogICAgICAgICAgICAiVGhlcmUgYXJlIGFsbCBmb3VyIGVudHJpZXMgaW4gdGhlIGR5bmFtaWMgZmllbGQgMiBzZWxlY3Rpb24iLAogICAgICAgICk7CgogICAgICAgICMgQ2xvc2UgdGhlIG5ldyBub3RlIHBvcHVwLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnLkNhbmNlbENsb3NlUG9wdXAnLCAnY3NzJyApLT5jbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgIyBDbGljayBvbiAnQ2xvc2UnIGFjdGlvbiBhbmQgc3dpdGNoIHRvIGl0LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudFRpY2tldENsb3NlO1RpY2tldElEPSRUaWNrZXRJRCcgKV0iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIFdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIjsnICk7CgogICAgICAgICMgQXQgdGhpcyBwb2ludCwgc3RhdGUgZmllbGQgc2hvdWxkIGJlIG1pc3NpbmcgJ2Nsb3NlZCBzdWNjZXNzZnVsJyBzdGF0ZSBiZWNhdXNlIG9mIEFDTC4KICAgICAgICAjICAgQ2hhbmdlIHRoZSBkeW5hbWljIGZpZWxkIHByb3BlcnR5IHRvICcxJyBhbmQgd2FpdCB1bnRpbCAnY2xvc2VkIHN1Y2Nlc3NmdWwnIGlzIGF2YWlsYWJsZSBhZ2Fpbi4KICAgICAgICAjICAgVGhlbiwgY2xvc2UgdGhlIHRpY2tldCBhbmQgdmVyaWZ5IGl0IHdhcyBhY3R1YWxseSBjbG9zZWQuCiAgICAgICAgIyAgIFBsZWFzZSBzZWUgYnVnIzEyNjcxIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNOZXdTdGF0ZUlEIG9wdGlvbjpjb250YWlucyhcImNsb3NlZCBzdWNjZXNzZnVsXCIpJykubGVuZ3RoID09IDAiKSwKICAgICAgICAgICAgIlN0YXRlICdjbG9zZWQgc3VjY2Vzc2Z1bCcgbm90IGF2YWlsYWJsZSBpbiBuZXcgc3RhdGUgc2VsZWN0aW9uIGJlZm9yZSBERiB1cGRhdGUiCiAgICAgICAgKTsKCiAgICAgICAgIyBTZXQgZHluYW1pYyBmaWVsZCB2YWx1ZSB0byBub24temVybywgYW5kIHdhaXQgZm9yIEFKQVggdG8gY29tcGxldGUuCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjRHluYW1pY0ZpZWxkX0ZpZWxkJFJhbmRvbUlEJykudmFsKCcxJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5BSkFYTG9hZGVyOnZpc2libGUiKS5sZW5ndGgnICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNOZXdTdGF0ZUlEIG9wdGlvbjpjb250YWlucyhcImNsb3NlZCBzdWNjZXNzZnVsXCIpJykubGVuZ3RoID09IDEiKSwKICAgICAgICAgICAgIlN0YXRlICdjbG9zZWQgc3VjY2Vzc2Z1bCcgYXZhaWxhYmxlIGluIG5ldyBzdGF0ZSBzZWxlY3Rpb24gYWZ0ZXIgREYgdXBkYXRlIgogICAgICAgICk7CgogICAgICAgICMgQ2xvc2UgdGhlIHRpY2tldC4KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNOZXdTdGF0ZUlEJykudmFsKCcyJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNTdWJqZWN0JywgICAgICAgICdjc3MnICktPnNlbmRfa2V5cygnQ2xvc2UnKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNSaWNoVGV4dCcsICAgICAgICdjc3MnICktPnNlbmRfa2V5cygnQ2xvc2luZy4uLicpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI3N1Ym1pdFJpY2hUZXh0JywgJ2NzcycgKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAxICk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gdGlja2V0IGhpc3Rvcnkgc2NyZWVuIG9mIHRlc3QgdGlja2V0LgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0SGlzdG9yeTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgdGlja2V0IHdhcyBpbmRlZWQgY2xvc2VkIHN1Y2Nlc3NmdWxseS4KICAgICAgICBteSAkQ2xvc2VNc2cgPSAnQ2hhbmdlZCBzdGF0ZSBmcm9tICJuZXciIHRvICJjbG9zZWQgc3VjY2Vzc2Z1bCIuJzsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRDbG9zZU1zZyApID4gLTEsCiAgICAgICAgICAgICdUaWNrZXQgY2xvc2VkIHN1Y2Nlc3NmdWxseScKICAgICAgICApOwoKICAgICAgICAjIENsZWFudXAKCiAgICAgICAgIyBEZWxldGUgdGVzdCBBQ0xzIHJ1bGVzLgogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDUgKSB7CiAgICAgICAgICAgIG15ICRBQ0xEYXRhID0gJEFDTE9iamVjdC0+QUNMR2V0KAogICAgICAgICAgICAgICAgTmFtZSAgID0+ICdUaGlzSXNBVW5pdFRlc3RBQ0wtJyAuICRDb3VudCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQUNMT2JqZWN0LT5BQ0xEZWxldGUoCiAgICAgICAgICAgICAgICBJRCAgICAgPT4gJEFDTERhdGEtPntJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJBQ0wgd2l0aCBJRCAkQUNMRGF0YS0+e0lEfSBpcyBkZWxldGVkIgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBEZXBsb3kgYWdhaW4gYWZ0ZXIgd2UgZGVsZXRlZCB0aGUgdGVzdCBhY2wuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWRtaW5BQ0w7U3ViYWN0aW9uPUFDTERlcGxveSIpOwogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgaW5kZXgoCiAgICAgICAgICAgICAgICAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLAogICAgICAgICAgICAgICAgJ0FDTCBpbmZvcm1hdGlvbiBmcm9tIGRhdGFiYXNlIGlzIG5vdCBpbiBzeW5jIHdpdGggdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uLCBwbGVhc2UgZGVwbG95IGFsbCBBQ0xzLicKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgID4gLTEsCiAgICAgICAgICAgICJBQ0wgZGVwbG95bWVudCBzdWNjZXNzZnVsLiIKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3QgdGlja2V0cy4KICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgVGlja2V0IGRlbGV0aW9uIGNvdWxkIGZhaWwgaWYgYXBhY2hlIHN0aWxsIHdyaXRlcyB0byB0aWNrZXQgaGlzdG9yeS4gVHJ5IGFnYWluIGluIHRoaXMgY2FzZS4KICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgc2xlZXAgMzsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJUaWNrZXQgd2l0aCB0aWNrZXQgSUQgJFRpY2tldElEIGlzIGRlbGV0ZWQiCiAgICAgICAgKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QuCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoIFR5cGUgPT4gJ1RpY2tldCcgKTsKCiAgICAgICAgIyBEZWxldGUgdGVzdCBTTEFzLgogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgICAgIGZvciBteSAkU0xBSUQgKEBTTEFzKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2Vfc2xhIFdIRVJFIHNsYV9pZCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkU0xBSUQgXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJEZWxldGVkIFNMQSB3aXRoIElEICRTTEFJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSBzZXJ2aWNlcyBhbmQgcmVsYXRpb25zLgogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gc2VydmljZV9jdXN0b21lcl91c2VyIFdIRVJFIGN1c3RvbWVyX3VzZXJfbG9naW4gPSA/IiwKICAgICAgICAgICAgQmluZCA9PiBbIFwkQ3VzdG9tZXJVc2VyTG9naW4gXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgc2VydmljZSByZWxhdGlvbnMgZm9yICRDdXN0b21lclVzZXJMb2dpbiIsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoQFNlcnZpY2VzKSB7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAgICAgIyBDbGVhbiB1cCBzZXJ2aWNhIGRhdGEuCiAgICAgICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2VfcHJlZmVyZW5jZXMgV0hFUkUgc2VydmljZV9pZCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkU2VydmljZUlEIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiU2VydmljZVByZWZlcmVuY2VzIGlzIGRlbGV0ZWQgLSBJRCAkU2VydmljZUlEIiwKICAgICAgICAgICAgKTsKIyAtLS0KICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gc2VydmljZSBXSEVSRSBJRCA9ID8iLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkU2VydmljZUlEIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiRGVsZXRlZCBzZXJ2aWNlIHdpdGggSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGN1c3RvbWVyX3VzZXIgV0hFUkUgbG9naW4gPSA/IiwKICAgICAgICAgICAgQmluZCA9PiBbIFwkQ3VzdG9tZXJVc2VyTG9naW4gXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkRlbGV0ZWQgQ3VzdG9tZXIgJEN1c3RvbWVyVXNlckxvZ2luIiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSB0ZXN0IGR5bmFtaWMgZmllbGQuCiAgICAgICAgJFN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGREZWxldGUoCiAgICAgICAgICAgIElEICAgICA9PiAkRHluYW1pY0ZpZWxkSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRHluYW1pY0ZpZWxkRGVsZXRlIC0gRGVsZXRlZCB0ZXN0IGR5bmFtaWMgZmllbGQgJER5bmFtaWNGaWVsZElEIiwKICAgICAgICApOwoKICAgICAgICAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZERlbGV0ZSgKICAgICAgICAgICAgSUQgICAgID0+ICREeW5hbWljRmllbGRJRDIsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRHluYW1pY0ZpZWxkRGVsZXRlIC0gRGVsZXRlZCB0ZXN0IGR5bmFtaWMgZmllbGQgJER5bmFtaWNGaWVsZElEMiIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0LgogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3KCBTZXJ2aWNlIFNMQSBDdXN0b21lclVzZXIgRHluYW1pY0ZpZWxkICkpIHsKICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKCBUeXBlID0+ICRDYWNoZSApOwogICAgICAgIH0KICAgIH0sCik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tc2VydmljZScgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRlc3QgdXNlciBJRAogICAgICAgIG15ICRUZXN0VXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHRpY2tldHMKICAgICAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAiU2VsZW5pdW0gVGVzdCBUaWNrZXQiLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnbmV3JywKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICdTZWxlbml1bUN1c3RvbWVyJywKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICJTZWxlbml1bUN1c3RvbWVyXEBsb2NhbGhvc3QuY29tIiwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+ICRUZXN0VXNlcklELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAiVGlja2V0IGlzIGNyZWF0ZWQgLSBJRCAkVGlja2V0SUQiLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byB6b29tIHZpZXcgb2YgY3JlYXRlZCB0ZXN0IHRpY2tldAogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyBjbGljayAnQWRkaXRpb25hbCBJVFNNIEZpZWxkcycgYW5kIHN3aXRjaCB3aW5kb3cKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgJ0FjdGlvbj1BZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkO1RpY2tldElEPSRUaWNrZXRJRCcgKV0iKQogICAgICAgICAgICAtPmNsaWNrKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggV2luZG93Q291bnQgPT4gMiApOwogICAgICAgIG15ICRIYW5kbGVzID0gJFNlbGVuaXVtLT5nZXRfd2luZG93X2hhbmRsZXMoKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMV0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNEeW5hbWljRmllbGRfSVRTTVJlcGFpclN0YXJ0VGltZVVzZWQiKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBzY3JlZW4KICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgcXcoIFJlcGFpclN0YXJ0VGltZVVzZWQgUmVjb3ZlcnlTdGFydFRpbWVVc2VkIER1ZURhdGVVc2VkKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0R5bmFtaWNGaWVsZF9JVFNNJElEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyBjaGFuZ2UgdGl0bGUgYW5kIGFkZCByZXBhaXIsIHJlY292ZXJ5IGFuZCBkdWUgZGF0ZXMKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNUaXRsZSIsICdjc3MnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVGl0bGUiLCAnY3NzJyApLT5zZW5kX2tleXMoIlNlbGVuaXVtIElUU00gRmllbGRzIFRpY2tldCIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0R5bmFtaWNGaWVsZF9JVFNNUmVwYWlyU3RhcnRUaW1lVXNlZCIsICAgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEeW5hbWljRmllbGRfSVRTTVJlY292ZXJ5U3RhcnRUaW1lVXNlZCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdHlwZT0nc3VibWl0J10iKS0+Y2xpY2soKTsKCiAgICAgICAgIyBzd2l0Y2ggYmFjayB0byB6b29tIHZpZXcKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5DbHVzdGVyIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICMgZm9yY2Ugc3ViIG1lbnVzIHRvIGJlIHZpc2libGUgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjbGljayBvbmUgb2YgdGhlIGxpbmtzCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJy5DbHVzdGVyIHVsIHVsJykuYWRkQ2xhc3MoJ0ZvcmNlVmlzaWJsZScpOyIpOwoKICAgICAgICAjIGNsaWNrIG9uIGhpc3RvcnkgbGluayBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvLypbdGV4dCgpPSdIaXN0b3J5J10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuQ2FuY2VsQ2xvc2VQb3B1cCIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgVGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlcwogICAgICAgIGZvciBteSAkVXBkYXRlVGV4dCAocXcoUmVwYWlyU3RhcnRUaW1lIFJlY292ZXJ5U3RhcnRUaW1lIER1ZURhdGUpKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJDaGFuZ2VkIGR5bmFtaWMgZmllbGQgSVRTTSRVcGRhdGVUZXh0IiApID4gLTEsCiAgICAgICAgICAgICAgICAiRHluYW1pY0ZpZWxkVXBkYXRlICRVcGRhdGVUZXh0IC0gZm91bmQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkZWxldGUgY3JlYXRlZCB0ZXN0IHRpY2tldHMKICAgICAgICBteSAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tldCBpcyBkZWxldGVkIC0gSUQgJFRpY2tldElEIgogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgKTsKICAgIH0KKTsKCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ2l0c20tc2VydmljZScgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRlc3QgdXNlciBJRAogICAgICAgIG15ICRUZXN0VXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IHRpY2tldHMKICAgICAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAiU2VsZW5pdW0gVGVzdCBUaWNrZXQiLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgID0+ICczIG5vcm1hbCcsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnbmV3JywKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICdTZWxlbml1bUN1c3RvbWVyJywKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICJTZWxlbml1bUN1c3RvbWVyXEBsb2NhbGhvc3QuY29tIiwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+ICRUZXN0VXNlcklELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAiVGlja2V0IGlzIGNyZWF0ZWQgLSBJRCAkVGlja2V0SUQiLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byB6b29tIHZpZXcgb2YgY3JlYXRlZCB0ZXN0IHRpY2tldAogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyBjbGljayAnRGVjaXNpb24nIGFuZCBzd2l0Y2ggd2luZG93CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsICdBY3Rpb249QWdlbnRUaWNrZXREZWNpc2lvbjtUaWNrZXRJRD0kVGlja2V0SUQnICldIiktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0R5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25SZXN1bHQiKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBzY3JlZW4KICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgcXcoIFJlc3VsdCBEYXRlVXNlZCBEYXRlTW9udGggRGF0ZURheSBEYXRlWWVhciBEYXRlSG91ciBEYXRlTWludXRlICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNEeW5hbWljRmllbGRfSVRTTURlY2lzaW9uJElEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyBjaGFuZ2UgZGVjaXNpb24gcmVzdWx0IGFuZCBkYXRlCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjRHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvblJlc3VsdCcpLnZhbCgnUmVqZWN0ZWQnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0R5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25EYXRlVXNlZCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAdHlwZT0nc3VibWl0J10iKS0+Y2xpY2soKTsKCiAgICAgICAgIyBzd2l0Y2ggYmFjayB0byB6b29tIHZpZXcKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDEgKTsKICAgICAgICAkU2VsZW5pdW0tPnN3aXRjaF90b193aW5kb3coICRIYW5kbGVzLT5bMF0gKTsKCiAgICAgICAgIyB3YWl0IHVudGlsIHBhZ2UgaGFzIGxvYWRlZCwgaWYgbmVjZXNzYXJ5CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5DbHVzdGVyIikubGVuZ3RoJwogICAgICAgICk7CgogICAgICAgICMgZm9yY2Ugc3ViIG1lbnVzIHRvIGJlIHZpc2libGUgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjbGljayBvbmUgb2YgdGhlIGxpbmtzCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJy5DbHVzdGVyIHVsIHVsJykuYWRkQ2xhc3MoJ0ZvcmNlVmlzaWJsZScpOyIpOwoKICAgICAgICAjIGNsaWNrIG9uIGhpc3RvcnkgbGluayBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvLypbdGV4dCgpPSdIaXN0b3J5J10iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIFdpbmRvd0NvdW50ID0+IDIgKTsKICAgICAgICAkSGFuZGxlcyA9ICRTZWxlbml1bS0+Z2V0X3dpbmRvd19oYW5kbGVzKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzFdICk7CgogICAgICAgICMgd2FpdCB1bnRpbCBwYWdlIGhhcyBsb2FkZWQsIGlmIG5lY2Vzc2FyeQogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIuQ2FuY2VsQ2xvc2VQb3B1cCIpLmxlbmd0aCcgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgZGVjaXNpb24gVGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlcwogICAgICAgIGZvciBteSAkVXBkYXRlVGV4dCAocXcoUmVzdWx0IERhdGUpKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJDaGFuZ2VkIGR5bmFtaWMgZmllbGQgSVRTTURlY2lzaW9uJFVwZGF0ZVRleHQiICkgPiAtMSwKICAgICAgICAgICAgICAgICJEeW5hbWljRmllbGRVcGRhdGUgZGVjaXNpb24gJFVwZGF0ZVRleHQgLSBmb3VuZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3QgdGlja2V0cwogICAgICAgIG15ICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0RGVsZXRlKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRUZXN0VXNlcklELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiVGlja2V0IGlzIGRlbGV0ZWQgLSBJRCAkVGlja2V0SUQiCiAgICAgICAgKTsKCiAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgVHlwZSA9PiAnVGlja2V0JywKICAgICAgICApOwogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA5ZWEwN2E5Nzk2MDMwODU0ZmJjN2NhNWYwNDJmNTUwMWMyZGRkZDliIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL0FnZW50L0FnZW50VGlja2V0RW1haWwudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgbXkgJEhlbHBlciAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJFNpZ25hdHVyZU9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTaWduYXR1cmUnKTsKICAgICAgICBteSAkUXVldWVPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAgICAgIyBEaXNhYmxlIGNoZWNrIGVtYWlsIGFkZHJlc3Nlcy4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBEbyBub3QgY2hlY2sgUmljaFRleHQuCiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0Zyb250ZW5kOjpSaWNoVGV4dCcsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBEbyBub3QgY2hlY2sgc2VydmljZSBhbmQgdHlwZS4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnVGlja2V0OjpTZXJ2aWNlJywKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQojICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICAgICAgVmFsdWUgPT4gMSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OlR5cGUnLAojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiMgICAgICAgICAgICBWYWx1ZSA9PiAwLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAojIC0tLQogICAgICAgICk7CgogICAgICAgICMgRW5hYmxlIHNlc3Npb24gbWFuYWdlbWVudCB1c2UgaHRtbCBjb29raWVzLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdTZXNzaW9uVXNlQ29va2llJywKICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIERlZmluZSByYW5kb20gdGVzdCB2YXJpYWJsZS4KICAgICAgICBteSAkUmFuZG9tSUQgPSAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwoKICAgICAgICBteSBAU2lnbmF0dXJlSURzOwogICAgICAgIG15IEBRdWV1ZUlEczsKICAgICAgICBteSBAUXVldWVOYW1lczsKICAgICAgICBteSBAQ3VzdG9tZXJVc2VySURzOwogICAgICAgIG15IEBUZXN0RGF0YSA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU2lnbmF0dXJlTmFtZSA9PiAnU2lnbmF0dXJlMScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBTaWduYXR1cmVUZXh0ID0+ICdDdXN0b21lciBGaXJzdCBOYW1lOiA8T1RSU19DVVNUT01FUl9EQVRBX1VzZXJGaXJzdG5hbWU+JywKICAgICAgICAgICAgICAgIFF1ZXVlTmFtZSAgICAgPT4gJ1F1ZXVlMScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBVc2VyRmlyc3ROYW1lID0+ICdGaXJzdE5hbWUxJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgICAgIFVzZXJMYXN0TmFtZSAgPT4gJ0xhc3ROYW1lMScgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gICAgID0+ICdVc2VyTG9naW4xJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU2lnbmF0dXJlTmFtZSA9PiAnU2lnbmF0dXJlMicgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBTaWduYXR1cmVUZXh0ID0+ICdDdXN0b21lciBMYXN0IE5hbWU6IDxPVFJTX0NVU1RPTUVSX0RBVEFfVXNlckxhc3RuYW1lPicsCiAgICAgICAgICAgICAgICBRdWV1ZU5hbWUgICAgID0+ICdRdWV1ZTInIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgVXNlckZpcnN0TmFtZSA9PiAnRmlyc3ROYW1lMicgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgICAgICBVc2VyTGFzdE5hbWUgID0+ICdMYXN0TmFtZTInIC4gJFJhbmRvbUlELAogICAgICAgICAgICAgICAgVXNlckxvZ2luICAgICA9PiAnVXNlckxvZ2luMicgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICREYXRhIChAVGVzdERhdGEpIHsKICAgICAgICAgICAgbXkgJFNpZ25hdHVyZUlEID0gJFNpZ25hdHVyZU9iamVjdC0+U2lnbmF0dXJlQWRkKAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJERhdGEtPntTaWduYXR1cmVOYW1lfSwKICAgICAgICAgICAgICAgIFRleHQgICAgICAgID0+ICREYXRhLT57U2lnbmF0dXJlVGV4dH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCcsCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICA9PiAnU2VsZW5pdW0gc2lnbmF0dXJlJywKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRTaWduYXR1cmVJRCwKICAgICAgICAgICAgICAgICJTaWduYXR1cmVJRCAkU2lnbmF0dXJlSUQgaXMgY3JlYXRlZCIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAU2lnbmF0dXJlSURzLCAkU2lnbmF0dXJlSUQ7CgogICAgICAgICAgICBteSAkUXVldWVJRCA9ICRRdWV1ZU9iamVjdC0+UXVldWVBZGQoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJERhdGEtPntRdWV1ZU5hbWV9LAogICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBHcm91cElEICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFN5c3RlbUFkZHJlc3NJRCA9PiAxLAogICAgICAgICAgICAgICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICAgICAgICAgICAgICBTaWduYXR1cmVJRCAgICAgPT4gJFNpZ25hdHVyZUlELAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICAgID0+ICdTZWxlbml1bSBRdWV1ZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkUXVldWVJRCwKICAgICAgICAgICAgICAgICJRdWV1ZUlEICRRdWV1ZUlEIGlzIGNyZWF0ZWQiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQFF1ZXVlSURzLCAgICRRdWV1ZUlEOwogICAgICAgICAgICBwdXNoIEBRdWV1ZU5hbWVzLCAkRGF0YS0+e1F1ZXVlTmFtZX07CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJVc2VySUQgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJBZGQoCiAgICAgICAgICAgICAgICBTb3VyY2UgICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgID0+ICREYXRhLT57VXNlckZpcnN0TmFtZX0sCiAgICAgICAgICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAkRGF0YS0+e1VzZXJMYXN0TmFtZX0sCiAgICAgICAgICAgICAgICBVc2VyQ3VzdG9tZXJJRCA9PiAkRGF0YS0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gICAgICA9PiAkRGF0YS0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBVc2VyRW1haWwgICAgICA9PiAiJERhdGEtPntVc2VyTG9naW59XEBsb2NhbGhvc3QuY29tIiwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgICAgICJDdXN0b21lclVzZXJJRCAkQ3VzdG9tZXJVc2VySUQgaXMgY3JlYXRlZCIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJVc2VySURzLCAkQ3VzdG9tZXJVc2VySUQ7CiAgICAgICAgfQoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHVzZXIgYW5kIGxvZ2luLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ3VzZXJzJywgJ2l0c20tc2VydmljZScgXSwKIyAtLS0KICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBOYXZpZ2F0ZSB0byBBZ2VudFRpY2tldEVtYWlsIHNjcmVlbi4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldEVtYWlsIik7CgogICAgICAgICMgQ2hlY2sgcGFnZS4KICAgICAgICBmb3IgbXkgJElEICgKICAgICAgICAgICAgcXcoRGVzdCBUb0N1c3RvbWVyIENjQ3VzdG9tZXIgQmNjQ3VzdG9tZXIgQ3VzdG9tZXJJRCBSaWNoVGV4dAogICAgICAgICAgICBTaWduYXR1cmUgRmlsZVVwbG9hZCBOZXh0U3RhdGVJRCBQcmlvcml0eUlEIHN1Ym1pdFJpY2hUZXh0KQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgICwgcXcoVHlwZUlEIFNlcnZpY2VJRCBPcHRpb25MaW5rVGlja2V0IER5bmFtaWNGaWVsZF9JVFNNSW1wYWN0KQojIC0tLQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRJRCIsICdjc3MnICk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgY2xpZW50IHNpZGUgdmFsaWRhdGlvbi4KICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1N1YmplY3QiLCAnY3NzJyApOwogICAgICAgICRFbGVtZW50LT5zZW5kX2tleXMoIiIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI3N1Ym1pdFJpY2hUZXh0IiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1N1YmplY3QuRXJyb3IiKS5sZW5ndGgnICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJyZXR1cm4gXCQoJyNTdWJqZWN0LkVycm9yJykubGVuZ3RoIiksCiAgICAgICAgICAgICdDbGllbnQgc2lkZSB2YWxpZGF0aW9uIGNvcnJlY3RseSBkZXRlY3RlZCBtaXNzaW5nIGlucHV0IHZhbHVlJywKICAgICAgICApOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50VGlja2V0RW1haWwgc2NyZWVuIGFnYWluLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0RW1haWwiKTsKCiAgICAgICAgIyBWZXJpZnkgc2lnbmF0dXJlIHRhZ3MgbGlrZSA8T1RSU19DVVNUT01FUl9EQVRBXyo+LCBwbGVhc2Ugc2VlIGJ1ZyMxMjg1MyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAjICAgU2VsZWN0IGZpcnN0IHF1ZXVlLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0Rlc3QnKS52YWwoXCQoJyNEZXN0IG9wdGlvbicpLmZpbHRlcihmdW5jdGlvbiAoKSB7IHJldHVybiBcJCh0aGlzKS5odG1sKCkgPT0gJyRRdWV1ZU5hbWVzWzBdJzsgfSApLnZhbCgpICkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5BSkFYTG9hZGVyOnZpc2libGUiKS5sZW5ndGgnICk7CgogICAgICAgICMgVGhlcmUgaXMgbm8gc2VsZWN0ZWQgY3VzdG9tZXIsIHNob3VsZCBiZSBubyByZXBsYWNlZCB0YWdzIGluIHNpZ25hdHVyZS4KICAgICAgICBteSAkU2lnbmF0dXJlVGV4dCA9ICJDdXN0b21lciBGaXJzdCBOYW1lOiAtIjsKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoJ3JldHVybiAkKCIjU2lnbmF0dXJlIikudmFsKCknKSwKICAgICAgICAgICAgJFNpZ25hdHVyZVRleHQsCiAgICAgICAgICAgICJTaWduYXR1cmUgaXMgZm91bmQgd2l0aCBubyByZXBsYWNlZCB0YWdzIgogICAgICAgICk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAjIGdldCBzZXJ2aWNlIG9iamVjdAogICAgICAgIG15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKCiAgICAgICAgIyBnZXQgdGVzdCB1c2VyIElECiAgICAgICAgbXkgJFRlc3RVc2VySUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTG9va3VwKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBzZXJ2aWNlCiAgICAgICAgbXkgJFNlcnZpY2VOYW1lID0gIlNlbGVuaXVtIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFNlcnZpY2VJRCAgID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJ1NlbGVuaXVtIFRlc3QgU2VydmljZScsCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+IDIsCiAgICAgICAgICAgIENyaXRpY2FsaXR5ID0+ICc1IHZlcnkgaGlnaCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgID0+ICRUZXN0VXNlcklELAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICJTZXJ2aWNlIGlzIGNyZWF0ZWQgLSBJRCAkU2VydmljZUlEIiwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBjdXN0b21lciB1c2VyIGFzIG1lbWJlciB0byB0aGUgdGVzdCBzZXJ2aWNlCiAgICAgICAgJFNlcnZpY2VPYmplY3QtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQoCiAgICAgICAgICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICRUZXN0RGF0YVsxXS0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIEFjdGl2ZSAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRUZXN0VXNlcklELAogICAgICAgICk7CiMgLS0tCgogICAgICAgICMgU2VsZWN0IGN1c3RvbWVyIHVzZXIuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVG9DdXN0b21lciIsICdjc3MnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVG9DdXN0b21lciIsICdjc3MnICktPnNlbmRfa2V5cyggJFRlc3REYXRhWzBdLT57VXNlckxvZ2lufSApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnbGkudWktbWVudS1pdGVtOmNvbnRhaW5zKCRUZXN0RGF0YVswXS0+e1VzZXJMb2dpbn0pJykuY2xpY2soKSIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI0N1c3RvbWVyU2VsZWN0ZWRfMSIpLmxlbmd0aCAmJiAhJCgiLkFKQVhMb2FkZXI6dmlzaWJsZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAkU2lnbmF0dXJlVGV4dCA9ICJDdXN0b21lciBGaXJzdCBOYW1lOiAkVGVzdERhdGFbMF0tPntVc2VyRmlyc3ROYW1lfSI7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+CiAgICAgICAgICAgICAgICAicmV0dXJuIHR5cGVvZihcJCkgPT09ICdmdW5jdGlvbicgJiYgXCQoJyNTaWduYXR1cmUnKS52YWwoKS5pbmRleE9mKCckU2lnbmF0dXJlVGV4dCcpICE9PSAtMTsiCiAgICAgICAgKTsKCiAgICAgICAgIyBJbnB1dCBzdWJqZWN0IGRhdGEuCiAgICAgICAgbXkgJFRpY2tldFN1YmplY3QgPSAiU2VsZW5pdW0gVGlja2V0IjsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJqZWN0IiwgJ2NzcycgKS0+Y2xlYXIoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJqZWN0IiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRUaWNrZXRTdWJqZWN0KTsKCiAgICAgICAgIyBRdWV1ZSBhbmQgY3VzdG9tZXIgYXJlIHNlbGVjdGVkLCBzaWduYXR1cmUgaGFzIHJlcGxhY2VkIHRhZ3MuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCdyZXR1cm4gJCgiI1NpZ25hdHVyZSIpLnZhbCgpJyksCiAgICAgICAgICAgICRTaWduYXR1cmVUZXh0LAogICAgICAgICAgICAiU2lnbmF0dXJlIGlzIGZvdW5kIHdpdGggcmVwbGFjZWQgdGFncyBvbiBzZWxlY3RlZCBjdXN0b21lciIKICAgICAgICApOwoKICAgICAgICAjIENoYW5nZSBxdWV1ZSwgdHJpZ2dlciBuZXcgc2lnbmF0dXJlLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0Rlc3QnKS52YWwoXCQoJyNEZXN0IG9wdGlvbicpLmZpbHRlcihmdW5jdGlvbiAoKSB7IHJldHVybiBcJCh0aGlzKS5odG1sKCkgPT0gJyRRdWV1ZU5hbWVzWzFdJzsgfSApLnZhbCgpICkudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5BSkFYTG9hZGVyOnZpc2libGUiKS5sZW5ndGgnICk7CgogICAgICAgICMgUXVldWUgaXMgY2hhbmdlZCwgdmVyaWZ5IHNpZ25hdHVyZSBjaGFuZ2Ugd2l0aCByZXBsYWNlZCB0YWdzLgogICAgICAgICRTaWduYXR1cmVUZXh0ID0gIkN1c3RvbWVyIExhc3QgTmFtZTogJFRlc3REYXRhWzBdLT57VXNlckxhc3ROYW1lfSI7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCdyZXR1cm4gJCgiI1NpZ25hdHVyZSIpLnZhbCgpJyksCiAgICAgICAgICAgICRTaWduYXR1cmVUZXh0LAogICAgICAgICAgICAiU2lnbmF0dXJlIGlzIGZvdW5kIHdpdGggcmVwbGFjZWQgdGFncyBvbiBxdWV1ZSBjaGFuZ2UiCiAgICAgICAgKTsKCiAgICAgICAgIyBBZGQgbmV3IGN1c3RvbWVyIGluICdUbycuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVG9DdXN0b21lciIsICdjc3MnICktPmNsZWFyKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjVG9DdXN0b21lciIsICdjc3MnICktPnNlbmRfa2V5cyggJFRlc3REYXRhWzFdLT57VXNlckxvZ2lufSApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnbGkudWktbWVudS1pdGVtOmNvbnRhaW5zKCRUZXN0RGF0YVsxXS0+e1VzZXJMb2dpbn0pJykuY2xpY2soKSIpOwoKICAgICAgICAjIENoYW5nZSBzZWxlY3RlZCBjdXN0b21lciwgdHJpZ2dlciByZXBsYWNlbWVudCB0YWcgaW4gc2lnbmF0dXJlLgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCIjQ3VzdG9tZXJTZWxlY3RlZF8yIikubGVuZ3RoJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0N1c3RvbWVyU2VsZWN0ZWRfMiIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQUpBWExvYWRlcjp2aXNpYmxlIikubGVuZ3RoJyApOwoKICAgICAgICAkU2lnbmF0dXJlVGV4dCA9ICJDdXN0b21lciBMYXN0IE5hbWU6ICRUZXN0RGF0YVsxXS0+e1VzZXJMYXN0TmFtZX0iOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjU2lnbmF0dXJlJykudmFsKCkuaW5kZXhPZignJFNpZ25hdHVyZVRleHQnKSAhPT0gLTE7IgogICAgICAgICk7CgogICAgICAgICMgSW5wdXQgYm9keSBkYXRhLgogICAgICAgIG15ICRUaWNrZXRCb2R5ID0gIlNlbGVuaXVtIGJvZHkgdGVzdCI7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjUmljaFRleHQiLCAnY3NzJyApLT5jbGVhcigpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1JpY2hUZXh0IiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRUaWNrZXRCb2R5KTsKCiAgICAgICAgIyBTZWxlY3RlZCBjdXN0b21lciBpcyBjaGFuZ2VkLCBzaWduYXR1cmUgcmVwbGFjZWQgdGFncyBhcmUgY2hhbmdlZC4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoJ3JldHVybiAkKCIjU2lnbmF0dXJlIikudmFsKCknKSwKICAgICAgICAgICAgJFNpZ25hdHVyZVRleHQsCiAgICAgICAgICAgICJTaWduYXR1cmUgaXMgZm91bmQgd2l0aCByZXBsYWNlZCB0YWdzIG9uIHNlbGVjdGVkIGN1c3RvbWVyIGNoYW5nZSIKICAgICAgICApOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjVHlwZUlEJykudmFsKFwkKCcjVHlwZUlEIG9wdGlvbicpLmZpbHRlcihmdW5jdGlvbiAoKSB7IHJldHVybiBcJCh0aGlzKS5odG1sKCkgPT0gJ1VuY2xhc3NpZmllZCc7IH0gKS52YWwoKSApLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQUpBWExvYWRlcjp2aXNpYmxlIikubGVuZ3RoJyApOwoKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gInJldHVybiBcJCgnI1NlcnZpY2VJRCBvcHRpb25bdmFsdWU9XCIkU2VydmljZUlEXCJdJykubGVuZ3RoOyIgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI1NlcnZpY2VJRCcpLnZhbCgnJFNlcnZpY2VJRCcpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7Iik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gJCgiI1NlcnZpY2VJbmNpZGVudFN0YXRlIikubGVuZ3RoJyApOwoKICAgICAgICAjIGNoZWNrIGZvciBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGZpZWxkCiAgICAgICAgbXkgJFNlcnZpY2VJbmNpZGVudFN0YXRlRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1NlcnZpY2VJbmNpZGVudFN0YXRlIiwgJ2NzcycgKTsKICAgICAgICAkU2VydmljZUluY2lkZW50U3RhdGVFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgJFNlcnZpY2VJbmNpZGVudFN0YXRlRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjRHluYW1pY0ZpZWxkX0lUU01JbXBhY3Qgb3B0aW9uW3ZhbHVlPVwiMyBub3JtYWxcIl0nKS5sZW5ndGg7IiApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjUHJpb3JpdHlJRCBvcHRpb25bdmFsdWU9XCI0XCJdJykubGVuZ3RoOyIgKTsKCiAgICAgICAgIyB0ZXN0IHByaW9yaXR5IHVwZGF0ZSBiYXNlZCBvbiBpbXBhY3QgdmFsdWUKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI1ByaW9yaXR5SUQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJzQnLAogICAgICAgICAgICAiI1ByaW9yaXR5SUQgc3RvcmVkIHZhbHVlIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNEeW5hbWljRmllbGRfSVRTTUltcGFjdCcpLnZhbCgnMSB2ZXJ5IGxvdycpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7Iik7CgogICAgICAgIHNsZWVwIDI7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjUHJpb3JpdHlJRCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAnMycsCiAgICAgICAgICAgICIjUHJpb3JpdHlJRCB1cGRhdGVkIHZhbHVlIiwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIFN1Ym1pdCBmb3JtLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI3N1Ym1pdFJpY2hUZXh0IiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIEdldCBjcmVhdGVkIHRlc3QgdGlja2V0IGRhdGEuCiAgICAgICAgbXkgJVRpY2tldElEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICBSZXN1bHQgICAgICAgICA9PiAnSEFTSCcsCiAgICAgICAgICAgIExpbWl0ICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUZXN0RGF0YVsxXS0+e1VzZXJMb2dpbn0sCiAgICAgICAgKTsKICAgICAgICBteSAkVGlja2V0TnVtYmVyID0gKCVUaWNrZXRJRHMpWzFdOwogICAgICAgIG15ICRUaWNrZXRJRCAgICAgPSAoJVRpY2tldElEcylbMF07CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICJUaWNrZXQgd2FzIGNyZWF0ZWQgYW5kIGZvdW5kIC0gJFRpY2tldElEIiwKICAgICAgICApIHx8IGRpZTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFRpY2tldElEJyApXSIpLAogICAgICAgICAgICAiVGlja2V0IHdpdGggdGlja2V0IG51bWJlciAkVGlja2V0TnVtYmVyIGlzIGNyZWF0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgR28gdG8gdGlja2V0IHpvb20gcGFnZSBvZiBjcmVhdGVkIHRlc3QgdGlja2V0LgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQiKTsKCiAgICAgICAgIyBDaGVjayBpZiB0ZXN0IHRpY2tldCB2YWx1ZXMgYXJlIGdlbnVpbmUuCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGlja2V0U3ViamVjdCApID4gLTEsCiAgICAgICAgICAgICIkVGlja2V0U3ViamVjdCBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApIHx8IGRpZSAiJFRpY2tldFN1YmplY3Qgbm90IGZvdW5kIG9uIHBhZ2UiOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFRpY2tldEJvZHkgKSA+IC0xLAogICAgICAgICAgICAiJFRpY2tldEJvZHkgZm91bmQgb24gcGFnZSIsCiAgICAgICAgKSB8fCBkaWUgIiRUaWNrZXRCb2R5IG5vdCBmb3VuZCBvbiBwYWdlIjsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRUZXN0RGF0YVsxXS0+e1VzZXJMb2dpbn0gKSA+IC0xLAogICAgICAgICAgICAiJFRlc3REYXRhWzFdLT57VXNlckxvZ2lufSBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApIHx8IGRpZSAiJFRlc3REYXRhWzFdLT57VXNlckxvZ2lufSBub3QgZm91bmQgb24gcGFnZSI7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkU2lnbmF0dXJlVGV4dCApID4gLTEsCiAgICAgICAgICAgICJTaWduYXR1cmUgZm91bmQgb24gcGFnZSIKICAgICAgICApIHx8IGRpZSAiJFNpZ25hdHVyZVRleHQgbm90IGZvdW5kIG9uIHBhZ2UiOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgIyBmb3JjZSBzdWIgbWVudXMgdG8gYmUgdmlzaWJsZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNsaWNrIG9uZSBvZiB0aGUgbGlua3MKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnLkNsdXN0ZXIgdWwgdWwnKS5hZGRDbGFzcygnRm9yY2VWaXNpYmxlJyk7Iik7CgogICAgICAgICMgY2xpY2sgb24gaGlzdG9yeSBhbmQgc3dpdGNoIHdpbmRvdwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvLypbdGV4dCgpPSdIaXN0b3J5J10iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiLkNhbmNlbENsb3NlUG9wdXAiKS5sZW5ndGgnICk7CgogICAgICAgICMgY2hlY2sgZm9yIElUU00gdXBkYXRlZCBmaWVsZHMKICAgICAgICBmb3IgbXkgJFVwZGF0ZVRleHQgKHF3KEltcGFjdCBDcml0aWNhbGl0eSkpIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIkNoYW5nZWQgZHluYW1pYyBmaWVsZCBJVFNNJFVwZGF0ZVRleHQiICkgPiAtMSwKICAgICAgICAgICAgICAgICJEeW5hbWljRmllbGRVcGRhdGUgJFVwZGF0ZVRleHQgLSBmb3VuZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkU2VsZW5pdW0tPmNsb3NlKCk7CiAgICAgICAgJFNlbGVuaXVtLT5zd2l0Y2hfdG9fd2luZG93KCAkSGFuZGxlcy0+WzBdICk7CiMgLS0tCgogICAgICAgICMgRGlzYWJsZSBzZXNzaW9uIG1hbmFnZW1lbnQgdXNlIGh0bWwgY29va2llcyB0byBjaGVjayBzaWduYXR1cmUgdXBkYXRlIChzZWUgYnVnIzEyODkwKS4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnU2Vzc2lvblVzZUNvb2tpZScsCiAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBBbGxvdyBhcGFjaGUgdG8gcGljayB1cCB0aGUgY2hhbmdlZCBTeXNDb25maWcgdmlhIEFwYWNoZTo6UmVsb2FkLgogICAgICAgIHNsZWVwIDE7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRUaWNrZXRFbWFpbCBzY3JlZW4gYW5kIGxvZ2luIGJlY2F1c2UgdGhlcmUgaXMgbm8gc2Vzc2lvbiBjb29raWVzLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0RW1haWwiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNVc2VyIiwgICAgICAgICdjc3MnICktPnNlbmRfa2V5cygkVGVzdFVzZXJMb2dpbik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjUGFzc3dvcmQiLCAgICAnY3NzJyApLT5zZW5kX2tleXMoJFRlc3RVc2VyTG9naW4pOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0xvZ2luQnV0dG9uIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNEZXN0JykudmFsKFwkKCcjRGVzdCBvcHRpb24nKS5maWx0ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gXCQodGhpcykuaHRtbCgpID09ICckUXVldWVOYW1lc1swXSc7IH0gKS52YWwoKSApLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQUpBWExvYWRlcjp2aXNpYmxlIikubGVuZ3RoJyApOwoKICAgICAgICAjIFNlbGVjdCBjdXN0b21lciB1c2VyLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1RvQ3VzdG9tZXIiLCAnY3NzJyApLT5zZW5kX2tleXMoICRUZXN0RGF0YVswXS0+e1VzZXJMb2dpbn0gKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgibGkudWktbWVudS1pdGVtOnZpc2libGUiKS5sZW5ndGgnICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJ2xpLnVpLW1lbnUtaXRlbTpjb250YWlucygkVGVzdERhdGFbMF0tPntVc2VyTG9naW59KScpLmNsaWNrKCkiKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoCiAgICAgICAgICAgIEphdmFTY3JpcHQgPT4KICAgICAgICAgICAgICAgICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIiNDdXN0b21lclNlbGVjdGVkXzEiKS5sZW5ndGggJiYgISQoIi5BSkFYTG9hZGVyOnZpc2libGUiKS5sZW5ndGgnCiAgICAgICAgKTsKCiAgICAgICAgJFNpZ25hdHVyZVRleHQgPSAiQ3VzdG9tZXIgRmlyc3QgTmFtZTogJFRlc3REYXRhWzBdLT57VXNlckZpcnN0TmFtZX0iOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgInJldHVybiB0eXBlb2YoXCQpID09PSAnZnVuY3Rpb24nICYmIFwkKCcjU2lnbmF0dXJlJykudmFsKCkuaW5kZXhPZignJFNpZ25hdHVyZVRleHQnKSAhPT0gLTE7IgogICAgICAgICk7CgogICAgICAgICMgQ2hlY2sgaWYgc2lnbmF0dXJlIGhhdmUgY29ycmVjdCB0ZXh0IGFmdGVyIHNldCBxdWV1ZSBhbmQgY3VzdG9tZXIgdXNlci4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoJ3JldHVybiAkKCIjU2lnbmF0dXJlIikudmFsKCknKSwKICAgICAgICAgICAgJFNpZ25hdHVyZVRleHQsCiAgICAgICAgICAgICJTaWduYXR1cmUgaGFzIGNvcnJlY3QgdGV4dCIKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3QgdGlja2V0LgogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIFRpY2tldCBkZWxldGlvbiBjb3VsZCBmYWlsIGlmIGFwYWNoZSBzdGlsbCB3cml0ZXMgdG8gdGlja2V0IGhpc3RvcnkuIFRyeSBhZ2FpbiBpbiB0aGlzIGNhc2UuCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgIHNsZWVwIDM7CiAgICAgICAgICAgICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJUaWNrZXQgd2l0aCB0aWNrZXQgSUQgJFRpY2tldElEIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICAjIGRlbGV0ZSB0ZXN0IHNlcnZpY2UgLSB0ZXN0IGN1c3RvbWVyIGNvbm5lY3Rpb24KICAgICAgICAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlX2N1c3RvbWVyX3VzZXIgV0hFUkUgc2VydmljZV9pZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlIHNlcnZpY2UtY3VzdG9tZXIgY29ubmVjdGlvbiIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBzZXJ2aWNlIHByZWZlcmVuY2VzCiAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gc2VydmljZV9wcmVmZXJlbmNlcyBXSEVSRSBzZXJ2aWNlX2lkID0gJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJTZXJ2aWNlIHByZWZlcmVuY2VzIGlzIGRlbGV0ZWQgLSBJRCAkU2VydmljZUlEIiwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBjcmVhdGVkIHRlc3Qgc2VydmljZQogICAgICAgICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2UgaXMgZGVsZXRlZCAtIElEICRTZXJ2aWNlSUQiLAogICAgICAgICk7CiMgLS0tCgogICAgICAgICMgRGVsZXRlIGNyZWF0ZWQgdGVzdCBjdXN0b21lciB1c2Vycy4KICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgICAgICBmb3IgbXkgJEN1c3RvbWVyTG9naW4gKEBDdXN0b21lclVzZXJJRHMpIHsKICAgICAgICAgICAgbXkgJFRlc3RDdXN0b21lciA9ICREQk9iamVjdC0+UXVvdGUoJEN1c3RvbWVyTG9naW4pOwogICAgICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBjdXN0b21lcl91c2VyIFdIRVJFIGxvZ2luID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRUZXN0Q3VzdG9tZXIgXSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgICAgICJDdXN0b21lciB1c2VyICRUZXN0Q3VzdG9tZXIgaXMgZGVsZXRlZCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3QgcXVldWVzLgogICAgICAgIGZvciBteSAkUXVldWVJRCAoQFF1ZXVlSURzKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIHF1ZXVlIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRRdWV1ZUlEIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiUXVldWVJRCAkUXVldWVJRCBpcyBkZWxldGVkIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgRGVsZXRlIGNyZWF0ZWQgdGVzdCBzaWduYXR1cmUuCiAgICAgICAgZm9yIG15ICRTaWduYXR1cmVJRCAoQFNpZ25hdHVyZUlEcykgewogICAgICAgICAgICAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBzaWduYXR1cmUgV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFNpZ25hdHVyZUlEIF0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiU2lnbmF0dXJlSUQgJFNpZ25hdHVyZUlEIGlzIGRlbGV0ZWQiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0LgojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiMgICAgICAgIGZvciBteSAkQ2FjaGUgKHF3IChUaWNrZXQgQ3VzdG9tZXJVc2VyKSkgewogICAgICAgIGZvciBteSAkQ2FjaGUgKHF3IChUaWNrZXQgQ3VzdG9tZXJVc2VyIFNlcnZpY2UpKSB7CiMgLS0tCiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCggVHlwZSA9PiAkQ2FjaGUgKTsKICAgICAgICB9CgogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IG90cnMgLSA5ZWEwN2E5Nzk2MDMwODU0ZmJjN2NhNWYwNDJmNTUwMWMyZGRkZDliIC0gc2NyaXB0cy90ZXN0L1NlbGVuaXVtL0FnZW50L0FnZW50VGlja2V0UGhvbmUudAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwoKbXkgJFNlbGVuaXVtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpTZWxlbml1bScpOwoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgbXkgJEhlbHBlciAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgICAgICMgT3ZlcmxvYWQgQ3VzdG9tZXJVc2VyID0+IE1hcCBzZXR0aW5nIGRlZmluZWQgaW4gdGhlIERlZmF1bHRzLnBtIC0gdXNlIGV4dGVybmFsIHVybC4KICAgICAgICBteSAkRGVmYXVsdEN1c3RvbWVyVXNlciA9ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJVc2VyIik7CiAgICAgICAgJERlZmF1bHRDdXN0b21lclVzZXItPntNYXB9LT5bNV0gPSBbCiAgICAgICAgICAgICdVc2VyRW1haWwnLAogICAgICAgICAgICAnRW1haWwnLAogICAgICAgICAgICAnZW1haWwnLAogICAgICAgICAgICAxLAogICAgICAgICAgICAxLAogICAgICAgICAgICAndmFyJywKICAgICAgICAgICAgJ2h0dHA6Ly93d3cub3Rycy5jb20nLAogICAgICAgICAgICAwLAogICAgICAgICAgICAnJywKICAgICAgICAgICAgJ0FzUG9wdXAgT1RSU1BvcHVwX1RpY2tldEFjdGlvbicsCiAgICAgICAgXTsKICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgVmFsdWUgPT4gJERlZmF1bHRDdXN0b21lclVzZXIsCiAgICAgICAgKTsKCiAgICAgICAgIyBEbyBub3QgY2hlY2sgZW1haWwgYWRkcmVzc2VzLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIERvIG5vdCBjaGVjayBSaWNoVGV4dC4KICAgICAgICAkSGVscGVyLT5Db25maWdTZXR0aW5nQ2hhbmdlKAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICBLZXkgICA9PiAnRnJvbnRlbmQ6OlJpY2hUZXh0JywKICAgICAgICAgICAgVmFsdWUgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIERvIG5vdCBjaGVjayBzZXJ2aWNlIGFuZCB0eXBlLgogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OlNlcnZpY2UnLAojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiMgICAgICAgICAgICBWYWx1ZSA9PiAwLAogICAgICAgICAgICBWYWx1ZSA9PiAxLAojIC0tLQogICAgICAgICk7CiAgICAgICAgJEhlbHBlci0+Q29uZmlnU2V0dGluZ0NoYW5nZSgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpY2tldDo6VHlwZScsCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgICAgIFZhbHVlID0+IDAsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiMgLS0tCiAgICAgICAgKTsKCiAgICAgICAgIyBDcmVhdGUgdGVzdCB1c2VyLgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KIyAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICd1c2VycycgXSwKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ3VzZXJzJywgJ2l0c20tc2VydmljZScgXSwKIyAtLS0KICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgIyBHZXQgdGVzdCB1c2VyIElELgogICAgICAgIG15ICRUZXN0VXNlcklEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxvb2t1cCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgICAgICMgQWRkIHRlc3QgY3VzdG9tZXIgZm9yIHRlc3RpbmcuCiAgICAgICAgbXkgJFRlc3RDdXN0b21lciAgICAgICA9ICdDdXN0b21lcicgLiAkUmFuZG9tSUQ7CiAgICAgICAgbXkgJFRlc3RDdXN0b21lclVzZXJJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgICAgICBTb3VyY2UgICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSAgPT4gJFRlc3RDdXN0b21lciwKICAgICAgICAgICAgVXNlckxhc3RuYW1lICAgPT4gJFRlc3RDdXN0b21lciwKICAgICAgICAgICAgVXNlckN1c3RvbWVySUQgPT4gJFRlc3RDdXN0b21lciwKICAgICAgICAgICAgVXNlckxvZ2luICAgICAgPT4gJFRlc3RDdXN0b21lciwKICAgICAgICAgICAgVXNlckVtYWlsICAgICAgPT4gIiRUZXN0Q3VzdG9tZXJcQGxvY2FsaG9zdC5jb20iLAogICAgICAgICAgICBWYWxpZElEICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkVGVzdFVzZXJJRCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGVzdEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAiQ3VzdG9tZXJVc2VyQWRkIC0gSUQgJFRlc3RDdXN0b21lclVzZXJJRCIKICAgICAgICApOwoKICAgICAgICAjIExvZ2luIGFzIHRlc3QgdXNlci4KICAgICAgICAkU2VsZW5pdW0tPkxvZ2luKAogICAgICAgICAgICBUeXBlICAgICA9PiAnQWdlbnQnLAogICAgICAgICAgICBVc2VyICAgICA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICAgICAgUGFzc3dvcmQgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFNjcmlwdEFsaWFzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50VGlja2V0UGhvbmUgc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0UGhvbmUiKTsKCiAgICAgICAgIyBDaGVjayBwYWdlLgogICAgICAgIGZvciBteSAkSUQgKAogICAgICAgICAgICBxdyhGcm9tQ3VzdG9tZXIgQ3VzdG9tZXJJRCBEZXN0IFN1YmplY3QgUmljaFRleHQgRmlsZVVwbG9hZAogICAgICAgICAgICBOZXh0U3RhdGVJRCBQcmlvcml0eUlEIHN1Ym1pdFJpY2hUZXh0KQojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCiAgICAgICAgICAgICwgcXcoVHlwZUlEIFNlcnZpY2VJRCBPcHRpb25MaW5rVGlja2V0IER5bmFtaWNGaWVsZF9JVFNNSW1wYWN0KQojIC0tLQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRJRCIsICdjc3MnICk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgICAgICRFbGVtZW50LT5pc19kaXNwbGF5ZWQoKTsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgY2xpZW50IHNpZGUgdmFsaWRhdGlvbi4KICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1N1YmplY3QiLCAnY3NzJyApOwogICAgICAgICRFbGVtZW50LT5zZW5kX2tleXMoIiIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI3N1Ym1pdFJpY2hUZXh0IiwgJ2NzcycgKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiI1N1YmplY3QuRXJyb3IiKS5sZW5ndGgnICk7CgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgICAgICJyZXR1cm4gXCQoJyNTdWJqZWN0JykuaGFzQ2xhc3MoJ0Vycm9yJykiCiAgICAgICAgICAgICksCiAgICAgICAgICAgICcxJywKICAgICAgICAgICAgJ0NsaWVudCBzaWRlIHZhbGlkYXRpb24gY29ycmVjdGx5IGRldGVjdGVkIG1pc3NpbmcgaW5wdXQgdmFsdWUnLAogICAgICAgICk7CgogICAgICAgICMgTmF2aWdhdGUgdG8gQWdlbnRUaWNrZXRQaG9uZSBzY3JlZW4gYWdhaW4uCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRQaG9uZSIpOwoKICAgICAgICAjIENyZWF0ZSB0ZXN0IHBob25lIHRpY2tldC4KICAgICAgICBteSAkVGlja2V0U3ViamVjdCA9ICJTZWxlbml1bSBUaWNrZXQiOwogICAgICAgIG15ICRUaWNrZXRCb2R5ICAgID0gIlNlbGVuaXVtIGJvZHkgdGVzdCI7CiMgLS0tCiMgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKIyAtLS0KICAgICAgICBteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CgogICAgICAgICMgQ3JlYXRlIHRlc3Qgc2VydmljZS4KICAgICAgICBteSAkU2VydmljZU5hbWUgPSAiU2VsZW5pdW0iIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICBteSAkU2VydmljZUlEICAgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlcnZpY2VOYW1lLAogICAgICAgICAgICBWYWxpZElEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICA9PiAnU2VsZW5pdW0gVGVzdCBTZXJ2aWNlJywKICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gMiwKICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJzUgdmVyeSBoaWdoJywKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICJDcmVhdGVkIHNlcnZpY2UgSUQgLSAkU2VydmljZUlEIiwKICAgICAgICApOwoKICAgICAgICAjIExpbmsgdGVzdCBzZXJ2aWNlIHdpdGggdGVzdCBjdXN0b21lci4KICAgICAgICBteSAkU2VydmljZU1lbWJlckFkZFN1Y2Nlc3MgPSAkU2VydmljZU9iamVjdC0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJFRlc3RDdXN0b21lciwKICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFRlc3RVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZXJ2aWNlTWVtYmVyQWRkU3VjY2VzcywKICAgICAgICAgICAgIkFkZGVkIHNlcnZpY2UgSUQgJFNlcnZpY2VJRCB0byBDdXN0b21lclVzZXIgJFRlc3RDdXN0b21lci4iLAogICAgICAgICk7CgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI1R5cGVJRCcpLnZhbChcJCgnI1R5cGVJRCBvcHRpb24nKS5maWx0ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gXCQodGhpcykuaHRtbCgpID09ICdVbmNsYXNzaWZpZWQnOyB9ICkudmFsKCkgKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIKICAgICAgICApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAhJCgiLkFKQVhMb2FkZXI6dmlzaWJsZSIpLmxlbmd0aCcgKTsKCiMgLS0tCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRnJvbUN1c3RvbWVyIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRUZXN0Q3VzdG9tZXIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAncmV0dXJuIHR5cGVvZigkKSA9PT0gImZ1bmN0aW9uIiAmJiAkKCJsaS51aS1tZW51LWl0ZW06dmlzaWJsZSIpLmxlbmd0aCcgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnbGkudWktbWVudS1pdGVtOmNvbnRhaW5zKCRUZXN0Q3VzdG9tZXIpJykuY2xpY2soKSIpOwojIC0tLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiMgLS0tCgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjU2VydmljZUlEIG9wdGlvblt2YWx1ZT1cIiRTZXJ2aWNlSURcIl0nKS5sZW5ndGg7IiApOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcjU2VydmljZUlEJykudmFsKCckU2VydmljZUlEJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiAkKCIjU2VydmljZUluY2lkZW50U3RhdGUiKS5sZW5ndGgnICk7CgogICAgICAgICMgQ2hlY2sgZm9yIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgZmllbGQuCiAgICAgICAgbXkgJFNlcnZpY2VJbmNpZGVudFN0YXRlRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI1NlcnZpY2VJbmNpZGVudFN0YXRlIiwgJ2NzcycgKTsKICAgICAgICAkU2VydmljZUluY2lkZW50U3RhdGVFbGVtZW50LT5pc19lbmFibGVkKCk7CiAgICAgICAgJFNlcnZpY2VJbmNpZGVudFN0YXRlRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CgogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjRHluYW1pY0ZpZWxkX0lUU01JbXBhY3Qgb3B0aW9uW3ZhbHVlPVwiMyBub3JtYWxcIl0nKS5sZW5ndGg7IiApOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvciggSmF2YVNjcmlwdCA9PiAicmV0dXJuIFwkKCcjUHJpb3JpdHlJRCBvcHRpb25bdmFsdWU9XCI0XCJdJykubGVuZ3RoOyIgKTsKCiAgICAgICAgIyBUZXN0IHByaW9yaXR5IHVwZGF0ZSBiYXNlZCBvbiBpbXBhY3QgdmFsdWUuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNQcmlvcml0eUlEJywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICc0JywKICAgICAgICAgICAgIiNQcmlvcml0eUlEIHN0b3JlZCB2YWx1ZSIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnKS52YWwoJzEgdmVyeSBsb3cnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIpOwoKICAgICAgICBzbGVlcCAyOwoKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI1ByaW9yaXR5SUQnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJzMnLAogICAgICAgICAgICAiI1ByaW9yaXR5SUQgdXBkYXRlZCB2YWx1ZSIsCiAgICAgICAgKTsKIyAtLS0KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0Rlc3QnKS52YWwoJzJ8fFJhdycpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7Iik7CiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQUpBWExvYWRlcjp2aXNpYmxlIikubGVuZ3RoJyApOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJqZWN0IiwgICdjc3MnICktPnNlbmRfa2V5cygkVGlja2V0U3ViamVjdCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjUmljaFRleHQiLCAnY3NzJyApLT5zZW5kX2tleXMoJFRpY2tldEJvZHkpOwoKICAgICAgICAjIFdhaXQgZm9yICJDdXN0b21lciBJbmZvcm1hdGlvbiIuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5TaWRlYmFyQ29sdW1uIGZpZWxkc2V0IC5WYWx1ZSIpLmxlbmd0aCcKICAgICAgICApOwoKICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IEN1c3RvbWVyIGVtYWlsIGlzIGxpbmsuCiAgICAgICAgbXkgJExpbmtWaXNpYmxlID0gJFNlbGVuaXVtLT5XYWl0Rm9yKAogICAgICAgICAgICBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5TaWRlYmFyQ29sdW1uIGZpZWxkc2V0IGEuQXNQb3B1cDp2aXNpYmxlIikubGVuZ3RoJwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRMaW5rVmlzaWJsZSwKICAgICAgICAgICAgIkN1c3RvbWVyIGVtYWlsIGlzIGEgbGluayB3aXRoIGNsYXNzIEFzUG9wdXAuIgogICAgICAgICk7CgogICAgICAgICMgT3ZlcmxvYWQgQ3VzdG9tZXJVc2VyID0+IE1hcCBzZXR0aW5nIGRlZmluZWQgaW4gdGhlIERlZmF1bHRzLnBtIC0gdXNlIGludGVybmFsIHVybC4KICAgICAgICAkRGVmYXVsdEN1c3RvbWVyVXNlci0+e01hcH0tPls1XSA9IFsKICAgICAgICAgICAgJ1VzZXJFbWFpbCcsCiAgICAgICAgICAgICdFbWFpbCcsCiAgICAgICAgICAgICdlbWFpbCcsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICd2YXInLAogICAgICAgICAgICAnWyUgRW52KCJDR0lIYW5kbGUiKSAlXT9BY3Rpb249QWdlbnRUaWNrZXRDb21wb3NlO1Jlc3BvbnNlSUQ9MTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IHVyaSAlXScsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICcnLAogICAgICAgICAgICAnQXNQb3B1cCBPVFJTUG9wdXBfVGlja2V0QWN0aW9uJywKICAgICAgICBdOwogICAgICAgICRIZWxwZXItPkNvbmZpZ1NldHRpbmdDaGFuZ2UoCiAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21lclVzZXInLAogICAgICAgICAgICBWYWx1ZSA9PiAkRGVmYXVsdEN1c3RvbWVyVXNlciwKICAgICAgICApOwoKICAgICAgICAjIFJlbW92ZSBjdXN0b21lci4KICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNUaWNrZXRDdXN0b21lckNvbnRlbnRGcm9tQ3VzdG9tZXIgYS5DdXN0b21lclRpY2tldFJlbW92ZSIsICJjc3MiICktPmNsaWNrKCk7CgogICAgICAgICMgQWRkIGN1c3RvbWVyIGFnYWluLgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI0Zyb21DdXN0b21lciIsICdjc3MnICktPnNlbmRfa2V5cygkVGVzdEN1c3RvbWVyKTsKICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgibGkudWktbWVudS1pdGVtOnZpc2libGUiKS5sZW5ndGgnICk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgiXCQoJ2xpLnVpLW1lbnUtaXRlbTpjb250YWlucygkVGVzdEN1c3RvbWVyKScpLmNsaWNrKCkiKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBDdXN0b21lciBlbWFpbCBpcyBub3QgYSBsaW5rLgogICAgICAgICRMaW5rVmlzaWJsZSA9ICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoInJldHVybiBcJCgnLlNpZGViYXJDb2x1bW4gZmllbGRzZXQgYS5Bc1BvcHVwJykubGVuZ3RoOyIpOwogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgJExpbmtWaXNpYmxlLAogICAgICAgICAgICAiQ3VzdG9tZXIgZW1haWwgaXMgbm90IGEgbGluayB3aXRoIGNsYXNzIEFzUG9wdXAuIgogICAgICAgICk7CgogICAgICAgICMgVXNlICdFbnRlcicgcHJlc3MgaW5zdGVhZCBvZiAnVmVyaWZpZWRTdWJtaXQnIG9uICdTdWJqZWN0JyBmaWVsZCB0byBjaGVjayBpZiB3b3JrcyAoc2VlIGJ1ZyMxMzA1NikuCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjU3ViamVjdCIsICdjc3MnICktPnNlbmRfa2V5cygiXE57VStFMDA3fSIpOwogICAgICAgICRTZWxlbml1bS0+V2FpdEZvcigKICAgICAgICAgICAgSmF2YVNjcmlwdCA9PgogICAgICAgICAgICAgICAgJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgJCgiLk1lc3NhZ2VCb3ggYVtocmVmKj1cJ0FnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1cJ10iKS5sZW5ndGggIT09IDAnCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAgICAgIyBHZXQgY3JlYXRlZCB0ZXN0IHRpY2tldCBJRCBhbmQgbnVtYmVyLgogICAgICAgIG15IEBUaWNrZXQgPSBzcGxpdCggJ1RpY2tldElEPScsICRTZWxlbml1bS0+Z2V0X2N1cnJlbnRfdXJsKCkgKTsKCiAgICAgICAgbXkgJFRpY2tldElEID0gJFRpY2tldFsxXTsKCiAgICAgICAgbXkgJFRpY2tldE51bWJlciA9ICRUaWNrZXRPYmplY3QtPlRpY2tldE51bWJlckxvb2t1cCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkVGlja2V0SUQsCiAgICAgICAgICAgICJUaWNrZXQgd2FzIGNyZWF0ZWQgYW5kIGZvdW5kIC0gJFRpY2tldElEIiwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kVGlja2V0SUQnICldIiksCiAgICAgICAgICAgICJUaWNrZXQgd2l0aCB0aWNrZXQgbnVtYmVyICRUaWNrZXROdW1iZXIgaXMgY3JlYXRlZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBHbyB0byB0aWNrZXQgem9vbSBwYWdlIG9mIGNyZWF0ZWQgdGVzdCB0aWNrZXQuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICAjIENoZWNrIGlmIHRlc3QgdGlja2V0IHZhbHVlcyBhcmUgZ2VudWluZS4KICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRUaWNrZXRTdWJqZWN0ICkgPiAtMSwKICAgICAgICAgICAgIiRUaWNrZXRTdWJqZWN0IGZvdW5kIG9uIHBhZ2UiLAogICAgICAgICkgfHwgZGllICIkVGlja2V0U3ViamVjdCBub3QgZm91bmQgb24gcGFnZSI7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAkVGlja2V0Qm9keSApID4gLTEsCiAgICAgICAgICAgICIkVGlja2V0Qm9keSBmb3VuZCBvbiBwYWdlIiwKICAgICAgICApIHx8IGRpZSAiJFRpY2tldEJvZHkgbm90IGZvdW5kIG9uIHBhZ2UiOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFRlc3RDdXN0b21lciApID4gLTEsCiAgICAgICAgICAgICIkVGVzdEN1c3RvbWVyIGZvdW5kIG9uIHBhZ2UiLAogICAgICAgICkgfHwgZGllICIkVGVzdEN1c3RvbWVyIG5vdCBmb3VuZCBvbiBwYWdlIjsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICMgRm9yY2Ugc3ViIG1lbnVzIHRvIGJlIHZpc2libGUgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBjbGljayBvbmUgb2YgdGhlIGxpbmtzLgogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcuQ2x1c3RlciB1bCB1bCcpLmFkZENsYXNzKCdGb3JjZVZpc2libGUnKTsiKTsKCiAgICAgICAgIyBDbGljayBvbiBoaXN0b3J5IGFuZCBzd2l0Y2ggd2luZG93LgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvLypbdGV4dCgpPSdIaXN0b3J5J10iKS0+Y2xpY2soKTsKCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBXaW5kb3dDb3VudCA9PiAyICk7CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIFdhaXQgdW50aWwgcGFnZSBoYXMgbG9hZGVkLCBpZiBuZWNlc3NhcnkuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICQoIi5DYW5jZWxDbG9zZVBvcHVwIikubGVuZ3RoJyApOwoKICAgICAgICAjIENoZWNrIGZvciBJVFNNIHVwZGF0ZWQgZmllbGRzLgogICAgICAgIGZvciBteSAkVXBkYXRlVGV4dCAocXcoSW1wYWN0IENyaXRpY2FsaXR5KSkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgIGluZGV4KCAkU2VsZW5pdW0tPmdldF9wYWdlX3NvdXJjZSgpLCAiQ2hhbmdlZCBkeW5hbWljIGZpZWxkIElUU00kVXBkYXRlVGV4dCIgKSA+IC0xLAogICAgICAgICAgICAgICAgIkR5bmFtaWNGaWVsZFVwZGF0ZSAkVXBkYXRlVGV4dCAtIGZvdW5kIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgLS0tCgogICAgICAgICMgVGVzdCBidWcgIzEyMjI5LgogICAgICAgIG15ICRRdWV1ZUlEMSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUFkZCgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgID0+ICI8UXVldWU+JFJhbmRvbUlEIiwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgICAgICAgICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICAgICAgICAgIFNpZ25hdHVyZUlEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgPT4gJ1NvbWUgY29tbWVudCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFF1ZXVlSUQyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gIkp1bms6OlN1YlF1ZXVlICRSYW5kb21JRCAgJFJhbmRvbUlEIiwKICAgICAgICAgICAgVmFsaWRJRCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEdyb3VwSUQgICAgICAgICA9PiAxLAogICAgICAgICAgICBTeXN0ZW1BZGRyZXNzSUQgPT4gMSwKICAgICAgICAgICAgU2FsdXRhdGlvbklEICAgID0+IDEsCiAgICAgICAgICAgIFNpZ25hdHVyZUlEICAgICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICAgICAgICAgPT4gJ1NvbWUgY29tbWVudCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUXVldWVJRDEsCiAgICAgICAgICAgICJRdWV1ZSAjMSBjcmVhdGVkLiIKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkUXVldWVJRDIsCiAgICAgICAgICAgICJRdWV1ZSAjMiBjcmVhdGVkLiIKICAgICAgICApOwoKICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50VGlja2V0UGhvbmUgc2NyZWVuLgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0UGhvbmUiKTsKCiAgICAgICAgIyBTZWxlY3QgPFF1ZXVlPi4KICAgICAgICBteSAkUXVldWVWYWx1ZSA9ICIkUXVldWVJRDF8fDxRdWV1ZT4kUmFuZG9tSUQiOwogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoIlwkKCcjRGVzdCcpLnZhbCgnJFF1ZXVlVmFsdWUnKS50cmlnZ2VyKCdyZWRyYXcuSW5wdXRGaWVsZCcpLnRyaWdnZXIoJ2NoYW5nZScpOyIpOwoKICAgICAgICAjIFdhaXQgZm9yIGxvYWRlci4KICAgICAgICAkU2VsZW5pdW0tPldhaXRGb3IoIEphdmFTY3JpcHQgPT4gJ3JldHVybiB0eXBlb2YoJCkgPT09ICJmdW5jdGlvbiIgJiYgISQoIi5BSkFYTG9hZGVyOnZpc2libGUiKS5sZW5ndGgnICk7CgogICAgICAgICMgQ2hlY2sgUXVldWUgIzEgaXMgZGlzcGxheWVkIGFzIHNlbGVjdGVkLgogICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICcjRGVzdCcsICdjc3MnICktPmdldF92YWx1ZSgpLAogICAgICAgICAgICAkUXVldWVWYWx1ZSwKICAgICAgICAgICAgJ1F1ZXVlICMxIGlzIHNlbGVjdGVkLicsCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBRdWV1ZSAjMSBpcyBkaXNwbGF5ZWQgcHJvcGVybHkuCiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggJyNEZXN0JywgJ2NzcycgKS0+Z2V0X3ZhbHVlKCksCiAgICAgICAgICAgICRRdWV1ZUlEMSAuICJ8fDxRdWV1ZT4kUmFuZG9tSUQiLAogICAgICAgICAgICAnUXVldWUgIzEgaXMgc2VsZWN0ZWQuJywKICAgICAgICApOwoKICAgICAgICAjIFNlbGVjdCBTdWJRdWV1ZSBvbiBsb2FkaW5nIHNjcmVlbi4KICAgICAgICAjIEJ1ZyMxMjgxOSAoIGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI4MTkgKSAtIHF1ZXVlIGNvbnRhaW5zIHNwYWNlcyBpbiB0aGUgbmFtZS4KICAgICAgICAjIE5hdmlnYXRlIHRvIEFnZW50VGlja2V0UGhvbmUgc2NyZWVuIGFnYWluIHRvIGNoZWNrIHNlbGVjdGluZyBhIHF1ZXVlIGFmdGVyIGxvYWRpbmcgc2NyZWVuLgogICAgICAgICRRdWV1ZVZhbHVlID0gJFF1ZXVlSUQyIC4gInx8SnVuazo6U3ViUXVldWUgJFJhbmRvbUlEICAkUmFuZG9tSUQiOwogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0UGhvbmUiKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0Rlc3QnKS52YWwoJyRRdWV1ZVZhbHVlJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKCiAgICAgICAgIyBXYWl0IGZvciBsb2FkZXIuCiAgICAgICAgJFNlbGVuaXVtLT5XYWl0Rm9yKCBKYXZhU2NyaXB0ID0+ICdyZXR1cm4gdHlwZW9mKCQpID09PSAiZnVuY3Rpb24iICYmICEkKCIuQUpBWExvYWRlcjp2aXNpYmxlIikubGVuZ3RoJyApOwoKICAgICAgICAjIENoZWNrIFN1YlF1ZXVlIGlzIGRpc3BsYXllZCBwcm9wZXJseS4KICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAnI0Rlc3QnLCAnY3NzJyApLT5nZXRfdmFsdWUoKSwKICAgICAgICAgICAgJFF1ZXVlVmFsdWUsCiAgICAgICAgICAgICdRdWV1ZSAjMiBpcyBzZWxlY3RlZC4nLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIFF1ZXVlcy4KICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gcXVldWUgV0hFUkUgaWQgSU4gKD8sID8pIiwKICAgICAgICAgICAgQmluZCA9PiBbIFwkUXVldWVJRDEsIFwkUXVldWVJRDIgXSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlF1ZXVlcyBkZWxldGVkIiwKICAgICAgICApOwoKICAgICAgICAjIERlbGV0ZSBjcmVhdGVkIHRlc3QgdGlja2V0LgogICAgICAgICRTdWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0RGVsZXRlKAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBUaWNrZXQgZGVsZXRpb24gY291bGQgZmFpbCBpZiBhcGFjaGUgc3RpbGwgd3JpdGVzIHRvIHRpY2tldCBoaXN0b3J5LiBUcnkgYWdhaW4gaW4gdGhpcyBjYXNlLgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICBzbGVlcCAzOwogICAgICAgICAgICAkU3VjY2VzcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldERlbGV0ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tldCB3aXRoIHRpY2tldCBJRCAkVGlja2V0SUQgaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAojIC0tLQogICAgICAgICMgRGVsZXRlIHRlc3Qgc2VydmljZSAtIHRlc3QgY3VzdG9tZXIgY29ubmVjdGlvbi4KICAgICAgICAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlX2N1c3RvbWVyX3VzZXIgV0hFUkUgc2VydmljZV9pZCA9ICRTZXJ2aWNlSUQiLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiU2VydmljZS1jdXN0b21lciBjb25uZWN0aW9uIGlzIGRlbGV0ZWQiLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIHRlc3Qgc2VydmljZSBwcmVmZXJlbmNlcy4KICAgICAgICAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlX3ByZWZlcmVuY2VzIFdIRVJFIHNlcnZpY2VfaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2UgcHJlZmVyZW5jZXMgaXMgZGVsZXRlZCAtIElEICRTZXJ2aWNlSUQiLAogICAgICAgICk7CgogICAgICAgICMgRGVsZXRlIGNyZWF0ZWQgdGVzdCBzZXJ2aWNlLgogICAgICAgICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2UgaXMgZGVsZXRlZCAtIElEICRTZXJ2aWNlSUQiLAogICAgICAgICk7CiMgLS0tCgogICAgICAgICMgRGVsZXRlIGNyZWF0ZWQgdGVzdCBjdXN0b21lciB1c2VyLgogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgICAgICRUZXN0Q3VzdG9tZXIgPSAkREJPYmplY3QtPlF1b3RlKCRUZXN0Q3VzdG9tZXIpOwogICAgICAgICRTdWNjZXNzICAgICAgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBjdXN0b21lcl91c2VyIFdIRVJFIGxvZ2luID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFRlc3RDdXN0b21lciBdLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTdWNjZXNzLAogICAgICAgICAgICAiRGVsZXRlIGN1c3RvbWVyIHVzZXIgLSAkVGVzdEN1c3RvbWVyIiwKICAgICAgICApOwoKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNvcnJlY3QuCiAgICAgICAgZm9yIG15ICRDYWNoZSAocXcoIFRpY2tldCBDdXN0b21lclVzZXIgKSkgewogICAgICAgICAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoIFR5cGUgPT4gJENhY2hlICk7CiAgICAgICAgfQogICAgfQopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCmlmICggJFNlbGVuaXVtLT57YnJvd3Nlcl9uYW1lfSBuZSAnZmlyZWZveCcgKSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAxLAogICAgICAgICdQREYgdGVzdCBjdXJyZW50bHkgc3VwcG9ydHMgRmlyZWZveCBvbmx5JwogICAgKTsKICAgIHJldHVybiAxOwp9CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBoZWxwZXIgb2JqZWN0CiAgICAgICAgbXkgJEhlbHBlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CgogICAgICAgICMgY3JlYXRlIGFuZCBsb2cgaW4gdGVzdCB1c2VyCiAgICAgICAgbXkgJFRlc3RVc2VyTG9naW4gPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgKICAgICAgICAgICAgR3JvdXBzID0+IFsgJ2FkbWluJywgJ3VzZXJzJywgJ2l0c20tc2VydmljZScgXSwKICAgICAgICApIHx8IGRpZSAiRGlkIG5vdCBnZXQgdGVzdCB1c2VyIjsKCiAgICAgICAgJFNlbGVuaXVtLT5Mb2dpbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0FnZW50JywKICAgICAgICAgICAgVXNlciAgICAgPT4gJFRlc3RVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHRoZSBsaXN0IG9mIHNlcnZpY2UgdHlwZXMgZnJvbSBnZW5lcmFsIGNhdGFsb2cKICAgICAgICBteSAkU2VydmljZVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBhIGxvb2t1cCBoYXNoCiAgICAgICAgbXkgJVNlcnZpY2VUeXBlTmFtZTJJRCA9IHJldmVyc2UgJXskU2VydmljZVR5cGVMaXN0fTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBzZXJ2aWNlCiAgICAgICAgbXkgJFNlcnZpY2VOYW1lICAgICA9ICJTZXJ2aWNlIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJElUU01Dcml0aWNhbGl0eSA9ICc1IHZlcnkgaGlnaCc7CiAgICAgICAgbXkgJFNlcnZpY2VJRCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VBZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgVmFsaWRJRCAgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICAgPT4gJ1NlbGVuaXVtIFRlc3QgU2VydmljZScsCiAgICAgICAgICAgIFR5cGVJRCAgICAgID0+ICRTZXJ2aWNlVHlwZU5hbWUySUR7VHJhaW5pbmd9LAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkSVRTTUNyaXRpY2FsaXR5LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICJTZXJ2aWNlIGlzIGNyZWF0ZWQgLSBJRCAkU2VydmljZUlEIiwKICAgICAgICApOwoKICAgICAgICAjIHNldCBJVFNNSW1wYWN0IHRvICczIG5vcm1hbCcgYW5kIGdldCBwcmlvcml0eQogICAgICAgICMgZXhwZWN0ZWQgdmFsdWUgaXMgJzQgaGlnaCcsIGl0IHdpbGwgYmUgY2hlY2tlZCBpbiBBZ2VudFRpY2tldFByaW50IHNjcmVlbgogICAgICAgIG15ICRJVFNNSW1wYWN0ID0gJzMgbm9ybWFsJzsKICAgICAgICBteSAkUHJpb3JpdHlJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUnKS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkSVRTTUNyaXRpY2FsaXR5LAogICAgICAgICAgICBJbXBhY3QgICAgICA9PiAkSVRTTUltcGFjdCwKICAgICAgICApOwoKICAgICAgICAjIGdldCBUaWNrZXQgb2JqZWN0CiAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAgICAgIyBsb29rdXAgdHlwZSBpZCBmb3IgdHlwZSAnSW5jaWRlbnQnCiAgICAgICAgbXkgJFR5cGVJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVMb29rdXAoIFR5cGUgPT4gJ0luY2lkZW50JyApOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGN1c3RvbWVyCiAgICAgICAgbXkgJFRlc3RDdXN0b21lciA9ICdDdXN0b21lcicgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRUaWNrZXRJRCAgICAgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAnU2VsZW5pdW0gVGVzdCBUaWNrZXQnLAogICAgICAgICAgICBRdWV1ZSAgICAgICAgPT4gJ1JhdycsCiAgICAgICAgICAgIFByaW9yaXR5SUQgICA9PiAkUHJpb3JpdHlJRCwKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ29wZW4nLAogICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJFR5cGVJRCwKICAgICAgICAgICAgU2VydmljZUlEICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkVGVzdEN1c3RvbWVyLAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gIiRUZXN0Q3VzdG9tZXJcQGxvY2FsaG9zdC5jb20iLAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFRpY2tldElELAogICAgICAgICAgICAiVGlja2V0IGlzIGNyZWF0ZWQgLSBJRCAkVGlja2V0SUQiLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgIG15ICRJVFNNQ3JpdGljYWxpdHlDb25maWcgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gIklUU01Dcml0aWNhbGl0eSIsCiAgICAgICAgKTsKICAgICAgICBteSAkSVRTTUltcGFjdENvbmZpZyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgTmFtZSA9PiAiSVRTTUltcGFjdCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3IgQ3JpdGljYWxpdHkgYW5kIEltcGFjdAogICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRJVFNNQ3JpdGljYWxpdHlDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkSVRTTUNyaXRpY2FsaXR5LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRJVFNNSW1wYWN0Q29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJElUU01JbXBhY3QsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNjcmlwdCBhbGlhcwogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2NyaXB0QWxpYXMnKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZ2VudFRpY2tldFpvb20gc2NyZWVuCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRUaWNrZXRJRCIpOwoKICAgICAgICAjIGNsaWNrIG9uIHByaW50IG1lbnUgaXRlbQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1BZ2VudFRpY2tldFByaW50O1RpY2tldElEPSRUaWNrZXRJRFwnICldIiktPmNsaWNrKCk7CgogICAgICAgICMgc3dpdGNoIHRvIGFub3RoZXIgd2luZG93CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcHJpbnQgc2NyZWVuIGlzIGxvYWRlZAogICAgICAgIEFDVElWRVNMRUVQOgogICAgICAgIGZvciBteSAkU2Vjb25kICggMSAuLiAyMCApIHsKICAgICAgICAgICAgaWYgKCBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIlByaW9yaXR5IiApID4gLTEsICkgewogICAgICAgICAgICAgICAgbGFzdCBBQ1RJVkVTTEVFUDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzbGVlcCAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgcHJpbnRlZCB2YWx1ZXMgb2YgdGVzdCB0aWNrZXQKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJQcmlvcml0eSIgKSA+IC0xCiAgICAgICAgICAgICAgICAmJiBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIjQgaGlnaCIgKSA+IC0xLAogICAgICAgICAgICAiUHJpb3JpdHkgNCBoaWdoIC0gZm91bmQgb24gcHJpbnQgc2NyZWVuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIkltcGFjdDoiICkgPiAtMQogICAgICAgICAgICAgICAgJiYgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICIzIG5vcm1hbCIgKSA+IC0xLAogICAgICAgICAgICAiSW1wYWN0OiAzIG5vcm1hbCAtIGZvdW5kIG9uIHByaW50IHNjcmVlbiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJDcml0aWNhbGl0eToiICkgPiAtMQogICAgICAgICAgICAgICAgJiYgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICI1IHZlcnkgaGlnaCIgKSA+IC0xLAogICAgICAgICAgICAiQ3JpdGljYWxpdHk6IDUgdmVyeSBoaWdoIC0gZm91bmQgb24gcHJpbnQgc2NyZWVuIiwKICAgICAgICApOwoKICAgICAgICAjIGNsZWFuIHVwIHRlc3QgZGF0YSBmcm9tIHRoZSBEQgogICAgICAgICMgZGVsZXRlIHRlc3QgdGlja2V0CiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tldCBpcyBkZWxldGVkIC0gSUQgJFRpY2tldElEIgogICAgICAgICk7CgogICAgICAgICMgZ2V0IERCIG9iamVjdAogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIGNsZWFuIHVwIHNlcnZpY2EgZGF0YQogICAgICAgICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICJERUxFVEUgRlJPTSBzZXJ2aWNlX3ByZWZlcmVuY2VzIFdIRVJFIHNlcnZpY2VfaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2VQcmVmZXJlbmNlcyBpcyBkZWxldGVkIC0gSUQgJFNlcnZpY2VJRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBzZXJ2aWNlCiAgICAgICAgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2UgaXMgZGVsZXRlZCAtIElEICRTZXJ2aWNlSUQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgZm9yIG15ICRDYWNoZSAoCiAgICAgICAgICAgIHF3IChUaWNrZXQgU2VydmljZSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRDYWNoZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cik7CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCm15ICRTZWxlbml1bSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6U2VsZW5pdW0nKTsKCmlmICggJFNlbGVuaXVtLT57YnJvd3Nlcl9uYW1lfSBuZSAnZmlyZWZveCcgKSB7CiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAxLAogICAgICAgICJQREYgdGVzdCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBGaXJlZm94IiwKICAgICk7CiAgICByZXR1cm4gMTsKfQoKJFNlbGVuaXVtLT5SdW5UZXN0KAogICAgc3ViIHsKCiAgICAgICAgIyBnZXQgaGVscGVyIG9iamVjdAogICAgICAgIG15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IGN1c3RvbWVyIHVzZXIgYW5kIGxvZ2luCiAgICAgICAgbXkgJFRlc3RDdXN0b21lclVzZXJMb2dpbiA9ICRIZWxwZXItPlRlc3RDdXN0b21lclVzZXJDcmVhdGUoCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgY3VzdG9tZXIgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgIFBhc3N3b3JkID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbmVlZGVkIGRhdGEKICAgICAgICBteSBAVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJJRHMoCiAgICAgICAgICAgIFVzZXIgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICApOwogICAgICAgIG15ICRUZXN0Q3VzdG9tZXJJRCA9ICRVc2VyWzBdOwoKICAgICAgICBteSAkVHlwZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKS0+VHlwZUxvb2t1cCggVHlwZSA9PiAnSW5jaWRlbnQnICk7CgogICAgICAgICMgY3JlYXRlIHRlc3Qgc2VydmljZQogICAgICAgIG15ICRTZXJ2aWNlTmFtZSAgICAgPSAiU2VydmljZSIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpOwogICAgICAgIG15ICRJVFNNQ3JpdGljYWxpdHkgPSAnNSB2ZXJ5IGhpZ2gnOwogICAgICAgIG15ICRTZXJ2aWNlSUQgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlQWRkKAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VydmljZU5hbWUsCiAgICAgICAgICAgIFZhbGlkSUQgICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgID0+ICdTZWxlbml1bSBUZXN0IFNlcnZpY2UnLAogICAgICAgICAgICBUeXBlSUQgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkSVRTTUNyaXRpY2FsaXR5LAogICAgICAgICAgICBVc2VySUQgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICJTZXJ2aWNlIGlzIGNyZWF0ZWQgLSBJRCAkU2VydmljZUlEIiwKICAgICAgICApOwoKICAgICAgICAjIHNldCBJVFNNSW1wYWN0IHRvICczIG5vcm1hbCcgYW5kIGdldCBwcmlvcml0eQogICAgICAgICMgZXhwZWN0ZWQgdmFsdWUgaXMgJzQgaGlnaCcsIGl0IHdpbGwgYmUgY2hlY2tlZCBpbiBBZ2VudFRpY2tldFByaW50IHNjcmVlbgogICAgICAgIG15ICRJVFNNSW1wYWN0ID0gJzMgbm9ybWFsJzsKICAgICAgICBteSAkUHJpb3JpdHlJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUnKS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkSVRTTUNyaXRpY2FsaXR5LAogICAgICAgICAgICBJbXBhY3QgICAgICA9PiAkSVRTTUltcGFjdCwKICAgICAgICApOwoKICAgICAgICAjIGdldCBUaWNrZXQgb2JqZWN0CiAgICAgICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCBjdXN0b21lcgogICAgICAgIG15ICRUaWNrZXROdW1iZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDcmVhdGVOdW1iZXIoKTsKICAgICAgICBteSAkVGlja2V0SUQgICAgID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgICAgICBUTiAgICAgICAgICAgPT4gJFRpY2tldE51bWJlciwKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICdTZWxlbml1bSBUZXN0IFRpY2tldCcsCiAgICAgICAgICAgIFF1ZXVlICAgICAgICA9PiAnUmF3JywKICAgICAgICAgICAgUHJpb3JpdHlJRCAgID0+ICRQcmlvcml0eUlELAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnb3BlbicsCiAgICAgICAgICAgIFR5cGVJRCAgICAgICA9PiAkVHlwZUlELAogICAgICAgICAgICBTZXJ2aWNlSUQgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRUZXN0Q3VzdG9tZXJJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICIkVGVzdEN1c3RvbWVyVXNlckxvZ2luXEBsb2NhbGhvc3QuY29tIiwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICRUaWNrZXRJRCwKICAgICAgICAgICAgIlRpY2tldCBpcyBjcmVhdGVkIC0gSUQgJFRpY2tldElEIiwKICAgICAgICApOwoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBteSAkSVRTTUNyaXRpY2FsaXR5Q29uZmlnID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICJJVFNNQ3JpdGljYWxpdHkiLAogICAgICAgICk7CiAgICAgICAgbXkgJElUU01JbXBhY3RDb25maWcgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gIklUU01JbXBhY3QiLAogICAgICAgICk7CgogICAgICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWUgZm9yIENyaXRpY2FsaXR5IGFuZCBJbXBhY3QKICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkSVRTTUNyaXRpY2FsaXR5Q29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJElUU01Dcml0aWNhbGl0eSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkSVRTTUltcGFjdENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRJVFNNSW1wYWN0LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzY3JpcHQgYWxpYXMKICAgICAgICBteSAkU2NyaXB0QWxpYXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1NjcmlwdEFsaWFzJyk7CgogICAgICAgICMgbmF2aWdhdGUgdG8gQ3VzdG9tZXJUaWNrZXRab29tIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9Y3VzdG9tZXIucGw/QWN0aW9uPUN1c3RvbWVyVGlja2V0Wm9vbTtUaWNrZXROdW1iZXI9JFRpY2tldE51bWJlciIpOwoKICAgICAgICAjIGNsaWNrIG9uIHByaW50IG1lbnUgaXRlbQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIvL2FbY29udGFpbnMoXEBocmVmLCBcJ0FjdGlvbj1DdXN0b21lclRpY2tldFByaW50O1RpY2tldElEPSRUaWNrZXRJRFwnICldIiktPmNsaWNrKCk7CgogICAgICAgICMgc3dpdGNoIHRvIGFub3RoZXIgd2luZG93CiAgICAgICAgbXkgJEhhbmRsZXMgPSAkU2VsZW5pdW0tPmdldF93aW5kb3dfaGFuZGxlcygpOwogICAgICAgICRTZWxlbml1bS0+c3dpdGNoX3RvX3dpbmRvdyggJEhhbmRsZXMtPlsxXSApOwoKICAgICAgICAjIHdhaXQgdW50aWwgcHJpbnQgc2NyZWVuIGlzIGxvYWRlZAogICAgICAgIEFDVElWRVNMRUVQOgogICAgICAgIGZvciBteSAkU2Vjb25kICggMSAuLiAyMCApIHsKICAgICAgICAgICAgaWYgKCBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIlByaW9yaXR5IiApID4gLTEsICkgewogICAgICAgICAgICAgICAgbGFzdCBBQ1RJVkVTTEVFUDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzbGVlcCAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBmb3IgcHJpbnRlZCB2YWx1ZXMgb2YgdGVzdCB0aWNrZXQKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJQcmlvcml0eSIgKSA+IC0xCiAgICAgICAgICAgICAgICAmJiBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIjQgaGlnaCIgKSA+IC0xLAogICAgICAgICAgICAiUHJpb3JpdHkgNCBoaWdoIC0gZm91bmQgb24gcHJpbnQgc2NyZWVuIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgIkltcGFjdDoiICkgPiAtMQogICAgICAgICAgICAgICAgJiYgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICIzIG5vcm1hbCIgKSA+IC0xLAogICAgICAgICAgICAiSW1wYWN0OiAzIG5vcm1hbCAtIGZvdW5kIG9uIHByaW50IHNjcmVlbiIsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJDcml0aWNhbGl0eToiICkgPiAtMQogICAgICAgICAgICAgICAgJiYgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICI1IHZlcnkgaGlnaCIgKSA+IC0xLAogICAgICAgICAgICAiQ3JpdGljYWxpdHk6IDUgdmVyeSBoaWdoIC0gZm91bmQgb24gcHJpbnQgc2NyZWVuIiwKICAgICAgICApOwoKICAgICAgICAjIGNsZWFuIHVwIHRlc3QgZGF0YSBmcm9tIHRoZSBEQgogICAgICAgICMgZGVsZXRlIHRlc3QgdGlja2V0CiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlRpY2tldCBpcyBkZWxldGVkIC0gJFRpY2tldElEIgogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIHRlc3Qgc2VydmljZQogICAgICAgICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NIHNlcnZpY2UgV0hFUkUgaWQgPSAkU2VydmljZUlEIiwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIlNlcnZpY2UgaXMgZGVsZXRlZCAtIElEICRTZXJ2aWNlSUQiLAogICAgICAgICk7CgogICAgICAgICMgbWFrZSBzdXJlIHRoZSBjYWNoZSBpcyBjb3JyZWN0CiAgICAgICAgZm9yIG15ICRDYWNoZSAocXcgKFRpY2tldCBTZXJ2aWNlKSkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJENhY2hlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KKTsKCjE7Cg==
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyAtLQovLyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQovLyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgSVRTTSA9IElUU00gfHwge307CklUU00uQWdlbnQgPSBJVFNNLkFnZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UKICogQGV4cG9ydHMgVGFyZ2V0TlMgYXMgSVRTTS5BZ2VudC5JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciBJbmNpZGVudFN0YXRlLgogKi8KSVRTTS5BZ2VudC5JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudCA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICAvKioKICAgICAqIEBuYW1lIFNob3dJbmNpZGVudFN0YXRlCiAgICAgKiBAbWVtYmVyb2YgSVRTTS5BZ2VudC5JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge09iamVjdH0gRGF0YSAtIFRoZSBkYXRhIG5lZWRlZCBmb3IgdGhlIGluY2lkZW50IHN0YXRlIChUaWNrZXRJRCwgU2VydmljZUlEKQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gc2hvd3MgdGhlIEluY2lkZW50U3RhdGUgb2Ygc2VydmljZS4KICAgICAqLwogICAgVGFyZ2V0TlMuU2hvd0luY2lkZW50U3RhdGUgPSBmdW5jdGlvbiAoRGF0YSkgewoKICAgICAgICAvLyBzZXQgYWN0aW9uIGFuZCBzdWJhY3Rpb24KICAgICAgICBEYXRhLkFjdGlvbiA9ICdBZ2VudElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50JzsKICAgICAgICBEYXRhLlN1YmFjdGlvbiA9ICdHZXRTZXJ2aWNlSW5jaWRlbnRTdGF0ZSc7CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLCBEYXRhLCBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKCiAgICAgICAgICAgIC8vIGlmIGEgc2VydmljZSB3YXMgc2VsZWN0ZWQgYW5kIGFuIGluY2lkZW50IHN0YXRlIHdhcyBmb3VuZAogICAgICAgICAgICBpZiAoUmVzcG9uc2UuQ3VySW5jaVNpZ25hbCkgewoKICAgICAgICAgICAgICAgIC8vIHNldCBpbmNpZGVudCBzaWduYWwKICAgICAgICAgICAgICAgICQoJyNTZXJ2aWNlSW5jaWRlbnRTdGF0ZVNpZ25hbCcpLmF0dHIoJ2NsYXNzJywgUmVzcG9uc2UuQ3VySW5jaVNpZ25hbCk7CiAgICAgICAgICAgICAgICAkKCcjU2VydmljZUluY2lkZW50U3RhdGVTaWduYWwnKS5hdHRyKCd0aXRsZScsIFJlc3BvbnNlLkN1ckluY2lTdGF0ZSk7CgogICAgICAgICAgICAgICAgLy8gc2V0IGluY2lkZW50IHN0YXRlCiAgICAgICAgICAgICAgICAkKCcjU2VydmljZUluY2lkZW50U3RhdGUnKS5odG1sKFJlc3BvbnNlLkN1ckluY2lTdGF0ZSk7CgogICAgICAgICAgICAgICAgLy8gc2hvdyBzZXJ2aWNlIGluY2lkZW50IHNpZ25hbCBhbmQgc3RhdGUKICAgICAgICAgICAgICAgICQoJyNTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lcicpCiAgICAgICAgICAgICAgICAgICAgLnNob3coKQogICAgICAgICAgICAgICAgICAgIC5wcmV2KCkKICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gaGlkZSBzZXJ2aWNlIGluY2lkZW50IHNpZ25hbCBhbmQgc3RhdGUKICAgICAgICAgICAgICAgICQoJyNTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lcicpCiAgICAgICAgICAgICAgICAgICAgLmhpZGUoKQogICAgICAgICAgICAgICAgICAgIC5wcmV2KCkKICAgICAgICAgICAgICAgICAgICAuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIElUU00uQWdlbnQuSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgYWN0aW9ucyBmb3IgSVRTTSBBZ2VudCBJbmNpZGVudFN0YXRlLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICAgIC8vIGxvYWQgdGVtcGxhdGUgZm9yIGluY2lkZW50IHN0YXRlIGFuZCBzaWduYWwgYW5kIGF0dGFjaCBhdCB0byB0aGUgRE9NIGFmdGVyIHRoZSBzZXJ2aWNlCiAgICAgICAgdmFyIFNlcnZpY2VJbmNpZGVudFN0YXRlSFRNTCA9IENvcmUuVGVtcGxhdGUuUmVuZGVyKCdBZ2VudC9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC9TZXJ2aWNlSW5jaWRlbnRTdGF0ZScpOwoKICAgICAgICAvLyBpbnNlcnQgdGVtcGxhdGUgdG8gcGFnZQogICAgICAgICQoU2VydmljZUluY2lkZW50U3RhdGVIVE1MKS5pbnNlcnRCZWZvcmUoJCgnbGFiZWxbZm9yPVNMQUlEXScpKTsKCiAgICAgICAgLy8gdXBkYXRlIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCBzaWduYWwgd2hlbiBzZXJ2aWNlIGlzIGNoYW5nZWQKICAgICAgICAkKCcjU2VydmljZUlEJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgIC8vIHNob3cgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZQogICAgICAgICAgICBJVFNNLkFnZW50LklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LlNob3dJbmNpZGVudFN0YXRlKHsKICAgICAgICAgICAgICAgIFRpY2tldElEOiAkKCdpbnB1dFt0eXBlPWhpZGRlbl1bbmFtZT1UaWNrZXRJRF0nKS52YWwoKSwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICAvLyBvcGVuIHNvbWUgbGlua3MgYXMgcG9wIHVwCiAgICAgICAgJCgnYS5Bc1BvcHVwJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cCgkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgJ0FjdGlvbicpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgIC8vIHNob3cgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZQogICAgICAgIC8vICAgKHRoaXMgcGFydCBoZXJlIGlzIGltcG9ydGFudCBpZiB0aGUgcGFnZSBpcyByZWxvYWRlZCBkdWUgdG8gZS5nLiBhdHRhY2htZW50IHVwbG9hZAogICAgICAgIC8vICAgb3Igb24gZmlyc3QgbG9hZCBmb3IgQWdlbnRUaWNrZXRBY3Rpb25Db21tb24pCiAgICAgICAgaWYgKCQoJyNTZXJ2aWNlSUQnKS52YWwoKSkgewogICAgICAgICAgICBJVFNNLkFnZW50LklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LlNob3dJbmNpZGVudFN0YXRlKHsKICAgICAgICAgICAgICAgIFRpY2tldElEOiAkKCdpbnB1dFt0eXBlPWhpZGRlbl1bbmFtZT1UaWNrZXRJRF0nKS52YWwoKSwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH07CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShJVFNNLkFnZW50LklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50IHx8IHt9KSk7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6OklUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OyAgICAjIyBubyBjcml0aWMKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6Ok91dHB1dDo6VGVtcGxhdGU6OlByb3ZpZGVyOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RhdHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnLAopOwoKPWhlYWQxIE5BTUUKCnZhcjo6cGFja2FnZXNldHVwOjpJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudCAtIGNvZGUgdG8gZXhlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGZ1bmN0aW9ucwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1jdXQKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENvZGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCd2YXI6OnBhY2thZ2VzZXR1cDo6SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBGb3JjZSBhIHJlbG9hZCBvZiBaWlpBdXRvLnBtIGFuZCBaWlpBQXV0by5wbSB0byBnZXQgdGhlIGZyZXNoIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgogICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJUlOQyApIHsKICAgICAgICBpZiAoICRNb2R1bGUgPX4gbS9aWlpBQT91dG9cLnBtJC8gKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkSU5DeyRNb2R1bGV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIENyZWF0ZSBjb21tb24gb2JqZWN0cyB3aXRoIGZyZXNoIGRlZmF1bHQgY29uZmlnLgogICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKCk7CgogICAgIyBkZWZpbmUgVXNlcklEIHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdGF0cyBvYmplY3QKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZGVmaW5lIGZpbGUgcHJlZml4IGZvciBzdGF0cwogICAgJFNlbGYtPntGaWxlUHJlZml4fSA9ICdJVFNNU3RhdHMnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBuZXcgdGlja2V0IHN0YXRlcyB0byB2YWxpZAogICAgewogICAgICAgIG15IEBTdGF0ZU5hbWVzID0gKAogICAgICAgICAgICAnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgc3RhdGVzIHRvIHZhbGlkCiAgICAgICAgJFNlbGYtPl9TZXRTdGF0ZVZhbGlkKAogICAgICAgICAgICBTdGF0ZU5hbWVzID0+IFxAU3RhdGVOYW1lcywKICAgICAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgbmV3IHRpY2tldCB0eXBlcyB0byB2YWxpZAogICAgewogICAgICAgIG15IEBUeXBlTmFtZXMgPSAoCiAgICAgICAgICAgICdJbmNpZGVudCcsCiAgICAgICAgICAgICdJbmNpZGVudDo6TWFqb3InLAogICAgICAgICAgICAnU2VydmljZVJlcXVlc3QnLAogICAgICAgICAgICAnUHJvYmxlbScsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdHlwZXMgdG8gdmFsaWQKICAgICAgICAkU2VsZi0+X1NldFR5cGVWYWxpZCgKICAgICAgICAgICAgVHlwZU5hbWVzID0+IFxAVHlwZU5hbWVzLAogICAgICAgICAgICBWYWxpZCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNCiAgICAkU2VsZi0+X0NyZWF0ZUlUU01EeW5hbWljRmllbGRzKCk7CgogICAgIyBpbnN0YWxsIHN0YXRzCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdHMnKS0+U3RhdHNJbnN0YWxsKAogICAgICAgIEZpbGVQcmVmaXggPT4gJFNlbGYtPntGaWxlUHJlZml4fSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBpbnN0YWxsIHN0YXRzCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdHMnKS0+U3RhdHNJbnN0YWxsKAogICAgICAgIEZpbGVQcmVmaXggPT4gJFNlbGYtPntGaWxlUHJlZml4fSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzNfMl85MSgpCgpUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgaWYgdGhlIGluc3RhbGxlZCBtb2R1bGUgdmVyc2lvbiBpcyBzbWFsbGVyIHRoYW4gMy4yLjkxICgzLjMuMCBCZXRhIDEpLgoKbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZUZyb21Mb3dlclRoYW5fM18yXzkxKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzNfMl85MSB7ICAgICMjIG5vIGNyaXRpYwogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHJlbmFtZSB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiAgICAkU2VsZi0+X1JlbmFtZUR5bmFtaWNGaWVsZHMoKTsKCiAgICAjIHNldCB0aGUgc2NyZWVuIGR5bmFtaWMgZmllbGQgY29uZmlnCiAgICAkU2VsZi0+X1NldFNjcmVlbkR5bmFtaWNGaWVsZENvbmZpZygpOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF8yKCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiA0LjAuMi4KCm15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF8yKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF8yIHsgICAgIyMgbm8gY3JpdGljCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbWlncmF0ZSB0aGUgRFRMIENvbnRlbnQgaW4gdGhlIFN5c0NvbmZpZwogICAgJFNlbGYtPl9NaWdyYXRlRFRMSW5TeXNDb25maWcoKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG1ha2UgZHluYW1pYyBmaWVsZHMgaW50ZXJuYWwKICAgICRTZWxmLT5fTWFrZUR5bmFtaWNGaWVsZHNJbnRlcm5hbCgpOwoKICAgICMgaW5zdGFsbCBzdGF0cwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyktPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICRTZWxmLT57RmlsZVByZWZpeH0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENvZGVVbmluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVW5pbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVVuaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IG5ldyB0aWNrZXQgc3RhdGVzIHRvIGludmFsaWQKICAgIHsKICAgICAgICBteSBAU3RhdGVOYW1lcyA9ICgKICAgICAgICAgICAgJ2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHN0YXRlcyB0byBpbnZhbGlkCiAgICAgICAgJFNlbGYtPl9TZXRTdGF0ZVZhbGlkKAogICAgICAgICAgICBTdGF0ZU5hbWVzID0+IFxAU3RhdGVOYW1lcywKICAgICAgICAgICAgVmFsaWQgICAgICA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgbmV3IHRpY2tldCB0eXBlcyB0byBpbnZhbGlkCiAgICB7CiAgICAgICAgbXkgQFR5cGVOYW1lcyA9ICgKICAgICAgICAgICAgJ0luY2lkZW50JywKICAgICAgICAgICAgJ0luY2lkZW50OjpNYWpvcicsCiAgICAgICAgICAgICdTZXJ2aWNlUmVxdWVzdCcsCiAgICAgICAgICAgICdQcm9ibGVtJywKCiAgICAgICAgICAgICMgb2xkIHR5cGVzIGZyb20gSVRTTSBiZWZvcmUgdmVyc2lvbiAzLjIuOTEKICAgICAgICAgICAgJ0luY2lkZW50OjpTZXJ2aWNlUmVxdWVzdCcsCiAgICAgICAgICAgICdJbmNpZGVudDo6RGlzYXN0ZXInLAogICAgICAgICAgICAnUHJvYmxlbTo6S25vd25FcnJvcicsCiAgICAgICAgICAgICdQcm9ibGVtOjpQZW5kaW5nUmZDJywKICAgICAgICApOwoKICAgICAgICAjIHNldCB0eXBlcyB0byBpbnZhbGlkCiAgICAgICAgJFNlbGYtPl9TZXRUeXBlVmFsaWQoCiAgICAgICAgICAgIFR5cGVOYW1lcyA9PiBcQFR5cGVOYW1lcywKICAgICAgICAgICAgVmFsaWQgICAgID0+IDAsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQxIFBSSVZBVEUgSU5URVJGQUNFCgo9aGVhZDIgX1NldFNjcmVlbkR5bmFtaWNGaWVsZENvbmZpZygpCgpUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHNjcmVlbiBkeW5hbWljIHNjcmVlbiBjb25maWcKCm15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X1NldFNjcmVlbkR5bmFtaWNGaWVsZENvbmZpZygpOwoKPWN1dAoKc3ViIF9TZXRTY3JlZW5EeW5hbWljRmllbGRDb25maWcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG1hcHBpbmcgb2xkIG5hbWUgdG8gbmV3IG5hbWUgb2YgZHluYW1pYyBmaWVsZHMKICAgIG15ICVPbGQyTmV3ID0gKAogICAgICAgIFRpY2tldEZyZWVUZXh0MTMgPT4gJ0lUU01Dcml0aWNhbGl0eScsCiAgICAgICAgVGlja2V0RnJlZVRleHQxNCA9PiAnSVRTTUltcGFjdCcsCiAgICAgICAgVGlja2V0RnJlZVRleHQxNSA9PiAnSVRTTVJldmlld1JlcXVpcmVkJywKICAgICAgICBUaWNrZXRGcmVlVGV4dDE2ID0+ICdJVFNNRGVjaXNpb25SZXN1bHQnLAogICAgICAgIFRpY2tldEZyZWVUaW1lMyAgPT4gJ0lUU01SZXBhaXJTdGFydFRpbWUnLAogICAgICAgIFRpY2tldEZyZWVUaW1lNCAgPT4gJ0lUU01SZWNvdmVyeVN0YXJ0VGltZScsCiAgICAgICAgVGlja2V0RnJlZVRpbWU1ICA9PiAnSVRTTURlY2lzaW9uRGF0ZScsCiAgICAgICAgVGlja2V0RnJlZVRpbWU2ICA9PiAnSVRTTUR1ZURhdGUnLAogICAgKTsKCiAgICAjIGRlZmluZSB0aGUgZW5hYmxlZCBkeW5hbWljIGZpZWxkcyBmb3IgZWFjaCBzY3JlZW4KICAgICMgKHRha2VuIGZyb20gc3lzY29uZmlnIG9mIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50KQogICAgbXkgJVNjcmVlbkR5bmFtaWNGaWVsZENvbmZpZyA9ICgKICAgICAgICBBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkID0+IHsKICAgICAgICAgICAgSVRTTVJlcGFpclN0YXJ0VGltZSAgID0+IDEsCiAgICAgICAgICAgIElUU01SZWNvdmVyeVN0YXJ0VGltZSA9PiAxLAogICAgICAgICAgICBJVFNNRHVlRGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFnZW50VGlja2V0RGVjaXNpb24gPT4gewogICAgICAgICAgICBJVFNNRGVjaXNpb25SZXN1bHQgPT4gMSwKICAgICAgICAgICAgSVRTTURlY2lzaW9uRGF0ZSAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZ2VudFRpY2tldFBob25lID0+IHsKICAgICAgICAgICAgSVRTTUltcGFjdCAgPT4gMSwKICAgICAgICAgICAgSVRTTUR1ZURhdGUgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFnZW50VGlja2V0RW1haWwgPT4gewogICAgICAgICAgICBJVFNNSW1wYWN0ICA9PiAxLAogICAgICAgICAgICBJVFNNRHVlRGF0ZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWdlbnRUaWNrZXRTZWFyY2ggPT4gewogICAgICAgICAgICBJVFNNSW1wYWN0ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgSVRTTVJldmlld1JlcXVpcmVkICAgID0+IDEsCiAgICAgICAgICAgIElUU01EZWNpc2lvblJlc3VsdCAgICA9PiAxLAogICAgICAgICAgICBJVFNNUmVwYWlyU3RhcnRUaW1lICAgPT4gMSwKICAgICAgICAgICAgSVRTTVJlY292ZXJ5U3RhcnRUaW1lID0+IDEsCiAgICAgICAgICAgIElUU01EZWNpc2lvbkRhdGUgICAgICA9PiAxLAogICAgICAgICAgICBJVFNNRHVlRGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFnZW50VGlja2V0Wm9vbSA9PiB7CiAgICAgICAgICAgIElUU01JbXBhY3QgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBJVFNNQ3JpdGljYWxpdHkgICAgICAgPT4gMSwKICAgICAgICAgICAgSVRTTVJldmlld1JlcXVpcmVkICAgID0+IDEsCiAgICAgICAgICAgIElUU01EZWNpc2lvblJlc3VsdCAgICA9PiAxLAogICAgICAgICAgICBJVFNNUmVwYWlyU3RhcnRUaW1lICAgPT4gMSwKICAgICAgICAgICAgSVRTTVJlY292ZXJ5U3RhcnRUaW1lID0+IDEsCiAgICAgICAgICAgIElUU01EZWNpc2lvbkRhdGUgICAgICA9PiAxLAogICAgICAgICAgICBJVFNNRHVlRGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFnZW50VGlja2V0UHJpb3JpdHkgPT4gewogICAgICAgICAgICBJVFNNSW1wYWN0ID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZ2VudFRpY2tldENsb3NlID0+IHsKICAgICAgICAgICAgSVRTTVJldmlld1JlcXVpcmVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZ2VudFRpY2tldENvbXBvc2UgPT4gewogICAgICAgICAgICBJVFNNUmV2aWV3UmVxdWlyZWQgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRTeXNDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyk7CgogICAgbXkgQE5ld1NldHRpbmdzOwoKICAgIGZvciBteSAkU2NyZWVuICggc29ydCBrZXlzICVTY3JlZW5EeW5hbWljRmllbGRDb25maWcgKSB7CgogICAgICAgICMgZ2V0IGV4aXN0aW5nIGNvbmZpZyBmb3IgZWFjaCBzY3JlZW4KICAgICAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2NyZWVuIik7CgogICAgICAgICMgZ2V0IGV4aXN0aW5nIGR5bmFtaWMgZmllbGQgY29uZmlnCiAgICAgICAgbXkgJUV4aXN0aW5nU2V0dGluZyA9ICV7ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9IH07CgogICAgICAgICMgYWRkIHRoZSBuZXcgc2V0dGluZ3MKICAgICAgICBteSAlTmV3U2V0dGluZyA9ICggJUV4aXN0aW5nU2V0dGluZywgJXsgJFNjcmVlbkR5bmFtaWNGaWVsZENvbmZpZ3skU2NyZWVufSB9ICk7CgogICAgICAgICMgZGVsZXRlIG5vIGxvbmdlciB1c2VkIGR5bmFtaWMgZmllbGQgbmFtZXMgZnJvbSBlYWNoIGNvbmZpZwogICAgICAgIGZvciBteSAkT2xkRHluYW1pY0ZpZWxkICggc29ydCBrZXlzICVPbGQyTmV3ICkgewoKICAgICAgICAgICAgIyBhbiBvbGQgc2V0dGluZyBleGlzdHMKICAgICAgICAgICAgaWYgKCBleGlzdHMgJE5ld1NldHRpbmd7JE9sZER5bmFtaWNGaWVsZH0gKSB7CgogICAgICAgICAgICAgICAgIyBjb3B5IHRoZSBvbGQgc2V0dGluZyB0byB0aGUgbmV3IHNldHRpbmcKICAgICAgICAgICAgICAgICROZXdTZXR0aW5neyAkT2xkMk5ld3skT2xkRHluYW1pY0ZpZWxkfSB9ID0gJE5ld1NldHRpbmd7JE9sZER5bmFtaWNGaWVsZH07CgogICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIG9sZCBzZXR0aW5nCiAgICAgICAgICAgICAgICBkZWxldGUgJE5ld1NldHRpbmd7JE9sZER5bmFtaWNGaWVsZH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRTZXR0aW5nTmFtZSA9ICdUaWNrZXQ6OkZyb250ZW5kOjonIC4gJFNjcmVlbiAuICcjIyNEeW5hbWljRmllbGQnOwoKICAgICAgICAjIEJ1aWxkIG5ldyBzZXR0aW5nLgogICAgICAgIHB1c2ggQE5ld1NldHRpbmdzLCB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICRTZXR0aW5nTmFtZSwKICAgICAgICAgICAgRWZmZWN0aXZlVmFsdWUgPT4gXCVOZXdTZXR0aW5nLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIDEgaWYgIUBOZXdTZXR0aW5nczsKCiAgICAjIFdyaXRlIG5ldyBzZXR0aW5nLgogICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ3NTZXQoCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICBDb21tZW50cyA9PiAnSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQgLSBwYWNrYWdlIHNldHVwIGZ1bmN0aW9uOiBfU2V0U2NyZWVuRHluYW1pY0ZpZWxkQ29uZmlnJywKICAgICAgICBTZXR0aW5ncyA9PiBcQE5ld1NldHRpbmdzLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9TZXRTdGF0ZVZhbGlkKCkKCnNldHMgc3RhdGVzIHRvIHZhbGlkfGludmFsaWQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9TZXRTdGF0ZVZhbGlkKAogICAgICAgIFN0YXRlTmFtZXMgPT4gWyAnbmV3JywgJ29wZW4nIF0sCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfU2V0U3RhdGVWYWxpZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17U3RhdGVOYW1lc30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFN0YXRlTmFtZXMhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCB2YWxpZCBpZAogICAgbXkgJVZhbGlkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgICVWYWxpZExpc3QgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICBteSAkVmFsaWRJRCA9ICRQYXJhbXtWYWxpZH0gPyAkVmFsaWRMaXN0e3ZhbGlkfSA6ICRWYWxpZExpc3R7aW52YWxpZH07CgogICAgU1RBVEVOQU1FOgogICAgZm9yIG15ICRTdGF0ZU5hbWUgKCBAeyAkUGFyYW17U3RhdGVOYW1lc30gfSApIHsKCiAgICAgICAgIyBnZXQgc3RhdGUKICAgICAgICBteSAlU3RhdGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJFN0YXRlTmFtZSwKICAgICAgICApOwoKICAgICAgICBuZXh0IFNUQVRFTkFNRSBpZiAhJVN0YXRlOwoKICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZVVwZGF0ZSgKICAgICAgICAgICAgJVN0YXRlLAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZElELAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9TZXRUeXBlVmFsaWQoKQoKc2V0cyB0eXBlcyB0byB2YWxpZHxpbnZhbGlkCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fU2V0VHlwZVZhbGlkKAogICAgICAgIFR5cGVOYW1lcyA9PiBbICdJbmNpZGVudCcsICdQcm9ibGVtJyBdLAogICAgICAgIFZhbGlkICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfU2V0VHlwZVZhbGlkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUeXBlTmFtZXN9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUeXBlTmFtZXMhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCB2YWxpZCBpZAogICAgbXkgJVZhbGlkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKTsKICAgICVWYWxpZExpc3QgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICBteSAkVmFsaWRJRCA9ICRQYXJhbXtWYWxpZH0gPyAkVmFsaWRMaXN0e3ZhbGlkfSA6ICRWYWxpZExpc3R7aW52YWxpZH07CgogICAgIyBnZXQgbGlzdCBvZiBhbGwgdHlwZXMKICAgIG15ICVUeXBlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVMaXN0KAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgcmV2ZXJzZSB0aGUgdHlwZSBsaXN0IGZvciBlYXNpZXIgbG9va3VwCiAgICBteSAlVHlwZUxpc3RSZXZlcnNlID0gcmV2ZXJzZSAlVHlwZUxpc3Q7CgogICAgVFlQRU5BTUU6CiAgICBmb3IgbXkgJFR5cGVOYW1lICggQHsgJFBhcmFte1R5cGVOYW1lc30gfSApIHsKCiAgICAgICAgIyBsb29rdXAgdHlwZSBpZAogICAgICAgIG15ICRUeXBlSUQgPSAkVHlwZUxpc3RSZXZlcnNleyRUeXBlTmFtZX07CgogICAgICAgIG5leHQgVFlQRU5BTUUgaWYgISRUeXBlSUQ7CgogICAgICAgICMgZ2V0IHR5cGUKICAgICAgICBteSAlVHlwZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVHZXQoCiAgICAgICAgICAgIElEID0+ICRUeXBlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdHlwZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJyktPlR5cGVVcGRhdGUoCiAgICAgICAgICAgICVUeXBlLAogICAgICAgICAgICBWYWxpZElEID0+ICRWYWxpZElELAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9DcmVhdGVJVFNNRHluYW1pY0ZpZWxkcygpCgpjcmVhdGVzIGFsbCBkeW5hbWljIGZpZWxkcyB0aGF0IGFyZSBuZWNlc3NhcnkgZm9yIElUU00KCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9DcmVhdGVJVFNNRHluYW1pY0ZpZWxkcygpOwoKPWN1dAoKc3ViIF9DcmVhdGVJVFNNRHluYW1pY0ZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWxpZElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKAogICAgICAgIFZhbGlkID0+ICd2YWxpZCcsCiAgICApOwoKICAgICMgZ2V0IGFsbCBjdXJyZW50IGR5bmFtaWMgZmllbGRzCiAgICBteSAkRHluYW1pY0ZpZWxkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICAjIGdldCB0aGUgbGlzdCBvZiBvcmRlciBudW1iZXJzIChpcyBhbHJlYWR5IHNvcnRlZCkuCiAgICBteSBARHluYW1pY2ZpZWxkT3JkZXJMaXN0OwogICAgZm9yIG15ICREeW5hbWljZmllbGQgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKICAgICAgICBwdXNoIEBEeW5hbWljZmllbGRPcmRlckxpc3QsICREeW5hbWljZmllbGQtPntGaWVsZE9yZGVyfTsKICAgIH0KCiAgICAjIGdldCB0aGUgbGFzdCBlbGVtZW50IGZyb20gdGhlIG9yZGVyIGxpc3QgYW5kIGFkZCAxCiAgICBteSAkTmV4dE9yZGVyTnVtYmVyID0gMTsKICAgIGlmIChARHluYW1pY2ZpZWxkT3JkZXJMaXN0KSB7CiAgICAgICAgJE5leHRPcmRlck51bWJlciA9ICREeW5hbWljZmllbGRPcmRlckxpc3RbLTFdICsgMTsKICAgIH0KCiAgICAjIGdldCB0aGUgZGVmaW5pdGlvbiBmb3IgYWxsIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNCiAgICBteSBARHluYW1pY0ZpZWxkcyA9ICRTZWxmLT5fR2V0SVRTTUR5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCk7CgogICAgIyBjcmVhdGUgYSBkeW5hbWljIGZpZWxkcyBsb29rdXAgdGFibGUKICAgIG15ICVEeW5hbWljRmllbGRMb29rdXA7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JER5bmFtaWNGaWVsZExpc3R9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmIHJlZiAkRHluYW1pY0ZpZWxkIG5lICdIQVNIJzsKICAgICAgICAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgIyBjcmVhdGUgb3IgdXBkYXRlIGR5bmFtaWMgZmllbGRzCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoQER5bmFtaWNGaWVsZHMpIHsKCiAgICAgICAgbXkgJENyZWF0ZUR5bmFtaWNGaWVsZDsKCiAgICAgICAgIyBjaGVjayBpZiB0aGUgZHluYW1pYyBmaWVsZCBhbHJlYWR5IGV4aXN0cwogICAgICAgIGlmICggcmVmICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9IG5lICdIQVNIJyApIHsKICAgICAgICAgICAgJENyZWF0ZUR5bmFtaWNGaWVsZCA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoZSBmaWVsZCBleGlzdHMgY2hlY2sgaWYgdGhlIHR5cGUgbWF0Y2ggd2l0aCB0aGUgbmVlZGVkIHR5cGUKICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9LT57RmllbGRUeXBlfQogICAgICAgICAgICBuZSAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyByZW5hbWUgdGhlIGZpZWxkIGFuZCBjcmVhdGUgYSBuZXcgb25lCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRVcGRhdGUoCiAgICAgICAgICAgICAgICAleyAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSB9LAogICAgICAgICAgICAgICAgTmFtZSAgID0+ICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9LT57TmFtZX0gLiAnT2xkJywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENyZWF0ZUR5bmFtaWNGaWVsZCA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSBpZiB0aGUgZmllbGQgZXhpc3RzIGFuZCB0aGUgdHlwZSBtYXRjaCwgdXBkYXRlIGl0IHRvIHRoZSBJVFNNIGRlZmluaXRpb24KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRVcGRhdGUoCiAgICAgICAgICAgICAgICAleyREeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgSUQgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfS0+e0lEfSwKICAgICAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gJER5bmFtaWNGaWVsZExvb2t1cHsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0tPntGaWVsZE9yZGVyfSwKICAgICAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gJFZhbGlkSUQsCiAgICAgICAgICAgICAgICBSZW9yZGVyICAgID0+IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIG5ldyBmaWVsZCBoYXMgdG8gYmUgY3JlYXRlZAogICAgICAgIGlmICgkQ3JlYXRlRHluYW1pY0ZpZWxkKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBhIG5ldyBmaWVsZAogICAgICAgICAgICBteSAkRmllbGRJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkQWRkKAogICAgICAgICAgICAgICAgSW50ZXJuYWxGaWVsZCA9PiAxLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCAgICAgICAgID0+ICREeW5hbWljRmllbGQtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZE9yZGVyICAgID0+ICROZXh0T3JkZXJOdW1iZXIsCiAgICAgICAgICAgICAgICBGaWVsZFR5cGUgICAgID0+ICREeW5hbWljRmllbGQtPntGaWVsZFR5cGV9LAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSAgICA9PiAkRHluYW1pY0ZpZWxkLT57T2JqZWN0VHlwZX0sCiAgICAgICAgICAgICAgICBDb25maWcgICAgICAgID0+ICREeW5hbWljRmllbGQtPntDb25maWd9LAogICAgICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAkVmFsaWRJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRGaWVsZElEOwoKICAgICAgICAgICAgIyBpbmNyZWFzZSB0aGUgb3JkZXIgbnVtYmVyCiAgICAgICAgICAgICROZXh0T3JkZXJOdW1iZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgIyBtYWtlIGR5bmFtaWMgZmllbGRzIGludGVybmFsCiAgICAkU2VsZi0+X01ha2VEeW5hbWljRmllbGRzSW50ZXJuYWwoKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9SZW5hbWVEeW5hbWljRmllbGRzKCkKClRoaXMgZnVuY3Rpb24gcmVuYW1lcyB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LgoKbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fUmVuYW1lRHluYW1pY0ZpZWxkcygpOwoKPWN1dAoKc3ViIF9SZW5hbWVEeW5hbWljRmllbGRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdGhlIGRlZmluaXRpb24gZm9yIHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgIG15IEBEeW5hbWljRmllbGRzID0gJFNlbGYtPl9HZXRJVFNNRHluYW1pY0ZpZWxkc0RlZmluaXRpb24oKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ291bnRlcjsKICAgIG15ICRTdWNjZXNzQ291bnRlcjsKCiAgICAjIHJlbmFtZSB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5ldyAoQER5bmFtaWNGaWVsZHMpIHsKCiAgICAgICAgIyBnZXQgZXhpc3RpbmcgZHluYW1pYyBmaWVsZCBkYXRhCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9sZCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROZXctPntPbGROYW1lfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJXskRHluYW1pY0ZpZWxkT2xkfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZENvdW50ZXIrKzsKCiAgICAgICAgIyB1cGRhdGUgdGhlIGR5bmFtaWMgZmllbGQKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkVXBkYXRlKAogICAgICAgICAgICBJRCAgICAgICAgID0+ICREeW5hbWljRmllbGRPbGQtPntJRH0sCiAgICAgICAgICAgIEZpZWxkT3JkZXIgPT4gJER5bmFtaWNGaWVsZE9sZC0+e0ZpZWxkT3JkZXJ9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICREeW5hbWljRmllbGROZXctPntOYW1lfSwKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAkRHluYW1pY0ZpZWxkTmV3LT57TGFiZWx9LAogICAgICAgICAgICBGaWVsZFR5cGUgID0+ICREeW5hbWljRmllbGROZXctPntGaWVsZFR5cGV9LAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICREeW5hbWljRmllbGROZXctPntPYmplY3RUeXBlfSwKICAgICAgICAgICAgQ29uZmlnICAgICA9PiAkRHluYW1pY0ZpZWxkT2xkLT57Q29uZmlnfSwgICAgICAgIyB1c2UgdGhlIG9sZCBjb25maWcgc2V0dGluZ3MKICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgICAgICBSZW9yZGVyICAgID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAgICAgJFN1Y2Nlc3NDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgZXJyb3IgaGFuZGxpbmcgaWYgbm90IGFsbCBkeW5hbWljIGZpZWxkcyBjb3VsZCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQogICAgaWYgKCAkRHluYW1pY0ZpZWxkQ291bnRlciAhPSAkU3VjY2Vzc0NvdW50ZXIgKSB7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IHJlbmFtZSBhbGwgZHluYW1pYyBmaWVsZHMgZm9yIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBfR2V0SVRTTUR5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCkKCnJldHVybnMgdGhlIGRlZmluaXRpb24gZm9yIElUU00gcmVsYXRlZCBkeW5hbWljIGZpZWxkcwoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X0dldElUU01EeW5hbWljRmllbGRzRGVmaW5pdGlvbigpOwoKPWN1dAoKc3ViIF9HZXRJVFNNRHluYW1pY0ZpZWxkc0RlZmluaXRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlZmluZSBhbGwgZHluYW1pYyBmaWVsZHMgZm9yIElUU00KICAgIG15IEBEeW5hbWljRmllbGRzID0gKAogICAgICAgIHsKICAgICAgICAgICAgT2xkTmFtZSAgICA9PiAnVGlja2V0RnJlZVRleHQxNScsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0lUU01SZXZpZXdSZXF1aXJlZCcsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gVHJhbnNsYXRhYmxlKCdSZXZpZXcgUmVxdWlyZWQnKSwKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgID0+ICdObycsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgID0+IDAsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgTm8gID0+IFRyYW5zbGF0YWJsZSgnTm8nKSwKICAgICAgICAgICAgICAgICAgICBZZXMgPT4gVHJhbnNsYXRhYmxlKCdZZXMnKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgT2xkTmFtZSAgICA9PiAnVGlja2V0RnJlZVRleHQxNicsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0lUU01EZWNpc2lvblJlc3VsdCcsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gVHJhbnNsYXRhYmxlKCdEZWNpc2lvbiBSZXN1bHQnKSwKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgICAgICA9PiAnUGVuZGluZycsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGVWYWx1ZXMgPT4gMSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAnQXBwcm92ZWQnICAgICA9PiBUcmFuc2xhdGFibGUoJ0FwcHJvdmVkJyksCiAgICAgICAgICAgICAgICAgICAgJ1BlbmRpbmcnICAgICAgPT4gVHJhbnNsYXRhYmxlKCdQZW5kaW5nJyksCiAgICAgICAgICAgICAgICAgICAgJ1Bvc3Rwb25lZCcgICAgPT4gVHJhbnNsYXRhYmxlKCdQb3N0cG9uZWQnKSwKICAgICAgICAgICAgICAgICAgICAnUHJlLWFwcHJvdmVkJyA9PiBUcmFuc2xhdGFibGUoJ1ByZS1hcHByb3ZlZCcpLAogICAgICAgICAgICAgICAgICAgICdSZWplY3RlZCcgICAgID0+IFRyYW5zbGF0YWJsZSgnUmVqZWN0ZWQnKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE9sZE5hbWUgICAgPT4gJ1RpY2tldEZyZWVUaW1lMycsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0lUU01SZXBhaXJTdGFydFRpbWUnLAogICAgICAgICAgICBMYWJlbCAgICAgID0+IFRyYW5zbGF0YWJsZSgnUmVwYWlyIFN0YXJ0IFRpbWUnKSwKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgPT4gMCwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBZZWFyc0luRnV0dXJlID0+IDUsCiAgICAgICAgICAgICAgICBZZWFyc0luUGFzdCAgID0+IDUsCiAgICAgICAgICAgICAgICBZZWFyc1BlcmlvZCAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE9sZE5hbWUgICAgPT4gJ1RpY2tldEZyZWVUaW1lNCcsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0lUU01SZWNvdmVyeVN0YXJ0VGltZScsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gVHJhbnNsYXRhYmxlKCdSZWNvdmVyeSBTdGFydCBUaW1lJyksCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ0RhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgID0+IDAsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgWWVhcnNJbkZ1dHVyZSA9PiA1LAogICAgICAgICAgICAgICAgWWVhcnNJblBhc3QgICA9PiA1LAogICAgICAgICAgICAgICAgWWVhcnNQZXJpb2QgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBPbGROYW1lICAgID0+ICdUaWNrZXRGcmVlVGltZTUnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdJVFNNRGVjaXNpb25EYXRlJywKICAgICAgICAgICAgTGFiZWwgICAgICA9PiBUcmFuc2xhdGFibGUoJ0RlY2lzaW9uIERhdGUnKSwKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgPT4gMCwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBZZWFyc0luRnV0dXJlID0+IDUsCiAgICAgICAgICAgICAgICBZZWFyc0luUGFzdCAgID0+IDUsCiAgICAgICAgICAgICAgICBZZWFyc1BlcmlvZCAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE9sZE5hbWUgICAgPT4gJ1RpY2tldEZyZWVUaW1lNicsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0lUU01EdWVEYXRlJywKICAgICAgICAgICAgTGFiZWwgICAgICA9PiBUcmFuc2xhdGFibGUoJ0R1ZSBEYXRlJyksCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ0RhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgID0+IDI1OTIwMCwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBZZWFyc0luRnV0dXJlID0+IDEsCiAgICAgICAgICAgICAgICBZZWFyc0luUGFzdCAgID0+IDksCiAgICAgICAgICAgICAgICBZZWFyc1BlcmlvZCAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBEeW5hbWljRmllbGRzOwp9Cgo9aGVhZDIgX01ha2VEeW5hbWljRmllbGRzSW50ZXJuYWwoKQoKQ29udmVydHMgdGhlIGR5bmFtaWMgZmllbGRzIHRvIGludGVybmFsIGZpZWxkcywgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IGNhbiBub3QgYmUgZGVsZXRlZCBpbiB0aGUgYWRtaW4gaW50ZXJmYWNlLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X01ha2VEeW5hbWljRmllbGRzSW50ZXJuYWwoKTsKCj1jdXQKCnN1YiBfTWFrZUR5bmFtaWNGaWVsZHNJbnRlcm5hbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRoZSBkZWZpbml0aW9uIGZvciBhbGwgZHluYW1pYyBmaWVsZHMgZm9yIElUU00KICAgIG15IEBEeW5hbWljRmllbGRzID0gJFNlbGYtPl9HZXRJVFNNRHluYW1pY0ZpZWxkc0RlZmluaXRpb24oKTsKCiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoQER5bmFtaWNGaWVsZHMpIHsKCiAgICAgICAgIyBzZXQgYXMgaW50ZXJuYWwgZmllbGQKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnVVBEQVRFIGR5bmFtaWNfZmllbGQKICAgICAgICAgICAgICAgIFNFVCBpbnRlcm5hbF9maWVsZCA9IDEKICAgICAgICAgICAgICAgIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgICAgICBcJER5bmFtaWNGaWVsZC0+e05hbWV9LAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9NaWdyYXRlRFRMSW5TeXNDb25maWcoKQoKQ29udmVydHMgQzxEVEw+IHNldHRpbmdzIGluIHN5c2NvbmZpZyB0byBDPFRUPi4KCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9NaWdyYXRlRFRMSW5TeXNDb25maWcoKTsKCj1jdXQKCnN1YiBfTWlncmF0ZURUTEluU3lzQ29uZmlnIHsKCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkU3lzQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwogICAgbXkgJFByb3ZpZGVyT2JqZWN0ICA9IEtlcm5lbDo6T3V0cHV0OjpUZW1wbGF0ZTo6UHJvdmlkZXItPm5ldygpOwoKICAgIG15IEBOZXdTZXR0aW5nczsKCiAgICAjIGhhbmRsZSBoYXNoIHNldHRpbmdzCiAgICBOQU1FOgogICAgZm9yIG15ICROYW1lIChxdyhUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlKSkgewoKICAgICAgICAjIGdldCBzZXR0aW5nJ3MgY29udGVudAogICAgICAgIG15ICRTZXR0aW5nID0gJENvbmZpZ09iamVjdC0+R2V0KCROYW1lKTsKICAgICAgICBuZXh0IE5BTUUgaWYgISRTZXR0aW5nOwoKICAgICAgICBNRU5VTU9EVUxFOgogICAgICAgIGZvciBteSAkTWVudU1vZHVsZSAoIHNvcnQga2V5cyAleyRTZXR0aW5nfSApIHsKCiAgICAgICAgICAgICMgc2V0dGluZyBpcyBhIGhhc2gKICAgICAgICAgICAgU0VUVElOR0lURU06CiAgICAgICAgICAgIGZvciBteSAkU2V0dGluZ0l0ZW0gKCBzb3J0IGtleXMgJXsgJFNldHRpbmctPnskTWVudU1vZHVsZX0gfSApIHsKCiAgICAgICAgICAgICAgICBteSAkU2V0dGluZ0NvbnRlbnQgPSAkU2V0dGluZy0+eyRNZW51TW9kdWxlfS0+eyRTZXR0aW5nSXRlbX07CgogICAgICAgICAgICAgICAgIyBkbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGZvciBtaWdyYXRpbmcKICAgICAgICAgICAgICAgIG5leHQgU0VUVElOR0lURU0gaWYgISRTZXR0aW5nQ29udGVudDsKCiAgICAgICAgICAgICAgICBteSAkVFRDb250ZW50OwogICAgICAgICAgICAgICAgZXZhbCB7CiAgICAgICAgICAgICAgICAgICAgJFRUQ29udGVudCA9ICRQcm92aWRlck9iamVjdC0+TWlncmF0ZURUTHRvVFQoIENvbnRlbnQgPT4gJFNldHRpbmdDb250ZW50ICk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKCRAKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkTWVudU1vZHVsZS0+JFNldHRpbmdJdGVtIDogJEAhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFNldHRpbmctPnskTWVudU1vZHVsZX0tPnskU2V0dGluZ0l0ZW19ID0gJFRUQ29udGVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBCdWlsZCBuZXcgc2V0dGluZy4KICAgICAgICAgICAgcHVzaCBATmV3U2V0dGluZ3MsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICROYW1lIC4gJyMjIycgLiAkTWVudU1vZHVsZSwKICAgICAgICAgICAgICAgIEVmZmVjdGl2ZVZhbHVlID0+ICRTZXR0aW5nLT57JE1lbnVNb2R1bGV9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBzY2FsYXIgc2V0dGluZ3MKICAgIE5BTUU6CiAgICBmb3IgbXkgJE5hbWUgKAogICAgICAgIHF3KAogICAgICAgIFRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQKICAgICAgICBUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uCiAgICAgICAgKQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBnZXQgc2V0dGluZydzIGNvbnRlbnQKICAgICAgICBteSAkU2V0dGluZyA9ICRDb25maWdPYmplY3QtPkdldCgkTmFtZSk7CiAgICAgICAgbmV4dCBOQU1FIGlmICEkU2V0dGluZzsKCiAgICAgICAgU0VUVElOR0lURU06CiAgICAgICAgZm9yIG15ICRTZXR0aW5nSXRlbSAocXcoU3ViamVjdCBCb2R5KSkgewoKICAgICAgICAgICAgbXkgJFNldHRpbmdDb250ZW50ID0gJFNldHRpbmctPnskU2V0dGluZ0l0ZW19OwoKICAgICAgICAgICAgIyBkbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHZhbHVlIGZvciBtaWdyYXRpbmcKICAgICAgICAgICAgbmV4dCBTRVRUSU5HSVRFTSBpZiAhJFNldHRpbmdDb250ZW50OwoKICAgICAgICAgICAgbXkgJFRUQ29udGVudDsKICAgICAgICAgICAgZXZhbCB7CiAgICAgICAgICAgICAgICAkVFRDb250ZW50ID0gJFByb3ZpZGVyT2JqZWN0LT5NaWdyYXRlRFRMdG9UVCggQ29udGVudCA9PiAkU2V0dGluZ0NvbnRlbnQgKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCRAKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkTmFtZS0+JFNldHRpbmdJdGVtIDogJEAhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2V0dGluZy0+eyRTZXR0aW5nSXRlbX0gPSAkVFRDb250ZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEJ1aWxkIG5ldyBzZXR0aW5nLgogICAgICAgICAgICBwdXNoIEBOZXdTZXR0aW5ncywgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJE5hbWUgLiAnIyMjJyAuICRTZXR0aW5nSXRlbSwKICAgICAgICAgICAgICAgIEVmZmVjdGl2ZVZhbHVlID0+ICRTZXR0aW5nLT57JFNldHRpbmdJdGVtfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDEgaWYgIUBOZXdTZXR0aW5nczsKCiAgICAjIFdyaXRlIG5ldyBzZXR0aW5nLgogICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ3NTZXQoCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICAgICBDb21tZW50cyA9PiAnSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQgLSBwYWNrYWdlIHNldHVwIGZ1bmN0aW9uOiBfTWlncmF0ZURUTEluU3lzQ29uZmlnJywKICAgICAgICBTZXR0aW5ncyA9PiBcQE5ld1NldHRpbmdzLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
closed with workaround
Ticket is closed with workaround.
3
1
current_timestamp
1
current_timestamp
1
Incident
1
current_timestamp
1
current_timestamp
1
Incident::Major
1
current_timestamp
1
current_timestamp
1
ServiceRequest
1
current_timestamp
1
current_timestamp
1
Problem
1
current_timestamp
1
current_timestamp
1