ITSMIncidentProblemManagement
4.0.16
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 4 patch level 16.
Build for OTRS::ITSM 4 patch level 15.
Build for OTRS::ITSM 4 patch level 14.
Build for OTRS::ITSM 4 patch level 13.
Build for OTRS::ITSM 4 patch level 12.
Build for OTRS::ITSM 4 patch level 11.
Build for OTRS::ITSM 4 patch level 10.
Build for OTRS::ITSM 4 patch level 9.
Build for OTRS::ITSM 4 patch level 8.
Build for OTRS::ITSM 4 patch level 7.
Build for OTRS::ITSM 4 patch level 6.
Build for OTRS::ITSM 4 patch level 5.
Build for OTRS::ITSM 4 patch level 4.
Build for OTRS::ITSM 4 patch level 3.
Build for OTRS::ITSM 4 patch level 2.
Build for OTRS::ITSM 4.
Build for OTRS::ITSM 4 rc1.
Build for OTRS::ITSM 4 beta5.
Build for OTRS::ITSM 4 beta4.
Build for OTRS::ITSM 4 beta3.
Build for OTRS::ITSM 4 beta2.
Build for OTRS::ITSM 4 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.
4.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 4.0.16</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 4.0.16</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 4.0.16</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>WELCOME</strong>
<br/>
<br/>
You are about to upgrade the OTRS package ITSMIncidentProblemManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OTRS PACKAGES</strong>
<ul>
<li>ITSMCore 4.0.16</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 4.0.16</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 4.0.16</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
$Kernel::OM->Get('Kernel::System::Stats')->StatsCleanUp();
}
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeReinstall();
2016-02-11 11:47:35
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkNvbmZpZyI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkFkZGl0aW9uYWwgSVRTTSBUaWNrZXQgRmllbGRzPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5BZGRpdGlvbmFsIElUU00gRmllbGRzPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlRpY2tldDwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxMb2FkZXI+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICA8L0xvYWRlcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaWNrZXREZWNpc2lvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRpY2tldCBEZWNpc2lvbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+RGVjaXNpb248L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+VGlja2V0PC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPExvYWRlcj4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLkFnZW50LlRpY2tldEFjdGlvbi5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgIDwvTG9hZGVyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyMzMTUtQWRkdGxJVFNNRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0TWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+QWRkaXRpb25hbCBJVFNNIEZpZWxkczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzY3JpcHRpb24iIFRyYW5zbGF0YWJsZT0iMSI+Q2hhbmdlIHRoZSBJVFNNIGZpZWxkcyE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQ7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQb3B1cFR5cGUiPlRpY2tldEFjdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUjIyM0MjAtRGVjaXNpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIiBUcmFuc2xhdGFibGU9IjEiPkRlY2lzaW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5BZGQgYSBkZWNpc2lvbiE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXREZWNpc2lvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0RGVjaXNpb247VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRhcmdldCI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQb3B1cFR5cGUiPlRpY2tldEFjdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1JlcXVpcmVkTG9jayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc24ndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjVGlja2V0VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTZXJ2aWNlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1NlcnZpY2VNYW5kYXRvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyBpZiBzZXJ2aWNlIG11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1NMQU1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIFNMQSBtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjUXVldWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgcXVldWUgaW4gdGhlIHRpY2tldCByZXNwb25zaWJsZSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjT3duZXIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjT3duZXJNYW5kYXRvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyBpZiB0aWNrZXQgb3duZXIgbXVzdCBiZSBzZWxlY3RlZCBieSB0aGUgYWdlbnQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjUmVzcG9uc2libGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjU3RhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1N0YXRlVHlwZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPm9wZW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5jbG9zZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5wZW5kaW5nIHJlbWluZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyBhdXRvPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdGF0ZURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+b3BlbjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNOb3RlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNOb3RlTWFuZGF0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgaWYgbm90ZSBtdXN0IGJlIGZpbGxlZCBpbiBieSB0aGUgYWdlbnQuIENhbiBiZSBvdmVyd3JpdHRlbiBieSBUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdWJqZWN0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5bJSBUcmFuc2xhdGUoIk5vdGUiKSB8IGh0bWwgJV08L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjQm9keSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxUZXh0QXJlYT48L1RleHRBcmVhPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNJbnZvbHZlZEFnZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNJbmZvcm1BZ2VudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNBcnRpY2xlVHlwZURlZmF1bHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+bm90ZS1pbnRlcm5hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNBcnRpY2xlVHlwZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U3BlY2lmaWVzIHRoZSBkaWZmZXJlbnQgbm90ZSB0eXBlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1pbnRlcm5hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1leHRlcm5hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1yZXBvcnQiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjUHJpb3JpdHkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjUHJpb3JpdHlEZWZhdWx0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MyBub3JtYWw8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjVGl0bGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTVJlcGFpclN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTVJlY292ZXJ5U3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRHVlRGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNIaXN0b3J5VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5BZGROb3RlPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0hpc3RvcnlDb21tZW50IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPiUlRnJlZVRleHQ8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjU2hvd0luY2lkZW50U3RhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPnJ3PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1JlcXVpcmVkTG9jayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzbid0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNUaWNrZXRUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU2VydmljZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1NlcnZpY2VNYW5kYXRvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyBpZiBzZXJ2aWNlIG11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1NMQU1hbmRhdG9yeSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIFNMQSBtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUXVldWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgcXVldWUgaW4gdGhlIHRpY2tldCBub3RlIHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNPd25lciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI093bmVyTWFuZGF0b3J5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgaWYgdGlja2V0IG93bmVyIG11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1Jlc3BvbnNpYmxlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3RhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3RhdGVUeXBlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5vcGVuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Y2xvc2VkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyByZW1pbmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgYXV0bzwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3RhdGVEZWZhdWx0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+b3BlbjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNOb3RlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI05vdGVNYW5kYXRvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyBpZiBub3RlIG11c3QgYmUgZmlsbGVkIGluIGJ5IHRoZSBhZ2VudC4gQ2FuIGJlIG92ZXJ3cml0dGVuIGJ5IFRpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1N1YmplY3QiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+WyUgVHJhbnNsYXRlKCJEZWNpc2lvbiIpIHwgaHRtbCAlXTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNCb2R5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8VGV4dEFyZWE+WyUgVHJhbnNsYXRlKCJSZWFzb24iKSB8IGh0bWwgJV06PC9UZXh0QXJlYT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjSW52b2x2ZWRBZ2VudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNJbmZvcm1BZ2VudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0FydGljbGVUeXBlRGVmYXVsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPm5vdGUtaW50ZXJuYWw8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjQXJ0aWNsZVR5cGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNwZWNpZmllcyB0aGUgZGlmZmVyZW50IG5vdGUgdHlwZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHN5c3RlbS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdGUtaW50ZXJuYWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdGUtZXh0ZXJuYWwiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Im5vdGUtcmVwb3J0Ij4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1ByaW9yaXR5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUHJpb3JpdHlEZWZhdWx0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4zIG5vcm1hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNUaXRsZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTURlY2lzaW9uUmVzdWx0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRGVjaXNpb25EYXRlIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0hpc3RvcnlUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+QWRkTm90ZTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNIaXN0b3J5Q29tbWVudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPiUlTm90ZTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlN0YXRzOjpEeW5hbWljT2JqZWN0UmVnaXN0cmF0aW9uIyMjSVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdGF0czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdGF0czo6RHluYW1pY09iamVjdFJlZ2lzdHJhdGlvbiMjI0lUU01UaWNrZXRTb2x1dGlvblRpbWVBdmVyYWdlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlN0YXRzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmUjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1Bob25lTmV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RW1haWwjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0VtYWlsTmV3PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q2xvc2UjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0Nsb3NlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RnJlZVRleHQjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0ZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCIgVHJhbnNsYXRhYmxlPSIxIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Tm90ZSMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3Tm90ZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldE93bmVyIyMjU2hvd0luY2lkZW50U3RhdGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdPd25lcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiIFRyYW5zbGF0YWJsZT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFBlbmRpbmcjIyNTaG93SW5jaWRlbnRTdGF0ZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1BlbmRpbmc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQcmlvcml0eSMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3UHJpb3JpdHk8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRSZXNwb25zaWJsZSMjI1Nob3dJbmNpZGVudFN0YXRlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3UmVzcG9uc2libGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIiBUcmFuc2xhdGFibGU9IjEiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIiBUcmFuc2xhdGFibGU9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iQUNMS2V5c0xldmVsMzo6QWN0aW9ucyMjIzEwMC1EZWZhdWx0LUlUU00iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB3aGljaCBpdGVtcyBhcmUgYXZhaWxhYmxlIGZvciAnQWN0aW9uJyBpbiB0aGlyZCBsZXZlbCBvZiB0aGUgQUNMIHN0cnVjdHVyZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRBQ0w8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5BZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+QWdlbnRUaWNrZXREZWNpc2lvbjwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6VHlwZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQaG9uZSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHBob25lIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3UGhvbmVOZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUltcGFjdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUR1ZURhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEVtYWlsIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgZW1haWwgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdFbWFpbE5ldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNSW1wYWN0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRHVlRGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0U2VhcmNoIyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1NlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNSW1wYWN0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmV2aWV3UmVxdWlyZWQiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EZWNpc2lvblJlc3VsdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTVJlcGFpclN0YXJ0VGltZSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTVJlY292ZXJ5U3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRGVjaXNpb25EYXRlIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNRHVlRGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Wm9vbSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3Wm9vbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNSW1wYWN0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNQ3JpdGljYWxpdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZXZpZXdSZXF1aXJlZCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTURlY2lzaW9uUmVzdWx0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmVwYWlyU3RhcnRUaW1lIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNUmVjb3ZlcnlTdGFydFRpbWUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EZWNpc2lvbkRhdGUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01EdWVEYXRlIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQcmlvcml0eSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3UHJpb3JpdHk8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVRTTUltcGFjdCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q2xvc2UjIyNEeW5hbWljRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBjbG9zZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0Nsb3NlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZXZpZXdSZXF1aXJlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IGNvbXBvc2Ugc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdDb21wb3NlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IklUU01SZXZpZXdSZXF1aXJlZCI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UHJpb3JpdHkjIyNUaWNrZXRUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1ByaW9yaXR5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQcmlvcml0eSMjI1NlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdQcmlvcml0eTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0Wm9vbSMjI0R5bmFtaWNGaWVsZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBjdXN0b21lciBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpDdXN0b21lcjo6VGlja2V0OjpWaWV3Wm9vbTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNSW1wYWN0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJVFNNQ3JpdGljYWxpdHkiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICfQlNC+0LHQsNCy0Lgg0YDQtdGI0LXQvdC40LUg0LrRitC8INCx0LjQu9C10YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAn0JTQsNGC0LAg0LfQsCDRgNC10YjQsNCy0LDQvdC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ9Cg0LXQt9GD0LvRgtCw0YIg0L7RgiDRgNC10YjQtdC90LjQtdGC0L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfQmtGA0LDQudC90LAg0LTQsNGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAn0J7RgdC90L7QstCw0L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfQktGA0LXQvNC1INC90LAg0YHRgtCw0YDRgtC40YDQsNC90LUg0L3QsCDQstGK0LfRgdGC0LDQvdC+0LLRj9Cy0LDQvdC10YLQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ9CS0YDQtdC80LUg0L3QsCDRgdGC0LDRgNGC0LjRgNCw0L3QtSDQvdCwINGA0LXQvNC+0L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ9CY0LfQuNGB0LrQstCwINC/0YDQtdCz0LvQtdC20LTQsNC90LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ9C/0YDQuNC60LvRjtGH0LXQvSDRgSDQvtCx0YXQvtC00L3QviDRgNC10YjQtdC90LjQtSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ9Cf0YDQvtC80LXQvdC4IElUU00g0L/QvtC70LXRgtCw0YLQsCDQvdCwINCx0LjQu9C10YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAn0JrRgNC40YLQuNGH0L3QvtGB0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAn0JLQu9C40Y/QvdC40LUnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ9CU0L7Qv9GK0LvQvdC40YLQtdC70L3QuCBJVFNNINC/0L7Qu9C10YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICfQoNC10YjQtdC90LjQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jc19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmNzX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdQxZlpZGF0IMWZZcWhZW7DrSBrIHRpa2V0dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0dW0gxZhlxaFlbsOtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1bDvXNsZWRlayDFmGXFoWVuw60nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAnUMWZw63EjWluYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnxIxhcyB6YWjDoWplbsOtIG9ibm92ZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ8SMYXMgemFow6FqZW7DrSBvcHJhdnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnVnnFvmFkdWplIFDFmWVobGVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICd1emF2xZllbm8gZG/EjWFzbsO9bSDFmWXFoWVuw61tJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnWm3Em25hIElUU00gcG9sw60gdiB0aWtldHUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpxI1ub3N0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ1ZsaXYnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdEb3BsxYh0ZSDFmWXFoWVuw60hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdEb3BsxYhrb3bDoSBJVFNNIHBvbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnWm3Em8WIdGUgSVRNUyBwb2xlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ8WYZcWhZW7DrSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRhX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdUaWxmw7hqIGJlc2x1dG5pbmcgdGlsIHNhZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnQmVzbHV0bmluZ3NkYXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ0Jlc2x1dG5pbmdzcmVzdWx0YXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdGb3JmYWxkc2RhdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAnQmVncnVuZGVsc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ1N0YXJ0dGlkIGZvciBnZW5ldGFibGVyaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnU3RhcnR0aWQgZm9yIHJlcGVyYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnQW5tZWxkZWxzZSBrcsOmdmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdMdWtrZXQgbWVkIHdvcmthcm91bmQnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICdSZXQgc2FnZW5zIElUU00gZmVsdGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdLcml0aWthbGl0ZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnUMOldmlya25pbmcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdUaWxmw7hqIGVuIGJlc2x1dG5pbmchJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdZZGVybGlnZSBJVFNNIGZlbHRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdSZXQgSVRTTSBmZWx0ZXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnQmVzbHV0bmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdFbnRzY2hlaWR1bmcgYW4gVGlja2V0IGjDpG5nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0VudHNjaGVpZHVuZ3NkYXR1bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdFbnRzY2hlaWR1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdGw6RsbGlna2VpdHNkYXR1bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFzb24nfSA9ICdCZWdyw7xuZHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnV2llZGVyaGVyc3RlbGx1bmcgU3RhcnR6ZWl0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnUmVwYXJhdHVyIFN0YXJ0emVpdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdOYWNoYmVhcmJlaXR1bmcgZXJmb3JkZXJsaWNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdwcm92aXNvcmlzY2ggZ2VzY2hsb3NzZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAnRGllIEVudHNjaGVpZHVuZyBkZXMgVGlja2V0cyDDpG5kZXJuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICfDhG5kZXJuIGRlciBJVFNNIEZlbGRlciBkZXMgVGlja2V0cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnU2VydmljZSBWb3JmYWxsc3N0YXR1cyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdUaWNrZXQgdmVya27DvHBmZW4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0tyaXRpa2FsaXTDpHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnQXVzd2lya3VuZyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0hpbnp1ZsO8Z2VuIGVpbmVyIEVudHNjaGVpZHVuZyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ1p1c8OkdHpsaWNoZSBJVFNNIEZlbGRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFcmxhdWJ0IGRhcyBIaW56dWbDvGdlbiB2b24gTm90aXplbiBpbiBkZXIgenVzw6R0emxpY2hlbiBJVFNNLU9iZXJmbMOkY2hlIGltIEFnZW50ZW4tSW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0VybGF1YnQgZGFzIEhpbnp1ZsO8Z2VuIHZvbiBOb3RpemVuIGltIEVudHNjaGVpZHVuZ3MtQmlsZHNjaGlybSBpbSBBZ2VudGVuLUludGVyZmFjZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICfDhG5kZXJuIGRlciBJVFNNLUZlbGRlciEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdFbnRzY2hlaWR1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdBw7FhZGlyIGRlY2lzacOzbiBhbCB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0ZlY2hhIGRlIERlY2lzacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdSZXN1bHRhZG8gZGUgRGVjaXNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRmVjaGEgZGUgdmVuY2ltaWVudG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAnTW90aXZvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICdGZWNoYSBJbmljaWFsIGRlIFJlY3VwZXJhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdGZWNoYSBJbmljaWFsIGRlIFJlcGFyYWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ1JldmlzacOzbiBSZXF1ZXJpZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ0NlcnJhZG8gY29uIHNvbHVjacOzbiBwcm92aXNpb25hbCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ01vZGlmaWNhciBjYW1wb3MgSVRTTSBkZWwgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnVmluY3VsYXIgdGlja2V0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdVcmdlbmNpYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdJbXBhY3RvJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnwqFBZ3JlZ3VlIHVuYSBkZWNpc2nDs24hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdDYW1wb3MgSVRTTSBBZGljaW9uYWxlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFncmVnYXIgbm90YXMgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgYWdyZWdhciBub3RhcyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ01vZGlmaWNhciBsb3MgY2FtcG9zIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdEZWNpc2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0RldGVybWluYSBzaSBlcyBuZWNlc2FyaW8gcXVlIGVsIHRpY2tldCBlc3TDqSBibG9xdWVhZG8gcGFyYSBhY2NlZGVyIGEgbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlIChzaSBlbCB0aWNrZXQgbm8gZXN0w6EgYmxvcXVlYWRvIGHDum4sIHNlIGJsb3F1ZWEgeSBlbCBhZ2VudGUgYWN0dWFsIHNlIGNvbnZlcnRpcsOhIGF1dG9tw6F0aWNhbWVudGUgZW4gc3UgcHJvcGlldGFyaW8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdEZXRlcm1pbmEgc2kgZXMgbmVjZXNhcmlvIHF1ZSBlbCB0aWNrZXQgZXN0w6kgYmxvcXVlYWRvIHBhcmEgYWNjZWRlciBhIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUgKHNpIGVsIHRpY2tldCBubyBlc3TDoSBibG9xdWVhZG8gYcO6biwgc2UgYmxvcXVlYSB5IGVsIGFnZW50ZSBhY3R1YWwgc2UgY29udmVydGlyw6EgYXV0b23DoXRpY2FtZW50ZSBlbiBzdSBwcm9waWV0YXJpbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0ZXh0byBwb3IgZGVmYXVsdCBkZSB1bmEgbm90YSwgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0ZXh0byBwb3IgZGVmYXVsdCBkZSB1bmEgbm90YSwgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgc2lndWllbnRlIGVzdGFkbyBkZSB1biB0aWNrZXQgcG9yIGRlZmF1bHQsIGx1ZWdvIGRlIGFncmVnYXIgdW5hIG5vdGEgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHNpZ3VpZW50ZSBlc3RhZG8gZGUgdW4gdGlja2V0IHBvciBkZWZhdWx0LCBsdWVnbyBkZSBhZ3JlZ2FyIHVuYSBub3RhIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCBhc3VudG8gcG9yIGRlZmF1bHQgZGUgdW5hIG5vdGEsIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgYXN1bnRvIHBvciBkZWZhdWx0IGRlIHVuYSBub3RhLCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGxhIHByaW9yaWRhZCBkZWZhdWx0IGRlbCB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbGEgcHJpb3JpZGFkIGRlZmF1bHQgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlZmF1bHQgZGUgbGFzIG5vdGFzIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCB0aXBvIGRlZmF1bHQgZGUgbGFzIG5vdGFzIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIGVsIGNvbWVudGFyaW8gZGVsIGhpc3RvcmlhbCBwYXJhIGxhIGFjY2nDs24gZGUgbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcywgbWlzbWEgcXVlIGVzIHVzYWRhIHBvciBlbCBoaXN0b3JpYWwgZGVsIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBlbCBjb21lbnRhcmlvIGRlbCBoaXN0b3JpYWwsIHBhcmEgbGEgYWNjacOzbiBkZSBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiwgbWlzbWEgcXVlIGVzIHVzYWRhIHBvciBlbCBoaXN0b3JpYWwgZGVsIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBoaXN0b3JpYWwgcGFyYSBsYSBhY2Npw7NuIGRlIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIG1pc21hIHF1ZSBlcyB1c2FkYSBwb3IgZWwgaGlzdG9yaWFsIGRlbCB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgZWwgdGlwbyBkZSBoaXN0b3JpYWwsIHBhcmEgbGEgYWNjacOzbiBkZSBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiwgbWlzbWEgcXVlIGVzIHVzYWRhIHBvciBlbCBoaXN0b3JpYWwgZGVsIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIGVsIHNpZ3VpZW50ZSBlc3RhZG8gZGUgdW4gdGlja2V0LCBsdWVnbyBkZSBhZ3JlZ2FyIHVuYSBub3RhIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgZWwgc2lndWllbnRlIGVzdGFkbyBkZSB1biB0aWNrZXQsIGx1ZWdvIGRlIGFncmVnYXIgdW5hIG5vdGEgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ0hhYmlsaXRhLCBlbiBlbCBtw7NkdWxvIGRlIGVzdGFkw61zdGljYXMsIGxhIGdlbmVyYWNpw7NuIGRlIGVzdGFkw61zdGljYXMgYWNlcmNhIGRlbCB0YXNhIHByb21lZGlvIGRlIHNvbHVjacOzbiBkZSBwcmltZXIgbml2ZWwgZGUgdGlja2V0cyBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJ0hhYmlsaXRhLCBlbiBlbCBtw7NkdWxvIGRlIGVzdGFkw61zdGljYXMsIGxhIGdlbmVyYWNpw7NuIGRlIGVzdGFkw61zdGljYXMgYWNlcmNhIGRlbCBwcm9tZWRpbyBkZSBzb2x1Y2nDs24gZGUgdGlja2V0cyBJVFNNLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTaSB1bmEgbm90YSBlcyBhZ3JlZ2FkYSBwb3IgdW4gYWdlbnRlLCBkZWZpbmUgZWwgZXN0YWRvIGRlIHVuIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NpIHVuYSBub3RhIGVzIGFncmVnYWRhIHBvciB1biBhZ2VudGUsIGRlZmluZSBlbCBlc3RhZG8gZGUgdW4gdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNpw7NuLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc29zIG5lY2VzYXJpb3MgcGFyYSB1c2FyIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNvcyBuZWNlc2FyaW9zIHBhcmEgdXNhciBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiwgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCBzZXJ2aWNpbyBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUgKFRpY2tldDo6U2VydmljZSB0aWVuZSBxdWUgZXN0YXIgaGFiaWxpdGFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCBzZXJ2aWNpbyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlIChUaWNrZXQ6OlNlcnZpY2UgdGllbmUgcXVlIGVzdGFyIGhhYmlsaXRhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCBwcm9waWV0YXJpbyBkZWwgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGRlZmluaXIgZWwgcHJvcGlldGFyaW8gZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiwgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGRlZmluaXIgZWwgcmVzcG9uc2FibGUgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWl0ZSBkZWZpbmlyIGVsIHJlc3BvbnNhYmxlIGRlbCB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24sIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnUGVybWl0ZSBkZWZpbmlyIGVsIHRpcG8gZGUgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZSAoVGlja2V0OjpUeXBlIHRpZW5lIHF1ZSBlc3RhciBoYWJpbGl0YWRvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgZGVmaW5pciBlbCB0aXBvIGRlIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlIChUaWNrZXQ6OlR5cGUgdGllbmUgcXVlIGVzdGFyIGhhYmlsaXRhZG8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdGEgdW4gdsOtbmN1bG8gZW4gZWwgbWVuw7ogcGFyYSBtb2RpZmljYXIgbGEgZGVjaXNpw7NuIGRlIHVuIHRpY2tldCwgZW4gZWwgZGV0YWxsZSBkZSBkaWNobyB0aWNrZXQsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTXVlc3RhIHVuIHbDrW5jdWxvIGVuIGVsIG1lbsO6IHBhcmEgbW9kaWZpY2FyIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzLCBlbiBlbCBkZXRhbGxlIGRlbCB0aWNrZXQgY29ycmVzcG9uZGllbnRlLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdGEgdW5hIGxpc3RhIGRlIHRvZG9zIGxvcyBhZ2VudGVzIGludm9sdWNyYWRvcyBlbiBlc3RlIHRpY2tldCwgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0YSB1bmEgbGlzdGEgZGUgdG9kb3MgbG9zIGFnZW50ZXMgaW52b2x1Y3JhZG9zIGVuIGVzdGUgdGlja2V0LCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgdW5hIGxpc3RhIGRlIHRvZG9zIGxvcyBhZ2VudGVzIHBvc2libGVzIChhcXVlbGxvcyBjb24gcGVybWlzb3MgcGFyYSBhZ3JlZ2FyIG5vdGFzIGVuIGxhIGZpbGEgbyB0aWNrZXQpLCBwYXJhIGRldGVybWluYXIgcXVpw6luL3F1acOpbmVzIGRlYmVuIHNlciBpbmZvcm1hZG9zIGFjZXJjYSBkZSDDqXN0YSBub3RhLCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdHJhIHVuYSBsaXN0YSBkZSB0b2RvcyBsb3MgYWdlbnRlcyBwb3NpYmxlcyAoYXF1ZWxsb3MgY29uIHBlcm1pc29zIHBhcmEgYWdyZWdhciBub3RhcyBlbiBsYSBmaWxhIG8gdGlja2V0KSwgcGFyYSBkZXRlcm1pbmFyIHF1acOpbi9xdWnDqW5lcyBkZWJlbiBzZXIgaW5mb3JtYWRvcyBhY2VyY2EgZGUgw6lzdGEgbm90YSwgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nDs24gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdHJhIGxhcyBvcGNpb25lcyBkZSBwcmlvcmlkYWQgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdHJhIGxhcyBvcGNpb25lcyBkZSBwcmlvcmlkYWQgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNdWVzdHJhIGxvcyBjYW1wb3MgZGVsIHTDrXR1bG8gZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ011ZXN0cmEgbG9zIGNhbXBvcyBkZWwgdMOtdHVsbyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzacOzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZhX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICfYp9mE2LXYp9mCINuM2qkg2KrYtdmF24zZhSDYqNmHINiv2LHYrtmI2KfYs9iqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICfYqtin2LHbjNiuINiq2LXZhduM2YUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAn2YbYqtuM2KzZhyDYqti12YXbjNmFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAn2KrYp9ix24zYriDYp9mG2KzYp9mFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYXNvbid9ID0gJ9iv2YTbjNmEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfYstmF2KfZhiDYtNix2YjYuSDYqNmH2KjZiNivJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAn2LLZhdin2YYg2LTYsdmI2Lkg2KrYudmF24zYsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICfZhtuM2KfYsiDYqNmHINio2KfYstio24zZhtuMINiv2KfYsdivJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfZhdmI2YLYqtinINio2LPYqtmHINi02K8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAn2KrYutuM24zYsSDYqti12YXbjNmFINiv2LHYrtmI2KfYs9iqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICfYqti624zbjNixINmB24zZhNiv2YfYp9uMIElUU00g2K/Ysdiu2YjYp9iz2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfYp9ix2KrYqNin2Lcg2K/Ysdiu2YjYp9iz2KonOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ9in2YfZhduM2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAn2KfYq9ixJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAn24zaqSDYqti12YXbjNmFINin2LbYp9mB2Ycg2qnZhtuM2K8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICfZgduM2YTYr9mH2KfbjCDYp9i22KfZgdmHIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAn2YHbjNmE2K/Zh9in24wgSVRTTSDYsdinINiq2LrbjNuM2LEg2K/Zh9uM2K8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAn2KrYtdmF24zZhSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdBam91dGVyIHVuZSBkw6ljaXNpb24gYXUgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdEYXRlIGRlIGTDqWNpc2lvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdSw6lzdWx0YXQgZGUgbGEgRMOpY2lzaW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRW5nYWdlbmVudCBkZSBkYXRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYXNvbid9ID0gJ1JhaXNvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnRGF0ZSBkZSBkw6lidXQgZGUgcmV0b3VyIMOgIGxhIG5vcm1hbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdEYXRlIGRlIGTDqWJ1dCBkZSByw6lwYXJhdGlvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdSZXZ1ZSByZXF1aXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdGZXJtw6kgYXZlYyBjb250b3VybmVtZW50JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnTW9kaWZpZXIgbGVzIGNoYW1wcyBJVFNNIGR1IHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnQ3JpdGljaXTDqSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdJbXBhY3QnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdBam91dGV6IHVuZSBkw6ljaXNpb24hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdDaGFtcHMgSVRTTSBhZGRpdGlvbmVscyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdNb2RpZmlleiBsZXMgY2hhbXBzIElUU00hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnRMOpY2lzaW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdBZ2dpdW5naSB1bmEgQXBwcm92YXppb25lIGFsIFRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0YSBkaSBBcHByb3ZhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAnUmlzdWx0YXRvIGRlbGxhIEFwcHJvdmF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFzb24nfSA9ICdNb3Rpdm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0RhdGEgaW5pemlhbGUgZGkgcmVjdXBlcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdEYXRhIGluaXppYWxlIGRpIHJpcGFyYXppb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JldmlldyBSZXF1aXJlZCd9ID0gJ1JpY2hpZXN0YSBSZXZpc2lvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ2NoaXVzbyBjb24gc29sdXppb25lIHRhbXBvbmUgKHdvcmthcm91bmQpJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnTW9kaWZpY2EgY2FtcGkgSVRTTSBkZWwgdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdVcmdlbnppYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdJbXBhdHRvJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnQWdnaXVuZ2kgdW5hIHJpc29sdXppb25lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnQ2FtcGkgSVRTTSBhZ2dpdW50aXZpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ0NhbWJpYSBpIGNhbXBpIElUU00hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAnQXBwcm92YXppb25lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9qYV9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmphX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICfjg4HjgrHjg4Pjg4jjgavmsbrmlq3jgpLov73liqDjgZnjgosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ+axuuWumuaXpeS7mCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICfmsbrlrprntZDmnpwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICflr77lv5zmnJ/pmZAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAn55CG55SxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICflm57lvqnplovlp4vmmYLplpMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICfkv67nkIbplovlp4vmmYLplpMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAn44Os44OT44Ol44O85b+F6aCIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfjg6/jg7zjgq/jgqLjg6njgqbjg7Pjg4njgaflrozkuoYnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAn44OB44Kx44OD44OI44Gu5aSJ5pu05rG65a6aJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICfjg4HjgrHjg4Pjg4jjga5JVFNN6aCF55uu44KS5aSJ5pu044GZ44KLJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICfjgrXjg7zjg5PjgrnjgqTjg7Pjgrfjg4fjg7Pjg4jnirbms4EnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAn44OB44Kx44OD44OI44KS44Oq44Oz44Kv44GZ44KLJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICfph43opoHluqYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAn5b2x6Z+/5bqmJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAn5rG65a6a44KS6L+95Yqg44GZ44KL77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICfov73liqDjga5JVFNN6aCF55uuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+OCqOODvOOCuOOCp+ODs+ODiOOCpOODs+OCv+ODvOODleOCp+OCpOOCueOBruOCouODh+OCo+OCt+ODp+ODiuODq0lUU03poIXnm67nlLvpnaLjgafov73liqDjga7jg47jg7zjg4jjgpLoqLHlj6/jgZnjgosnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjga7msbrlrpog55S76Z2i44Gn44CB44Oh44Oi44Gu6L+95Yqg44KS6Kix5Y+v44GX44G+44GZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnSVRTTemgheebruOCkuWkieabtOOBmeOCi++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ+axuuWumic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+aLheW9k+iAheOCpOODs+OCv+ODvOODleOCp+OCpOOCueOBp+OCteODvOODk+OCuemBuOaKnuaZguOBq+OCteODvOODk+OCueOCpOODs+OCt+ODh+ODs+ODiOeKtuazgeOCkuihqOekuuOBmeOCi+OBi+Wumue+qeOBmeOCi+OBmeOCiyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrnjga7ov73liqAgSVRTTeODleOCo+ODvOODq+ODieeUu+mdouOBp+ihqOekuuOBleOCjOOCi+WLleeahOmgmOWfn+OAgiDpgbjmip7lj6/og73jgaroqK3lrprlgKQ6IDAgPSDnhKHlirksIDEgPSDmnInlirksIDIgPSDmnInlirkg44GV44KJ44GrIOW/hemgiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg7zjg5XjgqfjgqTjgrnjga7msbrlrprnlLvpnaLjgafooajnpLrjgZXjgozjgovli5XnmoTpoJjln5/jgIIg6YG45oqe5Y+v6IO944Gq6Kit5a6a5YCkOiAwID0g54Sh5Yq5LCAxID0g5pyJ5Yq5LCAyID0g5pyJ5Yq5IOOBleOCieOBqyDlv4XpoIgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAn5ouF5b2T6ICF44Kk44Oz44K/44O844OV44Kn44Kk44K544Gu44OB44Kx44OD44OI5qSc57Si55S76Z2i44Gn6KGo56S644GV44KM44KL5YuV55qE6aCY5Z+f44CCIOmBuOaKnuWPr+iDveOBquioreWumuWApDogMCA9IOeEoeWKuSwgMSA9IOacieWKuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAn5ouF5b2T6ICF44Kk44Oz44K/44O844OV44Kn44Kk44K544Gu44OB44Kx44OD44OI44K644O844Og55S76Z2i44Gn6KGo56S644GV44KM44KL5YuV55qE6aCY5Z+f44CCIOmBuOaKnuWPr+iDveOBquioreWumuWApDogMCA9IOeEoeWKuSwgMSA9IOacieWKuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9tc19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om1zX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdLZXB1dHVzYW4gYmVyZ2FudHVuZyBhdGFzIHRpa2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdUYXJpa2ggS2VwdXR1c2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ0tlcHV0dXNhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ1RhcmlraCBkaXNlYmFia2FuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYXNvbid9ID0gJ0FsYXNhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnUGVtdWxpaGFuIE1hc2EgTXVsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ1BlcmJhaWtpIE1hc2EgTXVsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdrZXJqYSBzZW11bGEgZGlwZXJsdWthbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAnZGl0dXR1cCBkZW5nYW4ga2VyamEgZGkgc2VraXRhcic7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdVYmFoIEtlcHV0dXNhbiBUaWtldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnUGVydWJhaGFuIGJpZGFuZyBJVFNNIHRpa2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnUGF1dGFuIHRpa2V0JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdLcml0aWthbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdLZXNhbic7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ1RhbWJhaCBrZXB1dHVzYW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdUYW1iYWhhbiBJVFNNIE1lZGFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ8OEbmRlcm4gZGVyIElUU00tRmVsZGVyISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0VudHNjaGVpZHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHpvb20gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9uYl9OT19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5iX05PX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdMZWdnIHRpbCBiZXNsdXRuaW5nIGZvciBzYWsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ0Jlc2x1dG5pbmdzZGF0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdCZXNsdXRuaW5nc3Jlc3VsdGF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRm9yZmFsbHNkYXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYXNvbid9ID0gJ0JlZ3J1bm5lbHNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICdTdGFydHRpZCBmb3IgZ2plbm9wcHJldHRpbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICdTdGFydHRpZCBmb3IgcmVwYXJhc2pvbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdFdmFsdWVyaW5nIGtyZXZlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAnTHVra2V0IG1lZCBtaWRsZXJ0aWRpZyBsw7hzbmluZyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdFbmRyZSBzYWtlbnMgYmVzbHV0bmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnRW5kcmUgc2FrZW5zIElUU00tZmVsdGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICcnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0RW1haWwKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpbmsgdGlja2V0J30gPSAnS29ibGUgc2FrJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdLcml0aWthbGl0ZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnT21mYW5nJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnTGVnZyB0aWwgZW4gYmVzbHV0bmluZyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0Vrc3RyYSBJVFNNLWZlbHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnVGlsbGF0ZXIgw6UgbGVnZ2UgdGlsIG5vdGlzZXIgaSBkZSBla3N0cmEgSVRTTS1mZWx0ZW5lIGkgc2Frc2JlaGFuZGxlcmRlbGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnRW5kcmUgSVRTTS1mZWx0ZW5lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0Jlc2x1dG5pbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5sX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdLb3BwZWwgYmVzbGlzc2luZyBhYW4gdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdCZXNsaXNzaW5nc2RhdHVtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1Jlc3VsdGFhdCBiZXNsaXNzaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnVmVydmFsZGF0dW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAnUmVkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0JlZ2ludGlqZCBoZXJzdGVsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnQmVnaW50aWpkIHJlcGFyYXRpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICdSZXZpZXcgYmVub2RpZ2QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ2dlc2xvdGVuIG1ldCB3b3JrYXJvdW5kJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnVmVyYW5kZXJlbiB2YW4gSVRTTSB2ZWxkZW4gdmFuIHRpY2tldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnVXJnZW50aWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnSW1wYWN0JzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIGEgZGVjaXNpb24hJ30gPSAnQmVzbGlzc2luZyB0b2V2b2VnZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdFeHRyYSBJVFNNIHZlbGRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdWZXJhbmRlcmVuIHZhbiBJVFNNIHZlbGRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdCZXNsaXNzaW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnBsX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdEb2RhaiBkZWN5emrEmSBkbyB6Z8WCb3N6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0YSBkZWN5emppJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1JlenVsdGF0IGRlY3l6amknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICdDemFzIHpha2/FhGN6ZW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFzb24nfSA9ICdQb3fDs2QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0N6YXMgcm96cG9jesSZY2lhIG9kenlza2l3YW5pYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ0N6YXMgcm96cG9jesSZY2lhIG5hcHJhd3knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnV3ltYWdhbnkgcHJ6ZWdsxIVkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdyb3p3acSFemFuZSB6IG9iZWrFm2NpZW0nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAnWm1pZcWEIGRlY3l6asSZIHcgemfFgm9zemVuaXUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ1ptaWXFhCBwb2xhIElUU00gemfFgm9zemVuaWEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdQb8WCxIVjeiB6Z8WCb3N6ZW5pZSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnS3J5dHljem5vxZvEhyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICdXcMWCeXcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdEb2RhaiBkZWN5emrEmSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ID0gJ0RvZGF0a293ZSBwb2xhIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUG96d2FsYSBuYSBkb2Rhd2FuaWUgbm90YXRlayBuYSBla3JhbmllIHogZG9kYXRrb3d5bWkgcG9sYW1pIElUU00gdyBwYW5lbHUgYWdlbnRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1BvendhbGEgbmEgZG9kYXdhbmllIG5vdGF0ZWsgbmEgZWtyYW5pZSBkZWN5emppIHcgcGFuZWx1IGFnZW50YS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSA9ICdabWllxYQgcG9sYSBJVFNNISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbid9ID0gJ0RlY3l6amEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiB0aGUgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBzaG91bGQgYmUgc2hvd24gZHVyaW5nIHNlcnZpY2Ugc2VsZWN0aW9uIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCB6b29tIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdBZGljaW9uYXIgZGVjaXPDo28gYW8gY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnRGF0YSBkZSBEZWNpc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdEZWNpc8OjbyBSZXN1bHRhbnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAnRGF0YSBkZSB2ZW5jaW1lbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlYXNvbid9ID0gJ1JhesOjbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gPSAnSG9yw6FyaW8gSW5pY2lhbCBkZSBSZWN1cGVyYcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnSG9yw6FyaW8gSW5pY2lhbCBkZSBSZXBhcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnUmV2aXPDo28gUmVxdWlzaXRhZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ2ZlY2hhZG8gY29tIHNvbHXDp8OjbyBkZSBjb250b3Jubyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICdBbHRlcmFyIERlY2lzw6NvIGRlIENoYW1hZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ0FsdGVyYXIgb3MgY2FtcG9zIElUU00gZG8gY2hhbWFkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXJ2aWNlIEluY2lkZW50IFN0YXRlJ30gPSAnRXN0YWRvIGRlIEluY2lkZW50ZSBkbyBTZXJ2acOnbyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICdBc3NvY2lhciBjaGFtYWRvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JpdGljYWxpdHknfSA9ICdDcml0aWNhbGlkYWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ0ltcGFjdG8nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdBZGljaW9uYXIgdW1hIGRlY2lzw6NvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnQ2FtcG9zIGFkaWNpb25haXMgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFkaWNpb25hciBub3RhcyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFkaWNpb25hciBub3RhcyBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnQWx0ZXJhciBjYW1wb3MgSVRTTSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdEZWNpc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5lIHNlIHVtIGJsb3F1ZWlvIGRlIGNoYW1hZG8gw6kgZXhpZ2lkbyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZSAoc2UgbyBjaGFtYWRvIG7Do28gZXN0aXZlciBibG9xdWVhZG8gYWluZGEsIG8gY2hhbWFkbyBzZXLDoSBibG9xdWVhZG9lIG8gYXRlbmRlbnRlIGF0dWFsIHNlcsOhIGF1dG9tYXRpY2FtZW50ZSBkZWZpbmlkbyBjb21vIHNldSBwcm9wcmlldMOhcmlvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5lIHNlIHVtIGJsb3F1ZWlvIGRlIGNoYW1hZG8gw6kgZXhpZ2lkbyBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUgKHNlIG8gY2hhbWFkbyBuw6NvIGVzdGl2ZXIgYmxvcXVlYWRvIGFpbmRhLCBvIGNoYW1hZG8gc2Vyw6EgYmxvcXVlYWRvZSBvIGF0ZW5kZW50ZSBhdHVhbCBzZXLDoSBhdXRvbWF0aWNhbWVudGUgZGVmaW5pZG8gY29tbyBzZXUgcHJvcHJpZXTDoXJpbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIHNlIG8gZXN0YWRvIGRlIGluY2lkZW50ZSBkbyBzZXJ2acOnbyBkZXZlIHNlciBtb3N0cmFkbyBkdXJhbnRlIGEgc2VsZcOnw6NvIGRlIHNlcnZpw6dvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGNvcnBvIHBhZHLDo28gZGUgdW1hIG5vdGEgbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gY29ycG8gcGFkcsOjbyBkZSB1bWEgbm90YSBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHLDs3hpbW8gZXN0YWRvIHBhZHLDo28gZGUgdW0gY2hhbWFkbyBhcMOzcyBhIGFkacOnw6NvIGRlIHVtYSBub3RhLCBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBwYWRyw6NvIGRlIHVtIGNoYW1hZG8gYXDDs3MgYSBhZGnDp8OjbyBkZSB1bWEgbm90YSwgbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBhc3N1bnRvIHBhZHLDo28gZGUgdW1hIG5vdGEgbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gYXNzdW50byBwYWRyw6NvIGRlIHVtYSBub3RhIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhIHByaW9yaWRhZGUgcGFkcsOjbyBkZSBjaGFtYWRvIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgYSBwcmlvcmlkYWRlIHBhZHLDo28gZGUgY2hhbWFkbyBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBwYWRyw6NvIGRlIHVtYSBub3RhIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBwYWRyw6NvIGRlIHVtYSBub3RhIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyBjb21lbnTDoXJpbyBkZSBoaXN0w7NyaWNvIHBhcmEgYSBhw6fDo28gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSwgcXVlIMOpIHVzYWRvIG5vIGhpc3TDs3JpY28gZG8gY2hhbWFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGNvbWVudMOhcmlvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBkZWNpc8OjbywgcXVlIMOpIHVzYWRvIG5vIGhpc3TDs3JpY28gZG8gY2hhbWFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNLCBxdWUgw6kgdXNhZG8gbm8gaGlzdMOzcmljbyBkbyBjaGFtYWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBkZSBoaXN0w7NyaWNvIHBhcmEgYSBhw6fDo28gZGUgZGVjaXPDo28sIHF1ZSDDqSB1c2FkbyBubyBoaXN0w7NyaWNvIGRvIGNoYW1hZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBkZSB1bSBjaGFtYWRvIGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBkZSB1bSBjaGFtYWRvIGFww7NzIGEgYWRpw6fDo28gZGUgdW1hIG5vdGEsIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7Dom1pY29zIG1vc3RyYWRvcyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4gQ29uZmlndXJhw6fDtWVzIHBvc3PDrXZlaXM6IDAgPSBEZXNhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLCAyID0gSGFiaWxpdGFkbyBlIHJlcXVlcmlkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOibWljb3MgbW9zdHJhZG9zIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4gQ29uZmlndXJhw6fDtWVzIHBvc3PDrXZlaXM6IDAgPSBEZXNhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLCAyID0gSGFiaWxpdGFkbyBlIHJlcXVlcmlkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOibWljb3MgbW9zdHJhZG9zIG5hIHRlbGEgZGUgcGVzcXVpc2EgZGUgY2hhbWFkbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLiBDb25maWd1cmHDp8O1ZXMgcG9zc8OtdmVpczogMCA9IERlc2FiaWxpdGFkbywgMSA9IEhhYmlsaXRhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdDYW1wb3MgZGluw6JtaWNvcyBtb3N0cmFkb3MgbmEgdGVsYSBkZSBkZXRhbGhlcyBkbyBjaGFtYWRvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuIENvbmZpZ3VyYcOnw7VlcyBwb3Nzw612ZWlzOiAwID0gRGVzYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgcXVlIG8gbcOzZHVsbyBkZSBlc3RhdMOtc3RpY2FzIGdlcmUgZXN0YXTDrXN0aWNhcyBzb2JyZSBvIG7DrXZlbCBtw6lkaW8gZGUgY2hhbWFkb3MgSVRTTSBubyBwcmltZWlybyBuw612ZWwgZGUgc29sdcOnw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJ1Blcm1pdGUgcXVlIG8gbcOzZHVsbyBkZSBlc3RhdMOtc3RpY2FzIGdlcmUgZXN0YXTDrXN0aWNhcyBzb2JyZSBvIG7DrXZlbCBtw6lkaW8gZGUgY2hhbWFkb3MgSVRTTSBubyBwcmltZWlybyBuw612ZWwgZGUgc29sdcOnw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZSB1bWEgbm90YSDDqSBhZGljaW9uYWRhIHBvciB1bSBhdGVuZGVudGUsIGRlZmluZSBvIGVzdGFkbyBkZSB1bSBjaGFtYWRvIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1NlIHVtYSBub3RhIMOpIGFkaWNpb25hZGEgcG9yIHVtIGF0ZW5kZW50ZSwgZGVmaW5lIG8gZXN0YWRvIGRlIHVtIGNoYW1hZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGQgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc3PDtWVzIG5lY2Vzc8OhcmlhcyBwYXJhIHVzYXIgYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gbmEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pc3PDtWVzIG5lY2Vzc8OhcmlhcyBwYXJhIHVzYXIgYSB0ZWxhIGRlIGRlY2lzw6NvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyBzZXJ2acOnbyBhZGljaW9uYWwgbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRlIGludGVyZmFjZSBkbyBhdGVuZGVudGUgKENoYW1hZG86OlNlcnZpw6dvIHByZWNpc2EgZXN0YXIgYXRpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHNlcnZpw6dvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZSAoQ2hhbWFkbzo6U2VydmnDp28gcHJlY2lzYSBlc3RhciBhdGl2YWRvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcm9wcmlldMOhcmlvIGRvIGNoYW1hZG8gbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcm9wcmlldMOhcmlvIGRvIGNoYW1hZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHJlc3BvbnPDoXZlbCBwZWxvIGNoYW1hZG8gZGUgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyByZXNwb25zw6F2ZWwgcGVsbyBjaGFtYWRvIG5hIHRlbGEgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGNoYW1hZG8gbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuIChDaGFtYWRvOjpUaXBvIHByZWNpc2EgZXN0YXIgYXRpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyB0aXBvIGRlIGNoYW1hZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlIChDaGFtYWRvOjpUaXBvIHByZWNpc2EgZXN0YXIgYXRpdmFkbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bSBsaW5rIG5vIG1lbnUgcGFyYSBhbHRlcmFyIGEgZGVjaXPDo28gZGUgdW0gY2hhbWFkbyBuYSBzdWEgdmlzw6NvIGVtIGRldGFsaGVzIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtIGxpbmsgbm8gbWVudSBwYXJhIG1vZGlmaWNhciBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIG5hIHZpc8OjbyBlbSBkZXRhbGhlcyBkZSB1bSBjaGFtYWRvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bWEgbGlzdGEgZGUgdG9kb3Mgb3MgYXRlbmRlbnRlcyBlbnZvbHZpZG9zIG5lc3RlIGNoYW1hZG8sIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bWEgbGlzdGEgZGUgdG9kb3Mgb3MgYXRlbmRlbnRlcyBlbnZvbHZpZG9zIG5lc3RlIGNoYW1hZG8sIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW1hIGxpc3RhIGRlIHRvZG9zIG9zIGF0ZW5kZW50ZXMgcG9zc8OtdmVpcyAodG9kb3Mgb3MgYXRlbmRlbnRlcyBjb20gcGVybWlzc8O1ZXMgZGUgbm90YSBuYSBmaWxhL2NoYW1hZG8pIHBhcmEgZGV0ZXJtaW5hciBxdWVtIGRldmUgc2VyIGluZm9ybWFkbyBzb2JyZSBlc3RhIG5vdGEsIG5hIHRlbGEgZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtYSBsaXN0YSBkZSB0b2RvcyBvcyBhdGVuZGVudGVzIHBvc3PDrXZlaXMgKHRvZG9zIG9zIGF0ZW5kZW50ZXMgY29tIHBlcm1pc3PDtWVzIG5vdGEgbmEgZmlsYS9jaGFtYWRvKSBwYXJhIGRldGVybWluYXIgcXVlbSBkZXZlIHNlciBpbmZvcm1hZG8gc29icmUgZXN0YSBub3RhLCBuYSB0ZWxhIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIGFzIG9ww6fDtWVzIGRlIHByaW9yaWRhZGUgZGUgY2hhbWFkbyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBhcyBvcMOnw7VlcyBkZSBwcmlvcmlkYWRlIGRlIGNoYW1hZG8gbmEgdGVsYSBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgb3MgY2FtcG9zIGRlIHTDrXR1bG8gbmEgdGVsYSBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIG9zIGNhbXBvcyBkZSB0w610dWxvIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4nOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdBZGljaW9uYXIgZGVjaXPDo28gYW8gdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIERhdGUnfSA9ICdEYXRhIGRhIERlY2lzw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uIFJlc3VsdCd9ID0gJ1Jlc3VsdGFkbyBkYSBkZWNpc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ0RhdGEgdmVuY2ltZW50byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFzb24nfSA9ICdNb3Rpdm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ0hvcsOhcmlvIEluaWNpYWwgZGEgUmVjdXBlcmHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXBhaXIgU3RhcnQgVGltZSd9ID0gJ0hvcsOhcmlvIEluaWNpYWwgZGUgUmVwYXJhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnQXZhbGlhw6fDo28gbmVjZXNzw6FyaWEgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICdmZWNoYWRvIGNvbSBzb2x1w6fDo28gZGUgY29udG9ybm8nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAnQWx0ZXJhciBkZWNpc8OjbyBkbyB0aWNrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ0FsdGVyYXIgb3MgY2FtcG9zIElUU00gZG8gdGlja2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlcnZpY2UgSW5jaWRlbnQgU3RhdGUnfSA9ICdFc3RhZG8gZGUgSW5jaWRlbnRlIGRvIFNlcnZpw6dvJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ0Fzc29jaWFyIHRpY2tldCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyaXRpY2FsaXR5J30gPSAnQ3JpdGljaWRhZGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAnSW1wYWN0byc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBhIGRlY2lzaW9uISd9ID0gJ0FkaWNpb25hciB1bWEgZGVjaXPDo28hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdDYW1wb3MgSVRTTSBhZGljaW9uYWlzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgYWRpY2lvbmFyIG5vdGFzIGFvIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXRlIGFkaWNpb25hciBub3RhcyBhbyBmb3JtdWzDoXJpb2RlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gPSAnQWx0ZXJhciBjYW1wb3MgSVRTTSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdEZWNpc8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5lIHNlIG8gYmxvcXVlaW8gZG8gdGlja2V0IMOpIG9icmlnYXTDs3JpbyBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUgKHNlIG8gdGlja2V0IG7Do28gZXN0aXZlciBibG9xdWVhZG8sIHNlcsOhIGJsb3F1ZWFkbyBlIG8gYWdlbnRlIGF0dWFsIHNlcsOhIGF1dG9tYXRpY2FtZW50ZSBkZWZpbmlkbyBjb21vIHNldSBwcm9wcmlldMOhcmlvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnRGVmaW5lIHNlIG8gYmxvcXVlaW8gZG8gdGlja2V0IMOpIG9icmlnYXTDs3JpbyBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlIChzZSBvIHRpY2tldCBuw6NvIGVzdGl2ZXIgYmxvcXVlYWRvLCBzZXLDoSBibG9xdWVhZG8gZSBvIGFnZW50ZSBhdHVhbCBzZXLDoSBhdXRvbWF0aWNhbWVudGUgZGVmaW5pZG8gY29tbyBzZXUgcHJvcHJpZXTDoXJpbykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIHNlIG8gZXN0YWRvIGRlIGluY2lkZW50ZSBkbyBzZXJ2acOnbyBkZXZlIHNlciBtb3N0cmFkbyBkdXJhbnRlIGEgc2VsZcOnw6NvIGRlIHNlcnZpw6dvIG5hIGludGVyZmFjZSBkZSBhdGVuZGVudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRleHRvIHBvciBvbWlzc8OjbyBkZSB1bWEgbm90YSBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGV4dG8gcG9yIG9taXNzw6NvIGRlIHVtYSBub3RhIG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHLDs3hpbW8gZXN0YWRvIHBvciBvbWlzc8OjbyBkZSB1bSB0aWNrZXQgYXDDs3MgYSBhZGnDp8OjbyBkZSB1bWEgbm90YSwgbm8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBwcsOzeGltbyBlc3RhZG8gcG9yIG9taXNzw6NvIGRlIHVtIHRpY2tldCBhcMOzcyBhIGFkacOnw6NvIGRlIHVtYSBub3RhLCBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdEZWZpbmUgbyBhc3N1bnRvIHBvciBvbWlzc8OjbyBkZSB1bWEgbm90YSBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gYXNzdW50byBwb3Igb21pc3PDo28gZGUgdW1hIG5vdGEgbm8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhIFByaW9yaWRhZGUgcG9yIG9taXNzw6NvIGRlIHRpY2tldCBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBhIFByaW9yaWRhZGUgcG9yIG9taXNzw6NvIGRlIHRpY2tldCBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gcG9yIG9taXNzw6NvIGRlIHVtYSBub3RhIG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gcG9yIG9taXNzw6NvIGRlIHVtYSBub3RhIG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRhIGludGVyZmFjZSBkZSBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnRGVmaW5lIG8gY29tZW50w6FyaW8gZGUgaGlzdMOzcmljbyBwYXJhIGEgYcOnw6NvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00sIHV0aWxpemFkbyBubyBoaXN0w7NyaWNvIGRvIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIGNvbWVudMOhcmlvIGRlIGhpc3TDs3JpY28gcGFyYSBhIGHDp8OjbyBkZSBkZWNpc8OjbywgdXRpbGl6YWRvIG5vIGhpc3TDs3JpY28gZG8gdGlja2V0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gZGUgaGlzdMOzcmljbyBwYXJhIGEgYcOnw6NvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00sIHV0aWxpemFkbyBubyBoaXN0w7NyaWNvIGRvIHRpY2tldC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gZGUgaGlzdMOzcmljbyBwYXJhIGEgYcOnw6NvIGRlIGRlY2lzw6NvLCB1dGlsaXphZG8gbm8gaGlzdMOzcmljbyBkbyB0aWNrZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBkZSB1bSB0aWNrZXQgYXDDs3MgYSBhZGnDp8OjbyBkZSB1bWEgbm90YSwgbm8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkYSBpbnRlcmZhY2UgZGUgYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByw7N4aW1vIGVzdGFkbyBkZSB1bSB0aWNrZXQgYXDDs3MgYSBhZGnDp8OjbyBkZSB1bWEgbm90YSwgbm8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ0NhbXBvcyBkaW7Dom1pY29zIG1vc3RyYWRvcyBuYSB0ZWxhIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4gQ29uZmlndXJhw6fDtWVzIHBvc3PDrXZlaXM6IDAgPSBEZXNhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLCAyID0gSGFiaWxpdGFkbyBlIHJlcXVlcmlkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOibWljb3MgbW9zdHJhZG9zIG5hIHRlbGEgZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGF0ZW5kZW50ZS4gQ29uZmlndXJhw6fDtWVzIHBvc3PDrXZlaXM6IDAgPSBEZXNhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLCAyID0gSGFiaWxpdGFkbyBlIHJlcXVlcmlkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnQ2FtcG9zIGRpbsOibWljb3MgbW9zdHJhZG9zIG5hIHRlbGEgZGUgcGVzcXVpc2EgZGUgY2hhbWFkbyBkYSBpbnRlcmZhY2UgZGUgYXRlbmRlbnRlLiBDb25maWd1cmHDp8O1ZXMgcG9zc8OtdmVpczogMCA9IERlc2FiaWxpdGFkbywgMSA9IEhhYmlsaXRhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdDYW1wb3MgZGluw6JtaWNvcyBtb3N0cmFkb3MgbmEgdGVsYSBkZSBkZXRhbGhlcyBkbyBjaGFtYWRvIGRhIGludGVyZmFjZSBkZSBhdGVuZGVudGUuIENvbmZpZ3VyYcOnw7VlcyBwb3Nzw612ZWlzOiAwID0gRGVzYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ1Blcm1pdGUgcXVlIG8gbcOzZHVsbyBkZSBlc3RhdMOtc3RpY2FzIGdlcmUgZXN0YXTDrXN0aWNhcyBzb2JyZSBvIG7DrXZlbCBtw6lkaW8gZGUgdGlja2V0cyBJVFNNIG5vIHByaW1laXJvIG7DrXZlbCBkZSBzb2x1w6fDo28uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0KICAgICAgICAnUGVybWl0ZSBxdWUgbyBtw7NkdWxvIGRlIGVzdGF0w61zdGljYXMgZ2VyZSBlc3RhdMOtc3RpY2FzIHNvYnJlIG8gbsOtdmVsIG3DqWRpbyBkZSB0aWNrZXRzIElUU00gbm8gcHJpbWVpcm8gbsOtdmVsIGRlIHNvbHXDp8Ojby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnU2UgdW1hIG5vdGEgw6kgYWRpY2lvbmFkYSBwb3IgdW0gYWdlbnRlLCBkZWZpbmUgbyBlc3RhZG8gZG8gdGlja2V0IG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdTZSB1bWEgbm90YSDDqSBhZGljaW9uYWRhIHBvciB1bSBhZ2VudGUsIGRlZmluZSBvIGVzdGFkbyBkbyB0aWNrZXQgbm8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZGEgaW50ZXJmYWNlIGRlIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdQZXJtaXNzw7VlcyBuZWNlc3PDoXJpYXMgcGFyYSB1dGlsaXphciBvIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnUGVybWlzc8O1ZXMgbmVjZXNzw6FyaWFzIHBhcmEgdXRpbGl6YXIgbyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdEZWZpbmUgbyBzZXJ2acOnbyBhZGljaW9uYWwgYW8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkZSBpbnRlcmZhY2UgZG8gYWdlbnRlICh0aWNrZXQ6OlNlcnZpw6dvIG5lY2Vzc2l0YSBkZSBlc3RhciBhdGl2bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHNlcnZpw6dvIGRvIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZSAodGlja2V0OjpTZXJ2acOnbyBuZWNlc3NpdGEgZGUgZXN0YXIgYXRpdm8pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHByb3ByaWV0w6FyaW8gZG8gdGlja2V0IGRvIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnRGVmaW5lIG8gcHJvcHJpZXTDoXJpbyBkbyB0aWNrZXQgZG8gZm9ybXVsw6FyaW8gZGUgZGVjaXPDo28gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHJlc3BvbnPDoXZlbCBwZWxvIHRpY2tldCBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGQwIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHJlc3BvbnPDoXZlbCBwZWxvIHRpY2tldCBkbyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnRGVmaW5lIG8gdGlwbyBkZSB0aWNrZXQgZG8gZm9ybXVsw6FyaW8gZGUgY2FtcG9zIGFkaWNpb25haXMgSVRTTSBkbyBhZ2VudGUuICh0aWNrZXQ6OlRpcG8gbmVjZXNzaXRhIGRlIGVzdGFyIGF0aXZvKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0RlZmluZSBvIHRpcG8gZGUgdGlja2V0IGRvIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZSAodGlja2V0OjpUaXBvIG5lY2Vzc2l0YSBkZSBlc3RhciBhdGl2bykuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSB1bSBsaW5rIG5vIG1lbnUgcGFyYSBhbHRlcmFyIGEgZGVjaXPDo28gZGUgdW0gdGlja2V0IG5hIHZpc3RhIGRlIGRldGFsaGVzIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW0gbGluayBubyBtZW51IHBhcmEgbW9kaWZpY2FyIGNhbXBvcyBhZGljaW9uYWlzIElUU00gbmEgdmlzdGEgZGUgZGV0YWxoZXMgZG8gdGlja2V0IGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtYSBsaXN0YSBkZSB0b2RvcyBvcyBhZ2VudGVzIGVudm9sdmlkb3MgbmVzdGUgdGlja2V0LCBubyBmb3JtdWzDoXJpbyBkZSBjYW1wb3MgYWRpY2lvbmFpcyBJVFNNIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW1hIGxpc3RhIGRlIHRvZG9zIG9zIGFnZW50ZXMgZW52b2x2aWRvcyBuZXN0ZSB0aWNrZXQsIG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdNb3N0cmEgdW1hIGxpc3RhIGRvcyBhZ2VudGVzIHBvc3PDrXZlaXMgKHRvZG9zIG9zIGFnZW50ZXMgY29tIHBlcm1pc3PDtWVzIGRlIG5vdGEgbmEgZmlsYS90aWNrZXQpIHBhcmEgZGV0ZXJtaW5hciBxdWVtIGRldmUgc2VyIGluZm9ybWFkbyBzb2JyZSBlc3RhIG5vdGEsIG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIHVtYSBsaXN0YSBkb3MgYWdlbnRlcyBwb3Nzw612ZWlzICh0b2RvcyBvcyBhZ2VudGVzIGNvbSBwZXJtaXNzw7VlcyBub3RhIG5hIGZpbGEvdGlja2V0KSBwYXJhIGRldGVybWluYXIgcXVlbSBkZXZlIHNlciBpbmZvcm1hZG8gc29icmUgZXN0YSBub3RhLCBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIGFzIG9ww6fDtWVzIGRlIFByaW9yaWRhZGUgZG8gdGlja2V0IG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIGFzIG9ww6fDtWVzIGRlIFByaW9yaWRhZGUgZGUgdGlja2V0IG5vIGZvcm11bMOhcmlvIGRlIGRlY2lzw6NvIGRvIGFnZW50ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTW9zdHJhIG9zIGNhbXBvcyBkZSB0w610dWxvIG5vIGZvcm11bMOhcmlvIGRlIGNhbXBvcyBhZGljaW9uYWlzIElUU00gZG8gYWdlbnRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ01vc3RyYSBvcyBjYW1wb3MgZGUgdMOtdHVsbyBubyBmb3JtdWzDoXJpbyBkZSBkZWNpc8OjbyBkbyBhZ2VudGUuJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnJ1X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICfQktGL0L3QtdGB0YLQuCDRgNC10YjQtdC90LjQtSDQv9C+INC30LDRj9Cy0LrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAn0JTQsNGC0LAg0YDQtdGI0LXQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gUmVzdWx0J30gPSAn0KDQtdC30YPQu9GM0YLQsNGCINGA0LXRiNC10L3QuNGPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1ZSBEYXRlJ30gPSAn0JTQsNGC0LAg0LjRgdC/0L7Qu9C90LXQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAn0J/RgNC40YfQuNC90LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ9CU0LDRgtCwINCy0L7RgdGB0YLQsNC90L7QstC70LXQvdC40Y8g0YHQtdGA0LLQuNGB0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICfQlNCw0YLQsCDQvdCw0YfQsNC70LAg0YDQsNCx0L7Rgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXZpZXcgUmVxdWlyZWQnfSA9ICfQndC10L7QsdGF0L7QtNC40Lwg0L/RgNC+0YHQvNC+0YLRgCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gPSAn0LfQsNC60YDRi9GC0L4g0YEg0L7QsdGF0L7QtNC90YvQvCDRgNC10YjQtdC90LjQtdC8JzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEFjdGlvbkNvbW1vbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCd9ID0gJ9CY0LfQvNC10L3QuNGC0Ywg0YDQtdGI0LXQvdC40LUg0L/QviDQt9Cw0Y/QstC60LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ9CY0LfQvNC10L3QuNGC0YwgSVRTTSDQv9C+0LvRjyDQt9Cw0Y/QstC60LgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ9Ch0L7RgdGC0L7Rj9C90LjQtSDQodC10YDQstC40YHQsCc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfQodCy0Y/Qt9Cw0YLRjCDQt9Cw0Y/QstC60YMnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ9Ca0YDQuNGC0LjRh9C90L7RgdGC0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wYWN0J30gPSAn0KHRgtC10L/QtdC90Ywg0LLQu9C40Y/QvdC40Y8nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfQlNC+0LHQsNCy0LjRgtGMINGA0LXRiNC10L3QuNC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICfQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0KDQsNC30YDQtdGI0LDQtdGCINC00L7QsdCw0LLQuNGC0Ywg0LfQsNC80LXRgtC60YMg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cg0LDQt9GA0LXRiNCw0LXRgiDQtNC+0LHQsNCy0LjRgtGMINC30LDQvNC10YLQutGDINC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+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+0YDQuNGC0LXRgiDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHRgtCw0L3QtNCw0YDRgtC90YvQuSDRgtC40L8g0LfQsNC80LXRgtC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGB0YLQsNC90LTQsNGA0YLQvdGL0Lkg0YLQuNC/INC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDQutC+0LzQvNC10L3RgtCw0YDQuNC5INCyINC40YHRgtC+0YDQuNC4INC00LvRjyDQtNC10LnRgdGC0LLQuNC5INC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDQutC+0LzQvNC10L3RgtCw0YDQuNC5INCyINC40YHRgtC+0YDQuNC4INC00LvRjyDQtNC10LnRgdGC0LLQuNC5INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgtC40L8g0LrQvtC80LzQtdC90YLQsNGA0LjRjyDQsiDQuNGB0YLQvtGA0LjQuCDQtNC70Y8g0LTQtdC50YHRgtCy0LjQuSDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YLQuNC/INC60L7QvNC80LXQvdGC0LDRgNC40Y8g0LIg0LjRgdGC0L7RgNC40Lgg0LTQu9GPINC00LXQudGB0YLQstC40Lkg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgdC70LXQtNGD0Y7RidC10LUg0YHQvtGB0YLQvtGP0L3QuNC1INC30LDRj9Cy0LrQuCDQv9C+0YHQu9C1INC00L7QsdCw0LLQu9C10L3QuNGPINC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQl9Cw0LTQsNC10YIg0YHQu9C10LTRg9GO0YnQtdC1INGB0L7RgdGC0L7Rj9C90LjQtSDQt9Cw0Y/QstC60Lgg0L/QvtGB0LvQtSDQtNC+0LHQsNCy0LvQtdC90LjRjyDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ9Ch0L/QuNGB0L7QuiDQlNC40L3QsNC80LjRh9C10YHQutC40YUg0L/QvtC70LXQuSwg0L/QvtC60LDQt9GL0LLQsNC10LzRi9GFINC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuINCS0L7Qt9C80L7QttC90YvQtSDQt9C90LDRh9C10L3QuNGPOiAwIC0g0L3QtSDQv9C+0LrQsNC30YvQstCw0YLRjCwgMSAtINC/0L7QutCw0LfRi9Cy0LDRgtGMLCAyIC0g0L/QvtC60LDQt9GL0LLQsNGC0YwsINC30L3QsNGH0LXQvdC40LUg0L7QsdGP0LfQsNGC0LXQu9GM0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICfQodC/0LjRgdC+0Log0JTQuNC90LDQvNC40YfQtdGB0LrQuNGFINC/0L7Qu9C10LksINC/0L7QutCw0LfRi9Cy0LDQtdC80YvRhSDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuINCS0L7Qt9C80L7QttC90YvQtSDQt9C90LDRh9C10L3QuNGPOiAwIC0g0L3QtSDQv9C+0LrQsNC30YvQstCw0YLRjCwgMSAtINC/0L7QutCw0LfRi9Cy0LDRgtGMLCAyIC0g0L/QvtC60LDQt9GL0LLQsNGC0YwsINC30L3QsNGH0LXQvdC40LUg0L7QsdGP0LfQsNGC0LXQu9GM0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICfQodC/0LjRgdC+0Log0JTQuNC90LDQvNC40YfQtdGB0LrQuNGFINC/0L7Qu9C10LksINC/0L7QutCw0LfRi9Cy0LDQtdC80YvRhSDQvdCwINGN0LrRgNCw0L3QtSDQv9C+0LjRgdC60LAg0LfQsNCy0L7QuiDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuINCS0L7Qt9C80L7QttC90YvQtSDQt9C90LDRh9C10L3QuNGPOiAwIC0g0L3QtSDQv9C+0LrQsNC30YvQstCw0YLRjCwgMSAtINC/0L7QutCw0LfRi9Cy0LDRgtGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICfQodC/0LjRgdC+0Log0JTQuNC90LDQvNC40YfQtdGB0LrQuNGFINC/0L7Qu9C10LksINC/0L7QutCw0LfRi9Cy0LDQtdC80YvRhSDQvdCwINGN0LrRgNCw0L3QtSDQv9C+0LTRgNC+0LHQvdC+0LPQviDQv9GA0L7RgdC80L7RgtGA0LAg0LfQsNGP0LLQutC4INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4g0JLQvtC30LzQvtC20L3Ri9C1INC30L3QsNGH0LXQvdC40Y86IDAgLSDQvdC1INC/0L7QutCw0LfRi9Cy0LDRgtGMLCAxIC0g0L/QvtC60LDQt9GL0LLQsNGC0YwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJ9CS0LrQu9GO0YfQsNC10YIg0LzQvtC00YPQu9GMINC+0YLRh9C10YLQvtCyINC00LvRjyDRhNC+0YDQvNC40YDQvtCy0LDQvdC40Y8g0L7RgtGH0LXRgtC+0LIg0L4g0YHRgNC10LTQvdC10LwgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICfQktC60LvRjtGH0LDQtdGCINC80L7QtNGD0LvRjCDQvtGC0YfQtdGC0L7QsiDQtNC70Y8g0YTQvtGA0LzQuNGA0L7QstCw0L3QuNGPINC+0YLRh9C10YLQvtCyINC+INGB0YDQtdC00L3QtdC8IElUU00gdGlja2V0IHNvbHV0aW9uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQktC+0LfQvNC+0LbQvdC+0YHRgtGMINGD0YHRgtCw0L3QvtCy0LjRgtGMINC90L7QstC+0LUg0YHQvtGB0YLQvtGP0L3QuNC1INC30LDQstC60Lgg0L/RgNC4INC00L7QsdCw0LLQu9C10L3QuNC4INC30LDQvNC10YLQutC4INC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JLQvtC30LzQvtC20L3QvtGB0YLRjCDRg9GB0YLQsNC90L7QstC40YLRjCDQvdC+0LLQvtC1INGB0L7RgdGC0L7Rj9C90LjQtSDQt9Cw0LLQutC4INC/0YDQuCDQtNC+0LHQsNCy0LvQtdC90LjQuCDQt9Cw0LzQtdGC0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0JfQsNC00LDQtdGCINGC0YDQtdCx0YPQtdC80YvQtSDQv9GA0LDQstCwINC00LvRjyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyDQv9GD0L3QutGC0LAg0LzQtdC90Y4g0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9CX0LDQtNCw0LXRgiDRgtGA0LXQsdGD0LXQvNGL0LUg0L/RgNCw0LLQsCDQtNC70Y8g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0L/Rg9C90LrRgtCwINC80LXQvdGOINCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0KHQtdGA0LLQuNGBINC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAgKFRpY2tldDo6U2VydmljZSDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0LDQutGC0LjQstC40YDQvtCy0LDQvSkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0KHQtdGA0LLQuNGBINC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAoVGlja2V0OjpTZXJ2aWNlINC00L7Qu9C20LXQvSDQsdGL0YLRjCDQsNC60YLQuNCy0LjRgNC+0LLQsNC9KS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LfQstC+0LvRj9C10YIg0LfQsNC00LDRgtGMINCS0LvQsNC00LXQu9GM0YbQsCDQt9Cw0Y/QstC60Lgg0L3QsCDRjdC60YDQsNC90LUg0JTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvQtSBJVFNNINC/0L7Qu9GPINCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0JLQu9Cw0LTQtdC70YzRhtCwINC30LDRj9Cy0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAn0J/QvtC30LLQvtC70Y/QtdGCINC30LDQtNCw0YLRjCDQntGC0LLQtdGC0YHRgtCy0LXQvdC90L7Qs9C+INC30LAg0LfQsNGP0LLQutGDINC90LAg0Y3QutGA0LDQvdC1INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUgSVRTTSDQv9C+0LvRjyDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfQn9C+0LfQstC+0LvRj9C10YIg0LfQsNC00LDRgtGMINCe0YLQstC10YLRgdGC0LLQtdC90L3QvtCz0L4g0LfQsCDQt9Cw0Y/QstC60YMg0L3QsCDRjdC60YDQsNC90LUg0KDQtdGI0LXQvdC40LUg0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ9Cf0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0KLQuNC/INC30LDRj9Cy0LrQuCDQvdCwINGN0LrRgNCw0L3QtSDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1IElUU00g0L/QvtC70Y8g0LIg0LjQvdGC0LXRgNGE0LXQudGB0LUg0LDQs9C10L3RgtCwIChUaWNrZXQ6OlR5cGUg0LTQvtC70LbQtdC9INCx0YvRgtGMINCw0LrRgtC40LLQuNGA0L7QstCw0L0pLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAn0J/QvtC30LLQvtC70Y/QtdGCINC30LDQtNCw0YLRjCDQotC40L8g0LfQsNGP0LLQutC4INC90LAg0Y3QutGA0LDQvdC1INCg0LXRiNC10L3QuNC1INCyINC40L3RgtC10YDRhNC10LnRgdC1INCw0LPQtdC90YLQsCAoVGlja2V0OjpUeXBlINC00L7Qu9C20LXQvSDQsdGL0YLRjCDQsNC60YLQuNCy0LjRgNC+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+0LvQtSDQotC10LzQsCDQvdCwINGN0LrRgNCw0L3QtSDQoNC10YjQtdC90LjQtSDQsiDQuNC90YLQtdGA0YTQtdC50YHQtSDQsNCz0LXQvdGC0LAuJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9zd19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnN3X0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICdPbmdlemEgdGlrZXRpIHlhIHVhbXV6aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBEYXRlJ30gPSAnVGFyZWhlIHlhIHVhbXV6aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICdNYXRva2VvIHlhIHVhbXV6aSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdWUgRGF0ZSd9ID0gJ1RhcmVoZSB1a29tbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWFzb24nfSA9ICdTYWJhYnUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ID0gJ011ZGEgd2Ega3VhbnphIHdhIHVyZWplc2hpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcGFpciBTdGFydCBUaW1lJ30gPSAnTXVkYSB3YSBrdWFuemEgd2EgbWF0ZW5nZW5lem8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAnbWFwaXRpbyB5YW5haGl0YWppa2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ID0gJ0Z1bmd3YSBuYSBta3VzYW55aWtvIGthemknOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0J30gPSAnQmFkaWxpc2hhIHRpa2V0aSB5YSB1YW11emknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ0JhZGlsaSB0aWtldGkgeWEgdWdhIHdhIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ0hhbGkgeWEgdHVraW8geWEgaHVkdW1hJzsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudFRpY2tldEVtYWlsCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHRpY2tldCd9ID0gJ1Rpa2V0aSBraXVuZ28nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ0t3YSBraW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcGFjdCd9ID0gJ01hZGhhcmEnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICdPbmdlemEgdWFtdXppISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gPSAnVWdhIHppbGl6b29uZ2V6d2EgWmEgSVRTTSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdSdWh1c3Uga3VvbmdlemEgdmlkb2tlem8ga2F0aWthIHNrcmluaSB5YSB1Z2EgbnlvbmdlemEgeWEgSVRTTSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdSdWh1c3Uga3VvbmdlemEgdmlkb2tlem8ga2F0aWthIHNrcmluaSB5YSBtYWFtdXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ0JhZGlsaSB1Z2Egd2EgSVRTTSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24nfSA9ICdVYW11emknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEga2FtYSBrdWZ1bmd3YSBrd2EgdGlrZXRpIGt1bmF0YWtpd2Ega2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSB3YSBraW9sZXN1cmEgY2hhIHdha2FsYSAoa2FtYSB0aWtldGkgaGFpamFmdW5nd2EgYmFkbywgdGlrZXRpIGluYWZ1bmd3YSBuYSB3YWthbGEgd2Egc2FzYSBhdGF3ZWt3YSBvdG9tYXRpa2kga2FtYSBtbWlsaWtpIHdha2UpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIGthbWEga3VmdW5nd2Ega3dhIHRpa2V0aSBrdW5hdGFraXdhIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYSAoa2FtYSB0aWtldGkgaGFpamFmdW5nd2EgYmFkbywgdGlrZXRpIGluYWZ1bmd3YSBuYSB3YWthbGEgd2Egc2FzYSBhdGF3ZWt3YSBvdG9tYXRpa2kga2FtYSBtbWlsaWtpIHdha2UpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIGlmIHRoZSBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIHNob3VsZCBiZSBzaG93biBkdXJpbmcgc2VydmljZSBzZWxlY3Rpb24gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEgIGthbWEgaGFsaSB5YSB0dWtpbyB5YSBodWR1bWEgaW9ueWVzaHdlIHdha2F0aSB3YSBjaGFndW8gbGEgaHVkdW1hIGthdGlrYSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBraWluaSBjaGEgY2hhZ3VvLW1zaW5naSBjaGEga2lkb2tlem8ga2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSB3YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIGtpaW5pIGNoYSBjaGFndW8tbXNpbmdpIGNoYSBraWRva2V6byBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBoYWxpIG5heW9mdWF0YSB5YSBjaGFndW8tbXNpbmdpIGJhYWRhIHlhIGt1b25nZXphIGtpZG9rZXpvLCBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9vbmdlendhIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBoYWxpIGluYXlvZnVhdGEgY2hhZ3VvLW1zaW5naSB5YSB0aWtldGkgYmFhZGEgeWEga3VvbmdlemEga2lkb2tlem8sIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZmFmYW51YSBzb21vIGNoYWd1by1tc2luZ2kgbGEga2lkb2tlem8ga2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlpb25nZXp3YSB3YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIHNvbW8gY2hhZ3VvLW1zaW5naSBsYSBraWRva2V6byBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFmYWZhbnVhIGtpcGF1bWJlbGUgY2hhIHRpa2V0aSBjaGFndW8gbXNpbmdpIGthdGlrYSBza3JpbmkgeWEgdWdhIHdhIElUU00gdWxpaW9uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEga2lwYXVtYmVsZSBjaGEgdGlrZXRpIGNoYWd1byBtc2luZ2kga2F0aWthIHNrcmluaSB5YSBtYWFtdXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYWZhZmFudWEgYWluYSB5YSBjaGFndW8gbXNpbmdpIHlhIGtpZG9rZXpvIGthdGlrYSBza3JpbmkgeWEgdWdhIHdhIElUU00gdWxpb29uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFlbGV6ZWEgYWluYSB5YSBjaGFndW8gbXNpbmdpIHlhIGtpZG9rZXpvIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdJbmFlbGV6ZWEgbWFvbmkgeWEgaGlzdG9yaWEga3dhIGFqaWxpIHlhIGtpdGVuZG8gY2hhIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSwgYW1iYWNobyBraW5hdHVtaWthIGt3YSBhamlsaSB5YSBoaXN0b3JpYSB5YSB0aWtldGkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICdJbmFlbGV6ZWEgbWFvbmkgeWEgaGlzdG9yaWEga3dhIGFpamlsaSB5YSBraXRlbmRvIGNoYSBza3JpbmkgeWEgbWFhbXV6aSwgYW1iYWNobyBraW5hdHVtaWthIGt3YSBhamlsaSB5YSBoaXN0b3JpYSB5YSB0aWtldGkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnSW5hZWxlemVhIGFpbmEgeWEgaGlzdG9yaWEga3dhIGFqaWxpIHlhIGtpdGVuZG8gY2hhIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSAsIGFtYmFjaG8ga2luYXR1bWlrYSBrd2EgYWppbGkgeWEgaGlzdG9yaWEgeWEgdGlrZXRpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnSW5hZWxlemVhIGFpbmEgeWEgaGlzdG9yaWEga3dhIGFqaWxpIHlhIGtpdGVuZG8gY2hhIHNrcmluaSB5YSBtYWFtdXppLCBhbWJhY2hvIGtpbmF0dW1pa2Ega3dhIGFqaWxpIHlhIGhpc3RvcmlhIHlhIHRpa2V0aS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZWxlemVhIGhhbGkgaWZ1YXRheW8geWEgdGlrZXRpIGJhYWRhIHlhIGt1b25nZXphIGtpZG9rZXpvLCBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hZWxlemVhIGhhbGkgaWZ1YXRheW8geWEgdGlrZXRpIGJhYWRhIHlhIGt1b25nZXphIGtpZG9rZXpvLCBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICdVZ2Egd2VueWUgbmd1dnUgdW5hb255ZXNod2Ega2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuIE1pcGFuZ2lsaW8gaW5heW93ZXpla2E6IDA9S3V0b2t1d2V6ZXNoYSwgMT13ZXplc2hhLCAyPVdlemVzaGEgbmEgaW5haGl0YWppa2EuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJ1VnYSB3ZW55ZSBuZ3V2dSB1bmFvbnllc2h3YSBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuIE1pcGFuZ2lsaW8gaW5heW93ZXpla2E6IDA9S3V0b2t1d2V6ZXNoYSwgMT13ZXplc2hhLCAyPVdlemVzaGEgbmEgaW5haGl0YWppa2EuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC4nfSA9CiAgICAgICAgJ1VnYSB3ZW55ZSBuZ3V2dSB1bmFvbnllc2h3YSBrYXRpa2Egc2tyaW5pIHlhIGt1dGFmdXRhIHRpa2V0aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4gTWlwYW5naWxpbyBpbmF5b3dlemVrYTogMD1LdXRva3V3ZXplc2hhLCAxPXdlemVzaGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICdVZ2Egd2VueWUgbmd1dnUgdW5hb255ZXNod2Ega2F0aWthIHNrcmluaSBpbGl5b2t1endhIHlhIHRpa2V0aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4gTWlwYW5naWxpbyBpbmF5b3dlemVrYTogMD1LdXRva3V3ZXplc2hhLCAxPXdlemVzaGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPQogICAgICAgICdXZXplc2hhIG1vZHVsaSB6YSB0YWt3aW11IGt1dGVuZ2VuZXphIHRha3dpbXUga3VodXN1IHdhc3Rhbmkgd2Ega2l3YW5nbyBjaGEgdWZ1bWJ1emkgY2hhIG5nYXppIHlhIGt3YW56YSB5YSB0aWtldGkgeWEgSVRTTS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPQogICAgICAgICdXZXplc2hhIG1vZHVsaSB6YSB0YWt3aW11IGt1dGVuZ2VuZXphIHRha3dpbXUga3VodXN1IHdhc3Rhbmkgd2EgdWZ1bWJ1emkgd2EgdGlrZXRpIHlhIElUU00nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnS2FtYSBraWRva2V6byBraW1lb25nZXp3YSBuYSB3YWthbGEsIGluYXdla2EgaGFsaSB5YSB0aWtldGkga2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSB3YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdLYW1hIGtpZG9rZXpvIGtpbWVvbmdlendhIG5hIHdha2FsYSwgaW5hd2VrYSBoYWxpIHlhIHRpa2V0aSBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5haGl0YWppIHJ1aHVzYSBrdXR1bWlhIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlpb25nZXp3YSBrYXRpa2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFoaXRhamkgcnVodXNhIGt1dHVtaWEgc2tyaW5pIHlhIG1hYW11emkga2F0aWthIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnSW5hd2Vrd2Ega2F0aWthIGh1ZHVtYSBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaWlvbmdlendhIGthdGlrYSBraW9lbGVzdXJhIGNoYSB3YWthbGEgKFRpa2V0aTo6IEh1ZHVtYSBpbmFoaXRhamkga3VhbWlsaXNod2EpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICdJbmF3ZWthIGh1ZHVtYSBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGV1c3VyYSBjaGEgd2FrYWxhIChUaWtldGk6OiBIdWR1bWEgaW5haGl0YWppIGt1YW1pbGlzaHdhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmF3ZWthIG1taWxpa2kgd2EgdGlrZXRpIGthdGlrYSBza3JpbmkgeWEgdWdhIHdhIElUU00gaWxpeW9vbmdlendhIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hd2VrYSBtbWlsaWtpIHdhIHRpa3d0aSBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW5hd2VrYSB0aWtldGkgaW5heW9odXNpa2Ega2F0aWthIHNrcmluaSB5YSB1Z2Egd2EgSVRTTSB1bGlvb25nZXp3YSAgd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmF3ZWthIHRpa2V0aSBpbmF5b2h1c2lrYSBrYXRpa2Egc2tyaW5pIHlhIG1hYW11emkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnSW5hd2VrYSBhaW5hIHlhIHRpa2V0aSBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9vbmdlendhIGthdGlrYSBraW9sZXN1cmEgY2hhIHdha2FsYSAoVGlrZXRpOjpBaW5hIGluYXlvaGl0YWppIGt1YW1pbGlzaHdhKS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJ0luYXdla2EgYWluYSB5YSB0aWtldGkga2F0aWthIHNrcmluaSB5YSBtYWFtdXppIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhIChUaWtldGk6OiBBaW5hIGluYXlvaGl0YWppIGt1YW1pbGlzaHdhICkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYW9ueWVzaGEga2l1bmdvIGthdGlrYSBtZW55dSBjaGEga3ViYWRpbGlzaGEgbWFhbXV6aSB5YSB0aWtldGkga2F0aWthIG1hbmRoYXJpIHlha2UgaWxpeW9rdXp3YSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIGtpdW5nbyBrYXRpa2EgbWVueXUgY2hhIGt1cmVrZWJpc2hhIHVnYSB6YSBJVFNNIHppbGl6b29uZ2V6d2Ega2F0aWthIG1hbmRoYXJpIHlhIGlsaXlva3V6d2EgeWEgdGlrZXRpIHlhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIG9yb2RoYSB5YSBtYXdha2FsYSB3b3RlIHdhbGlvaHVzaWthIGthdGlrYSB0aWtldGkgaGlpLCBrYXRpa2Egc2tyaW5pIHlhIHVnYSB3YSBJVFNNIHVsaW9vbmdlendhIHdhIGtpb2xlc3VyYSBjaGEgd2FrYWxhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0luYW9ueWVzaGEgb3JvZGhhIHlhIG1hd2FrYWxhIHdvdGUgd2FsaW9odXNpa2Ega2F0aWthIHRpa2V0aSBoaWksIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIG9yb2RoYSB5YSBtYXdha2FsYSB3b3RlKCBNYXdha2FsYSB3b3RlIHdlbnllIGtpZG9rZXpvIGNoYSBydWh1c2Ega2F0aWthIGZvbGVuaS90aWtldGkpIHdhbmFvd2V6YSBrdWd1bmR1YSBuYW5pIGF0YWFyaWZpd2Uga3VodXN1IGtpZG9rZXpvIGhpa2ksIGthdGlrYSBza3JpbmkgeWEgdWdhIHdhIElUU00gdWxpb29uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIG9yb2RoYSB5YSBtYXdha2FsYSB3b3RlKCBNYXdha2FsYSB3b3RlIHdlbnllIGtpZG9rZXpvIGNoYSBydWh1c2Ega2F0aWthIGZvbGVuaS90aWtldGkpIHdhbmFvd2V6YSBrdWd1bmR1YSBuYW5pIGF0YWFyaWZpd2Uga3VodXN1IGtpZG9rZXpvIGhpa2ksIGthdGlrYSBza3JpbmkgeWEgbWFhbXV6aSB5YSBraW9sZXN1cmEgY2hhIHdha2FsYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFvbnllc2hhIG1pY2hhZ3VvIHllbnllIGtpcGF1bWJlbGUgeWEgdGlrZXRpIGthdGlrYSBza3JpbmkgdWdhIHdhIElUU00gdWxpb29uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdJbmFveWVzaGEgJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0lueWVzaGEgdWdhIHphIGtpY2h3YSBjaGEgaGFiYXJpIGthdGlrYSBza3JpbmkgeWEgdWdhIHdhIElUU00gdWxpb29uZ2V6d2Egd2Ega2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnSW55ZXNoYSB1Z2Egd2Ega2ljaHdhIGNoYSBoYWJhcmkga2F0aWthIHNrcmluaSB5YSBtYWFtemkgeWEga2lvbGVzdXJhIGNoYSB3YWthbGEuJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX0NOX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICflop7liqDlhrPlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ+WGs+WumuaXpeacnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICflhrPlrprnu5PmnpwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfmiKrmraLml6XmnJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAn55CG55SxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfmgaLlpI3lvIDlp4vml7bpl7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICfkv67lpI3lvIDlp4vml7bpl7QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAn6ZyA6KaB5aSN5a6hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICflhbPpl60o5Y+Y6YCaKSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICfkv67mlLnlt6XljZXlhrPlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ+S/ruaUuUlUU03lrZfmrrUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ+acjeWKoeaVhemanOeKtuaAgSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfpk77mjqXlt6XljZUnOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ+mHjeimgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICflvbHlk40nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfmt7vliqDlhrPlrpohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdJVFNN5a2X5q61JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ+S/ruaUuUlUU03lrZfmrrUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAn5Yaz5a6aJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9UV19JVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnpoX1RXX0lUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSA9ICflop7liqDmsbrlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVjaXNpb24gRGF0ZSd9ID0gJ+axuuWumuaXpeacnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWNpc2lvbiBSZXN1bHQnfSA9ICfmsbrlrprnu5PmnpwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVlIERhdGUnfSA9ICfmiKrmraLml6XmnJ8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVhc29uJ30gPSAn55CG55SxJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSA9ICfmgaLlvqnplovlp4vmmYLplpMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSA9ICfkv67lvqnplovlp4vmmYLplpMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmV2aWV3IFJlcXVpcmVkJ30gPSAn6ZyA6KaB6KSH5a+pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSA9ICfpl5zploko6K6K6YCaKSc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYW5nZSBEZWNpc2lvbiBvZiBUaWNrZXQnfSA9ICfkv67mlLnlt6Xllq7msbrlrponOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ+S/ruaUuUlUU03lrZfmrrUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VydmljZSBJbmNpZGVudCBTdGF0ZSd9ID0gJ+acjeWLmeaVhemanOeLgOaFiyc7CgogICAgIyBUZW1wbGF0ZTogQWdlbnRUaWNrZXRFbWFpbAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGluayB0aWNrZXQnfSA9ICfpj4jmjqXlt6Xllq4nOwoKICAgICMgVGVtcGxhdGU6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcml0aWNhbGl0eSd9ID0gJ+mHjeimgSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBhY3QnfSA9ICflvbHpn78nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgYSBkZWNpc2lvbiEnfSA9ICfmt7vliqDmsbrlrpohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSA9ICdJVFNN5a2X5q61JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ID0gJ+S/ruaUuUlUU03lrZfmrrUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlY2lzaW9uJ30gPSAn5rG65a6aJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgaWYgdGhlIHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGR1cmluZyBzZXJ2aWNlIHNlbGVjdGlvbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSB0aWNrZXQgem9vbSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICcnOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0QWN0aW9uQ29tbW9uLnBtIC0gY29tbW9uIGZpbGUgZm9yIHNldmVyYWwgbW9kdWxlcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi80NzhlZTY2NWM1MzViNjgwMjljZWQ0ZGNhMTk3YjUyMzViN2IxOTJmL0tlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0QWN0aW9uQ29tbW9uLnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRBY3Rpb25Db21tb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3I7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CiMgLS0tCgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0JhY2tlbmRPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57RW1haWxQYXJzZXJPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICAgICBNb2RlICA9PiAnU3RhbmRhbG9uZScsCiAgICAgICAgRGVidWcgPT4gMCwKICAgICk7CiAgICAkU2VsZi0+e1N0YW5kYXJkVGVtcGxhdGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBnZXQgaW5mb3JtIHVzZXIgbGlzdAogICAgbXkgQEluZm9ybVVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcgKTsKICAgICRTZWxmLT57SW5mb3JtVXNlcklEfSA9IFxASW5mb3JtVXNlcklEOwoKICAgICMgZ2V0IGludm9sdmVkIHVzZXIgbGlzdAogICAgbXkgQEludm9sdmVkVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW52b2x2ZWRVc2VySUQnICk7CiAgICAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSA9IFxASW52b2x2ZWRVc2VySUQ7CgogICAgIyBnZXQgYXJ0aWNsZSBmb3Igd2hvbSB0aGlzIHNob3VsZCBiZSBhIHJlcGx5LCBpZiBhdmFpbGFibGUKICAgIG15ICRSZXBseVRvQXJ0aWNsZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1JlcGx5VG9BcnRpY2xlJyApIHx8ICIiOwoKICAgICMgZ2V0IGxpc3Qgb2YgdXNlcnMgdGhhdCB3aWxsIGJlIGluZm9ybWVkIHdpdGhvdXQgc2VsZWN0aW9uIGluIGluZm9ybWVkL2ludm9sdmVkIGxpc3QKICAgIG15IEBVc2VyTGlzdFdpdGhvdXRTZWxlY3Rpb24KICAgICAgICA9IHNwbGl0KCAnLCcsICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1VzZXJMaXN0V2l0aG91dFNlbGVjdGlvbicgKSB8fCAiIiApOwogICAgJFNlbGYtPntVc2VyTGlzdFdpdGhvdXRTZWxlY3Rpb259ID0gXEBVc2VyTGlzdFdpdGhvdXRTZWxlY3Rpb247CgogICAgIyBjaGVjayBpZiBSZXBseVRvQXJ0aWNsZSByZWFsbHkgYmVsb25ncyB0byB0aGUgdGlja2V0CiAgICBteSAlUmVwbHlUb0FydGljbGVDb250ZW50OwogICAgbXkgQFJlcGx5VG9BZHJlc3NlczsKICAgIGlmICgkUmVwbHlUb0FydGljbGUpIHsKICAgICAgICAlUmVwbHlUb0FydGljbGVDb250ZW50ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlR2V0KAogICAgICAgICAgICBBcnRpY2xlSUQgICAgID0+ICRSZXBseVRvQXJ0aWNsZSwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSAgICAgICAgPSAkUmVwbHlUb0FydGljbGU7CiAgICAgICAgJFNlbGYtPntSZXBseVRvQXJ0aWNsZUNvbnRlbnR9ID0gXCVSZXBseVRvQXJ0aWNsZUNvbnRlbnQ7CgogICAgICAgICMgZ2V0IHNlbmRlciBvZiBvcmlnaW5hbCBub3RlICh0byBpbmZvcm0gc2VuZGVyIGFib3V0IGFuc3dlcikKICAgICAgICBpZiAoICRSZXBseVRvQXJ0aWNsZUNvbnRlbnR7Q3JlYXRlZEJ5fSApIHsKICAgICAgICAgICAgbXkgQFJlcGx5VG9TZW5kZXJJRCA9ICggJFJlcGx5VG9BcnRpY2xlQ29udGVudHtDcmVhdGVkQnl9ICk7CiAgICAgICAgICAgICRTZWxmLT57UmVwbHlUb1NlbmRlclVzZXJJRH0gPSBcQFJlcGx5VG9TZW5kZXJJRDsKICAgICAgICB9CgogICAgICAgICMgaWYgYXJ0aWNsZSBiZWxvbmdzIHRvIG90aGVyIHRpY2tldCwgZG9uJ3QgdXNlIGl0IGFzIHJlcGx5CiAgICAgICAgaWYgKCAkUmVwbHlUb0FydGljbGVDb250ZW50e1RpY2tldElEfSBuZSAkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gPSAiIjsKICAgICAgICB9CgogICAgICAgICMgaWYgYXJ0aWNsZSBpcyBub3Qgb2YgdHlwZSBub3RlLWludGVybmFsLCBkb24ndCB1c2UgaXQgYXMgcmVwbHkKICAgICAgICBpZiAoICRSZXBseVRvQXJ0aWNsZUNvbnRlbnR7QXJ0aWNsZVR5cGV9ICF+IC9ebm90ZS0oaW50ZXJuYWx8ZXh0ZXJuYWwpJC9pICkgewogICAgICAgICAgICAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSA9ICIiOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBmb3JtIGlkCiAgICBpZiAoICEkU2VsZi0+e0Zvcm1JRH0gKSB7CiAgICAgICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRENyZWF0ZSgpOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvZiBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIGRlZmluZSB0aGUgZHluYW1pYyBmaWVsZHMgdG8gc2hvdyBiYXNlZCBvbiB0aGUgb2JqZWN0IHR5cGUKICAgIG15ICRPYmplY3RUeXBlID0gWydUaWNrZXQnXTsKCiAgICAjIG9ubHkgc2NyZWVucyB0aGF0IGFkZCBub3RlcyBjYW4gbW9kaWZ5IEFydGljbGUgZHluYW1pYyBmaWVsZHMKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgJE9iamVjdFR5cGUgPSBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXTsKICAgIH0KCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiAkT2JqZWN0VHlwZSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFRpY2tldElEIGlzIGdpdmVuIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0gcGVybWlzc2lvbnMhIiwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgIG15ICVQb3NzaWJsZUFjdGlvbnMgPSAoIDEgPT4gJFNlbGYtPntBY3Rpb259ICk7CgogICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgIG15ICVBY2xBY3Rpb24gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIGlmICggJEFDTCB8fCBJc0hhc2hSZWZXaXRoRGF0YSggXCVBY2xBY3Rpb24gKSApIHsKCiAgICAgICAgbXkgJUFjbEFjdGlvbkxvb2t1cCA9IHJldmVyc2UgJUFjbEFjdGlvbjsKCiAgICAgICAgIyBzaG93IGVycm9yIHNjcmVlbiBpZiBBQ0wgcHJvaGliaXRzIHRoaXMgYWN0aW9uCiAgICAgICAgaWYgKCAhJEFjbEFjdGlvbkxvb2t1cHsgJFNlbGYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllcycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgUmVwbHlUb0FydGljbGUgPT4gJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgcmlnaHQgaGVhZGVyCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0hlYWRlcicgLiAkU2VsZi0+e0FjdGlvbn0sCiAgICApOwoKICAgICMgZ2V0IGxvY2sgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICBpZiAoICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGxvY2sgc3RhdGUKICAgICAgICAgICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb3BlcnRpZXNMb2NrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtOdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0KCdTb3JyeSwgeW91IG5lZWQgdG8gYmUgdGhlIHRpY2tldCBvd25lciB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLicpLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BsZWFzZSBjaGFuZ2UgdGhlIG93bmVyIGZpcnN0LicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYmFjayBsaW5rCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRLZXkgKAogICAgICAgIHF3KAogICAgICAgIE5ld1N0YXRlSUQgTmV3UHJpb3JpdHlJRCBUaW1lVW5pdHMgQXJ0aWNsZVR5cGVJRCBUaXRsZSBCb2R5IFN1YmplY3QgTmV3UXVldWVJRAogICAgICAgIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlIE5ld093bmVySUQgTmV3T3duZXJUeXBlIE9sZE93bmVySUQgTmV3UmVzcG9uc2libGVJRAogICAgICAgIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgRXhwYW5kIFJlcGx5VG9BcnRpY2xlIFN0YW5kYXJkVGVtcGxhdGVJRCBDcmVhdGVBcnRpY2xlCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIHZhbHVlcyBmb3JtIGh0dHAgcmVxdWVzdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIHRvIHN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGR5bmFtaWMgZmllbGQgZm9yIHRoZSBpbXBhY3QKICAgIG15ICRJbXBhY3REeW5hbWljRmllbGRDb25maWc7CiMgLS0tCgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZm9ybSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgaW1wYWN0IGZpZWxkIHdhcyBmb3VuZAogICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IGVxICdJVFNNSW1wYWN0JyApIHsKCiAgICAgICAgICAgICMgc3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgaW1wYWN0IGZpZWxkCiAgICAgICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgIH0KIyAtLS0KICAgIH0KCiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnUHJpb3JpdHlSQycpOwogICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnKSB8fCAnJzsKCiAgICAjIGNoZWNrIGlmIHByaW9yaXR5IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZAogICAgaWYgKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnIHx8ICggJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAmJiAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcgKSApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgICMgc2V0IHNlcnZpY2UgaWQgZnJvbSB0aWNrZXQKICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFRpY2tldHtTZXJ2aWNlSUR9ICkgewogICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJFRpY2tldHtTZXJ2aWNlSUR9OwogICAgfQoKICAgICMgc2V0IGltcGFjdCBmcm9tIHRpY2tldAogICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICkgewogICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fTsKICAgIH0KCiAgICBteSAlU2VydmljZTsKICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CgogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U2hvd0luY2lkZW50U3RhdGV9IHx8IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVjYWxjdWxhdGUgaW1wYWN0IGlmIGltcGFjdCBpcyBub3Qgc2V0IHVudGlsIG5vdwogICAgICAgIGlmICggISRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gJiYgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBuZSAnRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QnICkgewoKICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCBzZWxlY3Rpb24KICAgICAgICAgICAgbXkgJERlZmF1bHRTZWxlY3Rpb24gPSAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX07CgogICAgICAgICAgICBpZiAoJERlZmF1bHRTZWxlY3Rpb24pIHsKCiAgICAgICAgICAgICAgICAjIGdldCBkZWZhdWx0IGltcGFjdAogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICREZWZhdWx0U2VsZWN0aW9uOwogICAgICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICYmICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gJiYgJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eSA9PiAkU2VydmljZXtDcml0aWNhbGl0eX0sCiAgICAgICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSA9ICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIG5vIHNlcnZpY2Ugd2FzIHNlbGVjdGVkCiAgICBlbHNlIHsKCiAgICAgICAgIyBkbyBub3Qgc2hvdyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24KICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gPSAnJzsKCiAgICAgICAgIyBzaG93IG9ubHkgdGhlIGVtcHR5IHNlbGVjdGlvbgogICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9ID0ge307CiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICcnOwogICAgfQoKICAgICMgc2V0IHRoZSBzZWxlY3RlZCBpbXBhY3QKICAgICREeW5hbWljRmllbGRWYWx1ZXN7SVRTTUltcGFjdH0gPSAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9OwoKIyAtLS0KICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICBteSAlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGQ7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CgogICAgIyB0cmFuc2Zvcm0gcGVuZGluZyB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkR2V0UGFyYW17WWVhcn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNb250aH0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtEYXl9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17SG91cn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNaW51dGV9CiAgICAgICAgKQogICAgewogICAgICAgICVHZXRQYXJhbSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmb3JtRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyByZXdyYXAgYm9keSBpZiBubyByaWNoIHRleHQgaXMgdXNlZAogICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gJiYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5XcmFwUGxhaW5UZXh0KAogICAgICAgICAgICBNYXhDaGFyYWN0ZXJzID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUnKSwKICAgICAgICAgICAgUGxhaW5UZXh0ICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgc3RvcmUgYWN0aW9uCiAgICAgICAgbXkgJUVycm9yOwoKICAgICAgICAjIElmIGlzIGFuIGFjdGlvbiBhYm91dCBhdHRhY2htZW50cwogICAgICAgIG15ICRJc1VwbG9hZCA9IDA7CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBteSBAQXR0YWNobWVudElEcyA9IG1hcCB7CiAgICAgICAgICAgIG15ICgkSUQpID0gJF8gPX4gbXsgXEEgQXR0YWNobWVudERlbGV0ZSAoXGQrKSBceiB9eG1zOwogICAgICAgICAgICAkSUQgPyAkSUQgOiAoKTsKICAgICAgICB9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCByZXZlcnNlIHNvcnQgQEF0dGFjaG1lbnRJRHMgKSB7CiAgICAgICAgICAgIG15ICREZWxldGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBdHRhY2htZW50RGVsZXRlJENvdW50IiApOwogICAgICAgICAgICBuZXh0IENPVU5UIGlmICEkRGVsZXRlOwogICAgICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDb3VudCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJElzVXBsb2FkID0gMTsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgKSB7CiAgICAgICAgICAgICRJc1VwbG9hZCAgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgICAgICVFcnJvciAgICAgICAgICAgICAgICAgICA9ICgpOwogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgcGVuZGluZyB0aW1lCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkSXNVcGxvYWQgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBzdGF0ZSB0eXBlCiAgICAgICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkTmVlZGVkIChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGRhdGUKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgICAgICAgICA8ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJElzVXBsb2FkICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICYmICRTZWxmLT57Q29uZmlnfS0+e05vdGVNYW5kYXRvcnl9ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdEludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydCb2R5SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBvd25lcgogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSAmJiAkU2VsZi0+e0NvbmZpZ30tPntPd25lck1hbmRhdG9yeX0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdOZXcnICYmICEkR2V0UGFyYW17TmV3T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydOZXdPd25lckludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICYmICEkR2V0UGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydPbGRPd25lckludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgdGl0bGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gJiYgISRHZXRQYXJhbXtUaXRsZX0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1RpdGxlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayB0eXBlCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkKICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgJiYKICAgICAgICAgICAgICAgICggISRHZXRQYXJhbXtUeXBlSUR9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydUeXBlSURJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBzZXJ2aWNlCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0KICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBtYW5kYXRvcnkgc2VydmljZQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9CiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlTWFuZGF0b3J5fQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzbGEKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U0xBTWFuZGF0b3J5fQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTTEFJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayB0aW1lIHVuaXRzLCBidXQgb25seSBpZiB0aGUgY3VycmVudCBzY3JlZW4gaGFzIGEgbm90ZQogICAgICAgICAgICAjICAgKGFjY291bnRlZCB0aW1lIGNhbiBvbmx5IGJlIHN0b3JlZCBpZiBhbmQgYXJ0aWNsZSBpcyBnZW5lcmF0ZWQpCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydUaW1lVW5pdHNJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBleHBhbmQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFeHBhbmR9ICkgewogICAgICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICAgICAgJEVycm9ye0V4cGFuZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IHBvc3NpYmxlIHZhbHVlcyBrZXkgPT4gdmFsdWUgdG8ga2V5ID0+IGtleSBmb3IgQUNMcyB1c2luZyBhIEhhc2ggc2xpY2UKICAgICAgICAgICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgICAgICBteSAkQUNMID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRWYWxpZGF0aW9uUmVzdWx0OwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgb24gYXR0YWNobWVudCB1cGxvYWQKICAgICAgICAgICAgaWYgKCAhJElzVXBsb2FkICkgewoKICAgICAgICAgICAgICAgICRWYWxpZGF0aW9uUmVzdWx0ID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkU2VsZi0+e1BhcmFtT2JqZWN0fSwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0hIiwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluLicsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICAgICAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgU2VydmVyRXJyb3IgID0+ICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICB8fCAnJywKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e0Vycm9yTWVzc2FnZX0gfHwgJycsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgID0+IDEsCiAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgPT4gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZXJyb3JzCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgQm9keUNsYXNzID0+ICdQb3B1cCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAgICAgQXR0YWNobWVudHMgICAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgICAgID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJwogICAgICAgICAgICAgICAgICAgIDogJycKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgICBJc1VwbG9hZCAgICAgICAgID0+ICRJc1VwbG9hZCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVFcnJvciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgdGl0bGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpdGxlfSApIHsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtUaXRsZX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFRpdGxlVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgbmV3IHR5cGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRUeXBlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VHlwZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZVNldCgKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgc2VydmljZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VTZXQoCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1NMQUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBU2V0KAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFVubG9ja09uQXdheSA9IDE7CgogICAgICAgICMgc2V0IG5ldyBvd25lcgogICAgICAgIG15IEBOb3RpZnlEb25lOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57T3duZXJ9ICkgewogICAgICAgICAgICBteSAkQm9keVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0MkFzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3T3duZXJUeXBlfSBlcSAnT2xkJyAmJiAkR2V0UGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtPbGRPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ICAgPT4gJEJvZHlUZXh0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRVbmxvY2tPbkF3YXkgPSAwOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdG8gbm90IG5vdGlmeSBvd25lciB0d2ljZQogICAgICAgICAgICAgICAgaWYgKCAkU3VjY2VzcyAmJiAkU3VjY2VzcyBlcSAxICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQE5vdGlmeURvbmUsICRHZXRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdOZXcnICYmICRHZXRQYXJhbXtOZXdPd25lcklEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkQm9keVRleHQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFVubG9ja09uQXdheSA9IDA7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld093bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG1vdmUgdGlja2V0IHRvIGEgbmV3IHF1ZXVlLCBidXQgb25seSBpZiB0aGUgcXVldWUgd2FzIGNoYW5nZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1F1ZXVlfQogICAgICAgICAgICAmJiAkR2V0UGFyYW17TmV3UXVldWVJRH0KICAgICAgICAgICAgJiYgJEdldFBhcmFte05ld1F1ZXVlSUR9IG5lICRUaWNrZXR7UXVldWVJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgbW92ZSB0aWNrZXQgKHNlbmQgbm90aWZpY2F0aW9uIGlmIG5vIG5ldyBvd25lciBpcyBzZWxlY3RlZCkKICAgICAgICAgICAgbXkgJEJvZHlBc1RleHQgPSAnJzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJEJvZHlBc1RleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0MkFzY2lpKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gfHwgMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQm9keUFzVGV4dCA9ICRHZXRQYXJhbXtCb2R5fSB8fCAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRNb3ZlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRRdWV1ZVNldCgKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgICAgICA9PiAkR2V0UGFyYW17TmV3UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZE5vTm90aWZpY2F0aW9uID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgICAgICAgID0+ICRCb2R5QXNUZXh0LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkTW92ZSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIG5vdGUKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJyc7CiAgICAgICAgbXkgJFJldHVyblVSTDsKCiAgICAgICAgIyBzZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSAmJiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gJiYgJEdldFBhcmFte05ld1N0YXRlSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN0YXRlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBTdGF0ZUlEICA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHVubG9jayB0aGUgdGlja2V0IGFmdGVyIGNsb3NlCiAgICAgICAgICAgIG15ICVTdGF0ZURhdGEgPSAkU2VsZi0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCB1bmxvY2sgb24gY2xvc2Ugc3RhdGUKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lIG9uIHBlbmRpbmcgc3RhdGUKICAgICAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVkaXJlY3QgcGFyZW50IHdpbmRvdyB0byBsYXN0IHNjcmVlbiBvdmVydmlldyBvbiBjbG9zZWQgdGlja2V0cwogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgICAgICRSZXR1cm5VUkwgPSAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gfHwgJ0FjdGlvbj1BZ2VudERhc2hib2FyZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyByZXNwb25zaWJsZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9ICkgewogICAgICAgICAgICAgICAgbXkgJEJvZHlUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dDJBc2NpaSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRSZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgICA9PiAkQm9keVRleHQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgdG8gbm90IG5vdGlmeSByZXNwb25zaWJsZSB0d2ljZQogICAgICAgICAgICAgICAgaWYgKCAkU3VjY2VzcyAmJiAkU3VjY2VzcyBlcSAxICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQE5vdGlmeURvbmUsICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17Q3JlYXRlQXJ0aWNsZX0KICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57Tm90ZX0KICAgICAgICAgICAgJiYgKCAkR2V0UGFyYW17U3ViamVjdH0gfHwgJEdldFBhcmFte0JvZHl9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkU3ViamVjdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRHZXRQYXJhbXtTdWJqZWN0fQogICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBzdWJqZWN0Jyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgdGhlcmUgaXMgbm8gQXJ0aWNsZVR5cGVJRCwgdXNlIHRoZSBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0FydGljbGVUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0FydGljbGVUeXBlfSA9ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlRGVmYXVsdH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRGcm9tID0gIlwiJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAkU2VsZi0+e1VzZXJMYXN0bmFtZX1cIiA8JFNlbGYtPntVc2VyRW1haWx9PiI7CiAgICAgICAgICAgIG15IEBOb3RpZnlVc2VySURzOwogICAgICAgICAgICBpZiAoICRTZWxmLT57UmVwbHlUb0FydGljbGV9ICkgewogICAgICAgICAgICAgICAgQE5vdGlmeVVzZXJJRHMgPSAoCiAgICAgICAgICAgICAgICAgICAgQHsgJFNlbGYtPntVc2VyTGlzdFdpdGhvdXRTZWxlY3Rpb259IH0sCiAgICAgICAgICAgICAgICAgICAgQHsgJFNlbGYtPntJbmZvcm1Vc2VySUR9IH0sCiAgICAgICAgICAgICAgICAgICAgQHsgJFNlbGYtPntJbnZvbHZlZFVzZXJJRH0gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBATm90aWZ5VXNlcklEcyA9ICggQHsgJFNlbGYtPntJbmZvcm1Vc2VySUR9IH0sIEB7ICRTZWxmLT57SW52b2x2ZWRVc2VySUR9IH0gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQXJ0aWNsZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgICAgICAgICAgICAgPT4gJ2FnZW50JywKICAgICAgICAgICAgICAgIEZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9LAogICAgICAgICAgICAgICAgRm9yY2VOb3RpZmljYXRpb25Ub1VzZXJJRCAgICAgICA9PiBcQE5vdGlmeVVzZXJJRHMsCiAgICAgICAgICAgICAgICBFeGNsdWRlTXV0ZU5vdGlmaWNhdGlvblRvVXNlcklEID0+IFxATm90aWZ5RG9uZSwKICAgICAgICAgICAgICAgIFVubG9ja09uQXdheSAgICAgICAgICAgICAgICAgICAgPT4gJFVubG9ja09uQXdheSwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnRzLCBcJVVwbG9hZFN0dWZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnRzCiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAgICAgIyBza2lwLCBkZWxldGVkIG5vdCB1c2VkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SUQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgICAgICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0KICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgICAgICMgaWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5CiAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICRHZXRQYXJhbXtCb2R5fSAhfiAvKFxRJENvbnRlbnRJREhUTUxRdW90ZVxFfFxRJENvbnRlbnRJRFxFKS9pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgd3JpdGUgZXhpc3RpbmcgZmlsZSB0byBiYWNrZW5kCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVXcml0ZUF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXR0ZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgIyBzZXQgdGhlIG9iamVjdCBJRCAoVGlja2V0SUQgb3IgQXJ0aWNsZUlEKSBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIGNvbmZpZ3JhdGlvbgogICAgICAgICAgICBteSAkT2JqZWN0SUQgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnID8gJEFydGljbGVJRCA6ICRTZWxmLT57VGlja2V0SUR9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkT2JqZWN0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgaWYgKCAoJEdldFBhcmFte1NlcnZpY2VJRH0gJiYgJFNlcnZpY2V7Q3JpdGljYWxpdHl9ICkgfHwgISRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAgICAgIyBnZXQgY29uZmlnIGZvciBjcml0aWNhbGl0eSBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgIG15ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSVRTTUNyaXRpY2FsaXR5JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHBvc3NpYmxlIHZhbHVlcyBmb3IgY3JpdGljYWxpdHkKICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJldmVyc2UgdGhlIGxpc3QgdG8gZmluZCBvdXQgdGhlIGtleQogICAgICAgICAgICBteSAlUmV2ZXJzZUNyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgPSByZXZlcnNlICV7ICRDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzIH07CgogICAgICAgICAgICAjIHNldCB0aGUgY3JpdGljYWxpdHkKICAgICAgICAgICAgJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlc3sgJFNlcnZpY2V7Q3JpdGljYWxpdHl9IHx8ICcnIH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KCiAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICAkUmV0dXJuVVJMIHx8PSAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGVJRCI7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlBvcHVwQ2xvc2UoCiAgICAgICAgICAgIFVSTCA9PiAkUmV0dXJuVVJMLAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0dldFNlcnZpY2VJbmNpZGVudFN0YXRlJyApIHsKCiAgICAgICAgIyBnZXQgdGhlIHNlbGVjdGVkIHNlcnZpY2UgaWQKICAgICAgICBteSAkU2VydmljZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApIHx8ICcnOwoKICAgICAgICAjIGJ1aWxkIGVtcHR5IHJlc3BvbnNlIGhhc2gKICAgICAgICBteSAlUmVzcG9uc2UgPSAoCiAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJycsCiAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgPT4gJyZuYnNwJywKICAgICAgICApOwoKICAgICAgICAjIG9ubHkgaWYgc2VydmljZSBpZCBpcyBzZWxlY3RlZCBhbmQgaW5jaWRlbnQgc3RhdGUgc2hvdWxkIGJlIHNob3duIGluIHRoaXMgc2NyZWVuCiAgICAgICAgaWYgKCAkU2VydmljZUlEICYmICRTZWxmLT57Q29uZmlnfS0+e1Nob3dJbmNpZGVudFN0YXRlfSApIHsKCiAgICAgICAgICAgICMgc2V0IGluY2lkZW50IHNpZ25hbAogICAgICAgICAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgICAgICAgICBvcGVyYXRpb25hbCA9PiAnZ3JlZW5sZWQnLAogICAgICAgICAgICAgICAgd2FybmluZyAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICAgICAgICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYnVpbGQgdGhlIHJlc3BvbnNlCiAgICAgICAgICAgICVSZXNwb25zZSA9ICgKICAgICAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkU2VydmljZXtDdXJJbmNpU3RhdGVUeXBlfSB9LAogICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkU2VydmljZXtDdXJJbmNpU3RhdGV9KSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZW5jb2RlIHJlc3BvbnNlIHRvIEpTT04KICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiBcJVJlc3BvbnNlLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiMgLS0tCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CiAgICAgICAgbXkgJVRpY2tldCAgICAgICAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciAgID0gJFRpY2tldHtDdXN0b21lclVzZXJJRH07CiAgICAgICAgbXkgJEVsZW1lbnRDaGFuZ2VkID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CgogICAgICAgIG15ICRTZXJ2aWNlSUQ7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgdmFsdWUgZnJvbSBwYXJhbSBpZiBmaWVsZCBpcyB2aXNpYmxlIGluIHRoZSBzY3JlZW4KICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICAgICAgJFNlcnZpY2VJRCA9ICRHZXRQYXJhbXtTZXJ2aWNlSUR9IHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBvdGhlcndpc2UgdXNlIHRpY2tldCBzZXJ2aWNlIHZhbHVlIHNpbmNlIGl0IGNhbid0IGJlIGNoYW5nZWQKICAgICAgICBlbHNpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICAgICAgJFNlcnZpY2VJRCA9ICRUaWNrZXR7U2VydmljZUlEfSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIG15ICRRdWV1ZUlEID0gJEdldFBhcmFte05ld1F1ZXVlSUR9IHx8ICRUaWNrZXR7UXVldWVJRH07CgogICAgICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKCiAgICAgICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGlzdCB0eXBlCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRPd25lcnMgPSAkU2VsZi0+X0dldE93bmVycygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICRPbGRPd25lcnMgPSAkU2VsZi0+X0dldE9sZE93bmVycygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICRSZXNwb25zaWJsZVVzZXJzID0gJFNlbGYtPl9HZXRSZXNwb25zaWJsZSgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICk7CiAgICAgICAgbXkgJFR5cGVzID0gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICApOwoKICAgICAgICAjIHJlc2V0IHByZXZpb3VzIFNlcnZpY2VJRCB0byByZXNldCBTTEEtTGlzdCBpZiBubyBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkU2VydmljZUlEIHx8ICEkU2VydmljZXMtPnskU2VydmljZUlEfSApIHsKICAgICAgICAgICAgJFNlcnZpY2VJRCA9ICcnOwogICAgICAgIH0KICAgICAgICBteSAkU0xBcyA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgU2VydmljZUlEICAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICApOwogICAgICAgIG15ICROZXh0U3RhdGVzID0gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyB1cGRhdGUgRHluYW1pYyBGaWVsZHMgUG9zc2libGUgVmFsdWVzIHZpYSBBSkFYCiAgICAgICAgbXkgQER5bmFtaWNGaWVsZEFKQVg7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0FDTFJlZHVjaWJsZTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICV7JFBvc3NpYmxlVmFsdWVzfTsKICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICBteSAkQUNMID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9IGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICkgfHwgJFBvc3NpYmxlVmFsdWVzOwoKICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBRdWV1ZUlEID0+ICRRdWV1ZUlEIHx8ICcnLAogICAgICAgICk7CgogICAgICAgIG15IEBUZW1wbGF0ZUFKQVg7CgogICAgICAgICMgdXBkYXRlIHRpY2tldCBib2R5IGFuZCBhdHRhY2hlbWVudHMgaWYgbmVlZGVkLgogICAgICAgIGlmICggJEVsZW1lbnRDaGFuZ2VkIGVxICdTdGFuZGFyZFRlbXBsYXRlSUQnICkgewogICAgICAgICAgICBteSBAVGlja2V0QXR0YWNobWVudHM7CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZVRleHQ7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgVXBsb2FkIGNhY2hlCiAgICAgICAgICAgIG15ICRSZW1vdmVTdWNjZXNzID0gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRSZW1vdmVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRm9ybSBhdHRhY2htZW50cyBjb3VsZCBub3QgYmUgZGVsZXRlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgdGhlIHRlbXBsYXRlIHRleHQgYW5kIHNldCBuZXcgYXR0YWNobWVudHMgaWYgYSB0ZW1wbGF0ZSBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoIElzUG9zaXRpdmVJbnRlZ2VyKCAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSApICkgewogICAgICAgICAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgICAgICAgICAgIyBzZXQgdGVtcGxhdGUgdGV4dCwgcmVwbGFjZSBzbWFydCB0YWdzIChsaW1pdGVkIGFzIHRpY2tldCBpcyBub3QgY3JlYXRlZCkKICAgICAgICAgICAgICAgICRUZW1wbGF0ZVRleHQgPSAkVGVtcGxhdGVHZW5lcmF0b3ItPlRlbXBsYXRlKAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBpZiBSZXBseVRvQXJ0aWNsZSBpcyBnaXZlbiwgZ2V0IHRoaXMgYXJ0aWNsZSB0byBnZW5lcmF0ZQogICAgICAgICAgICAgICAgIyB0aGUgcXVvdGVkIGFydGljbGUgY29udGVudAogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgYXJ0aWNsZSB0byBxdW90ZQogICAgICAgICAgICAgICAgICAgIG15ICRCb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICA9PiAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVcGxvYWRDYWNoZU9iamVjdCA9PiAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHByZXBhcmUgcXVvdGVkIGJvZHkgY29udGVudAogICAgICAgICAgICAgICAgICAgICRCb2R5ID0gJFNlbGYtPl9HZXRRdW90ZWRSZXBseUJvZHkoCiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRTZWxmLT57UmVwbHlUb0FydGljbGVDb250ZW50fSB9LAogICAgICAgICAgICAgICAgICAgICAgICBCb2R5ID0+ICRCb2R5LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZVRleHQgLiAnPGJyPjxicj4nIC4gJEJvZHk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkVGVtcGxhdGVUZXh0ID0gJFRlbXBsYXRlVGV4dCAuICJcblxuIiAuICRCb2R5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBTdGRBdHRhY2htZW50T2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgICAgICAgICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byB0aWNrZXQKICAgICAgICAgICAgICAgIG15ICVBbGxTdGRBdHRhY2htZW50cyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlQWxsU3RkQXR0YWNobWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzRGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50R2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzRGF0YSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VuZCBhIGxpc3Qgb2YgYXR0YWNobWVudHMgaW4gdGhlIHVwbG9hZCBjYWNoZSBiYWNrIHRvIHRoZSBjbGllbnRzaWRlIEphdmFTY3JpcHQKICAgICAgICAgICAgICAgICMgd2hpY2ggcmVuZGVycyB0aGVuIHRoZSBsaXN0IG9mIGN1cnJlbnRseSB1cGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgQFRpY2tldEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCA9ICgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VUZW1wbGF0ZU5vdGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJzAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkVGVtcGxhdGVUZXh0IHx8ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnVGlja2V0QXR0YWNobWVudHMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFxAVGlja2V0QXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAgICAgS2VlcERhdGEgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgICAgICBbCgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3T3duZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPd25lcnMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09sZE93bmVySUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2xkT3duZXJzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17T2xkT3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFJlc3BvbnNpYmxlVXNlcnMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1N0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkTmV4dFN0YXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ID8gMCA6IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFByaW9yaXRpZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNMQXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFR5cGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgbXkgJEJvZHkgPSAnJzsKCiAgICAgICAgIyBpZiBSZXBseVRvQXJ0aWNsZSBpcyBnaXZlbiwgZ2V0IHRoaXMgYXJ0aWNsZSB0byBnZW5lcmF0ZQogICAgICAgICMgdGhlIHF1b3RlZCBhcnRpY2xlIGNvbnRlbnQKICAgICAgICBpZiAoICRTZWxmLT57UmVwbHlUb0FydGljbGV9ICkgewoKICAgICAgICAgICAgIyBnZXQgYXJ0aWNsZSB0byBxdW90ZQogICAgICAgICAgICAkQm9keSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXJ0aWNsZVF1b3RlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICA9PiAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ID0+ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBwcmVwYXJlIHF1b3RlZCBib2R5IGNvbnRlbnQKICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+X0dldFF1b3RlZFJlcGx5Qm9keSgKICAgICAgICAgICAgICAgICV7ICRTZWxmLT57UmVwbHlUb0FydGljbGVDb250ZW50fSB9LAogICAgICAgICAgICAgICAgQm9keSA9PiAkQm9keSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgYSBib2R5IGNvbnRlbnQgd2FzIHByZSBkZWZpbmVkLCBhZGQgdGhpcyBiZWZvcmUgdGhlIHF1b3RlZCBhcnRpY2xlIGNvbnRlbnQKICAgICAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSApIHsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkyUmljaFRleHQoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRCb2R5ID0gJEdldFBhcmFte0JvZHl9IC4gJEJvZHk7CiAgICAgICAgfQoKICAgICAgICAjIGZpbGx1cCBjb25maWd1cmVkIGRlZmF1bHQgdmFycwogICAgICAgIGlmICggJEJvZHkgZXEgJycgJiYgJFNlbGYtPntDb25maWd9LT57Qm9keX0gKSB7CiAgICAgICAgICAgICRCb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRCb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEJvZHksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBCb2R5IHZhciB0byBjYWxjdWxhdGVkIGNvbnRlbnQKICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkQm9keTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSApIHsKICAgICAgICAgICAgbXkgJFRpY2tldFN1YmplY3RSZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlN1YmplY3RSZScpOwogICAgICAgICAgICBpZiAoJFRpY2tldFN1YmplY3RSZSkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFRpY2tldFN1YmplY3RSZSAuICc6ICcgLiAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlQ29udGVudH17U3ViamVjdH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAnUmU6ICcgLiAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlQ29udGVudH17U3ViamVjdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17U3ViamVjdH0gJiYgJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57U3ViamVjdH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBodG1sIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVEeW5hbWljRmllbGRIVE1MOwoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0byBzdG9yZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gZGF0YWJhc2UgKG9yIHVuZGVmaW5lZCkKICAgICAgICAgICAgbXkgJFZhbHVlOwoKICAgICAgICAgICAgIyBvbmx5IGdldCB2YWx1ZXMgZm9yIFRpY2tldCBmaWVsZHMgKGFsbCBzY3JlZW5zIGJhc2VkIG9uIEFnZW50VGlja2VBY3Rpb25Db21tb24KICAgICAgICAgICAgIyBnZW5lcmF0ZXMgYSBuZXcgYXJ0aWNsZSwgdGhlbiBhcnRpY2xlIGZpZWxkcyB3aWxsIGJlIGFsd2F5cyBlbXB0eSBhdCB0aGUgYmVnaW5uaW5nKQogICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyApIHsKCiAgICAgICAgICAgICAgICAjIGdldCB2YWx1ZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlIGZyb20gVGlja2V0CiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAgICAgJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgPT4gJFNlbGYtPntQYXJhbU9iamVjdH0sCiAgICAgICAgICAgICAgICBBSkFYVXBkYXRlICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVwZGF0YWJsZUZpZWxkcyA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcmludCBmb3JtIC4uLgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICAgICAgVHlwZSAgICAgID0+ICdTbWFsbCcsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIEJvZHlDbGFzcyA9PiAnUG9wdXAnLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICA/ICdWYWxpZGF0ZV9SZXF1aXJlZCcKICAgICAgICAgICAgICAgIDogJycKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MID0+IFwlRHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgICMgV2lkZ2V0IFRpY2tldCBBY3Rpb25zCiAgICBpZiAoCiAgICAgICAgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKQogICAgICAgIHx8CiAgICAgICAgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2V9ICkgICAgIHx8CiAgICAgICAgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHx8CiAgICAgICAgJFNlbGYtPntDb25maWd9LT57VGl0bGV9IHx8CiAgICAgICAgJFNlbGYtPntDb25maWd9LT57UXVldWV9IHx8CiAgICAgICAgJFNlbGYtPntDb25maWd9LT57T3duZXJ9IHx8CiAgICAgICAgJFNlbGYtPntDb25maWd9LT57U3RhdGV9IHx8CiAgICAgICAgJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9CiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1dpZGdldFRpY2tldEFjdGlvbnMnLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGl0bGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkRHluYW1pY0ZpZWxkTmFtZXMgPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKAogICAgICAgIE9ubHlEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgY3JlYXRlIGEgc3RyaW5nIHdpdGggdGhlIHF1b3RlZCBkeW5hbWljIGZpZWxkIG5hbWVzIHNlcGFyYXRlZCBieSBjb21tYXMKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGROYW1lcykgKSB7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7JER5bmFtaWNGaWVsZE5hbWVzfSApIHsKICAgICAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZE5hbWVzU3RyZ30gLj0gIiwgJyIgLiAkRmllbGQgLiAiJyI7CiAgICAgICAgfQogICAgfQoKICAgICMgdHlwZXMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgIG15ICVUeXBlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIENsYXNzID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9LT57VHlwZUlESW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIERhdGEgID0+IFwlVHlwZSwKICAgICAgICAgICAgTmFtZSAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXJ2aWNlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXNldCBwcmV2aW91cyBTZXJ2aWNlSUQgdG8gcmVzZXQgU0xBLUxpc3QgaWYgbm8gc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgIGlmICggISRQYXJhbXtTZXJ2aWNlSUR9IHx8ICEkU2VydmljZXMtPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VJRH0gPSAnJzsKICAgICAgICB9CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U2VydmljZU1hbmRhdG9yeX0gKSB7CgogICAgICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkICcgLiAoICRQYXJhbXtTZXJ2aWNlSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlTWFuZGF0b3J5JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICRQYXJhbXtTZXJ2aWNlSW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U0xBTWFuZGF0b3J5fSApIHsKCiAgICAgICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gKCAkUGFyYW17U0xBSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQU1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTTEEnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntRdWV1ZX0gKSB7CgogICAgICAgICMgZmV0Y2ggYWxsIHF1ZXVlcwogICAgICAgIG15ICVNb3ZlUXVldWVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRNb3ZlTGlzdCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUeXBlICAgICA9PiAnbW92ZV9pbnRvJywKICAgICAgICApOwoKICAgICAgICAjIHNldCBtb3ZlIHF1ZXVlcwogICAgICAgICRQYXJhbXtRdWV1ZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IHsgJU1vdmVRdWV1ZXMsICcnID0+ICctJyB9LAogICAgICAgICAgICBNdWx0aXBsZSAgICAgICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgICA9PiAnTmV3UXVldWVJRCcsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdOZXdRdWV1ZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJFBhcmFte05ld1F1ZXVlSUR9LAogICAgICAgICAgICBUcmVlVmlldyAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIEN1cnJlbnRRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSwKICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdRdWV1ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnM7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnb3duZXInLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgb2xkIG93bmVyCiAgICAgICAgbXkgQE9sZFVzZXJJbmZvID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRPd25lckxpc3QoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgJFBhcmFte093bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte05ld093bmVySUR9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld093bmVySUQnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJFBhcmFte05ld093bmVySW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICBTaXplICAgICAgICAgPT4gMSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgKTsKICAgICAgICBteSBAT2xkT3duZXJzOwogICAgICAgIG15ICVTZWVuT2xkT3duZXI7CiAgICAgICAgaWYgKEBPbGRVc2VySW5mbykgewogICAgICAgICAgICBteSAkQ291bnRlciA9IDE7CiAgICAgICAgICAgIFVTRVI6CiAgICAgICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQE9sZFVzZXJJbmZvICkgewoKICAgICAgICAgICAgICAgICMgc2tpcCBpZiBvbGQgb3duZXIgaXMgYWxyZWFkeSBpbiB0aGUgbGlzdAogICAgICAgICAgICAgICAgbmV4dCBVU0VSIGlmICRTZWVuT2xkT3duZXJ7ICRVc2VyLT57VXNlcklEfSB9OwogICAgICAgICAgICAgICAgJFNlZW5PbGRPd25lcnsgJFVzZXItPntVc2VySUR9IH0gPSAxOwogICAgICAgICAgICAgICAgcHVzaCBAT2xkT3duZXJzLCB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFVzZXItPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICIkQ291bnRlcjogJFVzZXItPntVc2VyRnVsbG5hbWV9IgogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRPbGRPd25lclNlbGVjdGVkSUQgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSAuICcxJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3RyaW5nCiAgICAgICAgJFBhcmFte09sZE93bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBPbGRPd25lcnMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkT2xkT3duZXJTZWxlY3RlZElELAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09sZE93bmVySUQnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJFBhcmFte09sZE93bmVySW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRQYXJhbXtOZXdPd25lclR5cGV9ICYmICRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICkgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6T2xkJ30gPSAnY2hlY2tlZCA9ICJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17J05ld093bmVyVHlwZTo6TmV3J30gPSAnY2hlY2tlZCA9ICJjaGVja2VkIic7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lcicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntSZXNwb25zaWJsZX0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHJlc3BvbnNpYmxlCiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICkgewoKICAgICAgICBteSAlU3RhdGU7CiAgICAgICAgbXkgJVN0YXRlTGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkUGFyYW17TmV3U3RhdGVJRH0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZFZhbHVlfSA9ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdGF0ZXtTZWxlY3RlZElEfSA9ICRQYXJhbXtOZXdTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAgICAgJFBhcmFte1N0YXRlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3U3RhdGVJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ID8gMCA6IDEsCiAgICAgICAgICAgICVTdGF0ZSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgIFNUQVRFSUQ6CiAgICAgICAgZm9yIG15ICRTdGF0ZUlEICggc29ydCBrZXlzICVTdGF0ZUxpc3QgKSB7CgogICAgICAgICAgICBuZXh0IFNUQVRFSUQgaWYgISRTdGF0ZUlEOwoKICAgICAgICAgICAgIyBnZXQgc3RhdGUgZGF0YQogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KCBJRCA9PiAkU3RhdGVJRCApOwoKICAgICAgICAgICAgbmV4dCBTVEFURUlEIGlmICRTdGF0ZURhdGF7VHlwZU5hbWV9ICF+IC9wZW5kaW5nL2k7CgogICAgICAgICAgICAjIGdldCB1c2VkIGNhbGVuZGFyCiAgICAgICAgICAgIG15ICRDYWxlbmRhciA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0Q2FsZW5kYXJHZXQoCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBhcmFte0RhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMCwKICAgICAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgPT4gNSwKICAgICAgICAgICAgICAgIERpZmZUaW1lICAgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpCiAgICAgICAgICAgICAgICAgICAgfHwgMCwKICAgICAgICAgICAgICAgIENsYXNzID0+ICRQYXJhbXtEYXRlSW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFZhbGlkYXRlRGF0ZUluRnV0dXJlID0+IDEsCiAgICAgICAgICAgICAgICBDYWxlbmRhciAgICAgICAgICAgICA9PiAkQ2FsZW5kYXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGVQZW5kaW5nJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGxhc3QgU1RBVEVJRDsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewoKICAgICAgICBteSAlUHJpb3JpdHk7CiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFByaW9yaXR5TGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkVmFsdWV9ID0gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1ByaW9yaXR5SUR9OwogICAgICAgIH0KICAgICAgICAkUHJpb3JpdHl7U2VsZWN0ZWRJRH0gfHw9ICRQYXJhbXtQcmlvcml0eUlEfTsKICAgICAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAlUHJpb3JpdHksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgRW5kIFdpZGdldCBUaWNrZXQgQWN0aW9ucwoKICAgICMgV2lkZ2V0IER5bmFtaWMgRmllbGRzCgogICAgaWYgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXaWRnZXREeW5hbWljRmllbGRzJywKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIG15IEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkczsKIyAtLS0KCiAgICAjIER5bmFtaWMgZmllbGRzCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgcmVtZW1iZXIgZHluYW1pYyBmaWVsZHMgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluZGl2aWR1YWxseQogICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IGVxICdJVFNNSW1wYWN0JyApIHsKICAgICAgICAgICAgcHVzaCBASW5kaXZpZHVhbER5bmFtaWNGaWVsZHMsICREeW5hbWljRmllbGRDb25maWc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgIH0KIyAtLS0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgY3ljbGUgdHJvdWdoIGR5bmFtaWMgZmllbGRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbmRpdmlkdWFsbHkKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQEluZGl2aWR1YWxEeW5hbWljRmllbGRzICkgewoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQoKICAgICMgRW5kIFdpZGdldCBEeW5hbWljIEZpZWxkcwoKICAgICMgV2lkZ2V0IEFydGljbGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CgogICAgICAgICRQYXJhbXtXaWRnZXRTdGF0dXN9ID0gJ0NvbGxhcHNlZCc7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57Tm90ZU1hbmRhdG9yeX0KICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgfHwgJFBhcmFte0lzVXBsb2FkfQogICAgICAgICAgICB8fCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17V2lkZ2V0U3RhdHVzfSA9ICdFeHBhbmRlZCc7CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e05vdGVNYW5kYXRvcnl9CiAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtTdWJqZWN0UmVxdWlyZWR9ID0gJ1ZhbGlkYXRlX1JlcXVpcmVkJzsKICAgICAgICAgICAgJFBhcmFte0JvZHlSZXF1aXJlZH0gICAgPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1N1YmplY3RSZXF1aXJlZH0gPSAnVmFsaWRhdGVfRGVwZW5kaW5nUmVxdWlyZWRBTkQgVmFsaWRhdGVfRGVwZW5kaW5nX0NyZWF0ZUFydGljbGUnOwogICAgICAgICAgICAkUGFyYW17Qm9keVJlcXVpcmVkfSAgICA9ICdWYWxpZGF0ZV9EZXBlbmRpbmdSZXF1aXJlZEFORCBWYWxpZGF0ZV9EZXBlbmRpbmdfQ3JlYXRlQXJ0aWNsZSc7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdXaWRnZXRBcnRpY2xlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhbGwgdXNlciBpZHMgb2YgYWdlbnRzLCB0aGF0IGNhbiBiZSBzaG93biBpbiB0aGlzIGRpYWxvZwogICAgICAgICMgYmFzZWQgb24gcXVldWUgcmlnaHRzCiAgICAgICAgbXkgJVNob3duVXNlcnM7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdub3RlJywKICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgJFNob3duVXNlcnN7JFVzZXJJRH0gPSAkQWxsR3JvdXBzTWVtYmVyc3skVXNlcklEfTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgYW5kIHJldHJpZXZlIGludm9sdmVkIGFuZCBpbmZvcm1lZCBhZ2VudHMgb2YgUmVwbHlUbyBOb3RlCiAgICAgICAgbXkgQFJlcGx5VG9Vc2VyczsKICAgICAgICBteSAlUmVwbHlUb1VzZXJzSGFzaDsKICAgICAgICBteSAlUmVwbHlUb1VzZXJJRHM7CiAgICAgICAgaWYgKCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSApIHsKICAgICAgICAgICAgbXkgQFJlcGx5VG9QYXJ0cyA9ICRTZWxmLT57RW1haWxQYXJzZXJPYmplY3R9LT5TcGxpdEFkZHJlc3NMaW5lKAogICAgICAgICAgICAgICAgTGluZSA9PiAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlQ29udGVudH0tPntUb30gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBSRVBMWVRPUEFSVDoKICAgICAgICAgICAgZm9yIG15ICRTaW5nbGVSZXBseVRvUGFydCAoQFJlcGx5VG9QYXJ0cykgewogICAgICAgICAgICAgICAgbXkgJFJlcGx5VG9BZGRyZXNzID0gJFNlbGYtPntFbWFpbFBhcnNlck9iamVjdH0tPkdldEVtYWlsQWRkcmVzcygKICAgICAgICAgICAgICAgICAgICBFbWFpbCA9PiAkU2luZ2xlUmVwbHlUb1BhcnQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgUkVQTFlUT1BBUlQgaWYgISRSZXBseVRvQWRkcmVzczsKICAgICAgICAgICAgICAgIHB1c2ggQFJlcGx5VG9Vc2VycywgJFJlcGx5VG9BZGRyZXNzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkUmVwbHlUb1VzZXJzSGFzaHskX30rKyBmb3IgQFJlcGx5VG9Vc2VyczsKCiAgICAgICAgICAgICMgZ2V0IHVzZXIgaWRzIG9mIGF2YWlsYWJsZSB1c2VycwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIHNvcnQga2V5cyAlU2hvd25Vc2VycyApIHsKICAgICAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkVXNlckVtYWlsID0gJFVzZXJEYXRhe1VzZXJFbWFpbH07CiAgICAgICAgICAgICAgICBpZiAoICRSZXBseVRvVXNlcnNIYXNoeyRVc2VyRW1haWx9ICkgewogICAgICAgICAgICAgICAgICAgICRSZXBseVRvVXNlcklEc3skVXNlcklEfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIG9yaWdpbmFsIG5vdGUgc2VuZGVyIHRvIGxpc3Qgb2YgdXNlciBpZHMKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IEB7ICRTZWxmLT57UmVwbHlUb1NlbmRlclVzZXJJRH0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGlmIHNlbmRlciByZXBsaWVzIHRvIGhpbXNlbGYsIGRvIG5vdCBpbmNsdWRlIHNlbmRlciBpbiBsaXN0CiAgICAgICAgICAgICAgICBpZiAoICRVc2VySUQgbmUgJFNlbGYtPntVc2VySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRSZXBseVRvVXNlcklEc3skVXNlcklEfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVtb3ZlIHVzZXIgaWQgb2YgYWN0aXZlIHVzZXIKICAgICAgICAgICAgZGVsZXRlICRSZXBseVRvVXNlcklEc3sgJFNlbGYtPntVc2VySUR9IH07CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0luZm9ybUFnZW50fSB8fCAkU2VsZi0+e0NvbmZpZ30tPntJbnZvbHZlZEFnZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9ybUFkZGl0aW9uYWxBZ2VudHMnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGFnZW50cyBmb3IgImludm9sdmVkIGFnZW50cyIKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0ludm9sdmVkQWdlbnR9ICkgewoKICAgICAgICAgICAgbXkgQFVzZXJJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEludm9sdmVkQWdlbnRzTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgQEludm9sdmVkQWdlbnRzOwogICAgICAgICAgICBteSAkQ291bnRlciA9IDE7CgogICAgICAgICAgICBVU0VSOgogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBVc2VySURzICkgewoKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICIkQ291bnRlcjogJFVzZXItPntVc2VyRnVsbG5hbWV9IjsKICAgICAgICAgICAgICAgIGlmICggJFVzZXItPntPdXRPZk9mZmljZU1lc3NhZ2V9ICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSAuPSAiICRVc2VyLT57T3V0T2ZPZmZpY2VNZXNzYWdlfSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBASW52b2x2ZWRBZ2VudHMsIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkVXNlci0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRDb3VudGVyKys7CgogICAgICAgICAgICAgICAgIyBhZGQgaW52b2x2ZWQgdXNlciBhcyBzZWxlY3RlZCBlbnRyaWVzLCBpZiBhdmFpbGFibGUgaW4gUmVwbHlUb0FkZHJlc3NlcyBsaXN0CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57UmVwbHlUb0FydGljbGV9ICYmICRSZXBseVRvVXNlcklEc3sgJFVzZXItPntVc2VySUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSB9LCAkVXNlci0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRSZXBseVRvVXNlcklEc3sgJFVzZXItPntVc2VySUR9IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRJbnZvbHZlZEFnZW50U2l6ZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpJbnZvbHZlZEFnZW50TWF4U2l6ZScpIHx8IDM7CiAgICAgICAgICAgICRQYXJhbXtJbnZvbHZlZEFnZW50U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcQEludm9sdmVkQWdlbnRzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0ludm9sdmVkVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgPT4gJEludm9sdmVkQWdlbnRTaXplLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBibG9jayBpcyBjYWxsZWQgYmVsb3cgImluZm9ybSBhZ2VudHMiCiAgICAgICAgfQoKICAgICAgICAjIGFnZW50IGxpc3QKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0luZm9ybUFnZW50fSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1JlcGx5VG9BcnRpY2xlfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBlbWFpbCBhZGRyZXNzIG9mIGFsbCB1c2VycyBhbmQgY29tcGFyZSB0byByZXBseXRvLWFkZHJlc3NlcwogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVNob3duVXNlcnMgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVwbHlUb1VzZXJJRHN7JFVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHsgJFNlbGYtPntJbmZvcm1Vc2VySUR9IH0sICRVc2VySUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkUmVwbHlUb1VzZXJJRHN7JFVzZXJJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkSW5mb3JtQWdlbnRTaXplID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkluZm9ybUFnZW50TWF4U2l6ZScpCiAgICAgICAgICAgICAgICB8fCAzOwogICAgICAgICAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTZWxmLT57SW5mb3JtVXNlcklEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0luZm9ybVVzZXJJRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgICAgICAgICBTaXplICAgICAgID0+ICRJbmZvcm1BZ2VudFNpemUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpbnZvbHZlZAogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57SW52b2x2ZWRBZ2VudH0gKSB7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52b2x2ZWRBZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgbGlzdCBvZiBhZ2VudHMsIHRoYXQgcmVjZWl2ZSB0aGlzIG5vdGUgKFJlcGx5VG9Ob3RlKQogICAgICAgICMgYXQgbGVhc3Qgc2VuZGVyIG9mIG9yaWdpbmFsIG5vdGUgYW5kIGFsbCByZWNlcGllbnRzIG9mIHRoZSBvcmlnaW5hbCBub3RlCiAgICAgICAgIyB0aGF0IGNvdWxkbid0IGJlIHNlbGVjdGVkIHdpdGggaW52b2x2ZWQvaW5mb3JtIGFnZW50cwogICAgICAgIGlmICggJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gKSB7CgogICAgICAgICAgICBteSAkVXNlcnNIYXNoU2l6ZSA9IGtleXMgJVJlcGx5VG9Vc2VySURzOwogICAgICAgICAgICBteSAkQ291bnRlciAgICAgICA9IDA7CiAgICAgICAgICAgICRQYXJhbXtVc2VyTGlzdFdpdGhvdXRTZWxlY3Rpb259ID0gam9pbiggJywnLCBrZXlzICVSZXBseVRvVXNlcklEcyApOwoKICAgICAgICAgICAgaWYgKCAkVXNlcnNIYXNoU2l6ZSA+IDAgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVJlcGx5VG9Vc2VySURzICkgewogICAgICAgICAgICAgICAgICAgICRDb3VudGVyKys7CgogICAgICAgICAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZ2VudHNXaXRob3V0U2VsZWN0aW9uU2luZ2xlVXNlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIG91dHB1dCBhIHNlcGFyYXRvciAoSW5mb3JtQWdlbnRzV2l0aG91dFNlbGVjdGlvblNpbmdsZVVzZXJTZXBhcmF0b3IpLAogICAgICAgICAgICAgICAgICAgICMgaWYgbm90IGxhc3QgZW50cnkKICAgICAgICAgICAgICAgICAgICBpZiAoICRDb3VudGVyIDwgJFVzZXJzSGFzaFNpemUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmZvcm1BZ2VudHNXaXRob3V0U2VsZWN0aW9uU2luZ2xlVXNlclNlcGFyYXRvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlVXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkU2VsZi0+e0NvbmZpZ30tPntSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57Tm90ZU1hbmRhdG9yeX0KICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N1YmplY3RMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dExhYmVsTWFuZGF0b3J5JywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdWJqZWN0TGFiZWwnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHRMYWJlbCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgc3BlbGwgY2hlY2sKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJTcGVsbENoZWNrZXJ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTcGVsbENoZWNrJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgdGV4dCB0ZW1wbGF0ZSBzdHJpbmcKICAgICAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+e1N0YW5kYXJkVGVtcGxhdGVPYmplY3R9LT5TdGFuZGFyZFRlbXBsYXRlTGlzdCgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgVHlwZSAgPT4gJ05vdGUnLAogICAgICAgICk7CgogICAgICAgIG15ICRRdWV1ZVN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSB8fCAnJywKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgIElzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAgICAgJFF1ZXVlU3RhbmRhcmRUZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICB8fCAoICRTZWxmLT57Q29uZmlnfS0+e1F1ZXVlfSAmJiBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdGFuZGFyZFRlbXBsYXRlcyApICkKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFF1ZXVlU3RhbmRhcmRUZW1wbGF0ZXMgICAgfHwge30sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSB8fCAnJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGFuZGFyZFRlbXBsYXRlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXR0YWNobWVudHMKICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkQXR0YWNobWVudCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgQXJ0aWNsZVR5cGVJRCBzdHJpbmcKICAgICAgICBteSAlQXJ0aWNsZVR5cGU7CgogICAgICAgICMgc2V0IGFydGljbGUgdHlwZSBvZiB0aGlzIG5vdGUgdG8gdGhlIHNhbWUgdHlwZSBhcyB0aGUgYXJ0aWNsZSBmb3Igd2hvbSB0aGlzIGlzIHRoZSByZXBseQogICAgICAgIGlmICggJFNlbGYtPntSZXBseVRvQXJ0aWNsZX0gJiYgISRQYXJhbXtBcnRpY2xlVHlwZUlEfSApIHsKICAgICAgICAgICAgJEFydGljbGVUeXBle1NlbGVjdGVkSUR9ID0gJFNlbGYtPntSZXBseVRvQXJ0aWNsZUNvbnRlbnR9e0FydGljbGVUeXBlSUR9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICEkUGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZFZhbHVlfSA9ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlRGVmYXVsdH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17QXJ0aWNsZVR5cGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwb3NzaWJsZSBub3RlcwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVzfSApIHsKICAgICAgICAgICAgbXkgJURlZmF1bHROb3RlVHlwZXMgPSAleyAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZXN9IH07CiAgICAgICAgICAgIG15ICVOb3RlVHlwZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVUeXBlTGlzdCggUmVzdWx0ID0+ICdIQVNIJyApOwogICAgICAgICAgICBmb3IgbXkgJEtleU5vdGVUeXBlICggc29ydCBrZXlzICVOb3RlVHlwZXMgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkRGVmYXVsdE5vdGVUeXBlc3sgJE5vdGVUeXBlc3skS2V5Tm90ZVR5cGV9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICROb3RlVHlwZXN7JEtleU5vdGVUeXBlfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte0FydGljbGVUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJU5vdGVUeXBlcywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVUeXBlSUQnLAogICAgICAgICAgICAgICAgJUFydGljbGVUeXBlLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWwnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgRW5kIFdpZGdldCBBcnRpY2xlCgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtCiAgICApOwp9CgpzdWIgX0dldE5leHRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlTmV4dFN0YXRlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gXCVOZXh0U3RhdGVzOwp9CgpzdWIgX0dldFJlc3BvbnNpYmxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgc2hvdyBhbGwgdXNlcnMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgIH0KCiAgICAjIHNob3cgb25seSB1c2VycyB3aXRoIHJlc3BvbnNpYmxlIG9yIHJ3IHBlbWlzc2lvbnMgaW4gdGhlIHF1ZXVlCiAgICBlbHNpZiAoICRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte0FsbFVzZXJzfSApIHsKICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCgKICAgICAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17TmV3UXVldWVJRH0gfHwgJFBhcmFte1F1ZXVlSUR9CiAgICAgICAgKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAncmVzcG9uc2libGUnLAogICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpIH0gaWYgJEFDTDsKCiAgICByZXR1cm4gXCVTaG93blVzZXJzOwp9CgpzdWIgX0dldE93bmVycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJVNob3duVXNlcnM7CiAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICAjIHNob3cgYWxsIHVzZXJzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IG9ubHkgdXNlcnMgd2l0aCBvd25lciBvciBydyBwZW1pc3Npb25zIGluIHRoZSBxdWV1ZQogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFBhcmFte05ld1F1ZXVlSUR9IHx8ICRQYXJhbXtRdWV1ZUlEfQogICAgICAgICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgIENhY2hlZCAgPT4gMSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHdvcmtmbG93CiAgICBteSAkQUNMID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnTmV3T3duZXInLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4geyAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRPbGRPd25lcnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15IEBPbGRVc2VySW5mbyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0T3duZXJMaXN0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgbXkgJVVzZXJIYXNoOwogICAgaWYgKEBPbGRVc2VySW5mbykgewogICAgICAgIG15ICRDb3VudGVyID0gMTsKICAgICAgICBVU0VSOgogICAgICAgIGZvciBteSAkVXNlciAoIHJldmVyc2UgQE9sZFVzZXJJbmZvICkgewoKICAgICAgICAgICAgbmV4dCBVU0VSIGlmICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH07CgogICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJGdWxsbmFtZX0iOwogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIHdvcmtmbG93CiAgICBteSAkQUNMID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnT2xkT3duZXInLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVVc2VySGFzaCwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIHsgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVVzZXJIYXNoOwp9CgpzdWIgX0dldFNlcnZpY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2U7CgogICAgIyBnZXQgb3B0aW9ucyBmb3IgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgdW5rbm93biBjdXN0b21lcnMKICAgIG15ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgY2hlY2sgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2VsZWN0ZWQKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMCBsZWF2ZSBDdXN0b21lclVzZXJJRCBlbXB0eSwgaXQgd2lsbCBub3QgZ2V0IGFueSBzZXJ2aWNlcwogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAxIHNldCBDdXN0b21lclVzZXJJRCB0byBnZXQgZGVmYXVsdCBzZXJ2aWNlcwogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGlmIG5vbiBzZXQgY3VzdG9tZXJzIGNhbiBnZXQgZGVmYXVsdCBzZXJ2aWNlcyB0aGVuIHRoZXkgc2hvdWxkIGFsc28gYmUgYWJsZSB0byBnZXQgdGhlIFNMQXMKICAgICMgIGZvciB0aG9zZSBzZXJ2aWNlcyAodGhpcyB3b3JrcyBkdXJpbmcgdGlja2V0IGNyZWF0aW9uKS4KICAgICMgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2V0LCBUaWNrZXRTTEFMaXN0IHdpbGwgY29tcGxhaW4gZHVyaW5nIEFKQVggdXBkYXRlcyBhcyBVc2VySUQgaXMgbm90CiAgICAjICBwYXNzZWQuIFNlZSBidWcgMTExNDcuCgogICAgIyBnZXQgb3B0aW9ucyBmb3IgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgdW5rbm93biBjdXN0b21lcnMKICAgIG15ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgY2hlY2sgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2VsZWN0ZWQKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMCBsZWF2ZSBDdXN0b21lclVzZXJJRCBlbXB0eSwgaXQgd2lsbCBub3QgZ2V0IGFueSBzZXJ2aWNlcwogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAxIHNldCBDdXN0b21lclVzZXJJRCB0byBnZXQgZGVmYXVsdCBzZXJ2aWNlcwogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgIG15ICVTTEE7CiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlU0xBOwp9CgpzdWIgX0dldFByaW9yaXRpZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlUHJpb3JpdGllcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICVQYXJhbSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgKTsKICAgIGlmICggISRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5RGVmYXVsdH0gKSB7CiAgICAgICAgJFByaW9yaXRpZXN7Jyd9ID0gJy0nOwogICAgfQogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRGaWVsZHNUb1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBVcGRhdGFibGVGaWVsZHM7CgogICAgIyBzZXQgdGhlIGZpZWxkcyB0aGF0IGNhbiBiZSB1cGRhdGVhYmxlIHZpYSBBSkFYVXBkYXRlCiAgICBpZiAoICEkUGFyYW17T25seUR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgIEBVcGRhdGFibGVGaWVsZHMgPSBxdygKICAgICAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBOZXdPd25lcklEIE9sZE93bmVySUQgTmV3UmVzcG9uc2libGVJRCBOZXdTdGF0ZUlECiAgICAgICAgICAgIE5ld1ByaW9yaXR5SUQKICAgICAgICApOwogICAgfQoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gXEBVcGRhdGFibGVGaWVsZHM7Cn0KCnN1YiBfR2V0UXVvdGVkUmVwbHlCb2R5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgICAgIGlmICggJFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAkUGFyYW17Qm9keX0gPX4gcy9cdC8gL2c7CiAgICAgICAgICAgIG15ICRRdW90ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIFRleHQgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlF1b3RlJykgfHwgJycsCiAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFF1b3RlKSB7CgogICAgICAgICAgICAgICAgIyBxdW90ZSB0ZXh0CiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAiPGJsb2NrcXVvdGUgdHlwZT1cImNpdGVcIj4kUGFyYW17Qm9keX08L2Jsb2NrcXVvdGU+XG4iOwoKICAgICAgICAgICAgICAgICMgY2xlYW51cCBub3QgY29tcGF0LiB0YWdzCiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0RG9jdW1lbnRDbGVhbnVwKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRSZXNwb25zZUZvcm1hdCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+Rm9ybWF0VGltZVN0cmluZyggJFBhcmFte0NyZWF0ZWR9LCAnRGF0ZUZvcm1hdCcsICdOb1NlY29uZHMnICk7CiAgICAgICAgICAgICAgICAkUmVzcG9uc2VGb3JtYXQgLj0gJyAtICcgLiAkUGFyYW17RnJvbX0gLiAnICc7CiAgICAgICAgICAgICAgICAkUmVzcG9uc2VGb3JtYXQKICAgICAgICAgICAgICAgICAgICAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnd3JvdGUnKSAuICc6JzsKCiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkUmVzcG9uc2VGb3JtYXQgLiAkUGFyYW17Qm9keX07CgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gIjxici8+IiAuICRQYXJhbXtCb2R5fTsKCiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtDcmVhdGVkfSApIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRGF0ZScpIC4KICAgICAgICAgICAgICAgICAgICAgICAgIjogJFBhcmFte0NyZWF0ZWR9PGJyLz4iIC4gJFBhcmFte0JvZHl9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvciAocXcoU3ViamVjdCBSZXBseVRvIFJlcGx5LVRvIENjIFRvIEZyb20pKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkXykgLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogJFBhcmFteyRffTxici8+IiAuICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEZyb20gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RnJvbX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICRNZXNzYWdlRnJvbSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdNZXNzYWdlIGZyb20nKTsKICAgICAgICAgICAgICAgIG15ICRFbmRNZXNzYWdlICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdFbmQgbWVzc2FnZScpOwoKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9ICI8YnIvPi0tLS0gJE1lc3NhZ2VGcm9tICRGcm9tIC0tLTxici8+PGJyLz4iIC4gJFBhcmFte0JvZHl9OwogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9IC49ICI8YnIvPi0tLS0gJEVuZE1lc3NhZ2UgLS0tPGJyLz4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgcHJlcGFyZSBib2R5LCBzdWJqZWN0LCBSZXBseVRvIC4uLgogICAgICAgICMgcmV3cmFwIGJvZHkgaWYgZXhpc3RzCiAgICAgICAgaWYgKCAkUGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9fiBzL1x0LyAvZzsKICAgICAgICAgICAgbXkgJFF1b3RlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlF1b3RlJyk7CiAgICAgICAgICAgIGlmICgkUXVvdGUpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9fiBzL1xuL1xuJFF1b3RlIC9nOwogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gIlxuJFF1b3RlICIgLiAkUGFyYW17Qm9keX07CgogICAgICAgICAgICAgICAgbXkgJFJlc3BvbnNlRm9ybWF0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9CiAgICAgICAgICAgICAgICAgICAgLT5Gb3JtYXRUaW1lU3RyaW5nKCAkUGFyYW17Q3JlYXRlZH0sICdEYXRlRm9ybWF0JywgJ05vU2Vjb25kcycgKTsKICAgICAgICAgICAgICAgICRSZXNwb25zZUZvcm1hdCAuPSAnIC0gJyAuICRQYXJhbXtGcm9tfSAuICcgJzsKICAgICAgICAgICAgICAgICRSZXNwb25zZUZvcm1hdAogICAgICAgICAgICAgICAgICAgIC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCd3cm90ZScpIC4gIjpcbiI7CgogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gJFJlc3BvbnNlRm9ybWF0IC4gJFBhcmFte0JvZHl9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte0JvZHl9ID0gIlxuIiAuICRQYXJhbXtCb2R5fTsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte0NyZWF0ZWR9ICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdEYXRlJykgLgogICAgICAgICAgICAgICAgICAgICAgICAiOiAkUGFyYW17Q3JlYXRlZH1cbiIgLiAkUGFyYW17Qm9keX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZm9yIChxdyhTdWJqZWN0IFJlcGx5VG8gUmVwbHktVG8gQ2MgVG8gRnJvbSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRfKSAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiAkUGFyYW17JF99XG4iIC4gJFBhcmFte0JvZHl9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkTWVzc2FnZUZyb20gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTWVzc2FnZSBmcm9tJyk7CiAgICAgICAgICAgICAgICBteSAkRW5kTWVzc2FnZSAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRW5kIG1lc3NhZ2UnKTsKCiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gPSAiXG4tLS0tICRNZXNzYWdlRnJvbSAkUGFyYW17RnJvbX0gLS0tXG5cbiIgLiAkUGFyYW17Qm9keX07CiAgICAgICAgICAgICAgICAkUGFyYW17Qm9keX0gLj0gIlxuLS0tLSAkRW5kTWVzc2FnZSAtLS1cbiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtCb2R5fTsKfQoKc3ViIF9HZXRTdGFuZGFyZFRlbXBsYXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNyZWF0ZSB0ZW1wbGF0ZXMKICAgIG15ICVUZW1wbGF0ZXM7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgIG15ICRRdWV1ZUlEID0gJFBhcmFte1F1ZXVlSUR9IHx8ICcnOwogICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICYmICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZ2V0IFF1ZXVlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUXVldWVJRCA9ICRUaWNrZXR7UXVldWVJRH0gfHwgJyc7CiAgICB9CgogICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Tm90ZX0gKTsKCiAgICAjIHJldHVybiBqdXN0IHRoZSB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gJFN0YW5kYXJkVGVtcGxhdGVze05vdGV9Owp9CgpzdWIgX0dldFR5cGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVUeXBlOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0QWRkdGxJVFNNRmllbGQucG0gLSBhZGRpdGlvbmFsIGl0c20gZmllbGRzIGZvciB0aWNrZXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgojIC0tLQojIElUU00KIyAtLS0KI3BhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEZyZWVUZXh0OwpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDsKCiMgLS0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgYmFzZSBxdyggS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEFjdGlvbkNvbW1vbiApOwoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RGVjaXNpb24ucG0gLSB0byBhZGQgbm90ZXMgKGRlY2lzaW9uKSB0byBhIHRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldERlY2lzaW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIGJhc2UgcXcoIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRBY3Rpb25Db21tb24gKTsKCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RW1haWwucG0gLSB0byBjb21wb3NlIGluaXRpYWwgZW1haWwgdG8gY3VzdG9tZXIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvNDc4ZWU2NjVjNTM1YjY4MDI5Y2VkNGRjYTE5N2I1MjM1YjdiMTkyZi9LZXJuZWwvTW9kdWxlcy9BZ2VudFRpY2tldEVtYWlsLnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRFbWFpbDsKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpEQk9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBNYWlsOjpBZGRyZXNzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlsczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZTsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKIyAtLS0KCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntEZWJ1Z30gPSAkUGFyYW17RGVidWd9IHx8IDA7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICROZWVkZWQgKAogICAgICAgIHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IFF1ZXVlT2JqZWN0IE1haW5PYmplY3QgQ29uZmlnT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntTeXN0ZW1BZGRyZXNzfSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57QmFja2VuZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhbmRhcmRUZW1wbGF0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZS0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfSA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsgJ1RpY2tldCcsICdBcnRpY2xlJyBdLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CgogICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgaWYgKCAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gJiYgJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICF+IC9BY3Rpb249QWdlbnRUaWNrZXRFbWFpbC8gKSB7CiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBUbyBDYyBCY2MgVGltZVVuaXRzIFByaW9yaXR5SUQgU3ViamVjdCBCb2R5CiAgICAgICAgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBPd25lckFsbCBSZXNwb25zaWJsZUFsbCBOZXdSZXNwb25zaWJsZUlEIE5ld1VzZXJJRAogICAgICAgIE5leHRTdGF0ZUlEIFN0YW5kYXJkVGVtcGxhdGVJRAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CgogICAgIyBBQ0wgY29tcGF0aWJpbGl0eSB0cmFuc2xhdGlvbgogICAgbXkgJUFDTENvbXBhdEdldFBhcmFtOwogICAgJEFDTENvbXBhdEdldFBhcmFte093bmVySUR9ID0gJEdldFBhcmFte05ld1VzZXJJRH07CgogICAgIyBJZiBpcyBhbiBhY3Rpb24gYWJvdXQgYXR0YWNobWVudHMKICAgIG15ICRJc1VwbG9hZCA9ICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudFVwbG9hZCcgKSA/IDEgOiAwICk7CgogICAgIyBoYXNoIGZvciBjaGVjayBkdXBsaWNhdGVkIGVudHJpZXMKICAgIG15ICVBZGRyZXNzZXNMaXN0OwoKICAgICMgTXVsdGlwbGVDdXN0b21lciBUby1maWVsZAogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXI7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRDb3VudGVyVG9DdXN0b21lcicgKSB8fCAwOwogICAgbXkgJFNlbGVjdGVkID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJTZWxlY3RlZCcgKSB8fCAnJzsKCiAgICBpZiAoJEN1c3RvbWVyc051bWJlcikgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAxOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uLiAkQ3VzdG9tZXJzTnVtYmVyICkgewogICAgICAgICAgICBteSAkQ3VzdG9tZXJFbGVtZW50ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJUaWNrZXRUZXh0XycgLiAkQ291bnQgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyU2VsZWN0ZWQgPSAoICRTZWxlY3RlZCBlcSAkQ291bnQgPyAnY2hlY2tlZD0iY2hlY2tlZCInIDogJycgKTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJLZXlfJyAuICRDb3VudCApCiAgICAgICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgICAgIGlmICgkQ3VzdG9tZXJFbGVtZW50KSB7CgogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gLj0gJywgJyAuICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvciAgICA9ICcnOwogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDb3VudEF1eCAgICAgICAgID0gJEN1c3RvbWVyQ291bnRlcisrOwoKICAgICAgICAgICAgICAgIGlmICggISRJc1VwbG9hZCApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnQpICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gJiYgJEN1c3RvbWVyRXJyb3IgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIE11bHRpcGxlQ3VzdG9tZXIgQ2MtZmllbGQKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQ2M7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyQ2MgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJDY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJDYykgewogICAgICAgIG15ICRDdXN0b21lckNvdW50ZXJDYyA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXJDYyApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudENjID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2NDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXlDYyAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDY0N1c3RvbWVyS2V5XycgLiAkQ291bnQgKQogICAgICAgICAgICAgICAgfHwgJyc7CgogICAgICAgICAgICBpZiAoJEN1c3RvbWVyRWxlbWVudENjKSB7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0NjID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yQ2MgICAgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckRpc2FibGVkQ2MgPSAnJzsKICAgICAgICAgICAgICAgIG15ICRDb3VudEF1eENjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKCiAgICAgICAgICAgICAgICBpZiAoICEkSXNVcGxvYWQgKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0NjfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudENjOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0NjfSA9ICRDdXN0b21lckVsZW1lbnRDYzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQ3VzdG9tZXJFbGVtZW50Q2MpICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnQ2MgPSAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRXJyb3JUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvckNjID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gJiYgJEN1c3RvbWVyRXJyb3JDYyBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2dDYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQ2MgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvckNjIG5lICcnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZENjID0gJ2Rpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXhDYyAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lckNjLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXhDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnRDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSAgICAgID0+ICRDdXN0b21lcktleUNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3JDYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnQ2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAkQ3VzdG9tZXJEaXNhYmxlZENjLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRDY30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgTXVsdGlwbGVDdXN0b21lciBCY2MtZmllbGQKICAgIG15IEBNdWx0aXBsZUN1c3RvbWVyQmNjOwogICAgbXkgJEN1c3RvbWVyc051bWJlckJjYyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVGlja2V0Q291bnRlckJjY0N1c3RvbWVyJyApIHx8IDA7CgogICAgaWYgKCRDdXN0b21lcnNOdW1iZXJCY2MpIHsKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyQmNjID0gMTsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLi4gJEN1c3RvbWVyc051bWJlckJjYyApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRWxlbWVudEJjYyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0JjY0N1c3RvbWVyVGlja2V0VGV4dF8nIC4gJENvdW50ICk7CiAgICAgICAgICAgIG15ICRDdXN0b21lcktleUJjYyAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdCY2NDdXN0b21lcktleV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnRCY2MpIHsKCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZEJjYyA9ICcnOwogICAgICAgICAgICAgICAgbXkgJENvdW50QXV4QmNjICAgICAgICAgPSAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvckJjYyAgICA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJElzVXBsb2FkICkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtCY2N9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17QmNjfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCY2N9ID0gJEN1c3RvbWVyRWxlbWVudEJjYzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSgkQ3VzdG9tZXJFbGVtZW50QmNjKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpICkgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQmNjID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnRCY2N9ICYmICRDdXN0b21lckVycm9yQmNjIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZ0JjYyA9ICdJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yQmNjICAgID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyRXJyb3JCY2MgbmUgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckRpc2FibGVkQmNjID0gJ2Rpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXhCY2MgICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1c2ggQE11bHRpcGxlQ3VzdG9tZXJCY2MsIHsKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eEJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgID0+ICRDdXN0b21lckVsZW1lbnRCY2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXlCY2MsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvckJjYywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnQmNjLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWRCY2MsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudEJjY30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGFuIGVtcHR5IHZhbHVlIGlmIG5vdCBkZWZpbmVkCiAgICAkR2V0UGFyYW17Q2N9ICA9ICcnIGlmICFkZWZpbmVkICRHZXRQYXJhbXtDY307CiAgICAkR2V0UGFyYW17QmNjfSA9ICcnIGlmICFkZWZpbmVkICRHZXRQYXJhbXtCY2N9OwoKICAgICMgZ2V0IER5bmFtaWMgZmllbGRzIGZvcm0gUGFyYW1PYmplY3QKICAgIG15ICVEeW5hbWljRmllbGRWYWx1ZXM7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyB0byBzdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBkeW5hbWljIGZpZWxkIGZvciB0aGUgaW1wYWN0CiAgICBteSAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnOwojIC0tLQoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3JtIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFNlbGYtPntQYXJhbU9iamVjdH0sCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBpbXBhY3QgZmllbGQgd2FzIGZvdW5kCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gZXEgJ0lUU01JbXBhY3QnICkgewoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbXBhY3QgZmllbGQKICAgICAgICAgICAgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZyA9ICREeW5hbWljRmllbGRDb25maWc7CiAgICAgICAgfQojIC0tLQogICAgfQoKICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICBteSAlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGQ7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnUHJpb3JpdHlSQycpOwogICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSAgICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnKSB8fCAnJzsKCiAgICAjIGNoZWNrIGlmIHByaW9yaXR5IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZAogICAgaWYgKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnIHx8ICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0JyApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgIG15ICVTZXJ2aWNlOwogICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKCiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgSW5jaWRlbnRTdGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTaG93SW5jaWRlbnRTdGF0ZX0gfHwgMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWNhbGN1bGF0ZSBpbXBhY3QgaWYgaW1wYWN0IGlzIG5vdCBzZXQgdW50aWwgbm93CiAgICAgICAgaWYgKCAhJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAmJiAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IG5lICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcgKSB7CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICAgICBteSAkRGVmYXVsdFNlbGVjdGlvbiA9ICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfTsKCiAgICAgICAgICAgIGlmICgkRGVmYXVsdFNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgaW1wYWN0CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJERlZmF1bHRTZWxlY3Rpb247CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gJiYgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHl9LAogICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgIH0KICAgIH0KCiAgICAjIG5vIHNlcnZpY2Ugd2FzIHNlbGVjdGVkCiAgICBlbHNlIHsKCiAgICAgICAgIyBkbyBub3Qgc2hvdyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24KICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gPSAnJzsKCiAgICAgICAgIyBzaG93IG9ubHkgdGhlIGVtcHR5IHNlbGVjdGlvbgogICAgICAgICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57UG9zc2libGVWYWx1ZXN9ID0ge307CiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSA9ICcnOwogICAgfQoKICAgICMgc2V0IHRoZSBzZWxlY3RlZCBpbXBhY3QKICAgICREeW5hbWljRmllbGRWYWx1ZXN7SVRTTUltcGFjdH0gPSAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9OwojIC0tLQoKICAgICMgdHJhbnNmb3JtIHBlbmRpbmcgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgaWYgKAogICAgICAgIGRlZmluZWQgJEdldFBhcmFte1llYXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TW9udGh9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RGF5fQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0hvdXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TWludXRlfQogICAgICAgICkKICAgIHsKICAgICAgICAlR2V0UGFyYW0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZm9ybURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSB8fCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NyZWF0ZWQnICkgewoKICAgICAgICAjIGhlYWRlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGlmIHRoZXJlIGlzIG5vIHRpY2tldCBpZCEKICAgICAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSB8fCAoICRTZWxmLT57VGlja2V0SUR9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSApIHsKCiAgICAgICAgICAgICMgbm90aWZ5IGluZm8KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ1RpY2tldCAiJXMiIGNyZWF0ZWQhJywKICAgICAgICAgICAgICAgICAgICAgICAgJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgTGluayA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAgICAgLiAnQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0nCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgICAgIG15ICVVc2VyUHJlZmVyZW5jZXMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHN0b3JlIHRoZSBkeW5hbWljIGZpZWxkcyBkZWZhdWx0IHZhbHVlcyBvciB1c2VkIHNwZWNpZmljIGRlZmF1bHQgdmFsdWVzIHRvIGJlIHVzZWQgYXMKICAgICAgICAgICAgIyBBQ0xzIGluZm8gZm9yIGFsbCBmaWVsZHMKICAgICAgICAgICAgbXkgJUR5bmFtaWNGaWVsZERlZmF1bHRzOwoKICAgICAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30gKTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCB2YWx1ZSBmcm9tIGR5bmFtaWMgZmllbGQgY29uZmlnIChpZiBhbnkpCiAgICAgICAgICAgICAgICBteSAkRGVmYXVsdFZhbHVlID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9IHx8ICcnOwoKICAgICAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIHZhbHVlIGZyb20gdXNlciBwcmVmZXJlbmNlcyBpZiBpcyBzZXQKICAgICAgICAgICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgICAgICREZWZhdWx0VmFsdWUgPSAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJERlZmF1bHRWYWx1ZSBlcSAnJzsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxECiAgICAgICAgICAgICAgICAgICAgaWYgcmVmICREZWZhdWx0VmFsdWUgZXEgJ0FSUkFZJyAmJiAhSXNBcnJheVJlZldpdGhEYXRhKCREZWZhdWx0VmFsdWUpOwoKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGREZWZhdWx0c3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRGVmYXVsdFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGREZWZhdWx0czsKCiAgICAgICAgICAgICMgZ2V0IHNwbGl0IGFydGljbGUgaWYgZ2l2ZW4KICAgICAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgdG8gc3RvcmUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIGRhdGFiYXNlIChvciB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICBteSAkVmFsdWU7CgogICAgICAgICAgICAgICAgIyBvdmVycmlkZSB0aGUgdmFsdWUgZnJvbSB1c2VyIHByZWZlcmVuY2VzIGlmIGlzIHNldAogICAgICAgICAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlID0gJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9PSAyLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LAogICAgICAgICAgICAgICAgICAgIEFKQVhVcGRhdGUgICAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVwZGF0YWJsZUZpZWxkcyA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcQogICAgICAgICAgICAgICAgJ0hBU0gnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICAgICAgICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbWV0ZXJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGFuZCBmb3JtYXQgZGVmYXVsdCBzdWJqZWN0IGFuZCBib2R5CiAgICAgICAgICAgIG15ICRTdWJqZWN0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRCb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRCb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEJvZHksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tFbWFpbE5ldygKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZXMgPT4gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8IDEKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBQcmlvcml0aWVzID0+ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAxCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVHlwZXMgPT4gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAxCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgU2VydmljZXMgICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgU0xBcyAgICAgICAgICAgICAgPT4gJFNMQXMsCiAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlcyA9PiAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8ICcnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFVzZXJzID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJzID0+ICRTZWxmLT5fR2V0UmVzcG9uc2libGVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgRnJvbUxpc3QgPT4gJFNlbGYtPl9HZXRUb3MoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBUbyAgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgID0+ICRTdWJqZWN0LAogICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgPT4gJEJvZHksCiAgICAgICAgICAgICAgICBDdXN0b21lcklEICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEYXRhICAgICAgPT4ge30sCiAgICAgICAgICAgICAgICBUaW1lVW5pdHNSZXF1aXJlZCA9PiAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICAgICA/ICdWYWxpZGF0ZV9SZXF1aXJlZCcKICAgICAgICAgICAgICAgICAgICA6ICcnCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCAgICA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgID0+IFxATXVsdGlwbGVDdXN0b21lciwKICAgICAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJDYyAgPT4gXEBNdWx0aXBsZUN1c3RvbWVyQ2MsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQmNjID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIGRlbGl2ZXIgc2lnbmF0dXJlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2lnbmF0dXJlJyApIHsKICAgICAgICBteSAkUXVldWVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1F1ZXVlSUQnICk7CiAgICAgICAgaWYgKCAhJFF1ZXVlSUQgKSB7CiAgICAgICAgICAgIG15ICREZXN0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICAgICAgKCRRdWV1ZUlEKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0YXJ0IHdpdGggZW1wdHkgc2lnbmF0dXJlIChubyBxdWV1ZSBzZWxlY3RlZCkgLSBpZiB3ZSBoYXZlIGEgcXVldWUsIGdldCB0aGUgc2lnLgogICAgICAgIG15ICRTaWduYXR1cmUgPSAnJzsKICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRTZWxmLT5fR2V0U2lnbmF0dXJlKCBRdWV1ZUlEID0+ICRRdWV1ZUlEICk7CiAgICAgICAgfQogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSAgPSAndGV4dC9odG1sJzsKICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkTWltZVR5cGUgLiAnOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJFNpZ25hdHVyZSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgdGlja2V0IGFuZCBhcnRpY2xlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU3RvcmVOZXcnICkgewoKICAgICAgICBteSAlRXJyb3I7CiAgICAgICAgbXkgJE5leHRTdGF0ZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV4dFN0YXRlSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJVN0YXRlRGF0YTsKICAgICAgICBpZiAoJE5leHRTdGF0ZUlEKSB7CiAgICAgICAgICAgICVTdGF0ZURhdGEgPSAkU2VsZi0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkTmV4dFN0YXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICROZXh0U3RhdGUgICAgICAgID0gJFN0YXRlRGF0YXtOYW1lfTsKICAgICAgICBteSAkTmV3UmVzcG9uc2libGVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05ld1Jlc3BvbnNpYmxlSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJE5ld1VzZXJJRCAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdVc2VySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJERlc3QgICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwoKICAgICAgICAjIHNlZSBpZiBvbmx5IGEgbmFtZSBoYXMgYmVlbiBwYXNzZWQKICAgICAgICBpZiAoICREZXN0ICYmICREZXN0ICF+IG17IFxBIChcZCspPyBcfCBcfCAuKyBceiB9eG1zICkgewoKICAgICAgICAgICAgIyBzZWUgaWYgd2UgY2FuIGdldCBhbiBJRCBmb3IgdGhpcyBxdWV1ZSBuYW1lCiAgICAgICAgICAgIG15ICREZXN0SUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkRGVzdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkRGVzdElEKSB7CiAgICAgICAgICAgICAgICAkRGVzdCA9ICREZXN0SUQgLiAnfHwnIC4gJERlc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGVzdCA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAoICROZXdRdWV1ZUlELCAkRnJvbSApID0gc3BsaXQoIC9cfFx8LywgJERlc3QgKTsKICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgJEdldFBhcmFte093bmVyQWxsfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAlUXVldWUgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0U3lzdGVtQWRkcmVzcyggUXVldWVJRCA9PiAkTmV3UXVldWVJRCApOwogICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkUXVldWV7RW1haWx9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VuZGVyIHF1ZXVlIGZyb20KICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCROZXdRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSggUXVldWVJRCA9PiAkTmV3UXVldWVJRCApOwogICAgICAgIH0KICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ByZVNlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICRDdXN0b21lcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJJRCcgKSB8fCAnJzsKICAgICAgICBteSAkU2VsZWN0ZWRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRXhwYW5kQ3VzdG9tZXJOYW1lJyApCiAgICAgICAgICAgIHx8IDA7CiAgICAgICAgbXkgJUZyb21FeHRlcm5hbEN1c3RvbWVyOwogICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcmVTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ICAgICAgICAgICAgPSAkTmV3UXVldWVJRDsKICAgICAgICAkR2V0UGFyYW17RXhwYW5kQ3VzdG9tZXJOYW1lfSA9ICRFeHBhbmRDdXN0b21lck5hbWU7CgogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnT3duZXJBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnUmVzcG9uc2libGVBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xlYXJUbycgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICcnOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICROdW1iZXIgKCAxIC4uIDIgKSB7CiAgICAgICAgICAgIG15ICRJdGVtID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiRXhwYW5kQ3VzdG9tZXJOYW1lJE51bWJlciIgKSB8fCAwOwogICAgICAgICAgICBpZiAoICROdW1iZXIgPT0gMSAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJE51bWJlciA9PSAyICYmICRJdGVtICkgewogICAgICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCBkZWxldGUKICAgICAgICBteSBAQXR0YWNobWVudElEcyA9IG1hcCB7CiAgICAgICAgICAgIG15ICgkSUQpID0gJF8gPX4gbXsgXEEgQXR0YWNobWVudERlbGV0ZSAoXGQrKSBceiB9eG1zOwogICAgICAgICAgICAkSUQgPyAkSUQgOiAoKTsKICAgICAgICB9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciBteSAkQ291bnQgKCByZXZlcnNlIHNvcnQgQEF0dGFjaG1lbnRJRHMgKSB7CiAgICAgICAgICAgIG15ICREZWxldGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBdHRhY2htZW50RGVsZXRlJENvdW50IiApOwogICAgICAgICAgICBuZXh0IENPVU5UIGlmICEkRGVsZXRlOwogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudERlbGV0ZX0gPSAxOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJENvdW50LAogICAgICAgICAgICApOwogICAgICAgICAgICAkSXNVcGxvYWQgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IHVwbG9hZAogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudFVwbG9hZCcgKSApIHsKICAgICAgICAgICAgJElzVXBsb2FkICAgICAgICAgICAgICAgID0gMTsKICAgICAgICAgICAgJUVycm9yICAgICAgICAgICAgICAgICAgID0gKCk7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSA9IDE7CiAgICAgICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgaHRtbCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyAlRmlsdGVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQ7CgogICAgICAgICAgICAjIGRvIG5vdCB2YWxpZGF0ZSBvbiBhdHRhY2htZW50IHVwbG9hZAogICAgICAgICAgICBpZiAoICEkSXNVcGxvYWQgJiYgISRFeHBhbmRDdXN0b21lck5hbWUgKSB7CgogICAgICAgICAgICAgICAgJFZhbGlkYXRpb25SZXN1bHQgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PgogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRWYWxpZGF0aW9uUmVzdWx0KSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSEiLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgICAgIFNlcnZlckVycm9yICA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSAgfHwgJycsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gJFZhbGlkYXRpb25SZXN1bHQtPntFcnJvck1lc3NhZ2V9IHx8ICcnLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fSwKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkU2VsZi0+e1BhcmFtT2JqZWN0fSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGUgICA9PiAxLAogICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzID0+ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgRXhwYW5kIEN1c3RvbWVyIE5hbWUKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YTsKICAgICAgICBpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMSApIHsKCiAgICAgICAgICAgICMgc2VhcmNoIGN1c3RvbWVyCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0OwogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYganVzdCBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMKICAgICAgICAgICAgIyBpZiBqdXN0IG9uZSwgZmlsbHVwIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID0gMDsKICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJLZXkgKCBzb3J0IGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSsrOwogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0fSAgICAgPSAkQ3VzdG9tZXJVc2VyTGlzdHskQ3VzdG9tZXJVc2VyS2V5fTsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9ID0gJEN1c3RvbWVyVXNlcktleTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID09IDEgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ICAgICAgICAgICAgICA9ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH07CiAgICAgICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIG1vcmUgdGhlIG9uZSBjdXN0b21lciB1c2VyIGV4aXN0cywgc2hvdyBsaXN0CiAgICAgICAgICAgICMgYW5kIGNsZWFuIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgZG9uJ3QgY2hlY2sgZW1haWwgc3ludGF4IG9uIG11bHRpIGN1c3RvbWVyIHNlbGVjdAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IDAKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICcnOwoKICAgICAgICAgICAgICAgICMgY2xlYXIgdG8gaWYgdGhlcmUgaXMgbm8gY3VzdG9tZXIgZm91bmQKICAgICAgICAgICAgICAgIGlmICggISVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUb30gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRFcnJvcntFeHBhbmRDdXN0b21lck5hbWV9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJvbSBhbmQgY3VzdG9tZXIgaWQgaWYgY3VzdG9tZXIgdXNlciBpcyBnaXZlbgogICAgICAgIGVsc2lmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAyICkgewogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyS2V5ICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICRDdXN0b21lclVzZXJMaXN0eyRDdXN0b21lclVzZXJLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVySUQgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7Q3VzdG9tZXJ9ICkgewogICAgICAgICAgICAgICAgbXkgJUV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEZyb21FeHRlcm5hbEN1c3RvbWVye0VtYWlsfSA9ICRFeHRlcm5hbEN1c3RvbWVyVXNlckRhdGF7VXNlckVtYWlsfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGEgbmV3IGRlc3RpbmF0aW9uIHF1ZXVlIGlzIHNlbGVjdGVkCiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDMgKSB7CiAgICAgICAgICAgICRFcnJvcntOb1N1Ym1pdH0gPSAxOwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2UnKSApIHsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciApIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRDdXN0b21lcklEKSB7CiAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICBQQVJBTUVURVI6CiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KFRvIENjIEJjYykpIHsKICAgICAgICAgICAgbmV4dCBQQVJBTUVURVIgaWYgISRHZXRQYXJhbXskUGFyYW1ldGVyfTsKICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCAkR2V0UGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJFBhcmFtZXRlciAuICdFcnJvclR5cGUnIH0gPSAkUGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRQYXJhbWV0ZXIgLiAnSW52YWxpZCcgfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRTZWxmLT57U3lzdGVtQWRkcmVzc30tPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRFbWFpbC0+YWRkcmVzcygpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRJc0xvY2FsKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUGFyYW1ldGVyIC4gJ0lzTG9jYWxBZGRyZXNzJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBpdCBpcyBub3QgYSBzdWJhY3Rpb24gYWJvdXQgYXR0YWNobWVudHMsIGNoZWNrIGZvciBzZXJ2ZXIgZXJyb3JzCiAgICAgICAgaWYgKCAhJElzVXBsb2FkICYmICEkRXhwYW5kQ3VzdG9tZXJOYW1lICkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17VG99ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydUb0ludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnRGVzdGluYXRpb25JbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnQm9keUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgaWYgZGF0ZSBpcyB2YWxpZAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJEV4cGFuZEN1c3RvbWVyTmFtZQogICAgICAgICAgICAgICAgJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0KICAgICAgICAgICAgICAgICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnRGF0ZUludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkKICAgICAgICAgICAgICAgICAgICA8ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzZXJ2aWNlCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZU1hbmRhdG9yeX0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBtYW5kYXRvcnkgc2xhCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U0xBTWFuZGF0b3J5fQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTTEFJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgISRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydUeXBlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtUaW1lVW5pdHN9IGVxICcnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVGltZVVuaXRzSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBydW4gY29tcG9zZSBtb2R1bGVzCiAgICAgICAgbXkgJUFydGljbGVQYXJhbTsKICAgICAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVDb21wb3NlTW9kdWxlJykgfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRPYmplY3QtPlJ1biggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICAjIHRpY2tldCBwYXJhbXMKICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0gPSAoCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBlcnJvcnMKICAgICAgICAgICAgICAgICVFcnJvciA9ICgKICAgICAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdC0+RXJyb3IoICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICBpZiAoICRFcnJvcntUb0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRFcnJvcntDY0lzTG9jYWxBZGRyZXNzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRFcnJvcntCY2NJc0xvY2FsQWRkcmVzc30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JjY0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGFuZCBmb3JtYXQgZGVmYXVsdCBzdWJqZWN0IGFuZCBib2R5CiAgICAgICAgICAgIG15ICRTdWJqZWN0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRCb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRCb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEJvZHksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjc2V0IEJvZHkgYW5kIFN1YmplY3QgcGFyYW1ldGVycyBmb3IgT3V0cHV0CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTdWJqZWN0fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTdWJqZWN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkQm9keTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc2VydmljZXMKICAgICAgICAgICAgbXkgJFNlcnZpY2VzID0gJFNlbGYtPl9HZXRTZXJ2aWNlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCAgIHx8IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlc2V0IHByZXZpb3VzIFNlcnZpY2VJRCB0byByZXNldCBTTEEtTGlzdCBpZiBubyBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTZXJ2aWNlSUR9IHx8ICEkU2VydmljZXMtPnsgJEdldFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRCB8fCAxLAogICAgICAgICAgICAgICAgU2VydmljZXMgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBoZWFkZXIKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza0VtYWlsTmV3KAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcnMgICA9PiAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFVzZXJTZWxlY3RlZCAgICAgPT4gJE5ld1VzZXJJRCwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlcnMgPT4gJFNlbGYtPl9HZXRSZXNwb25zaWJsZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VyU2VsZWN0ZWQgPT4gJE5ld1Jlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVzICAgICAgICAgICAgICA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBOZXh0U3RhdGUgID0+ICROZXh0U3RhdGUsCiAgICAgICAgICAgICAgICBQcmlvcml0aWVzID0+ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFR5cGVzID0+ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICBTTEFzICAgICAgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVzID0+ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8ICcnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ3VzdG9tZXJJRCApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGF0YSAgICAgID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICAgICAgVGltZVVuaXRzUmVxdWlyZWQgPT4gKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICAgICAgPyAnVmFsaWRhdGVfUmVxdWlyZWQnCiAgICAgICAgICAgICAgICAgICAgOiAnJwogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIEZyb21MaXN0ICAgICA9PiAkU2VsZi0+X0dldFRvcygpLAogICAgICAgICAgICAgICAgRnJvbVNlbGVjdGVkID0+ICREZXN0LAogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkR2V0UGFyYW17U3ViamVjdH0gKSwKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJEdldFBhcmFte0JvZHl9ICksCiAgICAgICAgICAgICAgICBFcnJvcnMgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgU2lnbmF0dXJlICAgID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MICAgICA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyQ2MgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXJDYywKICAgICAgICAgICAgICAgIE11bHRpcGxlQ3VzdG9tZXJCY2MgID0+IFxATXVsdGlwbGVDdXN0b21lckJjYywKICAgICAgICAgICAgICAgIEZyb21FeHRlcm5hbEN1c3RvbWVyID0+IFwlRnJvbUV4dGVybmFsQ3VzdG9tZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgdGlja2V0LCBkbyBkYiBpbnNlcnQKICAgICAgICBteSAkVGlja2V0SUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgVGl0bGUgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFR5cGVJRCAgICAgICA9PiAkR2V0UGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgU2VydmljZUlEICAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBTTEFJRCAgICAgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgID0+ICROZXh0U3RhdGVJRCwKICAgICAgICAgICAgUHJpb3JpdHlJRCAgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgT3duZXJJRCAgICAgID0+IDEsCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ1RpY2tldCc7CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSAmJiAkU2VydmljZXtDcml0aWNhbGl0eX0gKSB7CgogICAgICAgICAgICAjIGdldCBjb25maWcgZm9yIGNyaXRpY2FsaXR5IGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJVFNNQ3JpdGljYWxpdHknLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgcG9zc2libGUgdmFsdWVzIGZvciBjcml0aWNhbGl0eQogICAgICAgICAgICBteSAkQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmV2ZXJzZSB0aGUgbGlzdCB0byBmaW5kIG91dCB0aGUga2V5CiAgICAgICAgICAgIG15ICVSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlcyA9IHJldmVyc2UgJXsgJENyaXRpY2FsaXR5UG9zc2libGVWYWx1ZXMgfTsKCiAgICAgICAgICAgICMgc2V0IHRoZSBjcml0aWNhbGl0eQogICAgICAgICAgICAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRSZXZlcnNlQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlc3sgJFNlcnZpY2V7Q3JpdGljYWxpdHl9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyAtLS0KICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICk7CiAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50cywgXCVVcGxvYWRTdHVmZjsKICAgICAgICB9CgogICAgICAgICMgcHJlcGFyZSBzdWJqZWN0CiAgICAgICAgbXkgJFRuID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXROdW1iZXJMb29rdXAoIFRpY2tldElEID0+ICRUaWNrZXRJRCApOwogICAgICAgICRHZXRQYXJhbXtTdWJqZWN0fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3ViamVjdEJ1aWxkKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRuLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ05ldycsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBuZXcgb3duZXIgaXMgZ2l2ZW4gKHRoZW4gc2VuZCBubyBhZ2VudCBub3RpZnkpCiAgICAgICAgbXkgJE5vQWdlbnROb3RpZnkgPSAwOwogICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICROb0FnZW50Tm90aWZ5ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gLj0gJzxici8+PGJyLz4nIC4gJFNpZ25hdHVyZTsKCiAgICAgICAgICAgICMgcmVtb3ZlIHVudXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgIG15IEBOZXdBdHRhY2htZW50RGF0YTsKICAgICAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SUQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnRJRAogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ID0+ICRDb250ZW50SUQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgYXR0YWNobWVudCBpZiBub3QgbGlua2VkIGluIGJvZHkKICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciBpbmxpbmUgaW1hZ2VzIGFuZCBub3JtYWwgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIHB1c2ggQE5ld0F0dGFjaG1lbnREYXRhLCBcJXskQXR0YWNobWVudH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQEF0dGFjaG1lbnRzID0gQE5ld0F0dGFjaG1lbnREYXRhOwoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gLj0gIlxuXG4iIC4gJFNpZ25hdHVyZTsKICAgICAgICB9CgogICAgICAgICMgbG9va3VwIHNlbmRlcgogICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9IEtlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvci0+bmV3KCAleyRTZWxmfSApOwogICAgICAgIG15ICRTZW5kZXIgICAgICAgICAgICA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+U2VuZGVyKAogICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNlbmQgZW1haWwKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlU2VuZCgKICAgICAgICAgICAgTm9BZ2VudE5vdGlmeSAgPT4gJE5vQWdlbnROb3RpZnksCiAgICAgICAgICAgIEF0dGFjaG1lbnQgICAgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgQXJ0aWNsZVR5cGUgICAgPT4gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGV9LAogICAgICAgICAgICBTZW5kZXJUeXBlICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgPT4gJFNlbmRlciwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgQ2MgICAgICAgICAgICAgPT4gJEdldFBhcmFte0NjfSwKICAgICAgICAgICAgQmNjICAgICAgICAgICAgPT4gJEdldFBhcmFte0JjY30sCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fQogICAgICAgICAgICAgICAgfHwgIlwlXCUkR2V0UGFyYW17VG99LCAkR2V0UGFyYW17Q2N9LCAkR2V0UGFyYW17QmNjfSIsCiAgICAgICAgICAgICVBcnRpY2xlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnQXJ0aWNsZSc7CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZW1vdmUgcHJlLXN1Ym1pdHRlZCBhdHRhY2htZW50cwogICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBzZXQgb3duZXIgKGlmIG5ldyB1c2VyIGlkIGlzIGdpdmVuKQogICAgICAgIGlmICgkTmV3VXNlcklEKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICROZXdVc2VySUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgbG9jawogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGVsc2Ugc2V0IG93bmVyIHRvIGN1cnJlbnQgYWdlbnQgYnV0IGRvIG5vdCBsb2NrIGl0CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHJlc3BvbnNpYmxlIChpZiBuZXcgdXNlciBpZCBpcyBnaXZlbikKICAgICAgICBpZiAoJE5ld1Jlc3BvbnNpYmxlSUQpIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRSZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJE5ld1Jlc3BvbnNpYmxlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICBpZiAoICRHZXRQYXJhbXtUaW1lVW5pdHN9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjY291bnRUaW1lKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgVGltZVVuaXQgID0+ICRHZXRQYXJhbXtUaW1lVW5pdHN9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdWxkIGkgc2V0IGFuIHVubG9jaz8KICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKCiAgICAgICAgICAgICMgc2V0IGxvY2sKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICBlbHNpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVuZGluZ1RpbWVTZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wb3JhcmlseSBsaW5rcwogICAgICAgICAgICBteSAkVGVtcExpbmtMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3QoCiAgICAgICAgICAgICAgICBPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgU3RhdGUgID0+ICdUZW1wb3JhcnknLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFRlbXBMaW5rTGlzdCAmJiByZWYgJFRlbXBMaW5rTGlzdCBlcSAnSEFTSCcgJiYgJXskVGVtcExpbmtMaXN0fSApIHsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJFRhcmdldE9iamVjdE9yZyAoIHNvcnQga2V5cyAleyRUZW1wTGlua0xpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdHlwZWxpc3QKICAgICAgICAgICAgICAgICAgICBteSAkVHlwZUxpc3QgPSAkVGVtcExpbmtMaXN0LT57JFRhcmdldE9iamVjdE9yZ307CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVHlwZSAoIHNvcnQga2V5cyAleyRUeXBlTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgZGlyZWN0aW9uIGxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkVHlwZUxpc3QtPnskVHlwZX07CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIHNvcnQga2V5cyAleyREaXJlY3Rpb25MaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFRhcmdldEtleU9yZyAoIHNvcnQga2V5cyAleyAkRGlyZWN0aW9uTGlzdC0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSB0ZW1wIGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QxID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkxICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MiA9PiAkVGFyZ2V0T2JqZWN0T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkyICAgID0+ICRUYXJnZXRLZXlPcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXRPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0S2V5ICAgID0gJFRpY2tldElEOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREaXJlY3Rpb24gZXEgJ1RhcmdldCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNvdXJjZUtleSAgICA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldE9iamVjdCA9ICRUYXJnZXRPYmplY3RPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIHBlcm1hbmVudGx5IGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAkU291cmNlT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICRUYXJnZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGFyZ2V0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KIyAtLS0KICAgICAgICAjIGdldCByZWRpcmVjdCBzY3JlZW4KICAgICAgICBteSAkTmV4dFNjcmVlbiA9ICRTZWxmLT57VXNlckNyZWF0ZU5leHRNYXNrfSB8fCAnQWdlbnRUaWNrZXRFbWFpbCc7CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbjtTdWJhY3Rpb249Q3JlYXRlZDtUaWNrZXRJRD0kVGlja2V0SUQiLAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0dldFNlcnZpY2VJbmNpZGVudFN0YXRlJyApIHsKCiAgICAgICAgIyBnZXQgdGhlIHNlbGVjdGVkIHNlcnZpY2UgaWQKICAgICAgICBteSAkU2VydmljZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VydmljZUlEJyApIHx8ICcnOwoKICAgICAgICAjIGJ1aWxkIGVtcHR5IHJlc3BvbnNlIGhhc2gKICAgICAgICBteSAlUmVzcG9uc2UgPSAoCiAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJycsCiAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgPT4gJyZuYnNwJywKICAgICAgICApOwoKICAgICAgICAjIG9ubHkgaWYgc2VydmljZSBpZCBpcyBzZWxlY3RlZAogICAgICAgIGlmICggJFNlcnZpY2VJRCAmJiAkU2VsZi0+e0NvbmZpZ30tPntTaG93SW5jaWRlbnRTdGF0ZX0gKSB7CgogICAgICAgICAgICAjIHNldCBpbmNpZGVudCBzaWduYWwKICAgICAgICAgICAgbXkgJUluY2lTaWduYWxzID0gKAogICAgICAgICAgICAgICAgb3BlcmF0aW9uYWwgPT4gJ2dyZWVubGVkJywKICAgICAgICAgICAgICAgIHdhcm5pbmcgICAgID0+ICd5ZWxsb3dsZWQnLAogICAgICAgICAgICAgICAgaW5jaWRlbnQgICAgPT4gJ3JlZGxlZCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIHRoZSByZXNwb25zZQogICAgICAgICAgICAlUmVzcG9uc2UgPSAoCiAgICAgICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICRJbmNpU2lnbmFsc3sgJFNlcnZpY2V7Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZSAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFNlcnZpY2V7Q3VySW5jaVN0YXRlfSksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGVuY29kZSByZXNwb25zZSB0byBKU09OCiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gXCVSZXNwb25zZSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQojIC0tLQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewogICAgICAgIG15ICREZXN0ICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICk7CiAgICAgICAgbXkgJEVsZW1lbnRDaGFuZ2VkID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CgogICAgICAgICMgZ2V0IEZyb20gYmFzZWQgb24gc2VsZWN0ZWQgcXVldWUKICAgICAgICBteSAkUXVldWVJRCA9ICcnOwogICAgICAgIGlmICggJERlc3QgPX4gL14oXGR7MSwxMDB9KVx8XHwuKz8kLyApIHsKICAgICAgICAgICAgJFF1ZXVlSUQgPSAkMTsKICAgICAgICAgICAgbXkgJVF1ZXVlID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFN5c3RlbUFkZHJlc3MoIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJFF1ZXVle0VtYWlsfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkVG9zID0gJFNlbGYtPl9HZXRUb3MoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEID0+ICRRdWV1ZUlELAogICAgICAgICk7CgogICAgICAgIG15ICROZXdUb3M7CgogICAgICAgIGlmICgkVG9zKSB7CiAgICAgICAgICAgIFRPczoKICAgICAgICAgICAgZm9yIG15ICRLZXlUbyAoIHNvcnQga2V5cyAleyRUb3N9ICkgewogICAgICAgICAgICAgICAgbmV4dCBUT3MgaWYgKCAkVG9zLT57JEtleVRvfSBlcSAnLScgKTsKICAgICAgICAgICAgICAgICROZXdUb3MtPnsiJEtleVRvfHwkVG9zLT57JEtleVRvfSJ9ID0gJFRvcy0+eyRLZXlUb307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgJFNpZ25hdHVyZSA9ICcnOwogICAgICAgIGlmICgkUXVldWVJRCkgewogICAgICAgICAgICAkU2lnbmF0dXJlID0gJFNlbGYtPl9HZXRTaWduYXR1cmUoIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKICAgICAgICB9CiAgICAgICAgbXkgJFVzZXJzID0gJFNlbGYtPl9HZXRVc2VycygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9LAogICAgICAgICk7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlVXNlcnMgPSAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9LAogICAgICAgICk7CiAgICAgICAgbXkgJE5leHRTdGF0ZXMgPSAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkU0xBcyA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICAgICAgU2VydmljZXMgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICk7CiAgICAgICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgfHwgJycsCiAgICAgICAgKTsKICAgICAgICBteSAkVHlwZXMgPSAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMCwKICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICMgY29udmVydCBGaWxlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXN9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0ga2V5cyAlRmlsdGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgKSB8fCAkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkRGF0YVZhbHVlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSBAVGVtcGxhdGVBSkFYOwoKICAgICAgICAjIHVwZGF0ZSB0aWNrZXQgYm9keSBhbmQgYXR0YWNoZW1lbnRzIGlmIG5lZWRlZC4KICAgICAgICBpZiAoICRFbGVtZW50Q2hhbmdlZCBlcSAnU3RhbmRhcmRUZW1wbGF0ZUlEJyApIHsKICAgICAgICAgICAgbXkgQFRpY2tldEF0dGFjaG1lbnRzOwogICAgICAgICAgICBteSAkVGVtcGxhdGVUZXh0OwoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIGF0dGFjaG1lbnRzIGZyb20gdGhlIFVwbG9hZCBjYWNoZQogICAgICAgICAgICBteSAkUmVtb3ZlU3VjY2VzcyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURSZW1vdmUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUmVtb3ZlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZvcm0gYXR0YWNobWVudHMgY291bGQgbm90IGJlIGRlbGV0ZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wbGF0ZSB0ZXh0IGFuZCBzZXQgbmV3IGF0dGFjaG1lbnRzIGlmIGEgdGVtcGxhdGUgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCBJc1Bvc2l0aXZlSW50ZWdlciggJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gKSApIHsKICAgICAgICAgICAgICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9IEtlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvci0+bmV3KCAleyRTZWxmfSApOwoKICAgICAgICAgICAgICAgICMgc2V0IHRlbXBsYXRlIHRleHQsIHJlcGxhY2Ugc21hcnQgdGFncyAobGltaXRlZCBhcyB0aWNrZXQgaXMgbm90IGNyZWF0ZWQpCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVUZXh0ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5UZW1wbGF0ZSgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBTdGRBdHRhY2htZW50T2JqZWN0CiAgICAgICAgICAgICAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgICAgICAgICAgICAgIyBhZGQgc3RkLiBhdHRhY2htZW50cyB0byB0aWNrZXQKICAgICAgICAgICAgICAgIG15ICVBbGxTdGRBdHRhY2htZW50cyA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlQWxsU3RkQXR0YWNobWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUF0dGFjaG1lbnRzRGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50R2V0KCBJRCA9PiAkXyApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzRGF0YSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VuZCBhIGxpc3Qgb2YgYXR0YWNobWVudHMgaW4gdGhlIHVwbG9hZCBjYWNoZSBiYWNrIHRvIHRoZSBjbGllbnRzaWRlIEphdmFTY3JpcHQKICAgICAgICAgICAgICAgICMgd2hpY2ggcmVuZGVycyB0aGVuIHRoZSBsaXN0IG9mIGN1cnJlbnRseSB1cGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgQFRpY2tldEF0dGFjaG1lbnRzID0gJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQFRlbXBsYXRlQUpBWCA9ICgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdVc2VUZW1wbGF0ZUNyZWF0ZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAnMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JpY2hUZXh0JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRUZW1wbGF0ZVRleHQgfHwgJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgID0+ICdUaWNrZXRBdHRhY2htZW50cycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBUaWNrZXRBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICAgICBLZWVwRGF0YSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15IEBFeHRlbmRlZERhdGE7CgogICAgICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICMgdXNlIFF1ZXVlSUQgZnJvbSB3ZWIgcmVxdWVzdCBpbiBjb21wb3NlIG1vZHVsZXMKICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CgogICAgICAgICAgICBteSAlSm9icyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgICAgIEpPQjoKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgbmV4dCBKT0IgaWYgISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+RGF0YSggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICAjIGdldCBBSkFYIHBhcmFtIHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKCAkT2JqZWN0LT5jYW4oJ0dldFBhcmFtQUpBWCcpICkgewogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICggJUdldFBhcmFtLCAkT2JqZWN0LT5HZXRQYXJhbUFKQVgoJUdldFBhcmFtKSApCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEtleSA9ICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICAgICAgICAgIGlmICgkS2V5KSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNvbnZlcnQgU2lnbmF0dXJlIHRvIEFTQ0lJLCBpZiBSaWNoVGV4dCBpcyBvbgogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgICAgICMgICAgICAgICAgICAkU2lnbmF0dXJlID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5Ub0FzY2lpKCBTdHJpbmcgPT4gJFNpZ25hdHVyZSwgKTsKICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkTmV3VG9zLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkRGVzdCwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2lnbmF0dXJlJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNpZ25hdHVyZSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1VzZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRVc2VycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFJlc3BvbnNpYmxlVXNlcnMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICROZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTdGFuZGFyZFRlbXBsYXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAogICAgICAgICAgICAgICAgQEV4dGVuZGVkRGF0YSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAnTm8gU3ViYWN0aW9uIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvcicsCiAgICAgICAgKTsKICAgIH0KfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5leHRTdGF0ZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVOZXh0U3RhdGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRVc2VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXJzCiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMganVzdCBzaG93IG9ubHkgdXNlcnMgd2l0aCBzZWxlY3RlZCBjdXN0b20gcXVldWUKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17QWxsVXNlcnN9ICkgewogICAgICAgIG15IEBVc2VySURzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgIGZvciBteSAkR3JvdXBNZW1iZXJLZXkgKCBzb3J0IGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkR3JvdXBNZW1iZXJLZXkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skR3JvdXBNZW1iZXJLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgc2hvdyB1c2VycwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBhbGwgdXNlcnMgd2hvIGFyZSBvd25lciBvciBydyBpbiB0aGUgcXVldWUgZ3JvdXAKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdvd25lcicsCiAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRNZW1iZXJLZXkgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JE1lbWJlcktleX0gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skTWVtYmVyS2V5fSA9ICRBbGxHcm91cHNNZW1iZXJzeyRNZW1iZXJLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdPd25lcicsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpIH0gaWYgJEFDTDsKCiAgICByZXR1cm4gXCVTaG93blVzZXJzOwp9CgpzdWIgX0dldFJlc3BvbnNpYmxlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXJzCiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMganVzdCBzaG93IG9ubHkgdXNlcnMgd2l0aCBzZWxlY3RlZCBjdXN0b20gcXVldWUKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17QWxsVXNlcnN9ICkgewogICAgICAgIG15IEBVc2VySURzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgIGZvciBteSAkR3JvdXBNZW1iZXJLZXkgKCBzb3J0IGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkR3JvdXBNZW1iZXJLZXkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skR3JvdXBNZW1iZXJLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgc2hvdyB1c2VycwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBhbGwgdXNlcnMgd2hvIGFyZSByZXNwb25zaWJsZSBvciBydyBpbiB0aGUgcXVldWUgZ3JvdXAKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdyZXNwb25zaWJsZScsCiAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRNZW1iZXJLZXkgKCBzb3J0IGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JE1lbWJlcktleX0gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skTWVtYmVyS2V5fSA9ICRBbGxHcm91cHNNZW1iZXJzeyRNZW1iZXJLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgd29ya2Zsb3cKICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnVGlja2V0JywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVNob3duVXNlcnMsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiB7ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpIH0gaWYgJEFDTDsKCiAgICByZXR1cm4gXCVTaG93blVzZXJzOwp9CgpzdWIgX0dldFByaW9yaXRpZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBwcmlvcml0eQogICAgbXkgJVByaW9yaXRpZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVQcmlvcml0aWVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHR5cGUKICAgIG15ICVUeXBlOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlVHlwZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VHlwZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlVHlwZTsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIG15ICVTZXJ2aWNlOwoKICAgICMgY2hlY2sgbmVlZGVkCiAgICByZXR1cm4gXCVTZXJ2aWNlIGlmICEkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgIyBnZXQgb3B0aW9ucyBmb3IgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgdW5rbm93biBjdXN0b21lcnMKICAgIG15ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgY2hlY2sgaWYgbm8gQ3VzdG9tZXJVc2VySUQgaXMgc2VsZWN0ZWQKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMCBsZWF2ZSBDdXN0b21lclVzZXJJRCBlbXB0eSwgaXQgd2lsbCBub3QgZ2V0IGFueSBzZXJ2aWNlcwogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAxIHNldCBDdXN0b21lclVzZXJJRCB0byBnZXQgZGVmYXVsdCBzZXJ2aWNlcwogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyVXNlcklEfSAmJiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlcklEfSA9ICc8REVGQVVMVD4nOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzbGEKICAgIG15ICVTTEE7CiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICYmICRQYXJhbXtTZXJ2aWNlc30gJiYgJXsgJFBhcmFte1NlcnZpY2VzfSB9ICkgewogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VzfS0+eyAkUGFyYW17U2VydmljZUlEfSB9ICkgewogICAgICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlU0xBOwp9CgpzdWIgX0dldFRvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgb3duIHNlbGVjdGlvbgogICAgbXkgJU5ld1RvczsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJykgKSB7CiAgICAgICAgJU5ld1RvcyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpIH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBTZWxlY3Rpb25UeXBlIFF1ZXVlIG9yIFN5c3RlbUFkZHJlc3M/CiAgICAgICAgbXkgJVRvczsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICAgICAlVG9zID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Nb3ZlTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVRvcyA9ICRTZWxmLT57REJPYmplY3R9LT5HZXRUYWJsZURhdGEoCiAgICAgICAgICAgICAgICBUYWJsZSA9PiAnc3lzdGVtX2FkZHJlc3MnLAogICAgICAgICAgICAgICAgV2hhdCAgPT4gJ3F1ZXVlX2lkLCBpZCcsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgQ2xhbXAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNyZWF0ZSBwZXJtaXNzaW9uIHF1ZXVlcwogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIHN0cmluZwogICAgICAgIFFVRVVFSUQ6CiAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICVUb3MgKSB7CiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVHZXQoIElEID0+ICRRdWV1ZUlEICk7CgogICAgICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2ssIGNhbiB3ZSBjcmVhdGUgbmV3IHRpY2tldHMgaW4gcXVldWUKICAgICAgICAgICAgbmV4dCBRVUVVRUlEIGlmICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9OwoKICAgICAgICAgICAgbXkgJFN0cmluZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblN0cmluZycpCiAgICAgICAgICAgICAgICB8fCAnPFJlYWxuYW1lPiA8PEVtYWlsPj4gLSBRdWV1ZTogPFF1ZXVlPic7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWU+LyRRdWV1ZURhdGF7TmFtZX0vZzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZUNvbW1lbnQ+LyRRdWV1ZURhdGF7Q29tbWVudH0vZzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgbmUgJ1F1ZXVlJyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVTeXN0ZW1BZGRyZXNzRGF0YSA9ICRTZWxmLT57U3lzdGVtQWRkcmVzc30tPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFRvc3skUXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxSZWFsbmFtZT4vJFN5c3RlbUFkZHJlc3NEYXRhe1JlYWxuYW1lfS9nOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxFbWFpbD4vJFN5c3RlbUFkZHJlc3NEYXRhe05hbWV9L2c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5ld1Rvc3skUXVldWVJRH0gPSAkU3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBlbXB0eSBzZWxlY3Rpb24KICAgICROZXdUb3N7Jyd9ID0gJy0nOwogICAgcmV0dXJuIFwlTmV3VG9zOwp9CgpzdWIgX0dldFNpZ25hdHVyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcHJlcGFyZSBzaWduYXR1cmUKICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9IEtlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvci0+bmV3KCAleyRTZWxmfSApOwogICAgbXkgJFNpZ25hdHVyZSAgICAgICAgID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TaWduYXR1cmUoCiAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgRGF0YSAgICA9PiBcJVBhcmFtLAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFNpZ25hdHVyZTsKfQoKc3ViIF9HZXRTdGFuZGFyZFRlbXBsYXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNyZWF0ZSB0ZW1wbGF0ZXMKICAgIG15ICVUZW1wbGF0ZXM7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgIG15ICRRdWV1ZUlEID0gJFBhcmFte1F1ZXVlSUR9IHx8ICcnOwogICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICYmICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZ2V0IFF1ZXVlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUXVldWVJRCA9ICRUaWNrZXR7UXVldWVJRH0gfHwgJyc7CiAgICB9CgogICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfSApOwoKICAgICMgcmV0dXJuIGp1c3QgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBzY3JlZW4KICAgIHJldHVybiAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfTsKfQoKc3ViIF9NYXNrRW1haWxOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgICMgYnVpbGQgY3VzdG9tZXIgc2VhcmNoIGF1dG9jb21wbGV0ZSBmaWVsZAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZScsCiAgICApOwoKICAgICMgYnVpbGQgc3RyaW5nCiAgICAkUGFyYW17VXNlcnN9LT57Jyd9ID0gJy0nOwogICAgJFBhcmFte09wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtVc2Vyc30sCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VXNlclNlbGVjdGVkfSwKICAgICAgICBOYW1lICAgICAgID0+ICdOZXdVc2VySUQnLAogICAgKTsKCiAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgJFBhcmFte05leHRTdGF0ZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUGFyYW17TmV4dFN0YXRlc30sCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRQYXJhbXtOZXh0U3RhdGV9IHx8ICRTZWxmLT57Q29uZmlnfS0+e1N0YXRlRGVmYXVsdH0sCiAgICApOwoKICAgICMgYnVpbGQgRGVzdGluYXRpb24gc3RyaW5nCiAgICBteSAlTmV3VG87CiAgICBpZiAoICRQYXJhbXtGcm9tTGlzdH0gKSB7CiAgICAgICAgZm9yIG15ICRGcm9tS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtGcm9tTGlzdH0gfSApIHsKICAgICAgICAgICAgJE5ld1RveyIkRnJvbUtleXx8JFBhcmFte0Zyb21MaXN0fS0+eyRGcm9tS2V5fSJ9ID0gJFBhcmFte0Zyb21MaXN0fS0+eyRGcm9tS2V5fTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAkUGFyYW17RnJvbVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkJyAuICggJFBhcmFte0Vycm9yc30tPntEZXN0aW5hdGlvbkludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJFBhcmFte0Zyb21TZWxlY3RlZH0sCiAgICAgICAgICAgIE9uQ2hhbmdlU3VibWl0ID0+IDAsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtGcm9tU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlTmV3VG8sCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkJyAuICRQYXJhbXtFcnJvcnN9LT57RGVzdGluYXRpb25JbnZhbGlkfSB8fCAnICcsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBUcmVlVmlldyAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17RnJvbVNlbGVjdGVkfSwKICAgICAgICApOwogICAgfQoKICAgICMgY3VzdG9tZXIgaW5mbyBzdHJpbmcKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2UnKSApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJUYWJsZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50Q3VzdG9tZXJWaWV3VGFibGUoCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0N1c3RvbWVyRGF0YX0sCiAgICAgICAgICAgIE1heCAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2VNYXhTaXplJyksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclRhYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBwcmVwYXJlIGVycm9ycyEKICAgIGlmICggJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgZm9yIG15ICRFcnJvcktleSAoIHNvcnQga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JEVycm9yS2V5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkUGFyYW17RXJyb3JzfS0+eyRFcnJvcktleX0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBGcm9tIGV4dGVybmFsCiAgICBteSAkU2hvd0Vycm9ycyA9IDE7CiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9CiAgICAgICAgJiYKICAgICAgICBkZWZpbmVkICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0tPntFbWFpbH0gJiYKICAgICAgICBkZWZpbmVkICRQYXJhbXtGcm9tRXh0ZXJuYWxDdXN0b21lcn0tPntDdXN0b21lcn0KICAgICAgICApCiAgICB7CiAgICAgICAgJFNob3dFcnJvcnMgPSAwOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Zyb21FeHRlcm5hbEN1c3RvbWVyJywKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LAogICAgICAgICk7CiAgICB9CgogICAgIyBDYwogICAgbXkgJEN1c3RvbWVyQ291bnRlckNjID0gMDsKICAgIGlmICggJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJDY30gfSApIHsKICAgICAgICAgICAgaWYgKCAhJFNob3dFcnJvcnMgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZW1wdHkgdmFsdWVzIGZvciBlcnJvcnMKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gICAgPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJEaXNhYmxlZH0gPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30gPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDY011bHRpcGxlQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjJyAuICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQ2MrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlckNjICkgewogICAgICAgICRQYXJhbXtDY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQ2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyQ2MrKywKICAgICAgICB9LAogICAgKTsKCiAgICAjIEJjYwogICAgbXkgJEN1c3RvbWVyQ291bnRlckJjYyA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyQmNjfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lckJjY30gfSApIHsKICAgICAgICAgICAgaWYgKCAhJFNob3dFcnJvcnMgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZW1wdHkgdmFsdWVzIGZvciBlcnJvcnMKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gICAgPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJEaXNhYmxlZH0gPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30gPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2NNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCY2MnIC4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQmNjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyQmNjKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRDdXN0b21lckNvdW50ZXJCY2MgKSB7CiAgICAgICAgJFBhcmFte0JjY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICdIaWRkZW4nOwogICAgfQoKICAgICMgc2V0IGN1c3RvbWVyIGNvdW50ZXIKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQmNjTXVsdGlwbGVDdXN0b21lckNvdW50ZXInLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDdXN0b21lckNvdW50ZXIgPT4gJEN1c3RvbWVyQ291bnRlckJjYysrLAogICAgICAgIH0sCiAgICApOwoKICAgICMgVG8KICAgIG15ICRDdXN0b21lckNvdW50ZXIgPSAwOwogICAgaWYgKCAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gKSB7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte011bHRpcGxlQ3VzdG9tZXJ9IH0gKSB7CiAgICAgICAgICAgIGlmICggISRTaG93RXJyb3JzICkgewoKICAgICAgICAgICAgICAgICMgc2V0IGVtcHR5IHZhbHVlcyBmb3IgZXJyb3JzCiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRGlzYWJsZWR9ID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9ID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTXVsdGlwbGVDdXN0b21lcicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9LAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckVycm9yRXhwbGFudGlvbicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJEN1c3RvbWVyQ291bnRlciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJIaWRkZW5Db250YWluZXJ9ID0gJ0hpZGRlbic7CiAgICB9CgogICAgIyBzZXQgY3VzdG9tZXIgY291bnRlcgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVyQ291bnRlciA9PiAkQ3VzdG9tZXJDb3VudGVyKyssCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17VG9JbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntUb0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVG9TZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0Vycm9yc30tPntUb0Vycm9yVHlwZX0gfHwgISRTaG93RXJyb3JzICkgewogICAgICAgICRQYXJhbXtUb0ludmFsaWR9ID0gJyc7CiAgICB9CgogICAgaWYgKCAkUGFyYW17Q2NJbnZhbGlkfSAmJiAkUGFyYW17RXJyb3JzfSAmJiAhJFBhcmFte0Vycm9yc30tPntDY0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0Vycm9yc30tPntDY0Vycm9yVHlwZX0gfHwgISRTaG93RXJyb3JzICkgewogICAgICAgICRQYXJhbXtDY0ludmFsaWR9ID0gJyc7CiAgICB9CgogICAgaWYgKCAkUGFyYW17QmNjSW52YWxpZH0gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57QmNjRXJyb3JUeXBlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCY2NTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFBhcmFte0Vycm9yc30tPntCY2NFcnJvclR5cGV9IHx8ICEkU2hvd0Vycm9ycyApIHsKICAgICAgICAkUGFyYW17QmNjSW52YWxpZH0gPSAnJzsKICAgIH0KCiAgICBteSAkRHluYW1pY0ZpZWxkTmFtZXMgPSAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKAogICAgICAgIE9ubHlEeW5hbWljRmllbGRzID0+IDEKICAgICk7CgogICAgIyBjcmVhdGUgYSBzdHJpbmcgd2l0aCB0aGUgcXVvdGVkIGR5bmFtaWMgZmllbGQgbmFtZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZE5hbWVzKSApIHsKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskRHluYW1pY0ZpZWxkTmFtZXN9ICkgewogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkTmFtZXNTdHJnfSAuPSAiLCAnIiAuICRGaWVsZCAuICInIjsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB0eXBlIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17VHlwZXN9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQnIC4gKCAkUGFyYW17RXJyb3JzfS0+e1R5cGVJbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0VHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHNlcnZpY2Ugc3RyaW5nCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlTWFuZGF0b3J5fSApIHsKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NlcnZpY2VzfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgJyAuICggJFBhcmFte0Vycm9yc30tPntTZXJ2aWNlSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2VNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtTZXJ2aWNlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtTZXJ2aWNlc30sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntTZXJ2aWNlSW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1NMQU1hbmRhdG9yeX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NMQXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQgJyAuICggJFBhcmFte0Vycm9yc30tPntTTEFJbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTTEFNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NMQXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTTEEnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgaWYgKCAkUGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ICkgewogICAgICAgICRQYXJhbXtQcmlvcml0eUlEfSA9ICRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICB9CiMgLS0tCgogICAgIyBjaGVjayBpZiBleGlzdHMgY3JlYXRlIHRlbXBsYXRlcyByZWdhcmRsZXNzIHRoZSBxdWV1ZQogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPntTdGFuZGFyZFRlbXBsYXRlT2JqZWN0fS0+U3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICBUeXBlICA9PiAnQ3JlYXRlJywKICAgICk7CgogICAgIyBidWlsZCB0ZXh0IHRlbXBsYXRlIHN0cmluZwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdGFuZGFyZFRlbXBsYXRlcyApICkgewogICAgICAgICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlc30gIHx8IHt9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9IHx8ICcnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhbmRhcmRUZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHByaW9yaXR5IHN0cmluZwogICAgaWYgKCAhJFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICRQYXJhbXtQcmlvcml0eX0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX07CiAgICB9CiAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUGFyYW17UHJpb3JpdGllc30sCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgICA9PiAkUGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17UHJpb3JpdHl9LAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICk7CgogICAgIyBwZW5kaW5nIGRhdGEgc3RyaW5nCiAgICAkUGFyYW17UGVuZGluZ0RhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgJVBhcmFtLAogICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgICAgICA9PiAwLAogICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgID0+IDUsCiAgICAgICAgRGlmZlRpbWUgICAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpIHx8IDAsCiAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntEYXRlSW52YWxpZH0gfHwgJyAnLAogICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgID0+IDEsCiAgICAgICAgVmFsaWRhdGVEYXRlSW5GdXR1cmUgPT4gMSwKICAgICk7CgogICAgIyBzaG93IG93bmVyIHNlbGVjdGlvbgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3T3duZXJTZWxlY3Rpb24nKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPd25lclNlbGVjdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyByZXNwb25zaWJsZSBzZWxlY3Rpb24KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpCiAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1Jlc3BvbnNpYmxlU2VsZWN0aW9uJykKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LT57Jyd9ID0gJy0nOwogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZU9wdGlvblN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17UmVzcG9uc2libGVVc2Vyc30sCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1Jlc3BvbnNpYmxlVXNlclNlbGVjdGVkfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZVNlbGVjdGlvbicsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIG15IEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkczsKIyAtLS0KCiAgICAjIER5bmFtaWMgZmllbGRzCiAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbmRpdmlkdWFsbHkKICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSBlcSAnSVRTTUltcGFjdCcgKSB7CiAgICAgICAgICAgIHB1c2ggQEluZGl2aWR1YWxEeW5hbWljRmllbGRzLCAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsKICAgICAgICB9CiMgLS0tCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgY3ljbGUgdHJvdWdoIGR5bmFtaWMgZmllbGRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbmRpdmlkdWFsbHkKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQEluZGl2aWR1YWxEeW5hbWljRmllbGRzICkgewoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQoKICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWwnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkU2hvd25PcHRpb25zQmxvY2s7CgogICAgIyBzaG93IHNwZWxsIGNoZWNrCiAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJTcGVsbENoZWNrZXJ9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIG5lZWQgdG8gY2FsbCBPcHRpb25zIGJsb2NrCiAgICAgICAgaWYgKCAhJFNob3duT3B0aW9uc0Jsb2NrICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgICAgICRTaG93bk9wdGlvbnNCbG9jayA9IDE7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTcGVsbENoZWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYWRkcmVzcyBib29rIGlmIHRoZSBtb2R1bGUgaXMgcmVnaXN0ZXJlZCBhbmQgamF2YSBzY3JpcHQgc3VwcG9ydCBpcyBhdmFpbGFibGUKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRCb29rfQogICAgICAgICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgY2hlY2sgaWYgbmVlZCB0byBjYWxsIE9wdGlvbnMgYmxvY2sKICAgICAgICBpZiAoICEkU2hvd25PcHRpb25zQmxvY2sgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRPcHRpb25zJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBmbGFnIHRvICJ0cnVlIiBpbiBvcmRlciB0byBwcmV2ZW50IGNhbGxpbmcgdGhlIE9wdGlvbnMgYmxvY2sgYWdhaW4KICAgICAgICAgICAgJFNob3duT3B0aW9uc0Jsb2NrID0gMTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FkZHJlc3NCb29rJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgY3VzdG9tZXIgZWRpdCBsaW5rCiAgICBteSAkT3B0aW9uQ3VzdG9tZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgQWN0aW9uID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICApOwogICAgaWYgKCRPcHRpb25DdXN0b21lcikgewoKICAgICAgICAjIGNoZWNrIGlmIG5lZWQgdG8gY2FsbCBPcHRpb25zIGJsb2NrCiAgICAgICAgaWYgKCAhJFNob3duT3B0aW9uc0Jsb2NrICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgICAgICRTaG93bk9wdGlvbnNCbG9jayA9IDE7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPcHRpb25DdXN0b21lcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBtYWtlIHN1cmUgdG8gc2hvdyB0aGUgb3B0aW9ucyBibG9jayBzbyB0aGF0IHRoZSAiTGluayBUaWNrZXQiIG9wdGlvbiBpcyBzaG93bgogICAgIyBldmVuIGlmIHNwZWxsY2hlY2tlciwgYWRkcmVzcyBib29rIGFuZCBPcHRpb25DdXN0b21lciBpcyB0dXJuZWQgb2ZmCiAgICBpZiAoICEkU2hvd25PcHRpb25zQmxvY2sgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IGZsYWcgdG8gInRydWUiIGluIG9yZGVyIHRvIHByZXZlbnQgY2FsbGluZyB0aGUgT3B0aW9ucyBibG9jayBhZ2FpbgogICAgICAgICRTaG93bk9wdGlvbnNCbG9jayA9IDE7CiAgICB9CiMgLS0tCgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0KICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0F0dGFjaG1lbnQnLAogICAgICAgICAgICBEYXRhID0+ICRBdHRhY2htZW50LAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHVzZSBoZWlnaHQvd2lkdGggZGVmaW5lZCBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJFNlbGYtPntDb25maWd9LT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldEVtYWlsJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbQogICAgKTsKfQoKc3ViIF9HZXRGaWVsZHNUb1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBVcGRhdGFibGVGaWVsZHM7CgogICAgIyBzZXQgdGhlIGZpZWxkcyB0aGF0IGNhbiBiZSB1cGRhdGVhYmxlIHZpYSBBSkFYVXBkYXRlCiAgICBpZiAoICEkUGFyYW17T25seUR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgIEBVcGRhdGFibGVGaWVsZHMgPSBxdygKICAgICAgICAgICAgVHlwZUlEIERlc3QgTmV4dFN0YXRlSUQgUHJpb3JpdHlJRCBTZXJ2aWNlSUQgU0xBSUQgU2lnbktleUlEIENyeXB0S2V5SUQgVG8gQ2MgQmNjCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRAogICAgICAgICk7CiAgICB9CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgIHB1c2ggQFVwZGF0YWJsZUZpZWxkcywgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwogICAgfQoKICAgIHJldHVybiBcQFVwZGF0YWJsZUZpZWxkczsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UGhvbmUucG0gLSB0byBoYW5kbGUgcGhvbmUgY2FsbHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvNDc4ZWU2NjVjNTM1YjY4MDI5Y2VkNGRjYTE5N2I1MjM1YjdiMTkyZi9LZXJuZWwvTW9kdWxlcy9BZ2VudFRpY2tldFBob25lLnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRQaG9uZTsKIyMgbm9maWx0ZXIoVGlkeUFsbDo6UGx1Z2luOjpPVFJTOjpQZXJsOjpEQk9iamVjdCkKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBNYWlsOjpBZGRyZXNzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwojIC0tLQoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE5lZWRlZCAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgTWFpbk9iamVjdCBDb25maWdPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICROZWVkZWQhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0tPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57QmFja2VuZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhbmRhcmRUZW1wbGF0ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZS0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9ID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntDb25maWd9LT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgcXcoQXJ0aWNsZUlEIExpbmtUaWNrZXRJRCBQcmlvcml0eUlEIE5ld1VzZXJJRAogICAgICAgIEZyb20gU3ViamVjdCBCb2R5IE5leHRTdGF0ZUlEIFRpbWVVbml0cwogICAgICAgIFllYXIgTW9udGggRGF5IEhvdXIgTWludXRlCiAgICAgICAgTmV3UmVzcG9uc2libGVJRCBSZXNwb25zaWJsZUFsbCBPd25lckFsbCBUeXBlSUQgU2VydmljZUlEIFNMQUlECiAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEIEZyb21DaGF0SUQKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgfQoKICAgICMgQUNMIGNvbXBhdGliaWxpdHkgdHJhbnNsYXRpb24KICAgIG15ICVBQ0xDb21wYXRHZXRQYXJhbTsKICAgICRBQ0xDb21wYXRHZXRQYXJhbXtPd25lcklEfSA9ICRHZXRQYXJhbXtOZXdVc2VySUR9OwoKICAgICMgSWYgaXMgYW4gYWN0aW9uIGFib3V0IGF0dGFjaG1lbnRzCiAgICBteSAkSXNVcGxvYWQgPSAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgPyAxIDogMCApOwoKICAgICMgTXVsdGlwbGVDdXN0b21lciBGcm9tLWZpZWxkCiAgICBteSBATXVsdGlwbGVDdXN0b21lcjsKICAgIG15ICRDdXN0b21lcnNOdW1iZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldENvdW50ZXJGcm9tQ3VzdG9tZXInICkgfHwgMDsKICAgIG15ICRTZWxlY3RlZCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyU2VsZWN0ZWQnICkgfHwgJyc7CgogICAgIyBoYXNoIGZvciBjaGVjayBkdXBsaWNhdGVkIGVudHJpZXMKICAgIG15ICVBZGRyZXNzZXNMaXN0OwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4uICRDdXN0b21lcnNOdW1iZXIgKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudCApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJTZWxlY3RlZCA9ICggJFNlbGVjdGVkIGVxICRDb3VudCA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJyApOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXkgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcktleV8nIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnQpIHsKCiAgICAgICAgICAgICAgICBteSAkQ291bnRBdXggICAgICAgICA9ICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yICAgID0gJyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZCA9ICcnOwoKICAgICAgICAgICAgICAgIGlmICggISRJc1VwbG9hZCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gLj0gJEN1c3RvbWVyRWxlbWVudCAuICcsJzsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRDdXN0b21lckVsZW1lbnQpICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5DaGVja0Vycm9yVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gJiYgJEN1c3RvbWVyRXJyb3IgZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAgICAgICAgICRDb3VudEF1eCAgICAgICAgID0gJENvdW50IC4gJ0Vycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgPT4gJENvdW50QXV4LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEN1c3RvbWVyRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ICAgICAgPT4gJEN1c3RvbWVyS2V5LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgICAgPT4gJEN1c3RvbWVyRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICRDdXN0b21lckRpc2FibGVkLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEeW5hbWljIGZpZWxkcyBmb3JtIFBhcmFtT2JqZWN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwojIC0tLQojIElUU00KIyAtLS0KICAgICMgdG8gc3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgZHluYW1pYyBmaWVsZCBmb3IgdGhlIGltcGFjdAogICAgbXkgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZzsKIyAtLS0KCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmb3JtIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFNlbGYtPntQYXJhbU9iamVjdH0sCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBpbXBhY3QgZmllbGQgd2FzIGZvdW5kCiAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gZXEgJ0lUU01JbXBhY3QnICkgewoKICAgICAgICAgICAgIyBzdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbXBhY3QgZmllbGQKICAgICAgICAgICAgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZyA9ICREeW5hbWljRmllbGRDb25maWc7CiAgICAgICAgfQojIC0tLQogICAgfQoKICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICBteSAlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGQ7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ICAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnUHJpb3JpdHlSQycpOwogICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnKSB8fCAnJzsKCiAgICAjIGNoZWNrIGlmIHByaW9yaXR5IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZAogICAgaWYgKCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdTZXJ2aWNlSUQnIHx8ICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0JyApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgIG15ICVTZXJ2aWNlOwogICAgIyBzZXJ2aWNlIHdhcyBzZWxlY3RlZAogICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKCiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgSW5jaWRlbnRTdGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTaG93SW5jaWRlbnRTdGF0ZX0gfHwgMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWNhbGN1bGF0ZSBpbXBhY3QgaWYgaW1wYWN0IGlzIG5vdCBzZXQgdW50aWwgbm93CiAgICAgICAgaWYgKCAhJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAmJiAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IG5lICdEeW5hbWljRmllbGRfSVRTTUltcGFjdCcgKSB7CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICAgICBteSAkRGVmYXVsdFNlbGVjdGlvbiA9ICRJbXBhY3REeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfTsKCiAgICAgICAgICAgIGlmICgkRGVmYXVsdFNlbGVjdGlvbikgewoKICAgICAgICAgICAgICAgICMgZ2V0IGRlZmF1bHQgaW1wYWN0CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ID0gJERlZmF1bHRTZWxlY3Rpb247CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY2FsY3VsYXRlIHByaW9yaXR5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlSQ30gJiYgJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgQ3JpdGljYWxpdHkgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHl9LAogICAgICAgICAgICAgICAgSW1wYWN0ICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SUR9ID0gJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgICAgICB9CiAgICB9CgogICAgIyBubyBzZXJ2aWNlIHdhcyBzZWxlY3RlZAogICAgZWxzZSB7CgogICAgICAgICMgZG8gbm90IHNob3cgdGhlIGRlZmF1bHQgc2VsZWN0aW9uCiAgICAgICAgJEltcGFjdER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9ID0gJyc7CgogICAgICAgICMgc2hvdyBvbmx5IHRoZSBlbXB0eSBzZWxlY3Rpb24KICAgICAgICAkSW1wYWN0RHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1Bvc3NpYmxlVmFsdWVzfSA9IHt9OwogICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGRfSVRTTUltcGFjdH0gPSAnJzsKICAgIH0KCiAgICAjIHNldCB0aGUgc2VsZWN0ZWQgaW1wYWN0CiAgICAkRHluYW1pY0ZpZWxkVmFsdWVze0lUU01JbXBhY3R9ID0gJEdldFBhcmFte0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fTsKIyAtLS0KCiAgICAjIHRyYW5zZm9ybSBwZW5kaW5nIHRpbWUsIHRpbWUgc3RhbXAgYmFzZWQgb24gdXNlciB0aW1lIHpvbmUKICAgIGlmICgKICAgICAgICBkZWZpbmVkICRHZXRQYXJhbXtZZWFyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01vbnRofQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0RheX0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtIb3VyfQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte01pbnV0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJUdldFBhcmFtID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UcmFuc2Zvcm1EYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ2hhdEVuZ2luZTo6QWN0aXZlJykgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJDaGF0IGlzIG5vdCBhY3RpdmUuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgT2ssIHRha2UgdGhlIGNoYXQKICAgICAgICBteSAlQ2hhdFBhcnRpY2lwYW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXQnKS0+Q2hhdFBhcnRpY2lwYW50Q2hlY2soCiAgICAgICAgICAgIENoYXRJRCAgICAgICAgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICBDaGF0dGVyVHlwZSAgID0+ICdVc2VyJywKICAgICAgICAgICAgQ2hhdHRlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIENoYXR0ZXJBY3RpdmUgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICElQ2hhdFBhcnRpY2lwYW50ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiTm8gcGVybWlzc2lvbi4iLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gfHwgJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGVkJyApIHsKCiAgICAgICAgIyBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGlmIHRoZXJlIGlzIG5vIHRpY2tldCBpZCEKICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CgogICAgICAgICAgICAjIG5vdGlmeSBpbmZvCiAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgIEluZm8gPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ1RpY2tldCAiJXMiIGNyZWF0ZWQhJywKICAgICAgICAgICAgICAgICAgICAkVGlja2V0e1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgTGluayA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAuICdBY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPScKICAgICAgICAgICAgICAgICAgICAuICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9CiAgICAgICAgICAgICYmICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSAhfiAvQWN0aW9uPUFnZW50VGlja2V0UGhvbmUvCiAgICAgICAgICAgICYmICRTZWxmLT57UmVxdWVzdGVkVVJMfSAhfiAvQWN0aW9uPUFnZW50VGlja2V0UGhvbmUuKkxpbmtUaWNrZXRJRD0vCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc3BsaXQgYXJ0aWNsZSBpZiBnaXZlbgogICAgICAgICMgZ2V0IEFydGljbGVJRAogICAgICAgIG15ICVBcnRpY2xlOwogICAgICAgIG15ICVDdXN0b21lckRhdGE7CiAgICAgICAgbXkgJEFydGljbGVGcm9tID0gJyc7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXJ0aWNsZUlEfSApIHsKCiAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgcm8gcGVybWlzc2lvbiEiLAogICAgICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAlQXJ0aWNsZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGFydGljbGUgaXMgZnJvbSB0aGUgc2FtZSBUaWNrZXRJRCBhcyB3ZSBjaGVja2VkIHBlcm1pc3Npb25zIGZvci4KICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtUaWNrZXRJRH0gbmUgJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICJBcnRpY2xlIGRvZXMgbm90IGJlbG9uZyB0byB0aWNrZXQgJFNlbGYtPntUaWNrZXRJRH0hIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRBcnRpY2xle1N1YmplY3R9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJEFydGljbGV7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkQXJ0aWNsZXtTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2F2ZSBhcnRpY2xlIGZyb20gZm9yIGFkZHJlc3NlcyBsaXN0CiAgICAgICAgICAgICRBcnRpY2xlRnJvbSA9ICRBcnRpY2xle0Zyb219OwoKICAgICAgICAgICAgIyBpZiBUbyBpcyBwcmVzZW50IGFuZCBpcyBubyBhIHF1ZXVlCiAgICAgICAgICAgICMgc2V0IFRvIGFzIGFydGljbGUgZnJvbQogICAgICAgICAgICBpZiAoIElzU3RyaW5nV2l0aERhdGEoICRBcnRpY2xle1RvfSApICkgewogICAgICAgICAgICAgICAgbXkgJVF1ZXVlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUxpc3QoKTsKCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+e0N1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb259ICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUXVldWUgKCBzb3J0IGtleXMgJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT57Q3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT57Q3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbn0tPnskUXVldWV9OwogICAgICAgICAgICAgICAgICAgICAgICAkUXVldWVzeyRRdWV1ZX0gPSAkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICVRdWV1ZUxvb2t1cCA9IHJldmVyc2UgJVF1ZXVlczsKICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFF1ZXVlTG9va3VweyAkQXJ0aWNsZXtUb30gfSApIHsKICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyb20gPSAkQXJ0aWNsZXtUb307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYm9keSBwcmVwYXJhdGlvbiBmb3IgcGxhaW4gdGV4dCBwcm9jZXNzaW5nCiAgICAgICAgICAgICRBcnRpY2xle0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BcnRpY2xlUXVvdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFVwbG9hZENhY2hlT2JqZWN0ICA9PiAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fSwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzSW5jbHVkZSA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZXtDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRBcnRpY2xle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEFydGljbGV7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQXJ0aWNsZXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yIG15ICRLZXlDdXN0b21lclVzZXJMaXN0ICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xle0Zyb219ID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlckxpc3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG11bHRpcGxlIGFkZHJlc3NlcyBsaXN0CiAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgbXkgJENvdW50RnJvbSA9IHNjYWxhciBATXVsdGlwbGVDdXN0b21lciB8fCAxOwogICAgICAgIG15ICVDdXN0b21lckRhdGFGcm9tOwogICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAlQ3VzdG9tZXJEYXRhRnJvbSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRFbWFpbCAoIE1haWw6OkFkZHJlc3MtPnBhcnNlKCRBcnRpY2xlRnJvbSkgKSB7CgogICAgICAgICAgICBteSAkQ291bnRBdXggICAgICAgICA9ICRDb3VudEZyb207CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yICAgID0gJyc7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yTXNnID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRGlzYWJsZWQgPSAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyU2VsZWN0ZWQgPSAoICRDb3VudEZyb20gZXEgJzEnID8gJ2NoZWNrZWQ9ImNoZWNrZWQiJyA6ICcnICk7CiAgICAgICAgICAgIG15ICRFbWFpbEFkZHJlc3MgICAgID0gJEVtYWlsLT5hZGRyZXNzKCk7CiAgICAgICAgICAgIGlmICggISRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWxBZGRyZXNzICkgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvck1zZyA9ICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgIC4gJ1NlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBmb3IgZHVwbGljYXRlZCBlbnRyaWVzCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQWRkcmVzc2VzTGlzdHskRW1haWx9ICYmICRDdXN0b21lckVycm9yIGVxICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3JNc2cgPSAnSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgJEN1c3RvbWVyRXJyb3IgICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRDdXN0b21lckVycm9yIG5lICcnICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyRGlzYWJsZWQgPSAnZGlzYWJsZWQ9ImRpc2FibGVkIic7CiAgICAgICAgICAgICAgICAkQ291bnRBdXggICAgICAgICA9ICRDb3VudEZyb20gLiAnRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ3VzdG9tZXJLZXkgPSAnJzsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkQ3VzdG9tZXJEYXRhRnJvbXtVc2VyRW1haWx9CiAgICAgICAgICAgICAgICAmJiAkQ3VzdG9tZXJEYXRhRnJvbXtVc2VyRW1haWx9IGVxICRFbWFpbEFkZHJlc3MKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEN1c3RvbWVyS2V5ID0gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgID0+ICRDb3VudEF1eCwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCAgPT4gJEVtYWlsLT5hZGRyZXNzKCksCiAgICAgICAgICAgICAgICBDdXN0b21lclNlbGVjdGVkID0+ICRDdXN0b21lclNlbGVjdGVkLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yICAgID0+ICRDdXN0b21lckVycm9yLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvck1zZyA9PiAkQ3VzdG9tZXJFcnJvck1zZywKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRBZGRyZXNzZXNMaXN0eyRFbWFpbEFkZHJlc3N9ID0gMTsKICAgICAgICAgICAgJENvdW50RnJvbSsrOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdXNlciBwcmVmZXJlbmNlcwogICAgICAgIG15ICVVc2VyUHJlZmVyZW5jZXMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHN0b3JlIHRoZSBkeW5hbWljIGZpZWxkcyBkZWZhdWx0IHZhbHVlcyBvciB1c2VkIHNwZWNpZmljIGRlZmF1bHQgdmFsdWVzIHRvIGJlIHVzZWQgYXMKICAgICAgICAjIEFDTHMgaW5mbyBmb3IgYWxsIGZpZWxkcwogICAgICAgIG15ICVEeW5hbWljRmllbGREZWZhdWx0czsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9ICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHZhbHVlIGZyb20gZHluYW1pYyBmaWVsZCBjb25maWcgKGlmIGFueSkKICAgICAgICAgICAgbXkgJERlZmF1bHRWYWx1ZSA9ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfSB8fCAnJzsKCiAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIHZhbHVlIGZyb20gdXNlciBwcmVmZXJlbmNlcyBpZiBpcyBzZXQKICAgICAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAkRGVmYXVsdFZhbHVlID0gJFVzZXJQcmVmZXJlbmNlc3sgJ1VzZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRGVmYXVsdFZhbHVlIGVxICcnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiByZWYgJERlZmF1bHRWYWx1ZSBlcSAnQVJSQVknICYmICFJc0FycmF5UmVmV2l0aERhdGEoJERlZmF1bHRWYWx1ZSk7CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkRGVmYXVsdHN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJERlZmF1bHRWYWx1ZTsKICAgICAgICB9CiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZERlZmF1bHRzOwoKICAgICAgICAjIGNyZWF0ZSBodG1sIHN0cmluZ3MgZm9yIGFsbCBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVEeW5hbWljRmllbGRIVE1MOwoKICAgICAgICBteSAlU3BsaXRUaWNrZXRQYXJhbTsKCiAgICAgICAgIyBpbiBjYXNlIG9mIHNwbGl0IGEgVGlja2V0SUQgYW5kIEFydGljbGVJRCBhcmUgYWx3YXlzIGdpdmVuLCBzZW5kIHRoZSBUaWNrZXRJRCB0byBjYWxjdWxhdGUKICAgICAgICAjIEFDTHMgYmFzZWQgb24gcGFyZW50IGluZm9ybWF0aW9uCiAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSAmJiAkQXJ0aWNsZXtBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAkU3BsaXRUaWNrZXRQYXJhbXtUaWNrZXRJRH0gPSAkU2VsZi0+e1RpY2tldElEfTsKICAgICAgICB9CgogICAgICAgICMgZml4IHRvIGJ1ZyMgODA2OCBGaWVsZCAmIER5bmFtaWNGaWVsZCBwcmVzZWxlY3Rpb24gb24gVGlja2V0U3BsaXQKICAgICAgICAjIHdoZW4gc3BsaXR0aW5nIGEgdGlja2V0IHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGVzIG11c3QgcmVtYWluIGluIHRoZSBuZXcgdGlja2V0IHNjcmVlbgogICAgICAgICMgdGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgU3BsaXRUaWNrZXRQYXJhbSBoYXNoCiAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBpbmZvcm1hdGlvbiBmcm9tIG9yaWdpbmFsIHRpY2tldCAoU3BsaXRUaWNrZXQpCiAgICAgICAgICAgIG15ICVTcGxpdFRpY2tldERhdGEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFNwbGl0VGlja2V0UGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBzaW1wbGUgSURzIHRvIHBhc3MgdGhlbSB0byB0aGUgbWFzawogICAgICAgICAgICBmb3IgbXkgJFNwbGl0ZWRQYXJhbSAocXcoVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBQcmlvcml0eUlEKSkgewogICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17JFNwbGl0ZWRQYXJhbX0gPSAkU3BsaXRUaWNrZXREYXRheyRTcGxpdGVkUGFyYW19OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBTdGF0ZUlEIGFzIE5leHRTdGF0ZUlECiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte05leHRTdGF0ZUlEfSA9ICRTcGxpdFRpY2tldERhdGF7U3RhdGVJRH07CgogICAgICAgICAgICAjIHNldCBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17VXNlclNlbGVjdGVkfSAgICAgICAgICAgID0gJFNwbGl0VGlja2V0RGF0YXtPd25lcklEfTsKICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9ID0gJFNwbGl0VGlja2V0RGF0YXtSZXNwb25zaWJsZUlEfTsKCiAgICAgICAgICAgICMgc2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBPd25lciBhbmQgUmVzcG9uc2libGUKICAgICAgICAgICAgaWYgKCAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9ICkgewogICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17UXVldWVJRH0gPSAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte0FsbFVzZXJzfSA9IDE7CgogICAgICAgICAgICAjIHNldCB0aGUgc2VsZWN0ZWQgcXVldWUgaW4gZm9ybWF0IElEfHxOYW1lCiAgICAgICAgICAgICRTcGxpdFRpY2tldFBhcmFte1RvU2VsZWN0ZWR9ID0gJFNwbGl0VGlja2V0RGF0YXtRdWV1ZUlEfSAuICd8fCcgLiAkU3BsaXRUaWNrZXREYXRhe1F1ZXVlfTsKCiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVTcGxpdFRpY2tldERhdGEgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRLZXkgPX4gL0R5bmFtaWNGaWVsZFxfKC4qKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNwbGl0VGlja2V0UGFyYW17RHluYW1pY0ZpZWxkfXskMX0gPSAkU3BsaXRUaWNrZXREYXRheyRLZXl9OwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkU3BsaXRUaWNrZXRQYXJhbXskS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHRvIHN0b3JlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSBkYXRhYmFzZSAob3IgdW5kZWZpbmVkKQogICAgICAgICAgICBteSAkVmFsdWU7CgogICAgICAgICAgICAjIGluIGNhc2Ugb2Ygc3BsaXQgYSBUaWNrZXRJRCBhbmQgQXJ0aWNsZUlEIGFyZSBhbHdheXMgZ2l2ZW4sIEdldCB0aGUgdmFsdWUKICAgICAgICAgICAgIyBmcm9tIERCIHRoaXMgY2FzZXMKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSAmJiAkQXJ0aWNsZXtBcnRpY2xlSUR9ICkgewoKICAgICAgICAgICAgICAgICMgc2VsZWN0IFRpY2tldElEIG9yIEFydGljbGVJRCB0byBnZXQgdGhlIHZhbHVlIGRlcGVuZGluZyBvbiBkeW5hbWljIGZpZWxkIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIG15ICRPYmplY3RJRCA9ICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JwogICAgICAgICAgICAgICAgICAgID8gJFNlbGYtPntUaWNrZXRJRH0KICAgICAgICAgICAgICAgICAgICA6ICRBcnRpY2xle0FydGljbGVJRH07CgogICAgICAgICAgICAgICAgIyBnZXQgdmFsdWUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZSAoc3BsaXQpCiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJE9iamVjdElELAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvdGhlcndpc2UgKG9uIGEgbmV3IHRpY2tldCkuIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBhIHVzZXIgc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZSBmb3IKICAgICAgICAgICAgIyB0aGUgZHluYW1pYyBmaWVsZCwgb3RoZXJ3aXNlIHdpbGwgdXNlIER5bmFtaWMgRmllbGQgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIG92ZXJyaWRlIHRoZSB2YWx1ZSBmcm9tIHVzZXIgcHJlZmVyZW5jZXMgaWYgaXMgc2V0CiAgICAgICAgICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGZpZWxkIGh0bWwKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fSwKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVwZGF0YWJsZUZpZWxkcyAgICAgID0+ICRTZWxmLT5fR2V0RmllbGRzVG9VcGRhdGUoKSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFuZCBmb3JtYXQgZGVmYXVsdCBzdWJqZWN0IGFuZCBib2R5CiAgICAgICAgbXkgJFN1YmplY3QgPSAkQXJ0aWNsZXtTdWJqZWN0fTsKICAgICAgICBpZiAoICEkU3ViamVjdCApIHsKICAgICAgICAgICAgJFN1YmplY3QgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkQm9keSA9ICRBcnRpY2xle0JvZHl9IHx8ICcnOwogICAgICAgIGlmICggISRCb2R5ICkgewogICAgICAgICAgICAkQm9keSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dCAoaWYgYm9keSBpcyBiYXNlZCBvbiBjb25maWcpCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0FydGljbGVJRH0gJiYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpbiBjYXNlIG9mIHRpY2tldCBzcGxpdCBzZXQgJFNlbGYtPntRdWV1ZUlEfSBhcyB0aGUgUXVldWVJRCBvZiB0aGUgb3JpZ2luYWwgdGlja2V0LAogICAgICAgICMgaW4gb3JkZXIgdG8gc2V0IGNvcnJlY3QgQUNMcyBvbiBwYWdlIGxvYWQgKGluaXRpYWwpLiBTZWUgYnVnIDg2ODcuCiAgICAgICAgaWYgKAogICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSggXCVTcGxpdFRpY2tldFBhcmFtICkKICAgICAgICAgICAgJiYgJFNwbGl0VGlja2V0UGFyYW17UXVldWVJRH0KICAgICAgICAgICAgJiYgISRTZWxmLT57UXVldWVJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntRdWV1ZUlEfSA9ICRTcGxpdFRpY2tldFBhcmFte1F1ZXVlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkU2VsZi0+e1F1ZXVlSUR9ICAgICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7VXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSAgICAgICAgIHx8IDEsCiAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrUGhvbmVOZXcoCiAgICAgICAgICAgIFF1ZXVlSUQgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgTmV4dFN0YXRlcyA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7VXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0gICAgICAgICB8fCAxLAogICAgICAgICAgICApLAogICAgICAgICAgICBQcmlvcml0aWVzID0+ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSAgICAgICAgIHx8IDEsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFR5cGVzID0+ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7VXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0gICAgICAgICB8fCAxLAogICAgICAgICAgICApLAogICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgIFNMQXMgICAgICAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlcyA9PiAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgJVNwbGl0VGlja2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgJycsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFVzZXJzID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICAlU3BsaXRUaWNrZXRQYXJhbSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICApLAogICAgICAgICAgICBUbyA9PiAkU2VsZi0+X0dldFRvcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICApLAogICAgICAgICAgICBGcm9tICAgICAgICAgPT4gJEFydGljbGV7RnJvbX0sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkU3ViamVjdCwKICAgICAgICAgICAgQm9keSAgICAgICAgID0+ICRCb2R5LAogICAgICAgICAgICBDdXN0b21lcklEICAgPT4gJEFydGljbGV7Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgIEN1c3RvbWVyRGF0YSA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgQXR0YWNobWVudHMgID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgIExpbmtUaWNrZXRJRCA9PiAkR2V0UGFyYW17TGlua1RpY2tldElEfSB8fCAnJywKICAgICAgICAgICAgRnJvbUNoYXRJRCAgID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSB8fCAnJywKCiAgICAgICAgICAgICMgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVTcGxpdFRpY2tldFBhcmFtLAogICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MID0+IFwlRHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICAgICAgTXVsdGlwbGVDdXN0b21lciA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IHRpY2tldCBhbmQgYXJ0aWNsZQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlTmV3JyApIHsKCiAgICAgICAgbXkgJUVycm9yOwogICAgICAgIG15ICVTdGF0ZURhdGE7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV4dFN0YXRlSUR9ICkgewogICAgICAgICAgICAlU3RhdGVEYXRhID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0KAogICAgICAgICAgICAgICAgSUQgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJE5leHRTdGF0ZSA9ICRTdGF0ZURhdGF7TmFtZX0gfHwgJyc7CiAgICAgICAgbXkgJERlc3QgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwoKICAgICAgICAjIHNlZSBpZiBvbmx5IGEgbmFtZSBoYXMgYmVlbiBwYXNzZWQKICAgICAgICBpZiAoICREZXN0ICYmICREZXN0ICF+IG17IFxBIChcZCspPyBcfCBcfCAuKyBceiB9eG1zICkgewoKICAgICAgICAgICAgIyBzZWUgaWYgd2UgY2FuIGdldCBhbiBJRCBmb3IgdGhpcyBxdWV1ZSBuYW1lCiAgICAgICAgICAgIG15ICREZXN0SUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVMb29rdXAoCiAgICAgICAgICAgICAgICBRdWV1ZSA9PiAkRGVzdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkRGVzdElEKSB7CiAgICAgICAgICAgICAgICAkRGVzdCA9ICREZXN0SUQgLiAnfHwnIC4gJERlc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGVzdCA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAoICROZXdRdWV1ZUlELCAkVG8gKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcmVTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkU2VsZWN0ZWRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkQ3VzdG9tZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJEV4cGFuZEN1c3RvbWVyTmFtZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0V4cGFuZEN1c3RvbWVyTmFtZScgKQogICAgICAgICAgICB8fCAwOwogICAgICAgIG15ICVGcm9tRXh0ZXJuYWxDdXN0b21lcjsKICAgICAgICAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7Q3VzdG9tZXJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJlU2VsZWN0ZWRDdXN0b21lclVzZXInICkKICAgICAgICAgICAgfHwgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ093bmVyQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte093bmVyQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3BvbnNpYmxlQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsZWFyRnJvbScgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJyc7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAyICkgewogICAgICAgICAgICBteSAkSXRlbSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkV4cGFuZEN1c3RvbWVyTmFtZSRDb3VudCIgKSB8fCAwOwogICAgICAgICAgICBpZiAoICRDb3VudCA9PSAxICYmICRJdGVtICkgewogICAgICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQ291bnQgPT0gMiAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJld3JhcCBib2R5IGlmIG5vIHJpY2ggdGV4dCBpcyB1c2VkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gJiYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+V3JhcFBsYWluVGV4dCgKICAgICAgICAgICAgICAgIE1heENoYXJhY3RlcnMgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpLAogICAgICAgICAgICAgICAgUGxhaW5UZXh0ICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgbXkgQEF0dGFjaG1lbnRJRHMgPSBtYXAgewogICAgICAgICAgICBteSAoJElEKSA9ICRfID1+IG17IFxBIEF0dGFjaG1lbnREZWxldGUgKFxkKykgXHogfXhtczsKICAgICAgICAgICAgJElEID8gJElEIDogKCk7CiAgICAgICAgfSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW1OYW1lcygpOwoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgbXkgJENvdW50ICggcmV2ZXJzZSBzb3J0IEBBdHRhY2htZW50SURzICkgewogICAgICAgICAgICBteSAkRGVsZXRlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXR0YWNobWVudERlbGV0ZSRDb3VudCIgKTsKICAgICAgICAgICAgbmV4dCBDT1VOVCBpZiAhJERlbGV0ZTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDb3VudCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJElzVXBsb2FkID0gMTsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgKSB7CiAgICAgICAgICAgICRJc1VwbG9hZCAgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgICAgICVFcnJvciAgICAgICAgICAgICAgICAgICA9ICgpOwogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICVVcGxvYWRTdHVmZiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgcGVuZGluZyBkYXRlCiAgICAgICAgaWYgKCAhJEV4cGFuZEN1c3RvbWVyTmFtZSAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSAmJiAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntUaW1lT2JqZWN0fS0+RGF0ZTJTeXN0ZW1UaW1lKCAlR2V0UGFyYW0sIFNlY29uZCA9PiAwICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRJc1VwbG9hZCA9PSAwICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcntEYXRlSW52YWxpZH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCAkSXNVcGxvYWQgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7RGF0ZUludmFsaWR9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGh0bWwgc3RyaW5ncyBmb3IgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEhUTUw7CgogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdDsKCiAgICAgICAgICAgICMgZG8gbm90IHZhbGlkYXRlIG9uIGF0dGFjaG1lbnQgdXBsb2FkCiAgICAgICAgICAgIGlmICggISRJc1VwbG9hZCAmJiAhJEV4cGFuZEN1c3RvbWVyTmFtZSApIHsKCiAgICAgICAgICAgICAgICAkVmFsaWRhdGlvblJlc3VsdCA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkVkaXRGaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgICAgPT4gJFNlbGYtPntQYXJhbU9iamVjdH0sCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ISIsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbi4nLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBwcm9wYWdhdGUgdmFsaWRhdGlvbiBlcnJvciB0byB0aGUgRXJyb3IgdmFyaWFibGUgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlIGZyb250ZW5kCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZmllbGQgaHRtbAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgU2VydmVyRXJyb3IgICAgICAgICAgPT4gJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gfHwgJycsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgICAgICAgICA9PiAkVmFsaWRhdGlvblJlc3VsdC0+e0Vycm9yTWVzc2FnZX0gfHwgJycsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkU2VsZi0+e1BhcmFtT2JqZWN0fSwKICAgICAgICAgICAgICAgIEFKQVhVcGRhdGUgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVcGRhdGFibGVGaWVsZHMgICAgICA9PiAkU2VsZi0+X0dldEZpZWxkc1RvVXBkYXRlKCksCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGV4cGFuZCBjdXN0b21lciBuYW1lCiAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGE7CiAgICAgICAgaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDEgKSB7CgogICAgICAgICAgICAjIHNlYXJjaCBjdXN0b21lcgogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdDsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgU2VhcmNoID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYganVzdCBvbmUgY3VzdG9tZXIgdXNlciBleGlzdHMKICAgICAgICAgICAgIyBpZiBqdXN0IG9uZSwgZmlsbHVwIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID0gMDsKICAgICAgICAgICAgZm9yIG15ICRLZXlDdXN0b21lclVzZXIgKCBzb3J0IGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSsrOwogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0fSAgICAgPSAkQ3VzdG9tZXJVc2VyTGlzdHskS2V5Q3VzdG9tZXJVc2VyfTsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9ID0gJEtleUN1c3RvbWVyVXNlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID09IDEgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gICAgICAgICAgICA9ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH07CiAgICAgICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59OwogICAgICAgICAgICAgICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7Q3VzdG9tZXJ9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICVFeHRlcm5hbEN1c3RvbWVyVXNlckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRGcm9tRXh0ZXJuYWxDdXN0b21lcntFbWFpbH0gPSAkRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhe1VzZXJFbWFpbH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgbW9yZSB0aGFuIG9uZSBjdXN0b21lciB1c2VyIGV4aXN0LCBzaG93IGxpc3QKICAgICAgICAgICAgIyBhbmQgY2xlYW4gQ3VzdG9tZXJVc2VySUQgYW5kIEN1c3RvbWVySUQKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBkb24ndCBjaGVjayBlbWFpbCBzeW50YXggb24gbXVsdGkgY3VzdG9tZXIgc2VsZWN0CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gMAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJyc7CgogICAgICAgICAgICAgICAgIyBjbGVhciBmcm9tIGlmIHRoZXJlIGlzIG5vIGN1c3RvbWVyIGZvdW5kCiAgICAgICAgICAgICAgICBpZiAoICElQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRFcnJvcntFeHBhbmRDdXN0b21lck5hbWV9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJvbSBhbmQgY3VzdG9tZXIgaWQgaWYgY3VzdG9tZXIgdXNlciBpcyBnaXZlbgogICAgICAgIGVsc2lmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAyICkgewogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkS2V5Q3VzdG9tZXJVc2VyICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJEN1c3RvbWVyVXNlckxpc3R7JEtleUN1c3RvbWVyVXNlcn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRGcm9tRXh0ZXJuYWxDdXN0b21lcntDdXN0b21lcn0gKSB7CiAgICAgICAgICAgICAgICBteSAlRXh0ZXJuYWxDdXN0b21lclVzZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEZyb21FeHRlcm5hbEN1c3RvbWVye0N1c3RvbWVyfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRnJvbUV4dGVybmFsQ3VzdG9tZXJ7RW1haWx9ID0gJEV4dGVybmFsQ3VzdG9tZXJVc2VyRGF0YXtVc2VyRW1haWx9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRFcnJvcntFeHBhbmRDdXN0b21lck5hbWV9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgaWYgYSBuZXcgZGVzdGluYXRpb24gcXVldWUgaXMgc2VsZWN0ZWQKICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMyApIHsKICAgICAgICAgICAgJEVycm9ye05vU3VibWl0fSA9IDE7CiAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkU2VsZWN0ZWRDdXN0b21lclVzZXI7CiAgICAgICAgfQoKICAgICAgICAjICdqdXN0JyBubyBzdWJtaXQKICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gNCApIHsKICAgICAgICAgICAgJEVycm9ye05vU3VibWl0fSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgY3VzdG9tZXIgaW5mbwogICAgICAgIG15ICVDdXN0b21lckRhdGE7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEN1c3RvbWVySUQpIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJEdldFBhcmFte0Zyb219ICkgKSB7CiAgICAgICAgICAgIGlmICggISRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgJEVycm9ye0Vycm9yVHlwZX0gICA9ICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFcnJvclR5cGUoKSAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkRXJyb3J7RnJvbUludmFsaWR9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISRJc1VwbG9hZCAmJiAhJEV4cGFuZEN1c3RvbWVyTmFtZSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0Zyb219ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydGcm9tSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJE5ld1F1ZXVlSUQgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0Rlc3RpbmF0aW9uSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNlcnZpY2UKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlTWFuZGF0b3J5fQogICAgICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzbGEKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTTEFNYW5kYXRvcnl9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NMQUludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICggISRHZXRQYXJhbXtUeXBlSUR9ICkgJiYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVHlwZUlESW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydSaWNoVGV4dEludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1RpbWVVbml0c30gZXEgJycKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydUaW1lVW5pdHNJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgIyBnZXQgYW5kIGZvcm1hdCBkZWZhdWx0IHN1YmplY3QgYW5kIGJvZHkKICAgICAgICAgICAgbXkgJFN1YmplY3QgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e0JvZHl9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgYm9keSBpcyByaWNoIHRleHQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQm9keSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICNzZXQgQm9keSBhbmQgU3ViamVjdCBwYXJhbWV0ZXJzIGZvciBPdXRwdXQKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFN1YmplY3Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRCb2R5OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBzZXJ2aWNlcwogICAgICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVzZXQgcHJldmlvdXMgU2VydmljZUlEIHRvIHJlc2V0IFNMQS1MaXN0IGlmIG5vIHNlcnZpY2UgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1NlcnZpY2VJRH0gfHwgISRTZXJ2aWNlcy0+eyAkR2V0UGFyYW17U2VydmljZUlEfSB9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1NlcnZpY2VJRH0gPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaGVhZGVyCiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza1Bob25lTmV3KAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcnMgICA9PiAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBVc2VyU2VsZWN0ZWQgICAgID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJTZWxlY3RlZCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICBOZXh0U3RhdGVzICAgICAgICAgICAgICA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgTmV4dFN0YXRlICA9PiAkTmV4dFN0YXRlLAogICAgICAgICAgICAgICAgUHJpb3JpdGllcyA9PiAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVHlwZXMgPT4gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICBTTEFzICAgICAgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVzID0+ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8ICcnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJEN1c3RvbWVySUQgKSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEYXRhID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICAgICAgVG8gICAgICAgICAgID0+ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkTmV3UXVldWVJRAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFRvU2VsZWN0ZWQgID0+ICREZXN0LAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRIVE1MICAgICA9PiBcJUR5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgICBNdWx0aXBsZUN1c3RvbWVyICAgICA9PiBcQE11bHRpcGxlQ3VzdG9tZXIsCiAgICAgICAgICAgICAgICBGcm9tRXh0ZXJuYWxDdXN0b21lciA9PiBcJUZyb21FeHRlcm5hbEN1c3RvbWVyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHRpY2tldCwgZG8gZGIgaW5zZXJ0CiAgICAgICAgbXkgJFRpY2tldElEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFN0YXRlSUQgICAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICBQcmlvcml0eUlEICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3VzdG9tZXJObyAgID0+ICRDdXN0b21lcklELAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnVGlja2V0JzsKCiAgICAgICAgICAgICMgc2V0IHRoZSB2YWx1ZQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5fSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNvbmZpZyBmb3IgY3JpdGljYWxpdHkgZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkQ3JpdGljYWxpdHlEeW5hbWljRmllbGRDb25maWcgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lUU01Dcml0aWNhbGl0eScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBwb3NzaWJsZSB2YWx1ZXMgZm9yIGNyaXRpY2FsaXR5CiAgICAgICAgICAgIG15ICRDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJENyaXRpY2FsaXR5RHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZXZlcnNlIHRoZSBsaXN0IHRvIGZpbmQgb3V0IHRoZSBrZXkKICAgICAgICAgICAgbXkgJVJldmVyc2VDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzID0gcmV2ZXJzZSAleyAkQ3JpdGljYWxpdHlQb3NzaWJsZVZhbHVlcyB9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIGNyaXRpY2FsaXR5CiAgICAgICAgICAgICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRDcml0aWNhbGl0eUR5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFJldmVyc2VDcml0aWNhbGl0eVBvc3NpYmxlVmFsdWVzeyAkU2VydmljZXtDcml0aWNhbGl0eX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQojIC0tLQogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSA9PiAnRmlsZVVwbG9hZCcsCiAgICAgICAgKTsKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnREYXRhLCBcJVVwbG9hZFN0dWZmOwogICAgICAgIH0KCiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAjIHJlbW92ZSB1bnVzZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICBteSBATmV3QXR0YWNobWVudERhdGE7CiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnREYXRhKSB7CiAgICAgICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRExpbmtFbmNvZGUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID1+IHMvKENvbnRlbnRJRD0pJENvbnRlbnRJRExpbmtFbmNvZGUvJDEkQ29udGVudElEL2c7CgogICAgICAgICAgICAgICAgICAgICMgaWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5CiAgICAgICAgICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICRHZXRQYXJhbXtCb2R5fSAhfiAvKFxRJENvbnRlbnRJREhUTUxRdW90ZVxFfFxRJENvbnRlbnRJRFxFKS9pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcmVtZW1iZXIgaW5saW5lIGltYWdlcyBhbmQgbm9ybWFsIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBwdXNoIEBOZXdBdHRhY2htZW50RGF0YSwgXCV7JEF0dGFjaG1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBBdHRhY2htZW50RGF0YSA9IEBOZXdBdHRhY2htZW50RGF0YTsKCiAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFBsYWluQm9keSA9ICRHZXRQYXJhbXtCb2R5fTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkUGxhaW5Cb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dDJBc2NpaSggU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBuZXcgb3duZXIgaXMgZ2l2ZW4gKHRoZW4gc2VuZCBubyBhZ2VudCBub3RpZnkpCiAgICAgICAgbXkgJE5vQWdlbnROb3RpZnkgPSAwOwogICAgICAgIGlmICggJEdldFBhcmFte05ld1VzZXJJRH0gKSB7CiAgICAgICAgICAgICROb0FnZW50Tm90aWZ5ID0gMTsKICAgICAgICB9CiAgICAgICAgbXkgJEFydGljbGVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgTm9BZ2VudE5vdGlmeSAgICA9PiAkTm9BZ2VudE5vdGlmeSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIEFydGljbGVUeXBlICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGV9LAogICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICBGcm9tICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgVG8gICAgICAgICAgICAgICA9PiAkVG8sCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgIEF1dG9SZXNwb25zZVR5cGUgPT4gKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQXV0b1Jlc3BvbnNlRm9yV2ViVGlja2V0cycpICkKICAgICAgICAgICAgPyAnYXV0byByZXBseScKICAgICAgICAgICAgOiAnJywKICAgICAgICAgICAgT3JpZ0hlYWRlciA9PiB7CiAgICAgICAgICAgICAgICBGcm9tICAgID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgICAgIFRvICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICAgICAgQm9keSAgICA9PiAkUGxhaW5Cb2R5LAoKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUXVldWUgPT4gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlTG9va3VwKCBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEICksCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnQXJ0aWNsZSc7CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBQZXJtaXNzaW9ucyBjaGVjayB3ZXJlIGRvbmUgZWFybGllcgogICAgICAgIGlmICggJEdldFBhcmFte0Zyb21DaGF0SUR9ICkgewogICAgICAgICAgICBteSAkQ2hhdE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0Jyk7CiAgICAgICAgICAgIG15ICVDaGF0ICAgICAgID0gJENoYXRPYmplY3QtPkNoYXRHZXQoCiAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSBAQ2hhdE1lc3NhZ2VMaXN0ID0gJENoYXRPYmplY3QtPkNoYXRNZXNzYWdlTGlzdCgKICAgICAgICAgICAgICAgIENoYXRJRCA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRDaGF0QXJ0aWNsZUlEOwoKICAgICAgICAgICAgaWYgKEBDaGF0TWVzc2FnZUxpc3QpIHsKICAgICAgICAgICAgICAgIG15ICRKU09OQm9keSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxAQ2hhdE1lc3NhZ2VMaXN0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkQ2hhdEFydGljbGVUeXBlID0gJ2NoYXQtaW50ZXJuYWwnOwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRDaGF0e1JlcXVlc3RlclR5cGV9IGVxICdDdXN0b21lcicKICAgICAgICAgICAgICAgICAgICB8fCAkQ2hhdHtUYXJnZXRUeXBlfSBlcSAnQ3VzdG9tZXInCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRDaGF0QXJ0aWNsZVR5cGUgPSAnY2hhdC1leHRlcm5hbCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJENoYXRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgTm9BZ2VudE5vdGlmeSA9PiAkTm9BZ2VudE5vdGlmeSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlVHlwZSAgID0+ICRDaGF0QXJ0aWNsZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKCiAgICAgICAgICAgICAgICAgICAgIyBGcm9tICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgICAgICAgICAjIFRvICAgICAgICAgICAgICAgPT4gJFRvLAogICAgICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCdDaGF0JyksCiAgICAgICAgICAgICAgICAgICAgQm9keSAgICAgICAgICAgPT4gJEpTT05Cb2R5LAogICAgICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgID0+ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZSAgICAgICAgICA9PiAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVMb29rdXAoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRDaGF0QXJ0aWNsZUlEKSB7CiAgICAgICAgICAgICAgICAkQ2hhdE9iamVjdC0+Q2hhdERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgb3duZXIgKGlmIG5ldyB1c2VyIGlkIGlzIGdpdmVuKQogICAgICAgIGlmICggJEdldFBhcmFte05ld1VzZXJJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdVc2VySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGxvY2sKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJ2xvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbHNlIHNldCBvd25lciB0byBjdXJyZW50IGFnZW50IGJ1dCBkbyBub3QgbG9jayBpdAogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBTZW5kTm9Ob3RpZmljYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCByZXNwb25zaWJsZSAoaWYgbmV3IHVzZXIgaWQgaXMgZ2l2ZW4pCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UmVzcG9uc2libGVTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnREYXRhKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdGVkIGF0dGFjaG1lbnRzCiAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAjIGxpbmsgdGlja2V0cwogICAgICAgIGlmICgKICAgICAgICAgICAgJEdldFBhcmFte0xpbmtUaWNrZXRJRH0KICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U3BsaXRMaW5rVHlwZX0KICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U3BsaXRMaW5rVHlwZX0tPntMaW5rVHlwZX0KICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U3BsaXRMaW5rVHlwZX0tPntEaXJlY3Rpb259CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEdldFBhcmFte0xpbmtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAiWW91IG5lZWQgcm8gcGVybWlzc2lvbiEiLAogICAgICAgICAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU291cmNlS2V5ID0gJEdldFBhcmFte0xpbmtUaWNrZXRJRH07CiAgICAgICAgICAgIG15ICRUYXJnZXRLZXkgPSAkVGlja2V0SUQ7CgogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1NwbGl0TGlua1R5cGV9LT57RGlyZWN0aW9ufSBlcSAnU291cmNlJyApIHsKICAgICAgICAgICAgICAgICRTb3VyY2VLZXkgPSAkVGlja2V0SUQ7CiAgICAgICAgICAgICAgICAkVGFyZ2V0S2V5ID0gJEdldFBhcmFte0xpbmtUaWNrZXRJRH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbGluayB0aGUgdGlja2V0cwogICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rQWRkKAogICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldEtleSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTcGxpdExpbmtUeXBlfS0+e0xpbmtUeXBlfSB8fCAnTm9ybWFsJywKICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2xvc2VkIHRpY2tldHMgZ2V0IHVubG9ja2VkCiAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CgogICAgICAgICAgICAjIHNldCBsb2NrCiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgZWxzaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXnBlbmRpbmcvaSApIHsKCiAgICAgICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAjIGdldCB0aGUgdGVtcG9yYXJpbHkgbGlua3MKICAgICAgICAgICAgbXkgJFRlbXBMaW5rTGlzdCA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIFN0YXRlICA9PiAnVGVtcG9yYXJ5JywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRUZW1wTGlua0xpc3QgJiYgcmVmICRUZW1wTGlua0xpc3QgZXEgJ0hBU0gnICYmICV7JFRlbXBMaW5rTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRPYmplY3RPcmcgKCBzb3J0IGtleXMgJXskVGVtcExpbmtMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IHR5cGVsaXN0CiAgICAgICAgICAgICAgICAgICAgbXkgJFR5cGVMaXN0ID0gJFRlbXBMaW5rTGlzdC0+eyRUYXJnZXRPYmplY3RPcmd9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFR5cGUgKCBzb3J0IGtleXMgJXskVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFR5cGVMaXN0LT57JFR5cGV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBzb3J0IGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUYXJnZXRLZXlPcmcgKCBzb3J0IGtleXMgJXsgJERpcmVjdGlvbkxpc3QtPnskRGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgdGVtcCBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdDIgPT4gJFRhcmdldE9iamVjdE9yZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MiAgICA9PiAkVGFyZ2V0S2V5T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlT2JqZWN0ID0gJFRhcmdldE9iamVjdE9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU291cmNlS2V5ICAgID0gJFRhcmdldEtleU9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0T2JqZWN0ID0gJ1RpY2tldCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRhcmdldEtleSAgICA9ICRUaWNrZXRJRDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGlyZWN0aW9uIGVxICdUYXJnZXQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU291cmNlT2JqZWN0ID0gJ1RpY2tldCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VLZXkgICAgPSAkVGlja2V0SUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGFyZ2V0S2V5ICAgID0gJFRhcmdldEtleU9yZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwZXJtYW5lbnRseSBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJFNvdXJjZU9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRTb3VyY2VLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAkVGFyZ2V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFRhcmdldEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiMgLS0tCiAgICAgICAgIyBnZXQgcmVkaXJlY3Qgc2NyZWVuCiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkU2VsZi0+e1VzZXJDcmVhdGVOZXh0TWFza30gfHwgJ0FnZW50VGlja2V0UGhvbmUnOwoKICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47U3ViYWN0aW9uPUNyZWF0ZWQ7VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdHZXRTZXJ2aWNlSW5jaWRlbnRTdGF0ZScgKSB7CgogICAgICAgICMgZ2V0IHRoZSBzZWxlY3RlZCBzZXJ2aWNlIGlkCiAgICAgICAgbXkgJFNlcnZpY2VJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlcnZpY2VJRCcgKSB8fCAnJzsKCiAgICAgICAgIyBidWlsZCBlbXB0eSByZXNwb25zZSBoYXNoCiAgICAgICAgbXkgJVJlc3BvbnNlID0gKAogICAgICAgICAgICBDdXJJbmNpU2lnbmFsID0+ICcnLAogICAgICAgICAgICBDdXJJbmNpU3RhdGUgID0+ICcmbmJzcCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBvbmx5IGlmIHNlcnZpY2UgaWQgaXMgc2VsZWN0ZWQKICAgICAgICBpZiAoICRTZXJ2aWNlSUQgJiYgJFNlbGYtPntDb25maWd9LT57U2hvd0luY2lkZW50U3RhdGV9ICkgewoKICAgICAgICAgICAgIyBzZXQgaW5jaWRlbnQgc2lnbmFsCiAgICAgICAgICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICAgICAgICAgIG9wZXJhdGlvbmFsID0+ICdncmVlbmxlZCcsCiAgICAgICAgICAgICAgICB3YXJuaW5nICAgICA9PiAneWVsbG93bGVkJywKICAgICAgICAgICAgICAgIGluY2lkZW50ICAgID0+ICdyZWRsZWQnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBidWlsZCB0aGUgcmVzcG9uc2UKICAgICAgICAgICAgJVJlc3BvbnNlID0gKAogICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRTZXJ2aWNle0N1ckluY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgICAgICBDdXJJbmNpU3RhdGUgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRTZXJ2aWNle0N1ckluY2lTdGF0ZX0pLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBlbmNvZGUgcmVzcG9uc2UgdG8gSlNPTgogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IFwlUmVzcG9uc2UsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KIyAtLS0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKICAgICAgICBteSAkRGVzdCAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwogICAgICAgIG15ICRDdXN0b21lclVzZXIgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApOwogICAgICAgIG15ICRFbGVtZW50Q2hhbmdlZCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJyApIHx8ICcnOwogICAgICAgIG15ICRRdWV1ZUlEICAgICAgICA9ICcnOwogICAgICAgIGlmICggJERlc3QgPX4gL14oXGR7MSwxMDB9KVx8XHwuKz8kLyApIHsKICAgICAgICAgICAgJFF1ZXVlSUQgPSAkMTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkVG9zID0gJFNlbGYtPl9HZXRUb3MoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEID0+ICRRdWV1ZUlELAogICAgICAgICk7CgogICAgICAgIG15ICROZXdUb3M7CgogICAgICAgIGlmICgkVG9zKSB7CiAgICAgICAgICAgIFRPczoKICAgICAgICAgICAgZm9yIG15ICRLZXlUbyAoIHNvcnQga2V5cyAleyRUb3N9ICkgewogICAgICAgICAgICAgICAgbmV4dCBUT3MgaWYgKCAkVG9zLT57JEtleVRvfSBlcSAnLScgKTsKICAgICAgICAgICAgICAgICROZXdUb3MtPnsiJEtleVRvfHwkVG9zLT57JEtleVRvfSJ9ID0gJFRvcy0+eyRLZXlUb307CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgJFVzZXJzID0gJFNlbGYtPl9HZXRVc2VycygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9LAogICAgICAgICk7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlVXNlcnMgPSAkU2VsZi0+X0dldFJlc3BvbnNpYmxlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9LAogICAgICAgICk7CiAgICAgICAgbXkgJE5leHRTdGF0ZXMgPSAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJUFDTENvbXBhdEdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkU0xBcyA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICAgICAgU2VydmljZXMgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICk7CiAgICAgICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPl9HZXRTdGFuZGFyZFRlbXBsYXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQUNMQ29tcGF0R2V0UGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgfHwgJycsCiAgICAgICAgKTsKICAgICAgICBteSAkVHlwZXMgPSAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQUNMUmVkdWNpYmxlOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVBQ0xDb21wYXRHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDAsCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbERhdGEoKTsKCiAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9IGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzICAgICA9PiAkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICkgfHwgJFBvc3NpYmxlVmFsdWVzOwoKICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgQFRlbXBsYXRlQUpBWDsKCiAgICAgICAgIyB1cGRhdGUgdGlja2V0IGJvZHkgYW5kIGF0dGFjaGVtZW50cyBpZiBuZWVkZWQuCiAgICAgICAgaWYgKCAkRWxlbWVudENoYW5nZWQgZXEgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgKSB7CiAgICAgICAgICAgIG15IEBUaWNrZXRBdHRhY2htZW50czsKICAgICAgICAgICAgbXkgJFRlbXBsYXRlVGV4dDsKCiAgICAgICAgICAgICMgcmVtb3ZlIGFsbCBhdHRhY2htZW50cyBmcm9tIHRoZSBVcGxvYWQgY2FjaGUKICAgICAgICAgICAgbXkgJFJlbW92ZVN1Y2Nlc3MgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKAogICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFJlbW92ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGb3JtIGF0dGFjaG1lbnRzIGNvdWxkIG5vdCBiZSBkZWxldGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgdGVtcGxhdGUgdGV4dCBhbmQgc2V0IG5ldyBhdHRhY2htZW50cyBpZiBhIHRlbXBsYXRlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoICRHZXRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgKSB7CiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSBLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3ItPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0ZW1wbGF0ZSB0ZXh0LCByZXBsYWNlIHNtYXJ0IHRhZ3MgKGxpbWl0ZWQgYXMgdGlja2V0IGlzIG5vdCBjcmVhdGVkKQogICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgU3RkQXR0YWNobWVudE9iamVjdAogICAgICAgICAgICAgICAgbXkgJFN0ZEF0dGFjaG1lbnRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudC0+bmV3KCAleyRTZWxmfSApOwoKICAgICAgICAgICAgICAgICMgYWRkIHN0ZC4gYXR0YWNobWVudHMgdG8gdGlja2V0CiAgICAgICAgICAgICAgICBteSAlQWxsU3RkQXR0YWNobWVudHMgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3IgKCBzb3J0IGtleXMgJUFsbFN0ZEF0dGFjaG1lbnRzICkgewogICAgICAgICAgICAgICAgICAgIG15ICVBdHRhY2htZW50c0RhdGEgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudEdldCggSUQgPT4gJF8gKTsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBEaXNwb3NpdGlvbiA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICVBdHRhY2htZW50c0RhdGEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNlbmQgYSBsaXN0IG9mIGF0dGFjaG1lbnRzIGluIHRoZSB1cGxvYWQgY2FjaGUgYmFjayB0byB0aGUgY2xpZW50c2lkZSBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICAjIHdoaWNoIHJlbmRlcnMgdGhlbiB0aGUgbGlzdCBvZiBjdXJyZW50bHkgdXBsb2FkZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIEBUaWNrZXRBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBUZW1wbGF0ZUFKQVggPSAoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVXNlVGVtcGxhdGVDcmVhdGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJzAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkVGVtcGxhdGVUZXh0IHx8ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICA9PiAnVGlja2V0QXR0YWNobWVudHMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFxAVGlja2V0QXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAgICAgS2VlcERhdGEgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdEZXN0JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE5ld1RvcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJERlc3QsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1VzZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRVc2VycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFJlc3BvbnNpYmxlVXNlcnMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICROZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTdGFuZGFyZFRlbXBsYXRlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBTdWJhY3Rpb24hIScsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvcicsCiAgICAgICAgKTsKICAgIH0KfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5leHRTdGF0ZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVOZXh0U3RhdGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRVc2VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXJzCiAgICBteSAlU2hvd25Vc2VyczsKICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMganVzdCBzaG93IG9ubHkgdXNlcnMgd2l0aCBzZWxlY3RlZCBjdXN0b20gcXVldWUKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17QWxsVXNlcnN9ICkgewogICAgICAgIG15IEBVc2VySURzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5HZXRTdWJzY3JpYmVkVXNlcklEc0J5UXVldWVJRCglUGFyYW0pOwogICAgICAgIGZvciBteSAkS2V5R3JvdXBNZW1iZXIgKCBzb3J0IGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkS2V5R3JvdXBNZW1iZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5R3JvdXBNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBhbGwgc3lzdGVtIHVzZXJzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IGFsbCB1c2VycyB3aG8gYXJlIG93bmVyIG9yIHJ3IGluIHRoZSBxdWV1ZSBncm91cAogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9ICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEtleU1lbWJlciAoIHNvcnQga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgaWYgKCAkQWxsR3JvdXBzTWVtYmVyc3skS2V5TWVtYmVyfSApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRLZXlNZW1iZXJ9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB3b3JrZmxvdwogICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgICVQYXJhbSwKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdUaWNrZXQnLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ093bmVyJywKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIHsgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xEYXRhKCkgfSBpZiAkQUNMOwoKICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0UmVzcG9uc2libGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBqdXN0IHNob3cgb25seSB1c2VycyB3aXRoIHNlbGVjdGVkIGN1c3RvbSBxdWV1ZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgQFVzZXJJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRLZXlHcm91cE1lbWJlciAoIHNvcnQga2V5cyAlQWxsR3JvdXBzTWVtYmVycyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkVUlEIChAVXNlcklEcykgewogICAgICAgICAgICAgICAgaWYgKCAkVUlEIGVxICRLZXlHcm91cE1lbWJlciApIHsKICAgICAgICAgICAgICAgICAgICAkSGl0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkSGl0ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBbGxHcm91cHNNZW1iZXJzeyRLZXlHcm91cE1lbWJlcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGFsbCBzeXN0ZW0gdXNlcnMKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgIH0KCiAgICAjIHNob3cgYWxsIHVzZXJzIHdobyBhcmUgcmVzcG9uc2libGUgb3IgcncgaW4gdGhlIHF1ZXVlIGdyb3VwCiAgICBlbHNpZiAoICRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0gKTsKICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgVHlwZSAgICA9PiAncmVzcG9uc2libGUnLAogICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICApOwogICAgICAgIGZvciBteSAkS2V5TWVtYmVyICggc29ydCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICBpZiAoICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JEtleU1lbWJlcn0gPSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5TWVtYmVyfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHdvcmtmbG93CiAgICBteSAkQUNMID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFJldHVyblR5cGUgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgUmV0dXJuU3ViVHlwZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4geyAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbERhdGEoKSB9IGlmICRBQ0w7CgogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlUHJpb3JpdGllcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0VHlwZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0eXBlCiAgICBteSAlVHlwZTsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZTsKCiAgICAjIGNoZWNrIG5lZWRlZAogICAgcmV0dXJuIFwlU2VydmljZSBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlOjpEZWZhdWx0OjpVbmtub3duQ3VzdG9tZXInKTsKCiAgICAjIGNoZWNrIGlmIG5vIEN1c3RvbWVyVXNlcklEIGlzIHNlbGVjdGVkCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDAgbGVhdmUgQ3VzdG9tZXJVc2VySUQgZW1wdHksIGl0IHdpbGwgbm90IGdldCBhbnkgc2VydmljZXMKICAgICMgaWYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gMSBzZXQgQ3VzdG9tZXJVc2VySUQgdG8gZ2V0IGRlZmF1bHQgc2VydmljZXMKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gJiYgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAnPERFRkFVTFQ+JzsKICAgIH0KCiAgICAjIGdldCBzZXJ2aWNlIGxpc3QKICAgIGlmICggJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlU2VydmljZTsKfQoKc3ViIF9HZXRTTEFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQoKc3ViIF9HZXRUb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgIG15ICVOZXdUb3M7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpICkgewogICAgICAgICVOZXdUb3MgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSB9OwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgU2VsZWN0aW9uVHlwZSBRdWV1ZSBvciBTeXN0ZW1BZGRyZXNzPwogICAgICAgIG15ICVUb3M7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgZXEgJ1F1ZXVlJyApIHsKICAgICAgICAgICAgJVRvcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TW92ZUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICAgICAgQWN0aW9uICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVUb3MgPSAkU2VsZi0+e0RCT2JqZWN0fS0+R2V0VGFibGVEYXRhKAogICAgICAgICAgICAgICAgVGFibGUgPT4gJ3N5c3RlbV9hZGRyZXNzJywKICAgICAgICAgICAgICAgIFdoYXQgID0+ICdxdWV1ZV9pZCwgaWQnLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgIENsYW1wID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjcmVhdGUgcGVybWlzc2lvbiBxdWV1ZXMKICAgICAgICBteSAlVXNlckdyb3VwcyA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlbGVjdGlvbiBzdHJpbmcKICAgICAgICBRVUVVRUlEOgogICAgICAgIGZvciBteSAkUXVldWVJRCAoIHNvcnQga2V5cyAlVG9zICkgewogICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgUVVFVUVJRCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25TdHJpbmcnKQogICAgICAgICAgICAgICAgfHwgJzxSZWFsbmFtZT4gPDxFbWFpbD4+IC0gUXVldWU6IDxRdWV1ZT4nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlPi8kUXVldWVEYXRhe05hbWV9L2c7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWVDb21tZW50Pi8kUXVldWVEYXRhe0NvbW1lbnR9L2c7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIG5lICdRdWV1ZScgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAlU3lzdGVtQWRkcmVzc0RhdGEgPSAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9LT5TeXN0ZW1BZGRyZXNzR2V0KAogICAgICAgICAgICAgICAgICAgIElEID0+ICRUb3N7JFF1ZXVlSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UmVhbG5hbWU+LyRTeXN0ZW1BZGRyZXNzRGF0YXtSZWFsbmFtZX0vZzsKICAgICAgICAgICAgICAgICRTdHJpbmcgPX4gcy88RW1haWw+LyRTeXN0ZW1BZGRyZXNzRGF0YXtOYW1lfS9nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICROZXdUb3N7JFF1ZXVlSUR9ID0gJFN0cmluZzsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgZW1wdHkgc2VsZWN0aW9uCiAgICAkTmV3VG9zeycnfSA9ICctJzsKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9HZXRTdGFuZGFyZFRlbXBsYXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNyZWF0ZSB0ZW1wbGF0ZXMKICAgIG15ICVUZW1wbGF0ZXM7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVRlbXBsYXRlcyBpZiAhJFBhcmFte1F1ZXVlSUR9ICYmICEkUGFyYW17VGlja2V0SUR9OwoKICAgIG15ICRRdWV1ZUlEID0gJFBhcmFte1F1ZXVlSUR9IHx8ICcnOwogICAgaWYgKCAhJFBhcmFte1F1ZXVlSUR9ICYmICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICMgZ2V0IFF1ZXVlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUXVldWVJRCA9ICRUaWNrZXR7UXVldWVJRH0gfHwgJyc7CiAgICB9CgogICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4gXCVUZW1wbGF0ZXMgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfSApOwoKICAgICMgcmV0dXJuIGp1c3QgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBzY3JlZW4KICAgIHJldHVybiAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3JlYXRlfTsKfQoKc3ViIF9NYXNrUGhvbmVOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgICMgYnVpbGQgY3VzdG9tZXIgc2VhcmNoIGF1dG9jb21wbGV0ZSBmaWVsZAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZScsCiAgICApOwoKICAgICMgYnVpbGQgc3RyaW5nCiAgICAkUGFyYW17T3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17VXNlcnN9LAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VXNlclNlbGVjdGVkfSwKICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1VzZXJJRCcsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICApOwoKICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAkUGFyYW17TmV4dFN0YXRlc1N0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRQYXJhbXtOZXh0U3RhdGVzfSwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFBhcmFte05leHRTdGF0ZX0gfHwgJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSwKICAgICk7CgogICAgIyBidWlsZCB0byBzdHJpbmcKICAgIG15ICVOZXdUbzsKICAgIGlmICggJFBhcmFte1RvfSApIHsKICAgICAgICBmb3IgbXkgJEtleVRvICggc29ydCBrZXlzICV7ICRQYXJhbXtUb30gfSApIHsKICAgICAgICAgICAgJE5ld1RveyIkS2V5VG98fCRQYXJhbXtUb30tPnskS2V5VG99In0gPSAkUGFyYW17VG99LT57JEtleVRvfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICRQYXJhbXtUb1N0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBUcmVlVmlldyAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgID0+ICRQYXJhbXtUb1NlbGVjdGVkfSwKICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte1RvU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQnLAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJU5ld1RvLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFte1RvU2VsZWN0ZWR9LAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgIyBjdXN0b21lciBpbmZvIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclRhYmxlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRDdXN0b21lclZpZXdUYWJsZSgKICAgICAgICAgICAgRGF0YSA9PiAkUGFyYW17Q3VzdG9tZXJEYXRhfSwKICAgICAgICAgICAgTWF4ICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZU1heFNpemUnKSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyVGFibGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgZXJyb3JzIQogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgbXkgJEtleUVycm9yICggc29ydCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskS2V5RXJyb3J9ID0gJyogJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkUGFyYW17RXJyb3JzfS0+eyRLZXlFcnJvcn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBGcm9tIGV4dGVybmFsCiAgICBteSAkU2hvd0Vycm9ycyA9IDE7CiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9ICYmCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LT57RW1haWx9ICYmCiAgICAgICAgZGVmaW5lZCAkUGFyYW17RnJvbUV4dGVybmFsQ3VzdG9tZXJ9LT57Q3VzdG9tZXJ9CiAgICAgICAgKQogICAgewogICAgICAgICRTaG93RXJyb3JzID0gMDsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGcm9tRXh0ZXJuYWxDdXN0b21lcicsCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte0Zyb21FeHRlcm5hbEN1c3RvbWVyfSwKICAgICAgICApOwogICAgfQogICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDA7CiAgICBpZiAoICRQYXJhbXtNdWx0aXBsZUN1c3RvbWVyfSApIHsKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17TXVsdGlwbGVDdXN0b21lcn0gfSApIHsKICAgICAgICAgICAgaWYgKCAhJFNob3dFcnJvcnMgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgZW1wdHkgdmFsdWVzIGZvciBlcnJvcnMKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gICAgPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJEaXNhYmxlZH0gPSAnJzsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30gPSAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57Q3VzdG9tZXJFcnJvck1zZ30sCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRJdGVtLT57Q3VzdG9tZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyRXJyb3JFeHBsYW50aW9uJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEN1c3RvbWVyQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkQ3VzdG9tZXJDb3VudGVyICkgewogICAgICAgICRQYXJhbXtDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgIH0KCiAgICAjIHNldCBjdXN0b21lciBjb3VudGVyCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ011bHRpcGxlQ3VzdG9tZXJDb3VudGVyJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXIrKywKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtGcm9tSW52YWxpZH0gJiYgJFBhcmFte0Vycm9yc30gJiYgISRQYXJhbXtFcnJvcnN9LT57RnJvbUVycm9yVHlwZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnRnJvbVNlcnZlckVycm9yTXNnJyApOwogICAgfQogICAgaWYgKCAkUGFyYW17RXJyb3JzfS0+e0Zyb21FcnJvclR5cGV9IHx8ICEkU2hvd0Vycm9ycyApIHsKICAgICAgICAkUGFyYW17RnJvbUludmFsaWR9ID0gJyc7CiAgICB9CgogICAgbXkgJER5bmFtaWNGaWVsZE5hbWVzID0gJFNlbGYtPl9HZXRGaWVsZHNUb1VwZGF0ZSgKICAgICAgICBPbmx5RHluYW1pY0ZpZWxkcyA9PiAxCiAgICApOwoKICAgICMgY3JlYXRlIGEgc3RyaW5nIHdpdGggdGhlIHF1b3RlZCBkeW5hbWljIGZpZWxkIG5hbWVzIHNlcGFyYXRlZCBieSBjb21tYXMKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGROYW1lcykgKSB7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7JER5bmFtaWNGaWVsZE5hbWVzfSApIHsKICAgICAgICAgICAgJFBhcmFte0R5bmFtaWNGaWVsZE5hbWVzU3RyZ30gLj0gIiwnIiAuICRGaWVsZCAuICInIjsKICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCB0eXBlIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIENsYXNzID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9LT57VHlwZUlESW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIERhdGEgID0+ICRQYXJhbXtUeXBlc30sCiAgICAgICAgICAgIE5hbWUgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgc2VydmljZSBzdHJpbmcKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1NlcnZpY2VNYW5kYXRvcnl9ICkgewogICAgICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17U2VydmljZXN9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gKCAkUGFyYW17RXJyb3JzfS0+e1NlcnZpY2VJbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U2VydmljZU1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NlcnZpY2VzfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e1NlcnZpY2VJbnZhbGlkfSB8fCAnICcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2UnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U0xBTWFuZGF0b3J5fSApIHsKICAgICAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17U0xBc30sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gKCAkUGFyYW17RXJyb3JzfS0+e1NMQUludmFsaWR9IHx8ICcgJyApLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQU1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17U0xBc30sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBpZiAoICRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5SUR9ID0gJFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgIH0KIyAtLS0KCiAgICAjIGNoZWNrIGlmIGV4aXN0cyBjcmVhdGUgdGVtcGxhdGVzIHJlZ2FyZGxlc3MgdGhlIHF1ZXVlCiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+e1N0YW5kYXJkVGVtcGxhdGVPYmplY3R9LT5TdGFuZGFyZFRlbXBsYXRlTGlzdCgKICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgIFR5cGUgID0+ICdDcmVhdGUnLAogICAgKTsKCiAgICAjIGJ1aWxkIHRleHQgdGVtcGxhdGUgc3RyaW5nCiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJVN0YW5kYXJkVGVtcGxhdGVzICkgKSB7CiAgICAgICAgJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVzfSAgfHwge30sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gfHwgJycsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGFuZGFyZFRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgcHJpb3JpdHkgc3RyaW5nCiAgICBpZiAoICEkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5fSA9ICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fTsKICAgIH0KICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgID0+ICRQYXJhbXtQcmlvcml0aWVzfSwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICBTZWxlY3RlZElEICAgID0+ICRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICBTZWxlY3RlZFZhbHVlID0+ICRQYXJhbXtQcmlvcml0eX0sCiAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgKTsKCiAgICAjIHBlbmRpbmcgZGF0YSBzdHJpbmcKICAgICRQYXJhbXtQZW5kaW5nRGF0ZVN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAlUGFyYW0sCiAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgID0+IDAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgPT4gNSwKICAgICAgICBEaWZmVGltZSAgICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMCwKICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e0RhdGVJbnZhbGlkfSwKICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICA9PiAxLAogICAgICAgIFZhbGlkYXRlRGF0ZUluRnV0dXJlID0+IDEsCiAgICApOwoKICAgICMgc2hvdyBvd25lciBzZWxlY3Rpb24KICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld093bmVyU2VsZWN0aW9uJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgcmVzcG9uc2libGUgc2VsZWN0aW9uCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKQogICAgICAgICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdSZXNwb25zaWJsZVNlbGVjdGlvbicpCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZVVzZXJzfS0+eycnfSA9ICctJzsKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJTZWxlY3RlZH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGVTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBteSBASW5kaXZpZHVhbER5bmFtaWNGaWVsZHM7CiMgLS0tCgogICAgIyBEeW5hbWljIGZpZWxkcwogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNraXAgZmllbGRzIHRoYXQgSFRNTCBjb3VsZCBub3QgYmUgcmV0cmlldmVkCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICApOwoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbmRpdmlkdWFsbHkKICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSBlcSAnSVRTTUltcGFjdCcgKSB7CiAgICAgICAgICAgIHB1c2ggQEluZGl2aWR1YWxEeW5hbWljRmllbGRzLCAkRHluYW1pY0ZpZWxkQ29uZmlnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRDsKICAgICAgICB9CiMgLS0tCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkID0+ICREeW5hbWljRmllbGRIVE1MLT57RmllbGR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgY3ljbGUgdHJvdWdoIGR5bmFtaWMgZmllbGRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbmRpdmlkdWFsbHkKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQEluZGl2aWR1YWxEeW5hbWljRmllbGRzICkgewoKICAgICAgICAjIGdldCB0aGUgaHRtbCBzdHJpbmdzIGZvcm0gJFBhcmFtCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEhUTUwgPSAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIC0tLQoKICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHNSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1RpbWVVbml0c1JlcXVpcmVkfSA9ICcnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkU2hvd25PcHRpb25zQmxvY2s7CgogICAgIyBzaG93IHNwZWxsIGNoZWNrCiAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJTcGVsbENoZWNrZXJ9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIG5lZWQgdG8gY2FsbCBPcHRpb25zIGJsb2NrCiAgICAgICAgaWYgKCAhJFNob3duT3B0aW9uc0Jsb2NrICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgICAgICRTaG93bk9wdGlvbnNCbG9jayA9IDE7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTcGVsbENoZWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgY3VzdG9tZXIgZWRpdCBsaW5rCiAgICBteSAkT3B0aW9uQ3VzdG9tZXIgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgQWN0aW9uID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICApOwogICAgaWYgKCRPcHRpb25DdXN0b21lcikgewoKICAgICAgICAjIGNoZWNrIGlmIG5lZWQgdG8gY2FsbCBPcHRpb25zIGJsb2NrCiAgICAgICAgaWYgKCAhJFNob3duT3B0aW9uc0Jsb2NrICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgICAgICRTaG93bk9wdGlvbnNCbG9jayA9IDE7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPcHRpb25DdXN0b21lcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBtYWtlIHN1cmUgdG8gc2hvdyB0aGUgb3B0aW9ucyBibG9jayBzbyB0aGF0IHRoZSAiTGluayBUaWNrZXQiIG9wdGlvbiBpcyBzaG93bgogICAgIyBldmVuIGlmIHNwZWxsY2hlY2tlciBhbmQgT3B0aW9uQ3VzdG9tZXIgaXMgdHVybmVkIG9mZgogICAgaWYgKCAhJFNob3duT3B0aW9uc0Jsb2NrICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE9wdGlvbnMnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCBmbGFnIHRvICJ0cnVlIiBpbiBvcmRlciB0byBwcmV2ZW50IGNhbGxpbmcgdGhlIE9wdGlvbnMgYmxvY2sgYWdhaW4KICAgICAgICAkU2hvd25PcHRpb25zQmxvY2sgPSAxOwogICAgfQojIC0tLQoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoIEB7ICRQYXJhbXtBdHRhY2htZW50c30gfSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAmJiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgRGF0YSA9PiAkQXR0YWNobWVudCwKICAgICAgICApOwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRTZWxmLT57Q29uZmlnfS0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICRQYXJhbXtSaWNoVGV4dFdpZHRofSAgPSAkU2VsZi0+e0NvbmZpZ30tPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFBlcm1pc3Npb25zIGhhdmUgYmVlbiBjaGVja2VkIGJlZm9yZSBpbiBSdW4oKQogICAgaWYgKCAkUGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgbXkgQENoYXRNZXNzYWdlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0JyktPkNoYXRNZXNzYWdlTGlzdCgKICAgICAgICAgICAgQ2hhdElEID0+ICRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NoYXRBcnRpY2xlUHJldmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2hhdE1lc3NhZ2VzID0+IFxAQ2hhdE1lc3NhZ2VzLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgb3V0cHV0IGJhY2sKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UGhvbmUnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKc3ViIF9HZXRGaWVsZHNUb1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBVcGRhdGFibGVGaWVsZHM7CgogICAgIyBzZXQgdGhlIGZpZWxkcyB0aGF0IGNhbiBiZSB1cGRhdGFibGUgdmlhIEFKQVhVcGRhdGUKICAgIGlmICggISRQYXJhbXtPbmx5RHluYW1pY0ZpZWxkc30gKSB7CiAgICAgICAgQFVwZGF0YWJsZUZpZWxkcyA9IHF3KCBUeXBlSUQgRGVzdCBTZXJ2aWNlSUQgU0xBSUQgTmV3VXNlcklEIE5ld1Jlc3BvbnNpYmxlSUQgTmV4dFN0YXRlSUQgUHJpb3JpdHlJRAogICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQKICAgICAgICApOwogICAgfQoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNBQ0xSZWR1Y2libGU7CgogICAgICAgIHB1c2ggQFVwZGF0YWJsZUZpZWxkcywgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwogICAgfQoKICAgIHJldHVybiBcQFVwZGF0YWJsZUZpZWxkczsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UHJpbnQucG0gLSBwcmludCBsYXlvdXQgZm9yIGFnZW50IGludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi80NzhlZTY2NWM1MzViNjgwMjljZWQ0ZGNhMTk3YjUyMzViN2IxOTJmL0tlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UHJpbnQucG0KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldFByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQREY7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpKU09OOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCBNYWluT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29uZmlnIHNldHRpbmdzCiAgICAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpab29tRXhwYW5kU29ydCcpOwoKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntQREZPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlBERi0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57QmFja2VuZE9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntKU09OT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkpTT04tPm5ldyglUGFyYW0pOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgY29uZmlnIGZvciBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkRmlsdGVyfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFByaW50IiktPntEeW5hbWljRmllbGR9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CiAgICBteSAkUXVldWVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UXVldWVJRCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgIG15ICRBcnRpY2xlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdBcnRpY2xlSUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9IHx8ICEkUXVldWVJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnTmVlZCBUaWNrZXRJRCEnICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgKTsKCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKSBpZiAhJEFjY2VzczsKCiAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICBteSAlUG9zc2libGVBY3Rpb25zID0gKCAxID0+ICRTZWxmLT57QWN0aW9ufSApOwoKICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAlQWNsQWN0aW9uID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBjaGVjayBpZiBBQ0wgcmVzdHJpY3Rpb25zIGV4aXN0CiAgICBpZiAoICRBQ0wgfHwgSXNIYXNoUmVmV2l0aERhdGEoIFwlQWNsQWN0aW9uICkgKSB7CgogICAgICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgICAgICMgc2hvdyBlcnJvciBzY3JlZW4gaWYgQUNMIHByb2hpYml0cyB0aGlzIGFjdGlvbgogICAgICAgIGlmICggISRBY2xBY3Rpb25Mb29rdXB7ICRTZWxmLT57QWN0aW9ufSB9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QgICAgICAgICAgID0+ICdUaWNrZXQnLAogICAgICAgIEtleSAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgU3RhdGUgICAgICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIE9iamVjdFBhcmFtZXRlcnMgPT4gewogICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgSWdub3JlTGlua2VkVGlja2V0U3RhdGVUeXBlcyA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdHlwZSBsaXN0CiAgICBteSAlTGlua1R5cGVMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+VHlwZUxpc3QoCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgdGhlIGxpbmsgZGF0YQogICAgbXkgJUxpbmtEYXRhOwogICAgaWYgKCAkTGlua0xpc3RXaXRoRGF0YSAmJiByZWYgJExpbmtMaXN0V2l0aERhdGEgZXEgJ0hBU0gnICYmICV7JExpbmtMaXN0V2l0aERhdGF9ICkgewogICAgICAgICVMaW5rRGF0YSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua09iamVjdFRhYmxlQ3JlYXRlKAogICAgICAgICAgICBMaW5rTGlzdFdpdGhEYXRhID0+ICRMaW5rTGlzdFdpdGhEYXRhLAogICAgICAgICAgICBWaWV3TW9kZSAgICAgICAgID0+ICdTaW1wbGVSYXcnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgY29udGVudAogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiMgLS0tCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIHNldCBjcml0aWNhbGl0eSBhbmQgaW1wYWN0CiAgICAkVGlja2V0e0NyaXRpY2FsaXR5fSA9ICRUaWNrZXR7RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eX0gfHwgJy0nOwogICAgJFRpY2tldHtJbXBhY3R9ICAgICAgPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAgICAgIHx8ICctJzsKIyAtLS0KICAgIG15IEBBcnRpY2xlQm94ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ29udGVudEluZGV4KAogICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFN0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50ID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgID0+IDAsCiAgICApOwoKICAgICMgY2hlY2sgaWYgb25seSBvbmUgYXJ0aWNsZSBuZWVkIHByaW50ZWQKICAgIGlmICgkQXJ0aWNsZUlEKSB7CgogICAgICAgIEFSVElDTEU6CiAgICAgICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xlLT57QXJ0aWNsZUlEfSA9PSAkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgQEFydGljbGVCb3ggPSAoJEFydGljbGUpOwogICAgICAgICAgICAgICAgbGFzdCBBUlRJQ0xFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyB0b3RhbCBhY2NvdW50ZWQgdGltZSBpZiBmZWF0dXJlIGlzIGFjdGl2ZToKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgJFRpY2tldHtUaWNrZXRUaW1lVW5pdHN9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50ZWRUaW1lR2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICApOwogICAgfQoKICAgICMgdXNlciBpbmZvCiAgICBteSAlVXNlckluZm8gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VyID0+ICRUaWNrZXR7T3duZXJ9LAogICAgKTsKCiAgICAjIHJlc3BvbnNpYmxlIGluZm8KICAgIG15ICVSZXNwb25zaWJsZUluZm87CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykgJiYgJFRpY2tldHtSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgJVJlc3BvbnNpYmxlSW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7UmVzcG9uc2libGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjdXN0b21lciBpbmZvCiAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyBzb21lIGh0bWwgcXVvdGluZwogICAgJFRpY2tldHtBZ2V9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSgKICAgICAgICBBZ2UgICA9PiAkVGlja2V0e0FnZX0sCiAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgKTsKCiAgICBpZiAoICRUaWNrZXR7VW50aWxUaW1lfSApIHsKICAgICAgICAkVGlja2V0e1BlbmRpbmdVbnRpbH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1VudGlsVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2VuZXJhdGUgcGRmIG91dHB1dAogICAgaWYgKCAkU2VsZi0+e1BERk9iamVjdH0gKSB7CiAgICAgICAgbXkgJFByaW50ZWRCeSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdwcmludGVkIGJ5Jyk7CiAgICAgICAgbXkgJFRpbWUgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1RpbWV9OwogICAgICAgIG15ICVQYWdlOwoKICAgICAgICAjIGdldCBtYXhpbXVtIG51bWJlciBvZiBwYWdlcwogICAgICAgICRQYWdle01heFBhZ2VzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQREY6Ok1heFBhZ2VzJyk7CiAgICAgICAgaWYgKCAhJFBhZ2V7TWF4UGFnZXN9IHx8ICRQYWdle01heFBhZ2VzfSA8IDEgfHwgJFBhZ2V7TWF4UGFnZXN9ID4gMTAwMCApIHsKICAgICAgICAgICAgJFBhZ2V7TWF4UGFnZXN9ID0gMTAwOwogICAgICAgIH0KICAgICAgICBteSAkSGVhZGVyUmlnaHQgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6SG9vaycpIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9OwogICAgICAgIG15ICRIZWFkbGluZUxlZnQgPSAkSGVhZGVyUmlnaHQ7CiAgICAgICAgbXkgJFRpdGxlICAgICAgICA9ICRIZWFkZXJSaWdodDsKICAgICAgICBpZiAoICRUaWNrZXR7VGl0bGV9ICkgewogICAgICAgICAgICAkSGVhZGxpbmVMZWZ0ID0gJFRpY2tldHtUaXRsZX07CiAgICAgICAgICAgICRUaXRsZSAuPSAnIC8gJyAuICRUaWNrZXR7VGl0bGV9OwogICAgICAgIH0KCiAgICAgICAgJFBhZ2V7TWFyZ2luVG9wfSAgICA9IDMwOwogICAgICAgICRQYWdle01hcmdpblJpZ2h0fSAgPSA0MDsKICAgICAgICAkUGFnZXtNYXJnaW5Cb3R0b219ID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luTGVmdH0gICA9IDQwOwogICAgICAgICRQYWdle0hlYWRlclJpZ2h0fSAgPSAkSGVhZGVyUmlnaHQ7CiAgICAgICAgJFBhZ2V7Rm9vdGVyTGVmdH0gICA9ICcnOwogICAgICAgICRQYWdle1BhZ2VUZXh0fSAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUGFnZScpOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0gICAgPSAxOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgcGRmIGRvY3VtZW50CiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Eb2N1bWVudE5ldygKICAgICAgICAgICAgVGl0bGUgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcm9kdWN0JykgLiAnOiAnIC4gJFRpdGxlLAogICAgICAgICAgICBFbmNvZGUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGZpcnN0IHBkZiBwYWdlCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTYsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGl0bGUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRUaWNrZXR7VGl0bGV9LAogICAgICAgICAgICBGb250U2l6ZSA9PiAxMywKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCAicHJpbnRlZCBieSIKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgPT4gJFByaW50ZWRCeSAuICcgJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRTZWxmLT57VXNlckxhc3RuYW1lfSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRW1haWx9IC4gJyknCiAgICAgICAgICAgICAgICAuICcsICcgLiAkVGltZSwKICAgICAgICAgICAgRm9udFNpemUgPT4gOSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtMTQsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGlja2V0IGluZm9zCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRUaWNrZXRJbmZvcygKICAgICAgICAgICAgUGFnZURhdGEgICAgICAgID0+IFwlUGFnZSwKICAgICAgICAgICAgVGlja2V0RGF0YSAgICAgID0+IFwlVGlja2V0LAogICAgICAgICAgICBVc2VyRGF0YSAgICAgICAgPT4gXCVVc2VySW5mbywKICAgICAgICAgICAgUmVzcG9uc2libGVEYXRhID0+IFwlUmVzcG9uc2libGVJbmZvLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGlja2V0RHluYW1pY0ZpZWxkcygKICAgICAgICAgICAgUGFnZURhdGEgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbGlua2VkIG9iamVjdHMKICAgICAgICBpZiAoJUxpbmtEYXRhKSB7CiAgICAgICAgICAgICRTZWxmLT5fUERGT3V0cHV0TGlua2VkT2JqZWN0cygKICAgICAgICAgICAgICAgIFBhZ2VEYXRhICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgICAgICBMaW5rRGF0YSAgICAgPT4gXCVMaW5rRGF0YSwKICAgICAgICAgICAgICAgIExpbmtUeXBlTGlzdCA9PiBcJUxpbmtUeXBlTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGN1c3RvbWVyIGluZm9zCiAgICAgICAgaWYgKCVDdXN0b21lckRhdGEpIHsKICAgICAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRDdXN0b21lckluZm9zKAogICAgICAgICAgICAgICAgUGFnZURhdGEgICAgID0+IFwlUGFnZSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGF0YSA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGFydGljbGVzCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRBcnRpY2xlcygKICAgICAgICAgICAgUGFnZURhdGEgICAgPT4gXCVQYWdlLAogICAgICAgICAgICBBcnRpY2xlRGF0YSA9PiBcQEFydGljbGVCb3gsCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gdGhlIHBkZiBkb2N1bWVudAogICAgICAgIG15ICRGaWxlbmFtZSA9ICdUaWNrZXRfJyAuICRUaWNrZXR7VGlja2V0TnVtYmVyfTsKICAgICAgICBteSAoICRzLCAkbSwgJGgsICRELCAkTSwgJFkgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgKTsKICAgICAgICAkTSA9IHNwcmludGYoICIlMDJkIiwgJE0gKTsKICAgICAgICAkRCA9IHNwcmludGYoICIlMDJkIiwgJEQgKTsKICAgICAgICAkaCA9IHNwcmludGYoICIlMDJkIiwgJGggKTsKICAgICAgICAkbSA9IHNwcmludGYoICIlMDJkIiwgJG0gKTsKICAgICAgICBteSAkUERGU3RyaW5nID0gJFNlbGYtPntQREZPYmplY3R9LT5Eb2N1bWVudE91dHB1dCgpOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRGaWxlbmFtZSAuICJfIiAuICIkWS0kTS0kRCIgLiAiXyIgLiAiJGgtJG0ucGRmIiwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gImFwcGxpY2F0aW9uL3BkZiIsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRQREZTdHJpbmcsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBodG1sIG91dHB1dAogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CgogICAgICAgIGlmICglTGlua0RhdGEpIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgZGF0YQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTGluaycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBmb3IgbXkgJExpbmtUeXBlTGlua0RpcmVjdGlvbiAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICVMaW5rRGF0YSApIHsKCiAgICAgICAgICAgICAgICAjIGludmVzdGlnYXRlIGxpbmsgdHlwZSBuYW1lCiAgICAgICAgICAgICAgICBteSBATGlua0RhdGEgPSBzcGxpdCBxezo6fSwgJExpbmtUeXBlTGlua0RpcmVjdGlvbjsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCBsaW5rIHR5cGUgZGF0YQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rVHlwZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtUeXBlTmFtZSA9PiAkTGlua1R5cGVMaXN0eyAkTGlua0RhdGFbMF0gfS0+eyAkTGlua0RhdGFbMV0gLiAnTmFtZScgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGV4dHJhY3Qgb2JqZWN0IGxpc3QKICAgICAgICAgICAgICAgIG15ICRPYmplY3RMaXN0ID0gJExpbmtEYXRheyRMaW5rVHlwZUxpbmtEaXJlY3Rpb259OwoKICAgICAgICAgICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRPYmplY3RMaXN0LT57JE9iamVjdH0gfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgdHlwZSBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rVHlwZVJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rU3RyZyA9PiAkSXRlbS0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBjdXN0b21lciBpbmZvcwogICAgICAgIGlmICglQ3VzdG9tZXJEYXRhKSB7CiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclRhYmxlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRDdXN0b21lclZpZXdUYWJsZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICAgICBNYXggID0+IDEwMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyB0aWNrZXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fSFRNTE1hc2soCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBcnRpY2xlQm94ICAgICAgPT4gXEBBcnRpY2xlQm94LAogICAgICAgICAgICBSZXNwb25zaWJsZURhdGEgPT4gXCVSZXNwb25zaWJsZUluZm8sCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJVVzZXJJbmZvLAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEZvb3RlcigpOwoKICAgICAgICAjIHJldHVybiBvdXRwdXQKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9QREZPdXRwdXRUaWNrZXRJbmZvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFnZURhdGEgVGlja2V0RGF0YSBVc2VyRGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlVGlja2V0ICAgPSAleyAkUGFyYW17VGlja2V0RGF0YX0gfTsKICAgIG15ICVVc2VySW5mbyA9ICV7ICRQYXJhbXtVc2VyRGF0YX0gfTsKICAgIG15ICVQYWdlICAgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICAjIGNyZWF0ZSBsZWZ0IHRhYmxlCiAgICBteSAkVGFibGVMZWZ0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1N0YXRlJyksCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkVGlja2V0e1N0YXRlfSApLAogICAgICAgIH0sCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICB7CiMgICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUHJpb3JpdHknKSwKIyAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkVGlja2V0e1ByaW9yaXR5fSApLAojICAgICAgICB9LAojIC0tLQogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1F1ZXVlJyksCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7UXVldWV9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTG9jaycpLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFRpY2tldHtMb2NrfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3VzdG9tZXJJRCcpLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnT3duZXInKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtPd25lcn0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRVc2VySW5mb3tVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkVXNlckluZm97VXNlckxhc3RuYW1lfSAuICcpJywKICAgICAgICB9LAogICAgXTsKCiAgICAjIGFkZCByZXNwb25zaWJsZSByb3csIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICkgewogICAgICAgIG15ICRSZXNwb25zaWJsZSA9ICctJzsKICAgICAgICBpZiAoICRUaWNrZXR7UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICAkUmVzcG9uc2libGUgPSAkVGlja2V0e1Jlc3BvbnNpYmxlfSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFBhcmFte1Jlc3BvbnNpYmxlRGF0YX0tPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkUGFyYW17UmVzcG9uc2libGVEYXRhfS0+e1VzZXJMYXN0bmFtZX0gLiAnKSc7CiAgICAgICAgfQogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdSZXNwb25zaWJsZScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkUmVzcG9uc2libGUsCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgdHlwZSByb3csIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1R5cGUnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtUeXBlfSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlTGVmdH0sICRSb3cgKTsKICAgIH0KCiAgICAjIGFkZCBzZXJ2aWNlIGFuZCBzbGEgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgIG15ICRSb3dTZXJ2aWNlID0gewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnU2VydmljZScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1NlcnZpY2V9IHx8ICctJywKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlTGVmdH0sICRSb3dTZXJ2aWNlICk7CiAgICAgICAgbXkgJFJvd1NMQSA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1NMQScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1NMQX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NMQSApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIG15ICRUYWJsZUxlZnRFeHRlbmRlZCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3JpdGljYWxpdHknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFRpY2tldHtDcml0aWNhbGl0eX0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0ltcGFjdCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkVGlja2V0e0ltcGFjdH0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1ByaW9yaXR5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRUaWNrZXR7UHJpb3JpdHl9KSwKICAgICAgICB9LAogICAgXTsKICAgIHB1c2ggQHskVGFibGVMZWZ0fSwgQHskVGFibGVMZWZ0RXh0ZW5kZWR9OwojIC0tLQoKICAgICMgY3JlYXRlIHJpZ2h0IHRhYmxlCiAgICBteSAkVGFibGVSaWdodCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdBZ2UnKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRUaWNrZXR7QWdlfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3JlYXRlZCcpLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAkVGlja2V0e0NyZWF0ZWR9LAogICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnLAogICAgICAgICAgICApLAogICAgICAgIH0sCiAgICBdOwoKICAgICMgc2hvdyBjcmVhdGVkIGJ5IGlmIGRpZmZlcmVudCB0aGVuIFVzZXIgSUQgMQogICAgaWYgKCAkVGlja2V0e0NyZWF0ZUJ5fSA+IDEgKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NyZWF0ZWQgYnknKSwKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlck5hbWUoIFVzZXJJRCA9PiAkVGlja2V0e0NyZWF0ZUJ5fSApLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVSaWdodH0sICRSb3cgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdBY2NvdW50ZWQgdGltZScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldFRpbWVVbml0c30sCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZVJpZ2h0fSwgJFJvdyApOwogICAgfQoKICAgICMgb25seSBzaG93IHBlbmRpbmcgdW50aWwgdW5sZXNzIGl0IGlzIHJlYWxseSBwZW5kaW5nCiAgICBpZiAoICRUaWNrZXR7UGVuZGluZ1VudGlsfSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUGVuZGluZyB0aWxsJyksCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7UGVuZGluZ1VudGlsfSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlUmlnaHR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgZmlyc3QgcmVzcG9uc2UgdGltZSByb3cKICAgIGlmICggZGVmaW5lZCggJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZX0gKSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnRmlyc3QgUmVzcG9uc2UgVGltZScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAkVGlja2V0e0ZpcnN0UmVzcG9uc2VUaW1lRGVzdGluYXRpb25EYXRlfSwKICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JywKICAgICAgICAgICAgICAgICdOb1NlY29uZHMnLAogICAgICAgICAgICApLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVSaWdodH0sICRSb3cgKTsKICAgIH0KCiAgICAjIGFkZCB1cGRhdGUgdGltZSByb3cKICAgIGlmICggZGVmaW5lZCggJFRpY2tldHtVcGRhdGVUaW1lfSApICkgewogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdVcGRhdGUgVGltZScpLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICAgICAkVGlja2V0e1VwZGF0ZVRpbWVEZXN0aW5hdGlvbkRhdGV9LAogICAgICAgICAgICAgICAgJ0RhdGVGb3JtYXQnLAogICAgICAgICAgICAgICAgJ05vU2Vjb25kcycsCiAgICAgICAgICAgICksCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZVJpZ2h0fSwgJFJvdyApOwogICAgfQoKICAgICMgYWRkIHNvbHV0aW9uIHRpbWUgcm93CiAgICBpZiAoIGRlZmluZWQoICRUaWNrZXR7U29sdXRpb25UaW1lfSApICkgewogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTb2x1dGlvbiBUaW1lJyksCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICRUaWNrZXR7U29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlfSwKICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JywKICAgICAgICAgICAgICAgICdOb1NlY29uZHMnLAogICAgICAgICAgICApLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVSaWdodH0sICRSb3cgKTsKICAgIH0KCiAgICBteSAkUm93cyA9IEB7JFRhYmxlTGVmdH07CiAgICBpZiAoIEB7JFRhYmxlUmlnaHR9ID4gJFJvd3MgKSB7CiAgICAgICAgJFJvd3MgPSBAeyRUYWJsZVJpZ2h0fTsKICAgIH0KCiAgICBteSAlVGFibGVQYXJhbTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57VmFsdWV9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtDb250ZW50fSAgICAgICAgID0gJyAnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNGRkZGRkYnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzRde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57VmFsdWV9OwogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDcwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gMTU2LjU7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsyXXtXaWR0aH0gPSAxOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bM117V2lkdGh9ID0gNzA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVs0XXtXaWR0aH0gPSAxNTYuNTsKCiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgPSA3OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yRXZlbn0gPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIFBBR0U6CiAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgIGxhc3QgUEFHRTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICVQYWdlLAogICAgICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dExpbmtlZE9iamVjdHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIExpbmtEYXRhIExpbmtUeXBlTGlzdCkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJVBhZ2UgICAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwogICAgbXkgJVR5cGVMaXN0ID0gJXsgJFBhcmFte0xpbmtUeXBlTGlzdH0gfTsKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgZm9yIG15ICRMaW5rVHlwZUxpbmtEaXJlY3Rpb24gKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAleyAkUGFyYW17TGlua0RhdGF9IH0gKSB7CgogICAgICAgICMgaW52ZXN0aWdhdGUgbGluayB0eXBlIG5hbWUKICAgICAgICBteSBATGlua0RhdGEgPSBzcGxpdCBxezo6fSwgJExpbmtUeXBlTGlua0RpcmVjdGlvbjsKICAgICAgICBteSAkTGlua1R5cGVOYW1lID0gJFR5cGVMaXN0eyAkTGlua0RhdGFbMF0gfS0+eyAkTGlua0RhdGFbMV0gLiAnTmFtZScgfTsKICAgICAgICAkTGlua1R5cGVOYW1lID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJExpbmtUeXBlTmFtZSk7CgogICAgICAgICMgZGVmaW5lIGhlYWRsaW5lCiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJExpbmtUeXBlTmFtZSAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJyc7CgogICAgICAgICMgZXh0cmFjdCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJFBhcmFte0xpbmtEYXRhfS0+eyRMaW5rVHlwZUxpbmtEaXJlY3Rpb259OwoKICAgICAgICBmb3IgbXkgJE9iamVjdCAoIHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICV7JE9iamVjdExpc3R9ICkgewoKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJE9iamVjdExpc3QtPnskT2JqZWN0fSB9ICkgewoKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSB8fD0gJyc7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkSXRlbS0+e1RpdGxlfSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZSB7CiAgICAgICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTE1LAogICAgKTsKCiAgICAjIG91dHB1dCBoZWFkbGluZQogICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdMaW5rZWQgT2JqZWN0cycpLAogICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgKTsKCiAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgWSAgICA9PiAtNCwKICAgICk7CgogICAgIyB0YWJsZSBwYXJhbXMKICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICMgb3V0cHV0IHRhYmxlCiAgICBQQUdFOgogICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgICAgIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0RHluYW1pY0ZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFnZURhdGEgVGlja2V0RGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkT3V0cHV0ID0gMDsKICAgIG15ICVUaWNrZXQgPSAleyAkUGFyYW17VGlja2V0RGF0YX0gfTsKICAgIG15ICVQYWdlICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93ID0gMDsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGQgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ1RpY2tldCddLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkRmlsdGVyfSB8fCB7fSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSB0YWJsZQogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWYWx1ZTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgIiI7CgogICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIEhUTUxPdXRwdXQgICAgICAgICA9PiAwLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICk7CgogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICkKICAgICAgICAgICAgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRWYWx1ZVN0cmctPntWYWx1ZX07CgogICAgICAgICRSb3crKzsKICAgICAgICAkT3V0cHV0ID0gMTsKICAgIH0KCiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAjIG91dHB1dCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgIGlmICgkT3V0cHV0KSB7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC0xNSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1RpY2tldCBEeW5hbWljIEZpZWxkcycpLAogICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMKICAgICAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUKICAgICAgICBQQUdFOgogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsCiAgICAgICAgICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRDdXN0b21lckluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBDdXN0b21lckRhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCAgICAgICA9IDA7CiAgICBteSAlQ3VzdG9tZXJEYXRhID0gJXsgJFBhcmFte0N1c3RvbWVyRGF0YX0gfTsKICAgIG15ICVQYWdlICAgICAgICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwogICAgbXkgJE1hcCA9ICRDdXN0b21lckRhdGF7Q29uZmlnfS0+e01hcH07CgogICAgIyBjaGVjayBpZiBjdXN0b21lciBjb21wYW55IHN1cHBvcnQgaXMgZW5hYmxlZAogICAgaWYgKCAkQ3VzdG9tZXJEYXRhe0NvbmZpZ30tPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fSApIHsKICAgICAgICBteSAkTWFwMiA9ICRDdXN0b21lckRhdGF7Q29tcGFueUNvbmZpZ30tPntNYXB9OwogICAgICAgIGlmICgkTWFwMikgewogICAgICAgICAgICBwdXNoKCBAeyRNYXB9LCBAeyRNYXAyfSApOwogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkRmllbGQgKCBAeyRNYXB9ICkgewogICAgICAgIGlmICggJHskRmllbGR9WzNdICYmICRDdXN0b21lckRhdGF7ICR7JEZpZWxkfVswXSB9ICkgewogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICR7JEZpZWxkfVsxXSApIC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRDdXN0b21lckRhdGF7ICR7JEZpZWxkfVswXSB9OwoKICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICAkT3V0cHV0ID0gMTsKICAgICAgICB9CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICBpZiAoJE91dHB1dCkgewoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDdXN0b21lciBJbmZvcm1hdGlvbicpLAogICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMKICAgICAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUKICAgICAgICBQQUdFOgogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICAgICAgaWYgKCAkVGFibGVQYXJhbXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsCiAgICAgICAgICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRBcnRpY2xlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFnZURhdGEgQXJ0aWNsZURhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVBhZ2UgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CgogICAgbXkgQEFydGljbGVEYXRhICA9IEB7ICRQYXJhbXtBcnRpY2xlRGF0YX0gfTsKICAgIG15ICRBcnRpY2xlQ291bnQgPSBzY2FsYXIgQEFydGljbGVEYXRhOwoKICAgICMgcmVzb3J0IGFydGljbGUgb3JkZXIKICAgIGlmICggJFNlbGYtPntab29tRXhwYW5kU29ydH0gZXEgJ3JldmVyc2UnICkgewogICAgICAgIEBBcnRpY2xlRGF0YSA9IHJldmVyc2UoQEFydGljbGVEYXRhKTsKICAgIH0KCiAgICBteSAkQXJ0aWNsZUNvdW50ZXIgPSAxOwogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZURhdGEpIHsKICAgICAgICBpZiAoICRBcnRpY2xlQ291bnRlciA9PSAxICkgewogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgICAgICBZICAgID0+IC0xNSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICAgICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdBcnRpY2xlcycpLAogICAgICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICAgICAgWSAgICA9PiAyLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUFydGljbGUgPSAleyRBcnRpY2xlVG1wfTsKCiAgICAgICAgIyBnZXQgYXR0YWNobWVudCBzdHJpbmcKICAgICAgICBteSAlQXRtSW5kZXggPSAoKTsKICAgICAgICBpZiAoICRBcnRpY2xle0F0bXN9ICkgewogICAgICAgICAgICAlQXRtSW5kZXggPSAleyAkQXJ0aWNsZXtBdG1zfSB9OwogICAgICAgIH0KICAgICAgICBteSAkQXR0YWNobWVudHM7CiAgICAgICAgZm9yIG15ICRGaWxlSUQgKCBzb3J0IGtleXMgJUF0bUluZGV4ICkgewogICAgICAgICAgICBteSAlRmlsZSA9ICV7ICRBdG1JbmRleHskRmlsZUlEfSB9OwogICAgICAgICAgICAkQXR0YWNobWVudHMgLj0gJEZpbGV7RmlsZW5hbWV9IC4gJyAoJyAuICRGaWxle0ZpbGVzaXplfSAuICIpXG4iOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRvdGFsIGFjY291bnRlZCB0aW1lIGlmIGZlYXR1cmUgaXMgYWN0aXZlOgogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgICAgICRBcnRpY2xleydBY2NvdW50ZWQgdGltZSd9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBhcnRpY2xlIGluZm8gdGFibGUKICAgICAgICBteSAlVGFibGVQYXJhbTE7CiAgICAgICAgbXkgJFJvdyA9IDA7CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICk7CgogICAgICAgIG15ICRBcnRpY2xlTnVtYmVyCiAgICAgICAgICAgID0gJFNlbGYtPntab29tRXhwYW5kU29ydH0gZXEgJ3JldmVyc2UnID8gJEFydGljbGVDb3VudCAtICRBcnRpY2xlQ291bnRlciArIDEgOiAkQXJ0aWNsZUNvdW50ZXI7CgogICAgICAgICMgYXJ0aWNsZSBudW1iZXIgdGFnCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAnICAgICMgJyAuICRBcnRpY2xlTnVtYmVyLAogICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gMiwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICdGcm9tJywgJ1RvJywgJ0NjJywgJ0FjY291bnRlZCB0aW1lJywgJ1N1YmplY3QnLCApIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXskUGFyYW1ldGVyfSApIHsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRQYXJhbWV0ZXIpIC4gJzonOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQXJ0aWNsZXskUGFyYW1ldGVyfTsKICAgICAgICAgICAgICAgICRSb3crKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NyZWF0ZWQnKSAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoCiAgICAgICAgICAgICRBcnRpY2xle0NyZWF0ZWR9LAogICAgICAgICAgICAnRGF0ZUZvcm1hdCcsCiAgICAgICAgKTsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9CiAgICAgICAgICAgIC49ICcgJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdieScpOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0KICAgICAgICAgICAgLj0gJyAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRBcnRpY2xle1NlbmRlclR5cGV9ICk7CiAgICAgICAgJFJvdysrOwoKICAgICAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgICAgICBteSAkRHluYW1pY0ZpZWxkID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgICAgICBPYmplY3RUeXBlICA9PiBbJ0FydGljbGUnXSwKICAgICAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntEeW5hbWljRmllbGRGaWx0ZXJ9IHx8IHt9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgdGFibGUKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWYWx1ZTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJFZhbHVlIGVxICIiOwoKICAgICAgICAgICAgIyBnZXQgcHJpbnQgc3RyaW5nIGZvciB0aGlzIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEhUTUxPdXRwdXQgICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSApCiAgICAgICAgICAgICAgICAuICc6JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRWYWx1ZVN0cmctPntWYWx1ZX07CiAgICAgICAgICAgICRSb3crKzsKICAgICAgICB9CgogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVHlwZScpIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gKTsKICAgICAgICAkUm93Kys7CgogICAgICAgIGlmICgkQXR0YWNobWVudHMpIHsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQXR0YWNobWVudCcpIC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICBjaG9tcCgkQXR0YWNobWVudHMpOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEF0dGFjaG1lbnRzOwogICAgICAgIH0KICAgICAgICAkVGFibGVQYXJhbTF7Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTYsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMgKGFydGljbGUgaW5mb3MpCiAgICAgICAgJFRhYmxlUGFyYW0xe1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbTF7Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW0xe0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFtMXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFtMXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbTF7UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW0xe1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZSAoYXJ0aWNsZSBpbmZvcykKICAgICAgICBQQUdFOgogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtMSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtMSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFtMXtTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsCiAgICAgICAgICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJEFydGljbGV7QXJ0aWNsZVR5cGV9IGVxICdjaGF0LWV4dGVybmFsJyB8fCAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gZXEgJ2NoYXQtaW50ZXJuYWwnICkKICAgICAgICB7CiAgICAgICAgICAgICRBcnRpY2xle0JvZHl9ID0gJFNlbGYtPntKU09OT2JqZWN0fS0+RGVjb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiAkQXJ0aWNsZXtCb2R5fQogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkTGluZXM7CiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkQXJ0aWNsZXtCb2R5fSApICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRMaW5lICggQHsgJEFydGljbGV7Qm9keX0gfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRMaW5lLT57U3lzdGVtR2VuZXJhdGVkfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExpbmVzIC49ICdbJyAuICRMaW5lLT57Q3JlYXRlVGltZX0gLiAnXSAnIC4gJExpbmUtPntNZXNzYWdlVGV4dH0gLiAiXG4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExpbmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAnWycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJExpbmUtPntDcmVhdGVUaW1lfSAuICddICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJExpbmUtPntDaGF0dGVyTmFtZX0gLiAnICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJExpbmUtPntNZXNzYWdlVGV4dH0gLiAiXG4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRMaW5lczsKICAgICAgICB9CgogICAgICAgICMgdGFibGUgcGFyYW1zIChhcnRpY2xlIGJvZHkpCiAgICAgICAgbXkgJVRhYmxlUGFyYW0yOwogICAgICAgICRUYWJsZVBhcmFtMntDZWxsRGF0YX1bMF1bMF17Q29udGVudH0gPSAkQXJ0aWNsZXtCb2R5fSB8fCAnICc7CiAgICAgICAgJFRhYmxlUGFyYW0ye1R5cGV9ICAgICAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFtMntCb3JkZXJ9ICAgICAgICAgICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFtMntGb250fSAgICAgICAgICAgICAgICAgICAgPSAnTW9ub3NwYWNlZCc7CiAgICAgICAgJFRhYmxlUGFyYW0ye0ZvbnRTaXplfSAgICAgICAgICAgICAgICA9IDc7CiAgICAgICAgJFRhYmxlUGFyYW0ye0JhY2tncm91bmRDb2xvcn0gICAgICAgICA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbTJ7UGFkZGluZ30gICAgICAgICAgICAgICAgID0gNDsKICAgICAgICAkVGFibGVQYXJhbTJ7UGFkZGluZ1RvcH0gICAgICAgICAgICAgID0gODsKICAgICAgICAkVGFibGVQYXJhbTJ7UGFkZGluZ0JvdHRvbX0gICAgICAgICAgID0gODsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKGFydGljbGUgYm9keSkKICAgICAgICBQQUdFOgogICAgICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgdGFibGUgKG9yIGEgZnJhZ21lbnQgb2YgaXQpCiAgICAgICAgICAgICVUYWJsZVBhcmFtMiA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtMiwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFtMntTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsCiAgICAgICAgICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJEFydGljbGVDb3VudGVyKys7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9IVE1MTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgb3V0cHV0IHJlc3BvbnNpYmxlLCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSApIHsKICAgICAgICBteSAkUmVzcG9uc2libGUgPSAnLSc7CiAgICAgICAgaWYgKCAkUGFyYW17UmVzcG9uc2libGV9ICkgewogICAgICAgICAgICAkUmVzcG9uc2libGUgPSAkUGFyYW17UmVzcG9uc2libGV9IC4gJyAoJwogICAgICAgICAgICAgICAgLiAkUGFyYW17UmVzcG9uc2libGVEYXRhfS0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtSZXNwb25zaWJsZURhdGF9LT57VXNlckxhc3RuYW1lfSAuICcpJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlU3RyaW5nID0+ICRSZXNwb25zaWJsZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHR5cGUsIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0VHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBzZXJ2aWNlIGFuZCBzbGEsIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U2VydmljZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU2VydmljZSA9PiAkUGFyYW17U2VydmljZX0gfHwgJy0nLAogICAgICAgICAgICAgICAgU0xBICAgICA9PiAkUGFyYW17U0xBfSAgICAgfHwgJy0nLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgYWNjb3VudGVkIHRpbWUKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWNjb3VudGVkVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBwZW5kaW5nIGRhdGUKICAgIGlmICggJFBhcmFte1BlbmRpbmdVbnRpbH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUGVuZGluZ1VudGlsJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGZpcnN0IHJlc3BvbnNlIHRpbWUKICAgIGlmICggZGVmaW5lZCggJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lfSApICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHVwZGF0ZSB0aW1lCiAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtVcGRhdGVUaW1lfSApICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgc29sdXRpb24gdGltZQogICAgaWYgKCBkZWZpbmVkKCAkUGFyYW17U29sdXRpb25UaW1lfSApICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGQgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ1RpY2tldCddLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkRmlsdGVyfSB8fCB7fSwKICAgICk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJFZhbHVlOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICRWYWx1ZSBlcSAiIjsKCiAgICAgICAgIyBnZXQgcHJpbnQgc3RyaW5nIGZvciB0aGlzIGR5bmFtaWMgZmllbGQKICAgICAgICBteSAkVmFsdWVTdHJnID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgSFRNTE91dHB1dCAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFZhbHVlTWF4Q2hhcnMgICAgICA9PiAyMCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fSwKICAgICAgICApOwoKICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIGFydGljbGUgc3R1ZmYKICAgIG15ICRTZWxlY3RlZEFydGljbGVJRCA9ICRQYXJhbXtBcnRpY2xlSUR9IHx8ICcnOwogICAgbXkgQEFydGljbGVCb3ggPSBAeyAkUGFyYW17QXJ0aWNsZUJveH0gfTsKCiAgICAjIGdldCBsYXN0IGN1c3RvbWVyIGFydGljbGUKICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICBteSAlQXJ0aWNsZSA9ICV7JEFydGljbGVUbXB9OwoKICAgICAgICAjIGdldCBhdHRhY2htZW50IHN0cmluZwogICAgICAgIG15ICVBdG1JbmRleCA9ICgpOwogICAgICAgIGlmICggJEFydGljbGV7QXRtc30gKSB7CiAgICAgICAgICAgICVBdG1JbmRleCA9ICV7ICRBcnRpY2xle0F0bXN9IH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXsnQXJ0aWNsZTo6QVRNJ30gPSAnJzsKICAgICAgICBmb3IgbXkgJEZpbGVJRCAoIHNvcnQga2V5cyAlQXRtSW5kZXggKSB7CiAgICAgICAgICAgIG15ICVGaWxlID0gJXsgJEF0bUluZGV4eyRGaWxlSUR9IH07CiAgICAgICAgICAgICRGaWxle0ZpbGVuYW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkRmlsZXtGaWxlbmFtZX0gKTsKICAgICAgICAgICAgbXkgJERvd25sb2FkVGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCJEb3dubG9hZCIpOwogICAgICAgICAgICAkUGFyYW17J0FydGljbGU6OkFUTSd9CiAgICAgICAgICAgICAgICAuPSAnPGEgaHJlZj0iJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfSAuICdBY3Rpb249QWdlbnRUaWNrZXRBdHRhY2htZW50OycKICAgICAgICAgICAgICAgIC4gIkFydGljbGVJRD0kQXJ0aWNsZXtBcnRpY2xlSUR9O0ZpbGVJRD0kRmlsZUlEXCIgdGFyZ2V0PVwiYXR0YWNobWVudFwiICIKICAgICAgICAgICAgICAgIC4gInRpdGxlPVwiJERvd25sb2FkVGV4dDogJEZpbGV7RmlsZW5hbWV9XCI+IgogICAgICAgICAgICAgICAgLiAiJEZpbGV7RmlsZW5hbWV9PC9hPiAkRmlsZXtGaWxlc2l6ZX08YnIvPiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRBcnRpY2xle0FydGljbGVUeXBlfSBlcSAnY2hhdC1leHRlcm5hbCcgfHwgJEFydGljbGV7QXJ0aWNsZVR5cGV9IGVxICdjaGF0LWludGVybmFsJyApCiAgICAgICAgewogICAgICAgICAgICAkQXJ0aWNsZXtDaGF0TWVzc2FnZXN9ID0gJFNlbGYtPntKU09OT2JqZWN0fS0+RGVjb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiAkQXJ0aWNsZXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGV7SXNDaGF0fSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBjaGVjayBpZiBqdXN0IGEgb25seSBodG1sIGVtYWlsCiAgICAgICAgICAgIG15ICRNaW1lVHlwZVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoZWNrTWltZVR5cGUoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRNaW1lVHlwZVRleHQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtUZXh0Tm90ZX0gPSAkTWltZVR5cGVUZXh0OwogICAgICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gICA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgaHRtbCBxdW90aW5nCiAgICAgICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICBOZXdMaW5lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld05ld0xpbmUnKSwKICAgICAgICAgICAgICAgICAgICBUZXh0ICAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICAgICAgICAgIFZNYXggICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TGluZXMnKSB8fCA1MDAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkbyBzb21lIHN0cmlwcyAmJiBxdW90aW5nCiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCkpIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXskUGFyYW1ldGVyfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFBhcmFtZXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJEFydGljbGV7JFBhcmFtZXRlcn0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hvdyBhY2NvdW50ZWQgYXJ0aWNsZSB0aW1lCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0Ojpab29tVGltZURpc3BsYXknKSApIHsKICAgICAgICAgICAgbXkgJEFydGljbGVUaW1lID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAiUm93IiwKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdUaW1lJywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZVRpbWUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICAgICAgT2JqZWN0VHlwZSAgPT4gWydBcnRpY2xlJ10sCiAgICAgICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkRmlsdGVyfSB8fCB7fSwKICAgICAgICApOwoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWYWx1ZTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJFZhbHVlIGVxICIiOwoKICAgICAgICAgICAgIyBnZXQgcHJpbnQgc3RyaW5nIGZvciB0aGlzIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIEhUTUxPdXRwdXQgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+IDIwLAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRMYWJlbCA9ICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH07CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUR5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgICAgICMgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAjICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgIyAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAjICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICMgICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFByaW50JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0Wm9vbS5wbSAtIHRvIGdldCBhIGNsb3NlciB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTYgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJG9yaWdpbjogaHR0cHM6Ly9naXRodWIuY29tL09UUlMvb3Rycy9ibG9iLzQ3OGVlNjY1YzUzNWI2ODAyOWNlZDRkY2ExOTdiNTIzNWI3YjE5MmYvS2VybmVsL01vZHVsZXMvQWdlbnRUaWNrZXRab29tLnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRab29tOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIFBPU0lYIHF3L2NlaWwvOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6QWN0aXZpdHlEaWFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlByb2Nlc3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OlRyYW5zaXRpb25BY3Rpb247CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpKU09OOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCBTZXNzaW9uT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVidWcKICAgICRTZWxmLT57RGVidWd9ID0gMDsKCiAgICAjIGdldCBwYXJhbXMKICAgICRTZWxmLT57QXJ0aWNsZUlEfSAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApOwogICAgJFNlbGYtPntBcnRpY2xlUGFnZX0gICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdBcnRpY2xlUGFnZScgKTsKICAgICRTZWxmLT57Wm9vbUV4cGFuZH0gICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnWm9vbUV4cGFuZCcgKTsKICAgICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnWm9vbUV4cGFuZFNvcnQnICk7CgogICAgIyBQbGVhc2Ugbm90ZTogWm9vbVRpbWVsaW5lIGlzIGFuIE9UUlNCdXNpbmVzcyBmZWF0dXJlCiAgICAkU2VsZi0+e1pvb21UaW1lbGluZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdab29tVGltZWxpbmUnICk7CiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ2hyb25pY2FsVmlld0VuYWJsZWQnKSApIHsKICAgICAgICAkU2VsZi0+e1pvb21UaW1lbGluZX0gPSAwOwogICAgfQoKICAgICMgc2F2ZSBsYXN0IHVzZWQgdmlldyB0eXBlIGluIHByZWZlcmVuY2VzCiAgICBpZiAoIGRlZmluZWQgJFNlbGYtPntab29tRXhwYW5kfSB8fCBkZWZpbmVkICRTZWxmLT57Wm9vbVRpbWVsaW5lfSApIHsKCiAgICAgICAgbXkgJExhc3RVc2VkWm9vbVZpZXdUeXBlID0gJyc7CiAgICAgICAgaWYgKCAkU2VsZi0+e1pvb21FeHBhbmR9ICYmICRTZWxmLT57Wm9vbUV4cGFuZH0gPT0gMSApIHsKICAgICAgICAgICAgJExhc3RVc2VkWm9vbVZpZXdUeXBlID0gJ0V4cGFuZCc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFNlbGYtPntab29tVGltZWxpbmV9ICYmICRTZWxmLT57Wm9vbVRpbWVsaW5lfSA9PSAxICkgewogICAgICAgICAgICAkTGFzdFVzZWRab29tVmlld1R5cGUgPSAnVGltZWxpbmUnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyTGFzdFVzZWRab29tVmlld1R5cGUnLAogICAgICAgICAgICBWYWx1ZSAgPT4gJExhc3RVc2VkWm9vbVZpZXdUeXBlLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ICkgewogICAgICAgIGlmICggJFVzZXJQcmVmZXJlbmNlc3tVc2VyQWdlbnREb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ICkgewogICAgICAgICAgICAkU2VsZi0+e0RvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ID0gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1pvb21FeHBhbmR9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJFVzZXJQcmVmZXJlbmNlc3tVc2VyTGFzdFVzZWRab29tVmlld1R5cGV9CiAgICAgICAgICAgICYmICRVc2VyUHJlZmVyZW5jZXN7VXNlckxhc3RVc2VkWm9vbVZpZXdUeXBlfSBlcSAnRXhwYW5kJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+e1pvb21FeHBhbmR9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57Wm9vbUV4cGFuZH0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Wm9vbUV4cGFuZCcpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoCiAgICAgICAgIWRlZmluZWQgJFNlbGYtPntab29tVGltZWxpbmV9CiAgICAgICAgJiYgJFVzZXJQcmVmZXJlbmNlc3tVc2VyTGFzdFVzZWRab29tVmlld1R5cGV9CiAgICAgICAgJiYgJFVzZXJQcmVmZXJlbmNlc3tVc2VyTGFzdFVzZWRab29tVmlld1R5cGV9IGVxICdUaW1lbGluZScKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntab29tVGltZWxpbmV9ID0gMTsKICAgIH0KCiAgICBpZiAoICFkZWZpbmVkICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9ICkgewogICAgICAgICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Olpvb21FeHBhbmRTb3J0Jyk7CiAgICB9CgogICAgJFNlbGYtPntBcnRpY2xlRmlsdGVyQWN0aXZlfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUaWNrZXRBcnRpY2xlRmlsdGVyJyk7CgogICAgIyBkZWZpbmUgaWYgcmljaCB0ZXh0IHNob3VsZCBiZSB1c2VkCiAgICAkU2VsZi0+e1JpY2hUZXh0fSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpab29tUmljaFRleHRGb3JjZScpCiAgICAgICAgfHwgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fQogICAgICAgIHx8IDA7CgogICAgIyBzdHJpcCBodG1sIGFuZCBhc2NpaSBhdHRhY2htZW50cyBvZiBjb250ZW50CiAgICAkU2VsZi0+e1N0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50fSA9IDE7CgogICAgIyBjaGVjayBpZiByaWNoIHRleHQgaXMgZW5hYmxlZCwgaWYgbm90IG9ubHkgc3RyaXAgYXNjaWkgYXR0YWNobWVudHMKICAgIGlmICggISRTZWxmLT57UmljaFRleHR9ICkgewogICAgICAgICRTZWxmLT57U3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnR9ID0gMjsKICAgIH0KCiAgICAjIHRpY2tldCBpZCBsb29rdXAKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICYmICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldE51bWJlcicgKSApIHsKICAgICAgICAkU2VsZi0+e1RpY2tldElEfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0SURMb29rdXAoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXROdW1iZXInICksCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTeXN0ZW1BZGRyZXNzfSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntKU09OT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkpTT04tPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0JhY2tlbmRPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyglUGFyYW0pOwojIC0tLQoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgY29uZmlnIGZvciBmcm9udGVuZCBtb2R1bGUKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkRmlsdGVyfSA9IHsKICAgICAgICAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRab29tIiktPntEeW5hbWljRmllbGR9IHx8IHt9IH0sCiAgICAgICAgJXsKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Wm9vbSIpCiAgICAgICAgICAgICAgICAtPntQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkfQogICAgICAgICAgICAgICAgfHwge30KICAgICAgICB9LAogICAgfTsKCiAgICAjIGNyZWF0ZSBhZGRpdGlvbmFsIG9iamVjdHMgZm9yIHByb2Nlc3MgbWFuYWdlbWVudAogICAgJFNlbGYtPntBY3Rpdml0eU9iamVjdH0gICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5LT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57QWN0aXZpdHlEaWFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZy0+bmV3KCVQYXJhbSk7CgogICAgJFNlbGYtPntUcmFuc2l0aW9uT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpQcm9jZXNzTWFuYWdlbWVudDo6VHJhbnNpdGlvbi0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1RyYW5zaXRpb25BY3Rpb25PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpUcmFuc2l0aW9uQWN0aW9uLT5uZXcoJVBhcmFtKTsKCiAgICAkU2VsZi0+e1Byb2Nlc3NPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpQcm9jZXNzLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgICAgIEFjdGl2aXR5T2JqZWN0ICAgICAgICAgPT4gJFNlbGYtPntBY3Rpdml0eU9iamVjdH0sCiAgICAgICAgQWN0aXZpdHlEaWFsb2dPYmplY3QgICA9PiAkU2VsZi0+e0FjdGl2aXR5RGlhbG9nT2JqZWN0fSwKICAgICAgICBUcmFuc2l0aW9uT2JqZWN0ICAgICAgID0+ICRTZWxmLT57VHJhbnNpdGlvbk9iamVjdH0sCiAgICAgICAgVHJhbnNpdGlvbkFjdGlvbk9iamVjdCA9PiAkU2VsZi0+e1RyYW5zaXRpb25BY3Rpb25PYmplY3R9LAogICAgKTsKCiAgICAjIGdldCB6b29tIHNldHRpbmdzIGRlcGVuZGluZyBvbiB0aWNrZXQgdHlwZQogICAgJFNlbGYtPntEaXNwbGF5U2V0dGluZ3N9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Wm9vbSIpOwoKICAgICMgdGhpcyBpcyBhIG1hcHBpbmcgb2YgaGlzdG9yeSB0eXBlcyB3aGljaCBpcyBiZWluZyB1c2VkCiAgICAjIGZvciB0aGUgY2hyb25pY2FsIHZpZXcgYW5kIGl0cyBldmVudCB0eXBlIGZpbHRlcgogICAgJFNlbGYtPntIaXN0b3J5VHlwZU1hcHBpbmd9ID0gewogICAgICAgIE5ld1RpY2tldCAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1RpY2tldCBDcmVhdGVkJywKICAgICAgICBBZGROb3RlICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOb3RlIEFkZGVkJywKICAgICAgICBBZGROb3RlQ3VzdG9tZXIgICAgICAgICAgICAgICAgID0+ICdOb3RlIEFkZGVkIChDdXN0b21lciknLAogICAgICAgIEVtYWlsQWdlbnQgICAgICAgICAgICAgICAgICAgICAgPT4gJ091dGdvaW5nIEVtYWlsJywKICAgICAgICBFbWFpbEFnZW50SW50ZXJuYWwgICAgICAgICAgICAgID0+ICdPdXRnb2luZyBFbWFpbCAoaW50ZXJuYWwpJywKICAgICAgICBFbWFpbEN1c3RvbWVyICAgICAgICAgICAgICAgICAgID0+ICdJbmNvbWluZyBDdXN0b21lciBFbWFpbCcsCiAgICAgICAgVGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlICAgICAgICA9PiAnRHluYW1pYyBGaWVsZCBVcGRhdGVkJywKICAgICAgICBQaG9uZUNhbGxBZ2VudCAgICAgICAgICAgICAgICAgID0+ICdPdXRnb2luZyBQaG9uZSBDYWxsJywKICAgICAgICBQaG9uZUNhbGxDdXN0b21lciAgICAgICAgICAgICAgID0+ICdJbmNvbWluZyBQaG9uZSBDYWxsJywKICAgICAgICBTZW5kQW5zd2VyICAgICAgICAgICAgICAgICAgICAgID0+ICdPdXRnb2luZyBBbnN3ZXInLAogICAgICAgIFJlc3BvbnNpYmxlVXBkYXRlICAgICAgICAgICAgICAgPT4gJ05ldyBSZXNwb25zaWJsZScsCiAgICAgICAgT3duZXJVcGRhdGUgICAgICAgICAgICAgICAgICAgICA9PiAnTmV3IE93bmVyJywKICAgICAgICBTTEFVcGRhdGUgICAgICAgICAgICAgICAgICAgICAgID0+ICdTTEEgVXBkYXRlZCcsCiAgICAgICAgU2VydmljZVVwZGF0ZSAgICAgICAgICAgICAgICAgICA9PiAnU2VydmljZSBVcGRhdGVkJywKICAgICAgICBDdXN0b21lclVwZGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b21lciBVcGRhdGVkJywKICAgICAgICBTdGF0ZVVwZGF0ZSAgICAgICAgICAgICAgICAgICAgID0+ICdTdGF0ZSBVcGRhdGVkJywKICAgICAgICBGb2xsb3dVcCAgICAgICAgICAgICAgICAgICAgICAgID0+ICdJbmNvbWluZyBGb2xsb3ctVXAnLAogICAgICAgIEVzY2FsYXRpb25VcGRhdGVUaW1lU3RvcCAgICAgICAgPT4gJ0VzY2FsYXRpb24gVXBkYXRlIFRpbWUgU3RvcHBlZCcsCiAgICAgICAgRXNjYWxhdGlvblNvbHV0aW9uVGltZVN0b3AgICAgICA9PiAnRXNjYWxhdGlvbiBTb2x1dGlvbiBUaW1lIFN0b3BwZWQnLAogICAgICAgIEVzY2FsYXRpb25GaXJzdFJlc3BvbnNlVGltZVN0b3AgPT4gJ0VzY2FsYXRpb24gRmlyc3QgUmVzcG9uc2UgVGltZSBTdG9wcGVkJywKICAgICAgICBFc2NhbGF0aW9uUmVzcG9uc2VUaW1lU3RvcCAgICAgID0+ICdFc2NhbGF0aW9uIFJlc3BvbnNlIFRpbWUgU3RvcHBlZCcsCiAgICAgICAgVGlja2V0TGlua0FkZCAgICAgICAgICAgICAgICAgICA9PiAnTGluayBBZGRlZCcsCiAgICAgICAgVGlja2V0TGlua0RlbGV0ZSAgICAgICAgICAgICAgICA9PiAnTGluayBEZWxldGVkJywKICAgICAgICBNZXJnZWQgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdUaWNrZXQgTWVyZ2VkJywKICAgICAgICBTZXRQZW5kaW5nVGltZSAgICAgICAgICAgICAgICAgID0+ICdQZW5kaW5nIFRpbWUgU2V0JywKICAgICAgICBMb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdUaWNrZXQgTG9ja2VkJywKICAgICAgICBVbmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdUaWNrZXQgVW5sb2NrZWQnLAogICAgICAgIE1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1F1ZXVlIFVwZGF0ZWQnLAogICAgICAgIFByaW9yaXR5VXBkYXRlICAgICAgICAgICAgICAgICAgPT4gJ1ByaW9yaXR5IFVwZGF0ZWQnLAogICAgICAgIFRpdGxlVXBkYXRlICAgICAgICAgICAgICAgICAgICAgPT4gJ1RpdGxlIFVwZGF0ZWQnLAogICAgICAgIFR5cGVVcGRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJ1R5cGUgVXBkYXRlZCcsCiAgICAgICAgV2ViUmVxdWVzdEN1c3RvbWVyICAgICAgICAgICAgICA9PiAnSW5jb21pbmcgV2ViIFJlcXVlc3QnLAogICAgICAgIFNlbmRBdXRvRm9sbG93VXAgICAgICAgICAgICAgICAgPT4gJ0F1dG9tYXRpYyBGb2xsb3ctVXAgU2VudCcsCiAgICAgICAgU2VuZEF1dG9SZXBseSAgICAgICAgICAgICAgICAgICA9PiAnQXV0b21hdGljIFJlcGx5IFNlbnQnLAogICAgICAgIFRpbWVBY2NvdW50aW5nICAgICAgICAgICAgICAgICAgPT4gJ1RpbWUgQWNjb3VudGVkJywKICAgICAgICBDaGF0RXh0ZXJuYWwgICAgICAgICAgICAgICAgICAgID0+ICdFeHRlcm5hbCBDaGF0JywKICAgICAgICBDaGF0SW50ZXJuYWwgICAgICAgICAgICAgICAgICAgID0+ICdJbnRlcm5hbCBDaGF0JywKICAgIH07CgogICAgIyBBZGQgY3VzdG9tIGZpbGVzIHRvIHRoZSB6b29tJ3MgZnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBvbiB0aGUgZmx5CiAgICAjICAgIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIG1vZHVsZXMuCiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ2hyb25pY2FsVmlld0VuYWJsZWQnKQogICAgICAgICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaHJvbmljYWxWaWV3RW5hYmxlZCcpID09IDEKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJFpvb21Gcm9udGVuZENvbmZpZ3VyYXRpb24gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRab29tfTsKICAgICAgICBteSBAQ3VzdG9tSlNGaWxlcyAgICAgICAgICAgICA9ICgKICAgICAgICAgICAgJ0NvcmUuQWdlbnQuVGlja2V0Wm9vbS5DaHJvbmljYWxWaWV3LmpzJywKICAgICAgICApOwogICAgICAgIHB1c2goIEB7ICRab29tRnJvbnRlbmRDb25maWd1cmF0aW9uLT57TG9hZGVyfS0+e0phdmFTY3JpcHR9IHx8IFtdIH0sIEBDdXN0b21KU0ZpbGVzICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBUaWNrZXRJRCBpcyBnaXZlbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIG15ICRUcmFuc2xhdGFibGVNZXNzYWdlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICJXZSBhcmUgc29ycnksIHlvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9ucyBhbnltb3JlIHRvIGFjY2VzcyB0aGlzIHRpY2tldCBpbiBpdHMgY3VycmVudCBzdGF0ZS4gIgogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbigKICAgICAgICAgICAgTWVzc2FnZSAgICA9PiAkVHJhbnNsYXRhYmxlTWVzc2FnZSwKICAgICAgICAgICAgV2l0aEhlYWRlciA9PiAneWVzJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBhdHRyaWJ1dGVzCiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgIG15ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBteSAkQ291bnRlciA9IDA7CgogICAgIyBnZXQgYWxsIHJlZ2lzdGVyZWQgQWN0aW9ucwogICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CgogICAgICAgIG15ICVBY3Rpb25zID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKSB9OwoKICAgICAgICAjIG9ubHkgdXNlIHRob3NlIEFjdGlvbnMgdGhhdCBzdGF0cyB3aXRoIEFnZW50CiAgICAgICAgJVBvc3NpYmxlQWN0aW9ucyA9IG1hcCB7ICsrJENvdW50ZXIgPT4gJF8gfQogICAgICAgICAgICBncmVwIHsgc3Vic3RyKCAkXywgMCwgbGVuZ3RoICdBZ2VudCcgKSBlcSAnQWdlbnQnIH0KICAgICAgICAgICAgc29ydCBrZXlzICVBY3Rpb25zOwogICAgfQoKICAgIG15ICRBQ0wgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbCgKICAgICAgICBEYXRhICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJUFjbEFjdGlvbiA9ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBpZiAoJEFDTCkgewogICAgICAgICVBY2xBY3Rpb24gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgIyBzaG93IGVycm9yIHNjcmVlbiBpZiBBQ0wgcHJvaGliaXRzIHRoaXMgYWN0aW9uCiAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIG1hcmsgc2hvd24gdGlja2V0IGFzIHNlZW4KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUaWNrZXRNYXJrQXNTZWVuJyApIHsKICAgICAgICBteSAkU3VjY2VzcyA9IDE7CgogICAgICAgICMgYWx3YXlzIHNob3cgYXJjaGl2ZWQgdGlja2V0cyBhcyBzZWVuCiAgICAgICAgaWYgKCAkVGlja2V0e0FyY2hpdmVGbGFnfSBuZSAneScgKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPl9UaWNrZXRJdGVtU2VlbiggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkU3VjY2VzcywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTWFya0FzSW1wb3J0YW50JyApIHsKCiAgICAgICAgIyBPd25lciBhbmQgUmVzcG9uc2libGUgY2FuIG1hcmsgYXJ0aWNsZXMgYXMgaW1wb3J0YW50IG9yIHJlbW92ZSBtYXJrCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e1VzZXJJRH0gPT0gJFRpY2tldHtPd25lcklEfQogICAgICAgICAgICB8fCAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e1VzZXJJRH0gPT0gJFRpY2tldHtSZXNwb25zaWJsZUlEfQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIEFsd2F5cyB1c2UgdXNlciBpZCAxIGJlY2F1c2Ugb3RoZXIgdXNlcnMgYWxzbyBoYXZlIHRvIHNlZSB0aGUgaW1wb3J0YW50IGZsYWcKICAgICAgICAgICAgbXkgJUFydGljbGVGbGFnID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRmxhZ0dldCgKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRBcnRpY2xlSXNJbXBvcnRhbnQgPSAkQXJ0aWNsZUZsYWd7SW1wb3J0YW50fTsKICAgICAgICAgICAgaWYgKCRBcnRpY2xlSXNJbXBvcnRhbnQpIHsKCiAgICAgICAgICAgICAgICAjIEFsd2F5cyB1c2UgdXNlciBpZCAxIGJlY2F1c2Ugb3RoZXIgdXNlcnMgYWxzbyBoYXZlIHRvIHNlZSB0aGUgaW1wb3J0YW50IGZsYWcKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZsYWdEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJ0ltcG9ydGFudCcsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgQWx3YXlzIHVzZSB1c2VyIGlkIDEgYmVjYXVzZSBvdGhlciB1c2VycyBhbHNvIGhhdmUgdG8gc2VlIHRoZSBpbXBvcnRhbnQgZmxhZwogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRmxhZ1NldCgKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAnSW1wb3J0YW50JywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfTtBcnRpY2xlSUQ9JFNlbGYtPntBcnRpY2xlSUR9IiwKICAgICAgICApOwogICAgfQoKICAgICMgbWFyayBzaG93biBhcnRpY2xlIGFzIHNlZW4KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdNYXJrQXNTZWVuJyApIHsKICAgICAgICBteSAkU3VjY2VzcyA9IDE7CgogICAgICAgICMgYWx3YXlzIHNob3cgYXJjaGl2ZWQgdGlja2V0cyBhcyBzZWVuCiAgICAgICAgaWYgKCAkVGlja2V0e0FyY2hpdmVGbGFnfSBuZSAneScgKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPl9BcnRpY2xlSXRlbVNlZW4oIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0gKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkU3VjY2VzcywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFydGljbGUgdXBkYXRlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQXJ0aWNsZVVwZGF0ZScgKSB7CiAgICAgICAgbXkgJENvdW50ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ291bnQnICk7CiAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVHZXQoCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtDb3VudH0gPSAkQ291bnQ7CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgaW5kZXggKHdpdGhvdXQgYXR0YWNobWVudHMpCiAgICAgICAgbXkgJUF0bUluZGV4ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQXR0YWNobWVudEluZGV4KAogICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFN0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50ID0+ICRTZWxmLT57U3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnR9LAogICAgICAgICAgICBBcnRpY2xlICAgICAgICAgICAgICAgICAgICA9PiBcJUFydGljbGUsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgICAgICRBcnRpY2xle0F0bXN9ID0gXCVBdG1JbmRleDsKCiAgICAgICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgICAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICAgICAgICAgIFZhbGlkICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+X0FydGljbGVJdGVtKAogICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgQXJ0aWNsZSAgICAgICAgICAgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICBBY2xBY3Rpb24gICAgICAgICA9PiBcJUFjbEFjdGlvbiwKICAgICAgICAgICAgU3RhbmRhcmRSZXNwb25zZXMgPT4gJFN0YW5kYXJkVGVtcGxhdGVze0Fuc3dlcn0sCiAgICAgICAgICAgIFN0YW5kYXJkRm9yd2FyZHMgID0+ICRTdGFuZGFyZFRlbXBsYXRlc3tGb3J3YXJkfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgPT4gJ09uTG9hZCcsCiAgICAgICAgKTsKICAgICAgICBteSAkQ29udGVudCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7ICVUaWNrZXQsICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQ29udGVudCApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2FuJ3QgZ2V0IGZvciBBcnRpY2xlSUQgJFNlbGYtPntBcnRpY2xlSUR9ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDaGFyc2V0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRDb250ZW50LAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgd3JpdGUgYXJ0aWNsZSBmaWx0ZXIgc2V0dGluZ3MgdG8gc2Vzc2lvbgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FydGljbGVGaWx0ZXJTZXQnICkgewoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGlja2V0SUQgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0SUQnICk7CiAgICAgICAgbXkgJFNhdmVEZWZhdWx0cyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NhdmVEZWZhdWx0cycgKTsKICAgICAgICBteSBAQXJ0aWNsZVR5cGVGaWx0ZXJJRHMgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdBcnRpY2xlVHlwZUZpbHRlcicgKTsKICAgICAgICBteSBAQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXJJRHMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdBcnRpY2xlU2VuZGVyVHlwZUZpbHRlcicgKTsKCiAgICAgICAgIyBidWlsZCBzZXNzaW9uIHN0cmluZwogICAgICAgIG15ICRTZXNzaW9uU3RyaW5nID0gJyc7CiAgICAgICAgaWYgKEBBcnRpY2xlVHlwZUZpbHRlcklEcykgewogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSAnQXJ0aWNsZVR5cGVGaWx0ZXI8JzsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gam9pbiAnLCcsIEBBcnRpY2xlVHlwZUZpbHRlcklEczsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gJz4nOwogICAgICAgIH0KICAgICAgICBpZiAoQEFydGljbGVTZW5kZXJUeXBlRmlsdGVySURzKSB7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nIC49ICdBcnRpY2xlU2VuZGVyVHlwZUZpbHRlcjwnOwogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSBqb2luICcsJywgQEFydGljbGVTZW5kZXJUeXBlRmlsdGVySURzOwogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSAnPic7CiAgICAgICAgfQoKICAgICAgICAjIHdyaXRlIHRoZSBzZXNzaW9uCgogICAgICAgICMgc2F2ZSBkZWZhdWx0IGZpbHRlciBzZXR0aW5ncyB0byB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgaWYgKCRTYXZlRGVmYXVsdHMpIHsKICAgICAgICAgICAgJFNlbGYtPntVc2VyT2JqZWN0fS0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICdBcnRpY2xlRmlsdGVyRGVmYXVsdCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJFNlc3Npb25TdHJpbmcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJ0FydGljbGVGaWx0ZXJEZWZhdWx0JywKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2Vzc2lvblN0cmluZywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdHVybiBvZmYgZmlsdGVyIGV4cGxpY2l0bHkgZm9yIHRoaXMgdGlja2V0CiAgICAgICAgaWYgKCAkU2Vzc2lvblN0cmluZyBlcSAnJyApIHsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgPSAnb2ZmJzsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBzZXNzaW9uCiAgICAgICAgbXkgJFVwZGF0ZSA9ICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICJBcnRpY2xlRmlsdGVyJFRpY2tldElEIiwKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZXNzaW9uU3RyaW5nLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICBteSAkSlNPTiA9ICcnOwogICAgICAgIGlmICgkVXBkYXRlKSB7CiAgICAgICAgICAgICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAnQXJ0aWNsZSBmaWx0ZXIgc2V0dGluZ3Mgd2VyZSBzYXZlZC4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHdyaXRlIGFydGljbGUgZmlsdGVyIHNldHRpbmdzIHRvIHNlc3Npb24KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdFdmVuVHlwZUZpbHRlclNldCcgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUaWNrZXRJRCAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXRJRCcgKTsKICAgICAgICBteSAkU2F2ZURlZmF1bHRzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2F2ZURlZmF1bHRzJyApOwogICAgICAgIG15IEBFdmVudFR5cGVGaWx0ZXJJRHMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICdFdmVudFR5cGVGaWx0ZXInICk7CgogICAgICAgICMgYnVpbGQgc2Vzc2lvbiBzdHJpbmcKICAgICAgICBteSAkU2Vzc2lvblN0cmluZyA9ICcnOwogICAgICAgIGlmIChARXZlbnRUeXBlRmlsdGVySURzKSB7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nIC49ICdFdmVudFR5cGVGaWx0ZXI8JzsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gam9pbiAnLCcsIEBFdmVudFR5cGVGaWx0ZXJJRHM7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nIC49ICc+JzsKICAgICAgICB9CgogICAgICAgICMgd3JpdGUgdGhlIHNlc3Npb24KCiAgICAgICAgIyBzYXZlIGRlZmF1bHQgZmlsdGVyIHNldHRpbmdzIHRvIHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICBpZiAoJFNhdmVEZWZhdWx0cykgewogICAgICAgICAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ0V2ZW50VHlwZUZpbHRlckRlZmF1bHQnLAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRTZXNzaW9uU3RyaW5nLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICdFdmVudFR5cGVGaWx0ZXJEZWZhdWx0JywKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2Vzc2lvblN0cmluZywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdHVybiBvZmYgZmlsdGVyIGV4cGxpY2l0bHkgZm9yIHRoaXMgdGlja2V0CiAgICAgICAgaWYgKCAkU2Vzc2lvblN0cmluZyBlcSAnJyApIHsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgPSAnb2ZmJzsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBzZXNzaW9uCiAgICAgICAgbXkgJFVwZGF0ZSA9ICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICJFdmVudFR5cGVGaWx0ZXIkVGlja2V0SUQiLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlc3Npb25TdHJpbmcsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgIG15ICRKU09OID0gJyc7CiAgICAgICAgaWYgKCRVcGRhdGUpIHsKICAgICAgICAgICAgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICdFdmVudCB0eXBlIGZpbHRlciBzZXR0aW5ncyB3ZXJlIHNhdmVkLicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZW5kIEpTT04gcmVzcG9uc2UKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgYXJ0aWNsZSBmaWx0ZXIgaXMgYWN0aXZhdGVkIGluIHN5c2NvbmZpZwogICAgaWYgKCAkU2VsZi0+e0FydGljbGVGaWx0ZXJBY3RpdmV9ICkgewoKICAgICAgICAjIGdldCBhcnRpY2xlIGZpbHRlciBzZXR0aW5ncyBmcm9tIHNlc3Npb24gc3RyaW5nCiAgICAgICAgbXkgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nID0gJFNlbGYtPnsgJ0FydGljbGVGaWx0ZXInIC4gJFNlbGYtPntUaWNrZXRJRH0gfTsKCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBmaWx0ZXIgZm9yIHRoaXMgdGlja2V0IGZyb20gdXNlciBwcmVmZXJlbmNlcwogICAgICAgIGlmICggISRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyApIHsKICAgICAgICAgICAgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nID0gJFNlbGYtPntBcnRpY2xlRmlsdGVyRGVmYXVsdH07CiAgICAgICAgfQoKICAgICAgICAjIGRvIG5vdCB1c2UgZGVmYXVsdHMgZm9yIHRoaXMgdGlja2V0IGlmIGZpbHRlciB3YXMgZXhwbGljaXRseSB0dXJuZWQgb2ZmCiAgICAgICAgZWxzaWYgKCAkQXJ0aWNsZUZpbHRlclNlc3Npb25TdHJpbmcgZXEgJ29mZicgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBleHRyYWN0IEFydGljbGVUeXBlSURzCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXJ0aWNsZUZpbHRlclNlc3Npb25TdHJpbmcKICAgICAgICAgICAgJiYgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nID1+IG17IEFydGljbGVUeXBlRmlsdGVyIDwgKCBbXjw+XSsgKSA+IH14bXMKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgQElEcyA9IHNwbGl0IC8sLywgJDE7CiAgICAgICAgICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntBcnRpY2xlVHlwZUlEfSA9IFxASURzOwogICAgICAgIH0KCiAgICAgICAgIyBleHRyYWN0IEFydGljbGVTZW5kZXJUeXBlSURzCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXJ0aWNsZUZpbHRlclNlc3Npb25TdHJpbmcKICAgICAgICAgICAgJiYgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nID1+IG17IEFydGljbGVTZW5kZXJUeXBlRmlsdGVyIDwgKCBbXjw+XSsgKSA+IH14bXMKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgQElEcyA9IHNwbGl0IC8sLywgJDE7CiAgICAgICAgICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntBcnRpY2xlU2VuZGVyVHlwZUlEfSA9IFxASURzOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZXZlbnQgdHlwZSBmaWx0ZXIgc2V0dGluZ3MgZnJvbSBzZXNzaW9uIHN0cmluZwogICAgICAgIG15ICRFdmVudFR5cGVGaWx0ZXJTZXNzaW9uU3RyaW5nID0gJFNlbGYtPnsgJ0V2ZW50VHlwZUZpbHRlcicgLiAkU2VsZi0+e1RpY2tldElEfSB9OwoKICAgICAgICAjIHNldCBhcnRpY2xlIGZpbHRlciBmb3IgdGhpcyB0aWNrZXQgZnJvbSB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgaWYgKCAhJEV2ZW50VHlwZUZpbHRlclNlc3Npb25TdHJpbmcgKSB7CiAgICAgICAgICAgICRFdmVudFR5cGVGaWx0ZXJTZXNzaW9uU3RyaW5nID0gJFNlbGYtPntFdmVudFR5cGVGaWx0ZXJEZWZhdWx0fTsKICAgICAgICB9CgogICAgICAgICMgZG8gbm90IHVzZSBkZWZhdWx0cyBmb3IgdGhpcyB0aWNrZXQgaWYgZmlsdGVyIHdhcyBleHBsaWNpdGx5IHR1cm5lZCBvZmYKICAgICAgICBlbHNpZiAoICRFdmVudFR5cGVGaWx0ZXJTZXNzaW9uU3RyaW5nIGVxICdvZmYnICkgewogICAgICAgICAgICAkRXZlbnRUeXBlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBleHRyYWN0IEFydGljbGVUeXBlSURzCiAgICAgICAgaWYgKAogICAgICAgICAgICAkRXZlbnRUeXBlRmlsdGVyU2Vzc2lvblN0cmluZwogICAgICAgICAgICAmJiAkRXZlbnRUeXBlRmlsdGVyU2Vzc2lvblN0cmluZyA9fiBteyBFdmVudFR5cGVGaWx0ZXIgPCAoIFtePD5dKyApID4gfXhtcwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSBASURzID0gc3BsaXQgLywvLCAkMTsKICAgICAgICAgICAgJFNlbGYtPntFdmVudFR5cGVGaWx0ZXJ9LT57RXZlbnRUeXBlSUR9ID0gXEBJRHMsCiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIGlmIEhUTUwgZW1haWwKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTaG93SFRNTGVNYWlsJyApIHsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgQXJ0aWNsZUlECiAgICAgICAgaWYgKCAhJFNlbGYtPntBcnRpY2xlSUR9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnTmVlZCBBcnRpY2xlSUQhJyApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBkYXRhCiAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVHZXQoCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBhcnRpY2xlIGRhdGEgZXhpc3RzCiAgICAgICAgaWYgKCAhJUFydGljbGUgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdJbnZhbGlkIEFydGljbGVJRCEnICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGl0IGlzIGEgaHRtbCBlbWFpbCwgcmV0dXJuIGhlcmUKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpIb29rJykKICAgICAgICAgICAgICAgIC4gIi0kQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LSRBcnRpY2xle1RpY2tldElEfS0kQXJ0aWNsZXtBcnRpY2xlSUR9IiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICIkQXJ0aWNsZXtNaW1lVHlwZX07IGNoYXJzZXQ9JEFydGljbGV7Q2hhcnNldH0iLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQXJ0aWNsZXtCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPk1hc2tBZ2VudFpvb20oCiAgICAgICAgVGlja2V0ICAgID0+IFwlVGlja2V0LAogICAgICAgIEFjbEFjdGlvbiA9PiBcJUFjbEFjdGlvbgogICAgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgTWFza0FnZW50Wm9vbSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVUaWNrZXQgICAgPSAleyAkUGFyYW17VGlja2V0fSB9OwogICAgbXkgJUFjbEFjdGlvbiA9ICV7ICRQYXJhbXtBY2xBY3Rpb259IH07CgogICAgIyBlbHNlIHNob3cgbm9ybWFsIHRpY2tldCB6b29tIHZpZXcKICAgICMgZmV0Y2ggYWxsIG1vdmUgcXVldWVzCiAgICBteSAlTW92ZVF1ZXVlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TW92ZUxpc3QoCiAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUeXBlICAgICA9PiAnbW92ZV9pbnRvJywKICAgICk7CgogICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICApOwoKICAgICMgb3duZXIgaW5mbwogICAgbXkgJU93bmVySW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkVGlja2V0e093bmVySUR9LAogICAgKTsKCiAgICAjIHJlc3BvbnNpYmxlIGluZm8KICAgIG15ICVSZXNwb25zaWJsZUluZm8gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFRpY2tldHtSZXNwb25zaWJsZUlEfSB8fCAxLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIHNob3duIGFydGljbGVzCgogICAgbXkgJExpbWl0ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1heEFydGljbGVzUGVyUGFnZScpOwoKICAgIG15ICRPcmRlciA9ICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9IGVxICdyZXZlcnNlJyA/ICdERVNDJyA6ICdBU0MnOwogICAgbXkgJFBhZ2U7CgogICAgaWYgKCAkU2VsZi0+e0FydGljbGVJRH0gKSB7CiAgICAgICAgJFBhZ2UgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVQYWdlKAogICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEICAgPT4gJFNlbGYtPntBcnRpY2xlSUR9LAogICAgICAgICAgICBSb3dzUGVyUGFnZSA9PiAkTGltaXQsCiAgICAgICAgICAgIE9yZGVyICAgICAgID0+ICRPcmRlciwKICAgICAgICAgICAgJXsgJFNlbGYtPntBcnRpY2xlRmlsdGVyfSAvLyB7fSB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57QXJ0aWNsZVBhZ2V9ICkgewogICAgICAgICRQYWdlID0gJFNlbGYtPntBcnRpY2xlUGFnZX07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFnZSA9IDE7CiAgICB9CgogICAgIyBXZSBuZWVkIHRvIGZpbmQgb3V0IHdoZXRoZXIgcGFnaW5hdGlvbiBpcyBhY3R1YWxseSBuZWNlc3NhcnkuCiAgICAjIFRoZSBlYXNpZXN0IHdheSB3b3VsZCBiZSBjb3VudCB0aGUgYXJ0aWNsZXMsIGJ1dCB0aGF0IHdvdWxkIHNsb3cKICAgICMgZG93biB0aGUgbW9zdCBjb21tb24gY2FzZSAoZmV3ZXIgYXJ0aWNsZXMgdGhhbiAkTGltaXQgaW4gdGhlIHRpY2tldCkuCiAgICAjIFNvIGluc3RlYWQgd2UgdXNlIHRoZSBmb2xsb3dpbmcgdHJpY2s6CiAgICAjIDEpIGlmIHRoZSAkUGFnZSA+IDEsIHdlIG5lZWQgcGFnaW5hdGlvbgogICAgIyAyKSBpZiBub3QsIHJlcXVlc3QgJExpbWl0ICsgMSBhcnRpY2xlcy4gSWYgJExpbWl0ICsgMSBhcmUgYWN0dWFsbHkKICAgICMgICAgcmV0dXJuZWQsIHBhZ2luYXRpb24gaXMgbmVjZXNzYXJ5CiAgICBteSAkRXh0cmEgPSAkUGFnZSA+IDEgPyAwIDogMTsKICAgIG15ICROZWVkUGFnaW5hdGlvbjsKICAgIG15ICRBcnRpY2xlQ291bnQ7CgogICAgbXkgQEFydGljbGVDb250ZW50QXJncyA9ICgKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAkU2VsZi0+e1N0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50fSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgTGltaXQgICAgICAgICAgICAgICAgICAgICAgPT4gJExpbWl0ICsgJEV4dHJhLAogICAgICAgIE9yZGVyICAgICAgICAgICAgICAgICAgICAgID0+ICRPcmRlciwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsICAgICMgZmV0Y2ggbGF0ZXIgb25seSBmb3IgdGhlIGFydGljbGUocykgdG8gZGlzcGxheQogICAgICAgICV7ICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0gLy8ge30gfSwgICAgIyBsaW1pdCBieSBBcnRpY2xlU2VuZGVyVHlwZUlEL0FydGljbGVUeXBlSUQKCiAgICApOwoKICAgICMgZ2V0IGNvbnRlbnQKICAgIG15IEBBcnRpY2xlQm94ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ29udGVudEluZGV4KAogICAgICAgIEBBcnRpY2xlQ29udGVudEFyZ3MsCiAgICAgICAgUGFnZSA9PiAkUGFnZSwKICAgICk7CgogICAgaWYgKCAhQEFydGljbGVCb3ggJiYgJFBhZ2UgPiAxICkgewoKICAgICAgICAjIGlmIHRoZSBwYWdlIGFyZ3VtZW50IGlzIHBhc3QgdGhlIGFjdHVhbCBudW1iZXIgb2YgcGFnZXMsCiAgICAgICAgIyBhc3N1bWUgcGFnZSAxIGluc3RlYWQuCiAgICAgICAgIyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIG5ldyBhcnRpY2xlIGZpbHRlciB3YXMgYWRkZWQuCiAgICAgICAgJFBhZ2UgICAgICAgPSAxOwogICAgICAgIEBBcnRpY2xlQm94ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ29udGVudEluZGV4KAogICAgICAgICAgICBAQXJ0aWNsZUNvbnRlbnRBcmdzLAogICAgICAgICAgICBQYWdlID0+ICRQYWdlLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGVDb3VudCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUNvdW50KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgJXsgJFNlbGYtPntBcnRpY2xlRmlsdGVyfSAvLyB7fSB9LAogICAgICAgICk7CiAgICAgICAgJE5lZWRQYWdpbmF0aW9uID0gJEFydGljbGVDb3VudCA+ICRMaW1pdDsKICAgIH0KICAgIGVsc2lmICggQEFydGljbGVCb3ggPiAkTGltaXQgKSB7CiAgICAgICAgcG9wIEBBcnRpY2xlQm94OwogICAgICAgICROZWVkUGFnaW5hdGlvbiA9IDE7CiAgICAgICAgJEFydGljbGVDb3VudCAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ291bnQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAleyAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9IC8vIHt9IH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhZ2UgPT0gMSApIHsKICAgICAgICAkQXJ0aWNsZUNvdW50ICAgPSBAQXJ0aWNsZUJveDsKICAgICAgICAkTmVlZFBhZ2luYXRpb24gPSAwOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE5lZWRQYWdpbmF0aW9uID0gMTsKICAgICAgICAkQXJ0aWNsZUNvdW50ICAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb3VudCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICV7ICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0gLy8ge30gfSwKICAgICAgICApOwogICAgfQoKICAgICRQYWdlIHx8PSAxOwoKICAgIG15ICRQYWdlczsKICAgIGlmICgkTmVlZFBhZ2luYXRpb24pIHsKICAgICAgICAkUGFnZXMgPSBjZWlsKCAkQXJ0aWNsZUNvdW50IC8gJExpbWl0ICk7CiAgICB9CgogICAgIyBhZGQgY291bnRlcgogICAgbXkgJENvdW50ID0gKCAkUGFnZSAtIDEgKSAqICRMaW1pdDsKCiAgICAjIGluIGNhc2Ugb2YgcmV2ZXJzZSBzb3J0aW5nLCBjb3VudCB0b3AtZG93bgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Wm9vbUV4cGFuZFNvcnQnKSBlcSAncmV2ZXJzZScgKSB7CiAgICAgICAgJENvdW50ID0gJEFydGljbGVDb3VudCAtICggKCAkUGFnZSAtIDEgKSAqICRMaW1pdCApICsgMTsKICAgIH0KCiAgICBteSAkQXJ0aWNsZUlERm91bmQgPSAwOwogICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZUJveCkgewoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpab29tRXhwYW5kU29ydCcpIGVxICdyZXZlcnNlJyApIHsKICAgICAgICAgICAgJENvdW50LS07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ291bnQrKzsKICAgICAgICB9CgogICAgICAgICRBcnRpY2xlLT57Q291bnR9ID0gJENvdW50OwogICAgICAgIGlmICggJFNlbGYtPntBcnRpY2xlSUR9ICYmICRTZWxmLT57QXJ0aWNsZUlEfSA9PSAkQXJ0aWNsZS0+e0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlSURGb3VuZCA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICVBcnRpY2xlRmxhZ3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGbGFnc09mVGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgc2VsZWN0ZWQgb3IgbGFzdCBjdXN0b21lciBhcnRpY2xlCiAgICBteSAkQXJ0aWNsZUlEOwogICAgaWYgKCRBcnRpY2xlSURGb3VuZCkgewogICAgICAgICRBcnRpY2xlSUQgPSAkU2VsZi0+e0FydGljbGVJRH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBmaW5kIGxhdGVzdCBub3Qgc2VlbiBhcnRpY2xlCiAgICAgICAgQVJUSUNMRToKICAgICAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlQm94KSB7CgogICAgICAgICAgICAjIGlnbm9yZSBzeXN0ZW0gc2VuZGVyIHR5cGUKICAgICAgICAgICAgbmV4dCBBUlRJQ0xFCiAgICAgICAgICAgICAgICBpZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpOZXdBcnRpY2xlSWdub3JlU3lzdGVtU2VuZGVyJykKICAgICAgICAgICAgICAgICYmICRBcnRpY2xlLT57U2VuZGVyVHlwZX0gZXEgJ3N5c3RlbSc7CgogICAgICAgICAgICBuZXh0IEFSVElDTEUgaWYgJEFydGljbGVGbGFnc3sgJEFydGljbGUtPntBcnRpY2xlSUR9IH0tPntTZWVufTsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRBcnRpY2xlLT57QXJ0aWNsZUlEfTsKICAgICAgICAgICAgbGFzdCBBUlRJQ0xFOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgc2VsZWN0ZWQgYXJ0aWNsZQogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgIGlmIChAQXJ0aWNsZUJveCkgewoKICAgICAgICAgICAgICAgICMgc2V0IGZpcnN0IGxpc3RlZCBhcnRpY2xlIGFzIGZhbGxiYWNrCiAgICAgICAgICAgICAgICAkQXJ0aWNsZUlEID0gJEFydGljbGVCb3hbMF0tPntBcnRpY2xlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBsYXN0IGN1c3RvbWVyIGFydGljbGUgYXMgc2VsZWN0ZWQgYXJ0aWNsZSByZXBsYWNpbmcgbGFzdCBzZXQKICAgICAgICAgICAgQVJUSUNMRVRNUDoKICAgICAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZVRtcC0+e1NlbmRlclR5cGV9IGVxICdjdXN0b21lcicgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFydGljbGVJRCA9ICRBcnRpY2xlVG1wLT57QXJ0aWNsZUlEfTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEFSVElDTEVUTVAgaWYgJFNlbGYtPntab29tRXhwYW5kU29ydH0gZXEgJ3JldmVyc2UnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgZXhwYW5kIHZpZXcgaXMgdXNhYmxlIChvbmx5IGZvciBsZXNzIHRoZW4gNDAwIGFydGljbGUpCiAgICAjIGlmIHlvdSBoYXZlIG1vcmUgYXJ0aWNsZXMgaXMgZ29pbmcgdG8gYmUgc2xvdyBhbmQgbm90IHVzYWJsZQogICAgbXkgJEFydGljbGVNYXhMaW1pdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNYXhBcnRpY2xlc1pvb21FeHBhbmQnKQogICAgICAgIC8vIDQwMDsKICAgIGlmICggJFNlbGYtPntab29tRXhwYW5kfSAmJiAkI0FydGljbGVCb3ggPiAkQXJ0aWNsZU1heExpbWl0ICkgewogICAgICAgICRTZWxmLT57Wm9vbUV4cGFuZH0gPSAwOwogICAgfQoKICAgICMgZ2V0IHNob3duIGFydGljbGUocykKICAgIG15IEBBcnRpY2xlQm94U2hvd247CiAgICBpZiAoICEkU2VsZi0+e1pvb21FeHBhbmR9ICkgewogICAgICAgIEFSVElDTEVCT1g6CiAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xlSUQgZXEgJEFydGljbGVUbXAtPntBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQXJ0aWNsZUJveFNob3duLCAkQXJ0aWNsZVRtcDsKICAgICAgICAgICAgICAgIGxhc3QgQVJUSUNMRUJPWDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIEBBcnRpY2xlQm94U2hvd24gPSBAQXJ0aWNsZUJveDsKICAgIH0KCiAgICAjIHNldCBkaXNwbGF5IG9wdGlvbnMKICAgICRQYXJhbXtXaWRnZXRUaXRsZX0gPSAnVGlja2V0IEluZm9ybWF0aW9uJzsKICAgICRQYXJhbXtIb29rfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Okhvb2snKSB8fCAnVGlja2V0Iyc7CgogICAgIyBjaGVjayBpZiB0aWNrZXQgaXMgbm9ybWFsIG9yIHByb2Nlc3MgdGlja2V0CiAgICBteSAkSXNQcm9jZXNzVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRDaGVja0ZvclByb2Nlc3NUeXBlKAogICAgICAgICdUaWNrZXRJRCcgPT4gJFNlbGYtPntUaWNrZXRJRH0KICAgICk7CgogICAgIyBvdmVyd3JpdGUgZGlzcGxheSBvcHRpb25zIGZvciBwcm9jZXNzIHRpY2tldAogICAgaWYgKCRJc1Byb2Nlc3NUaWNrZXQpIHsKICAgICAgICAkUGFyYW17V2lkZ2V0VGl0bGV9ID0gJFNlbGYtPntEaXNwbGF5U2V0dGluZ3N9LT57UHJvY2Vzc0Rpc3BsYXl9LT57V2lkZ2V0VGl0bGV9OwogICAgfQoKICAgICMgb25seSBzaG93IGFydGljbGUgdHJlZSBpZiBhcnRpY2xlcyBhcmUgcHJlc2VudCwKICAgICMgb3IgaWYgYSBmaWx0ZXIgaXMgc2V0IChzbyB0aGF0IHRoZSB1c2VyIGhhcyB0aGUgb3B0aW9uIHRvCiAgICAjIGRpc2FibGUgdGhlIGZpbHRlcikKICAgIGlmICggQEFydGljbGVCb3ggfHwgJFNlbGYtPntBcnRpY2xlRmlsdGVyfSApIHsKCiAgICAgICAgbXkgJFBhZ2luYXRpb247CgogICAgICAgIGlmICgkTmVlZFBhZ2luYXRpb24pIHsKICAgICAgICAgICAgJFBhZ2luYXRpb24gPSB7CiAgICAgICAgICAgICAgICBQYWdlcyAgICAgICA9PiAkUGFnZXMsCiAgICAgICAgICAgICAgICBDdXJyZW50UGFnZSA9PiAkUGFnZSwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGFydGljbGUgdHJlZQogICAgICAgICRQYXJhbXtBcnRpY2xlVHJlZX0gPSAkU2VsZi0+X0FydGljbGVUcmVlKAogICAgICAgICAgICBUaWNrZXQgICAgICAgICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgQXJ0aWNsZUZsYWdzICAgICAgPT4gXCVBcnRpY2xlRmxhZ3MsCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgIEFydGljbGVNYXhMaW1pdCAgID0+ICRBcnRpY2xlTWF4TGltaXQsCiAgICAgICAgICAgIEFydGljbGVCb3ggICAgICAgID0+IFxAQXJ0aWNsZUJveCwKICAgICAgICAgICAgUGFnaW5hdGlvbiAgICAgICAgPT4gJFBhZ2luYXRpb24sCiAgICAgICAgICAgIFBhZ2UgICAgICAgICAgICAgID0+ICRQYWdlLAogICAgICAgICAgICBBcnRpY2xlQ291bnQgICAgICA9PiBzY2FsYXIgQEFydGljbGVCb3gsCiAgICAgICAgICAgIEFjbEFjdGlvbiAgICAgICAgID0+IFwlQWNsQWN0aW9uLAogICAgICAgICAgICBTdGFuZGFyZFJlc3BvbnNlcyA9PiAkU3RhbmRhcmRUZW1wbGF0ZXN7QW5zd2VyfSwKICAgICAgICAgICAgU3RhbmRhcmRGb3J3YXJkcyAgPT4gJFN0YW5kYXJkVGVtcGxhdGVze0ZvcndhcmR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGFydGljbGVzIGl0ZW1zCiAgICBpZiAoICEkU2VsZi0+e1pvb21UaW1lbGluZX0gKSB7CgogICAgICAgICRQYXJhbXtBcnRpY2xlSXRlbXN9ID0gJyc7CiAgICAgICAgQVJUSUNMRToKICAgICAgICBmb3IgbXkgJEFydGljbGVUbXAgKEBBcnRpY2xlQm94U2hvd24pIHsKICAgICAgICAgICAgbXkgJUFydGljbGUgPSAlJEFydGljbGVUbXA7CgogICAgICAgICAgICAkU2VsZi0+X0FydGljbGVJdGVtKAogICAgICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgICAgICBBcnRpY2xlICAgICAgICAgICA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICBBY2xBY3Rpb24gICAgICAgICA9PiBcJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzID0+ICRTdGFuZGFyZFRlbXBsYXRlc3tBbnN3ZXJ9LAogICAgICAgICAgICAgICAgU3RhbmRhcmRGb3J3YXJkcyAgPT4gJFN0YW5kYXJkVGVtcGxhdGVze0ZvcndhcmR9LAogICAgICAgICAgICAgICAgQWN0dWFsQXJ0aWNsZUlEICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgID0+ICdTdGF0aWMnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17QXJ0aWNsZUl0ZW1zfSAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4geyAlVGlja2V0LCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFsd2F5cyBzaG93IGFyY2hpdmVkIHRpY2tldHMgYXMgc2VlbgogICAgaWYgKCAkU2VsZi0+e1pvb21FeHBhbmR9ICYmICRUaWNrZXR7QXJjaGl2ZUZsYWd9IG5lICd5JyApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRJdGVtTWFya0FzU2VlbicsCiAgICAgICAgICAgIERhdGEgPT4geyBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhZ2UgZGVzaWduCiAgICAkVGlja2V0e0FnZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKAogICAgICAgIEFnZSAgID0+ICRUaWNrZXR7QWdlfSwKICAgICAgICBTcGFjZSA9PiAnICcKICAgICk7CgogICAgIyBudW1iZXIgb2YgYXJ0aWNsZXMKICAgICRQYXJhbXtBcnRpY2xlQ291bnR9ID0gc2NhbGFyIEBBcnRpY2xlQm94OwoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VXNlQXJ0aWNsZUNvbG9ycycpICkgewogICAgICAgICRQYXJhbXtVc2VBcnRpY2xlQ29sb3JzfSA9IDE7CiAgICB9CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdIZWFkZXInLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICk7CgogICAgIyBydW4gdGlja2V0IG1lbnUgbW9kdWxlcwogICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJU1lbnVzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSB9OwogICAgICAgIE1FTlU6CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15ICRJdGVtID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICAgICAgQUNMICAgID0+IFwlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgQ29uZmlnID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgTUVOVSBpZiAhJEl0ZW07CiAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51fS0+e1BvcHVwVHlwZX0gKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSA9ICJBc1BvcHVwIFBvcHVwVHlwZV8kTWVudXN7JE1lbnV9LT57UG9wdXBUeXBlfSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRNZW51JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IE1vdmVRdWV1ZXNTdHJnCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNb3ZlVHlwZScpID1+IC9eZm9ybSQvaSApIHsKICAgICAgICAkTW92ZVF1ZXVlc3swfSA9ICctICcgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTW92ZScpIC4gJyAtJzsKICAgICAgICAkUGFyYW17TW92ZVF1ZXVlc1N0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0Rlc3RRdWV1ZUlEJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVNb3ZlUXVldWVzLAogICAgICAgICAgICBDdXJyZW50UXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgICk7CiAgICB9CiAgICBteSAlQWNsQWN0aW9uTG9va3VwID0gcmV2ZXJzZSAlQWNsQWN0aW9uOwogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldE1vdmV9CiAgICAgICAgJiYgKCAkQWNsQWN0aW9uTG9va3Vwe0FnZW50VGlja2V0TW92ZX0gKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAnbW92ZScsCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VGlja2V0SUR9ID0gJFRpY2tldHtUaWNrZXRJRH07CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TW92ZVR5cGUnKSA9fiAvXmZvcm0kL2kgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ01vdmVMaW5rJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdNb3ZlRm9ybScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgY3JlYXRlZCBieSBpZiBkaWZmZXJlbnQgdGhlbiBVc2VyIElEIDEKICAgIGlmICggJFRpY2tldHtDcmVhdGVCeX0gPiAxICkgewogICAgICAgICRUaWNrZXR7Q3JlYXRlZEJ5VXNlcn0gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTmFtZSggVXNlcklEID0+ICRUaWNrZXR7Q3JlYXRlQnl9ICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3JlYXRlZEJ5JywKICAgICAgICAgICAgRGF0YSA9PiB7JVRpY2tldH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRUaWNrZXR7QXJjaGl2ZUZsYWd9IGVxICd5JyApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcmNoaXZlRmxhZycsCiAgICAgICAgICAgIERhdGEgPT4geyAlVGlja2V0LCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCB0eXBlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHNlcnZpY2UKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRUaWNrZXR7U2VydmljZX0gKSB7CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAojICAgICAgICAgICAgTmFtZSA9PiAnU2VydmljZScsCiMgICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJUFjbEFjdGlvbiB9LAojICAgICAgICApOwoKICAgICAgICAjIHNldCBpbmNpZGVudCBzaWduYWwKICAgICAgICBteSAlSW5jaVNpZ25hbHMgPSAoCiAgICAgICAgICAgIG9wZXJhdGlvbmFsID0+ICdncmVlbmxlZCcsCiAgICAgICAgICAgIHdhcm5pbmcgICAgID0+ICd5ZWxsb3dsZWQnLAogICAgICAgICAgICBpbmNpZGVudCAgICA9PiAncmVkbGVkJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBzZXJ2aWNlIGRhdGEKICAgICAgICBteSAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIEluY2lkZW50U3RhdGUgPT4gMSwKICAgICAgICAgICAgU2VydmljZUlEICAgICA9PiAkVGlja2V0e1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICAlU2VydmljZSwKICAgICAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkU2VydmljZXtDdXJJbmNpU3RhdGVUeXBlfSB9LAogICAgICAgICAgICAgICAgJUFjbEFjdGlvbiwKICAgICAgICAgICAgfSwKICAgICAgICApOwojIC0tLQogICAgICAgIGlmICggJFRpY2tldHtTTEF9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlVGlja2V0LCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBmaXJzdCByZXNwb25zZSB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRUaWNrZXR7Rmlyc3RSZXNwb25zZVRpbWV9ICkgewogICAgICAgICRUaWNrZXR7Rmlyc3RSZXNwb25zZVRpbWVIdW1hbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRUaWNrZXR7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRUaWNrZXR7Rmlyc3RSZXNwb25zZVRpbWV9ICkgewogICAgICAgICAgICAkVGlja2V0e0ZpcnN0UmVzcG9uc2VUaW1lQ2xhc3N9ID0gJ1dhcm5pbmcnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGaXJzdFJlc3BvbnNlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlVGlja2V0LCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdXBkYXRlIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQgJFRpY2tldHtVcGRhdGVUaW1lfSApIHsKICAgICAgICAkVGlja2V0e1VwZGF0ZVRpbWVIdW1hbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldHtVcGRhdGVUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJFRpY2tldHtVcGRhdGVUaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRUaWNrZXR7VXBkYXRlVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRUaWNrZXR7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgICAgICRUaWNrZXR7VXBkYXRlVGltZUNsYXNzfSA9ICdXYXJuaW5nJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlVGlja2V0LCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgc29sdXRpb24gdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCAkVGlja2V0e1NvbHV0aW9uVGltZX0gKSB7CiAgICAgICAgJFRpY2tldHtTb2x1dGlvblRpbWVIdW1hbn0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldHtTb2x1dGlvblRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0e1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCA2MCAqIDYwICogMSA+ICRUaWNrZXR7U29sdXRpb25UaW1lfSApIHsKICAgICAgICAgICAgJFRpY2tldHtTb2x1dGlvblRpbWVDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlVGlja2V0LCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdG90YWwgYWNjb3VudGVkIHRpbWUgaWYgZmVhdHVyZSBpcyBhY3RpdmU6CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgICRUaWNrZXR7VGlja2V0VGltZVVuaXRzfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudGVkVGltZUdldCglVGlja2V0KTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUb3RhbEFjY291bnRlZFRpbWUnLAogICAgICAgICAgICBEYXRhID0+IFwlVGlja2V0LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHBlbmRpbmcgdW50aWwsIGlmIHNldDoKICAgIGlmICggJFRpY2tldHtVbnRpbFRpbWV9ICkgewogICAgICAgIGlmICggJFRpY2tldHtVbnRpbFRpbWV9IDwgLTEgKSB7CiAgICAgICAgICAgICRUaWNrZXR7UGVuZGluZ1VudGlsQ2xhc3N9ID0gJ1dhcm5pbmcnOwogICAgICAgIH0KICAgICAgICAkVGlja2V0e1VudGlsVGltZUh1bWFufSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyVGltZVN0YW1wKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICggJFRpY2tldHtVbnRpbFRpbWV9ICsgJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpICksCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0e1BlbmRpbmdVbnRpbH0gLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSgKICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldHtVbnRpbFRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1BlbmRpbmdVbnRpbCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgb3duZXIKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgIERhdGEgPT4geyAlVGlja2V0LCAlT3duZXJJbmZvLCAlQWNsQWN0aW9uIH0sCiAgICApOwoKICAgICMgc2hvdyByZXNwb25zaWJsZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpSZXNwb25zaWJsZScpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVSZXNwb25zaWJsZUluZm8sICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBubyBhcnRpY2xlcyBibG9jayBpZiB0aWNrZXQgZG9lcyBub3QgY29udGFpbiBhcnRpY2xlcwogICAgaWYgKCAhQEFydGljbGVCb3ggJiYgISRTZWxmLT57Wm9vbVRpbWVsaW5lfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIaW50Tm9BcnRpY2xlcycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgcHJvY2VzcyB3aWRnZXQgIGFuZCBhY3Rpdml0eSBkaWFsb2dzIG9uIHByb2Nlc3MgdGlja2V0cwogICAgaWYgKCRJc1Byb2Nlc3NUaWNrZXQpIHsKCiAgICAgICAgIyBnZXQgdGhlIERGIHdoZXJlIHRoZSBQcm9jZXNzRW50aXR5SUQgaXMgc3RvcmVkCiAgICAgICAgbXkgJFByb2Nlc3NFbnRpdHlJREZpZWxkID0gJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlByb2Nlc3M6OkR5bmFtaWNGaWVsZFByb2Nlc3NNYW5hZ2VtZW50UHJvY2Vzc0lEIik7CgogICAgICAgICMgZ2V0IHRoZSBERiB3aGVyZSB0aGUgQXRpdml0eUVudGl0eUlEIGlzIHN0b3JlZAogICAgICAgIG15ICRBY3Rpdml0eUVudGl0eUlERmllbGQgPSAnRHluYW1pY0ZpZWxkXycKICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiUHJvY2Vzczo6RHluYW1pY0ZpZWxkUHJvY2Vzc01hbmFnZW1lbnRBY3Rpdml0eUlEIik7CgogICAgICAgIG15ICRQcm9jZXNzRGF0YSA9ICRTZWxmLT57UHJvY2Vzc09iamVjdH0tPlByb2Nlc3NHZXQoCiAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCA9PiAkVGlja2V0eyRQcm9jZXNzRW50aXR5SURGaWVsZH0sCiAgICAgICAgKTsKICAgICAgICBteSAkQWN0aXZpdHlEYXRhID0gJFNlbGYtPntBY3Rpdml0eU9iamVjdH0tPkFjdGl2aXR5R2V0KAogICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgID0+ICdBZ2VudEludGVyZmFjZScsCiAgICAgICAgICAgIEFjdGl2aXR5RW50aXR5SUQgPT4gJFRpY2tldHskQWN0aXZpdHlFbnRpdHlJREZpZWxkfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBwcm9jZXNzIGluZm9ybWF0aW9uIGluIHRoZSBzaWRlYmFyCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFByb2Nlc3MgID0+ICRQcm9jZXNzRGF0YS0+e05hbWV9ICB8fCAnJywKICAgICAgICAgICAgICAgIEFjdGl2aXR5ID0+ICRBY3Rpdml0eURhdGEtPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCB0aGUgcHJvY2VzcyB3aWRnZXQgdGhlIHRoZSBtYWluIHNjcmVlbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFdpZGdldFRpdGxlID0+ICRQYXJhbXtXaWRnZXRUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgbmV4dCBhY3Rpdml0eSBkaWFsb2dzCiAgICAgICAgbXkgJE5leHRBY3Rpdml0eURpYWxvZ3M7CiAgICAgICAgaWYgKCAkVGlja2V0eyRBY3Rpdml0eUVudGl0eUlERmllbGR9ICkgewogICAgICAgICAgICAkTmV4dEFjdGl2aXR5RGlhbG9ncyA9ICR7QWN0aXZpdHlEYXRhfS0+e0FjdGl2aXR5RGlhbG9nfSAvLyB7fTsKICAgICAgICB9CiAgICAgICAgbXkgJEFjdGl2aXR5TmFtZSA9ICRBY3Rpdml0eURhdGEtPntOYW1lfTsKCiAgICAgICAgaWYgKCROZXh0QWN0aXZpdHlEaWFsb2dzKSB7CgogICAgICAgICAgICAjIHdlIGhhdmUgdG8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgdGhlIG5lZWRlZCBwZXJtaXNzaW9ucyB0byB2aWV3IHRoZQogICAgICAgICAgICAjIGRpZmZlcmVudCBhY3Rpdml0eSBkaWFsb2dzLCBzbyB3ZSBsb29wIG92ZXIgZXZlcnkgYWN0aXZpdHkgZGlhbG9nIGFuZCBjaGVjayBpZiB0aGVyZQogICAgICAgICAgICAjIGlzIGEgcGVybWlzc2lvbiBjb25maWd1cmVkLiBJZiB0aGVyZSBpcyBhIHBlcm1pc3Npb24gY29uZmlndXJlZCB3ZSBjaGVjayB0aGlzCiAgICAgICAgICAgICMgYW5kIGRpc3BsYXkvaGlkZSB0aGUgYWN0aXZpdHkgZGlhbG9nIGxpbmsKICAgICAgICAgICAgbXkgJVBlcm1pc3Npb25SaWdodHM7CiAgICAgICAgICAgIG15ICVQZXJtaXNzaW9uQWN0aXZpdHlEaWFsb2dMaXN0OwogICAgICAgICAgICBBQ1RJVklUWURJQUxPR1BFUk1JU1NJT046CiAgICAgICAgICAgIGZvciBteSAkSW5kZXggKCBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyROZXh0QWN0aXZpdHlEaWFsb2dzfSApIHsKICAgICAgICAgICAgICAgIG15ICRDdXJyZW50QWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JEluZGV4fTsKICAgICAgICAgICAgICAgIG15ICRDdXJyZW50QWN0aXZpdHlEaWFsb2cgICAgICAgICA9ICRTZWxmLT57QWN0aXZpdHlEaWFsb2dPYmplY3R9LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgICAgICAgID0+ICdBZ2VudEludGVyZmFjZScsCiAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkQ3VycmVudEFjdGl2aXR5RGlhbG9nRW50aXR5SUQKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgYW4gaW50ZXJmYWNlIGxvb2t1cC1saXN0CiAgICAgICAgICAgICAgICBteSAlSW50ZXJmYWNlTG9va3VwID0gbWFwIHsgJF8gPT4gMSB9IEB7ICRDdXJyZW50QWN0aXZpdHlEaWFsb2ctPntJbnRlcmZhY2V9IH07CgogICAgICAgICAgICAgICAgbmV4dCBBQ1RJVklUWURJQUxPR1BFUk1JU1NJT04gaWYgISRJbnRlcmZhY2VMb29rdXB7QWdlbnRJbnRlcmZhY2V9OwoKICAgICAgICAgICAgICAgIGlmICggJEN1cnJlbnRBY3Rpdml0eURpYWxvZy0+e1Blcm1pc3Npb259ICkgewoKICAgICAgICAgICAgICAgICAgICAjIHBlcmZvcm1hbmNlLWJvb3N0L2NhY2hlCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGVybWlzc2lvblJpZ2h0c3sgJEN1cnJlbnRBY3Rpdml0eURpYWxvZy0+e1Blcm1pc3Npb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQZXJtaXNzaW9uUmlnaHRzeyAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57UGVybWlzc2lvbn0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkUGVybWlzc2lvblJpZ2h0c3sgJEN1cnJlbnRBY3Rpdml0eURpYWxvZy0+e1Blcm1pc3Npb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQUNUSVZJVFlESUFMT0dQRVJNSVNTSU9OOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUGVybWlzc2lvbkFjdGl2aXR5RGlhbG9nTGlzdHskSW5kZXh9ID0gJEN1cnJlbnRBY3Rpdml0eURpYWxvZ0VudGl0eUlEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlZHVjZSBuZXh0IGFjdGl2aXR5IGRpYWxvZ3MgdG8gdGhlIG9uZXMgdGhhdCBoYXZlIHBlcm1pc3Npb25zCiAgICAgICAgICAgICROZXh0QWN0aXZpdHlEaWFsb2dzID0gXCVQZXJtaXNzaW9uQWN0aXZpdHlEaWFsb2dMaXN0OwoKICAgICAgICAgICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgICAgICAgICBteSAkQUNMID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlUGVybWlzc2lvbkFjdGl2aXR5RGlhbG9nTGlzdCwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpdml0eURpYWxvZycsCiAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICV7JE5leHRBY3Rpdml0eURpYWxvZ3N9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xEYXRhKCkKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05leHRBY3Rpdml0eURpYWxvZ3MnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJ0FjdGl2aXR5TmFtZScgPT4gJEFjdGl2aXR5TmFtZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCROZXh0QWN0aXZpdHlEaWFsb2dzKSApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkTmV4dEFjdGl2aXR5RGlhbG9nS2V5ICggc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJXskTmV4dEFjdGl2aXR5RGlhbG9nc30gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFjdGl2aXR5RGlhbG9nRGF0YSA9ICRTZWxmLT57QWN0aXZpdHlEaWFsb2dPYmplY3R9LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlICAgICAgICAgICAgICA9PiAnQWdlbnRJbnRlcmZhY2UnLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JE5leHRBY3Rpdml0eURpYWxvZ0tleX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpdml0eURpYWxvZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JE5leHRBY3Rpdml0eURpYWxvZ0tleX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJEFjdGl2aXR5RGlhbG9nRGF0YS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRUaWNrZXR7JFByb2Nlc3NFbnRpdHlJREZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdOb0FjdGl2aXR5RGlhbG9ncycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWydUaWNrZXQnXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZEZpbHRlcn0gfHwge30sCiAgICApOwojIC0tLQojIElUU00KIyAtLS0KICAgIG15IEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkczsKCiAgICAjIGxvb2t1cCBoYXNoIGZvciBhbGwgSVRTTSBkeW5hbWljIGZpZWxkcwogICAgbXkgJUlUU01EeW5hbWljRmllbGRzID0gKAogICAgICAgIElUU01Dcml0aWNhbGl0eSAgICAgICA9PiAxLAogICAgICAgIElUU01JbXBhY3QgICAgICAgICAgICA9PiAxLAogICAgICAgIElUU01SZXZpZXdSZXF1aXJlZCAgICA9PiAxLAogICAgICAgIElUU01EZWNpc2lvblJlc3VsdCAgICA9PiAxLAogICAgICAgIElUU01SZXBhaXJTdGFydFRpbWUgICA9PiAxLAogICAgICAgIElUU01SZWNvdmVyeVN0YXJ0VGltZSA9PiAxLAogICAgICAgIElUU01EZWNpc2lvbkRhdGUgICAgICA9PiAxLAogICAgICAgIElUU01EdWVEYXRlICAgICAgICAgICA9PiAxLAogICAgKTsKIyAtLS0KCiAgICAjIHRvIHN0b3JlIGR5bmFtaWMgZmllbGRzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgcHJvY2VzcyB3aWRnZXQgYW5kIGluIHRoZSBzaWRlYmFyCiAgICBteSAoIEBGaWVsZHNXaWRnZXQsIEBGaWVsZHNTaWRlYmFyICk7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhZGVmaW5lZCAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSBlcSAnJzsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5kaXZpZHVhbGx5CiAgICAgICAgaWYgKCAkSVRTTUR5bmFtaWNGaWVsZHN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICBwdXNoIEBJbmRpdmlkdWFsRHluYW1pY0ZpZWxkcywgJER5bmFtaWNGaWVsZENvbmZpZzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgfQojIC0tLQoKICAgICAgICAjIHVzZSB0cmFuc2xhdGlvbiBoZXJlIHRvIGJlIGFibGUgdG8gcmVkdWNlIHRoZSBjaGFyYWN0ZXIgbGVuZ3RoIGluIHRoZSB0ZW1wbGF0ZQogICAgICAgIG15ICRMYWJlbCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJElzUHJvY2Vzc1RpY2tldCAmJgogICAgICAgICAgICAkU2VsZi0+e0Rpc3BsYXlTZXR0aW5nc30tPntQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkfS0+eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkVmFsdWVTdHJnID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAoKICAgICAgICAgICAgICAgICMgbm8gVmFsdWVNYXhDaGFycyBoZXJlLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBGaWVsZHNXaWRnZXQsIHsKICAgICAgICAgICAgICAgIE5hbWUgID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgVmFsdWVLZXkKICAgICAgICAgICAgICAgICAgICA9PiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIExhYmVsICAgICAgICAgICAgICAgICAgICAgICA9PiAkTGFiZWwsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmt9LAogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBteSAkVmFsdWVTdHJnID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT4KICAgICAgICAgICAgICAgIEdldCgnVGlja2V0OjpGcm9udGVuZDo6RHluYW1pY0ZpZWxkc1pvb21NYXhTaXplU2lkZWJhcicpCiAgICAgICAgICAgICAgICB8fCAxOCwgICAgIyBsaW1pdCBmb3Igc2lkZWJhciBkaXNwbGF5CiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0Rpc3BsYXlTZXR0aW5nc30tPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHB1c2ggQEZpZWxkc1NpZGViYXIsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgTGFiZWwgICAgICAgICAgICAgICAgICAgICAgID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19QbGFpbicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoJElzUHJvY2Vzc1RpY2tldCkgewoKICAgICAgICAjIG91dHB1dCBkeW5hbWljIGZpZWxkcyByZWdpc3RlcmVkIGZvciBhIGdyb3VwIGluIHRoZSBwcm9jZXNzIHdpZGdldAogICAgICAgIG15IEBGaWVsZHNJbkFHcm91cDsKICAgICAgICBmb3IgbXkgJEdyb3VwTmFtZSAoCiAgICAgICAgICAgIHNvcnQga2V5cyAleyAkU2VsZi0+e0Rpc3BsYXlTZXR0aW5nc30tPntQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkR3JvdXBzfSB9CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZEdyb3VwcycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkR3JvdXBGaWVsZHNTdHJpbmcgPSAkU2VsZi0+e0Rpc3BsYXlTZXR0aW5nc30tPntQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkR3JvdXBzfS0+eyRHcm91cE5hbWV9OwoKICAgICAgICAgICAgJEdyb3VwRmllbGRzU3RyaW5nID1+IHN7XHN9e314bXNnOwogICAgICAgICAgICBteSBAR3JvdXBGaWVsZHMgPSBzcGxpdCggJywnLCAkR3JvdXBGaWVsZHNTdHJpbmcgKTsKCiAgICAgICAgICAgIGlmICggJCNHcm91cEZpZWxkcyArIDEgKSB7CgogICAgICAgICAgICAgICAgbXkgJFNob3dHcm91cFRpdGxlID0gMDsKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKEBGaWVsZHNXaWRnZXQpIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCBncmVwIHsgJF8gZXEgJEZpZWxkLT57TmFtZX0gfSBAR3JvdXBGaWVsZHMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAkU2hvd0dyb3VwVGl0bGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRmllbGQtPntMYWJlbH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJEZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRWYWx1ZU92ZXJsYXlUcmlnZ2VyJywKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEZpZWxkLT57TGlua30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWxpYXMgZm9yIHRpY2tldCB0aXRsZSwgVGl0bGUgd2lsbCBiZSBvdmVyd3JpdHRlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaXRsZSAgICA9PiAkVGlja2V0e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gJEZpZWxkLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICA9PiAkRmllbGQtPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgID0+ICRGaWVsZC0+e0xpbmt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRmllbGQtPntOYW1lfSA9PiAkRmllbGQtPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRQbGFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRGaWVsZC0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEZpZWxkc0luQUdyb3VwLCAkRmllbGQtPntOYW1lfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRTaG93R3JvdXBUaXRsZSkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRHcm91cFNlcGFyYXRvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkR3JvdXBOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGR5bmFtaWMgZmllbGRzIG5vdCByZWdpc3RlcmVkIGluIGEgZ3JvdXAgaW4gdGhlIHByb2Nlc3Mgd2lkZ2V0CiAgICAgICAgbXkgQFJlbWFpbmluZ0ZpZWxkc1dpZGdldDsKICAgICAgICBmb3IgbXkgJEZpZWxkIChARmllbGRzV2lkZ2V0KSB7CgogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gZXEgJEZpZWxkLT57TmFtZX0gfSBARmllbGRzSW5BR3JvdXAgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBSZW1haW5pbmdGaWVsZHNXaWRnZXQsICRGaWVsZDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZEdyb3VwcycsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkI1JlbWFpbmluZ0ZpZWxkc1dpZGdldCArIDEgKSB7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZEdyb3VwU2VwYXJhdG9yJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0ZpZWxkcyB3aXRoIG5vIGdyb3VwJyksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJEZpZWxkIChAUmVtYWluaW5nRmllbGRzV2lkZ2V0KSB7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRmllbGQtPntMYWJlbH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJEZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRWYWx1ZU92ZXJsYXlUcmlnZ2VyJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJEZpZWxkLT57TGlua30gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRMaW5rJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWxpYXMgZm9yIHRpY2tldCB0aXRsZSwgVGl0bGUgd2lsbCBiZSBvdmVyd3JpdHRlbgogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaXRsZSAgICA9PiAkVGlja2V0e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gJEZpZWxkLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICA9PiAkRmllbGQtPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgID0+ICRGaWVsZC0+e0xpbmt9LAogICAgICAgICAgICAgICAgICAgICAgICAkRmllbGQtPntOYW1lfSA9PiAkRmllbGQtPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Byb2Nlc3NXaWRnZXREeW5hbWljRmllbGRQbGFpbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRGaWVsZC0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJEZpZWxkLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgY3ljbGUgdHJvdWdoIGR5bmFtaWMgZmllbGRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbmRpdmlkdWFsbHkKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQEluZGl2aWR1YWxEeW5hbWljRmllbGRzICkgewoKICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgIFZhbHVlTWF4Q2hhcnMgICAgICA9PiAyNSwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fSwKICAgICAgICApOwoKICAgICAgICBteSAkTGFiZWwgPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRWYWx1ZVN0cmctPntMaW5rfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19MaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19QbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KIyAtLS0KCiAgICAjIG91dHB1dCBkeW5hbWljIGZpZWxkcyBpbiB0aGUgc2lkZWJhcgogICAgZm9yIG15ICRGaWVsZCAoQEZpZWxkc1NpZGViYXIpIHsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRmllbGQtPntMYWJlbH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkRmllbGQtPntMaW5rfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwKCiAgICAgICAgICAgICAgICAgICAgIyBhbGlhcyBmb3IgdGlja2V0IHRpdGxlLCBUaXRsZSB3aWxsIGJlIG92ZXJ3cml0dGVuCiAgICAgICAgICAgICAgICAgICAgVGlja2V0VGl0bGUgICAgPT4gJFRpY2tldHtUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgPT4gJEZpZWxkLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgID0+ICRGaWVsZC0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICA9PiAkRmllbGQtPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAkRmllbGQtPntOYW1lfSA9PiAkRmllbGQtPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZFBsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRGaWVsZC0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkRmllbGQtPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGN1c3RvbWVyIGluZm8gc3RyaW5nCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9ab29tJykgKSB7CgogICAgICAgICMgY3VzdG9tZXIgaW5mbwogICAgICAgIG15ICVDdXN0b21lckRhdGE7CiAgICAgICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtDdXN0b21lclRhYmxlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRDdXN0b21lclZpZXdUYWJsZSgKICAgICAgICAgICAgRGF0YSAgID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICBUaWNrZXQgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIE1heCAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvWm9vbU1heFNpemUnKSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyVGFibGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsaW5rZWQgb2JqZWN0cwogICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCAgICAgICAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5ICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBTdGF0ZSAgICAgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgT2JqZWN0UGFyYW1ldGVycyA9PiB7CiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICBJZ25vcmVMaW5rZWRUaWNrZXRTdGF0ZVR5cGVzID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgbGluayB0YWJsZSB2aWV3IG1vZGUKICAgIG15ICRMaW5rVGFibGVWaWV3TW9kZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMaW5rT2JqZWN0OjpWaWV3TW9kZScpOwoKICAgICMgY3JlYXRlIHRoZSBsaW5rIHRhYmxlCiAgICBteSAkTGlua1RhYmxlU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TGlua09iamVjdFRhYmxlQ3JlYXRlKAogICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgVmlld01vZGUgICAgICAgICA9PiAkTGlua1RhYmxlVmlld01vZGUsCiAgICApOwoKICAgICMgb3V0cHV0IHRoZSBzaW1wbGUgbGluayB0YWJsZQogICAgaWYgKCAkTGlua1RhYmxlU3RyZyAmJiAkTGlua1RhYmxlVmlld01vZGUgZXEgJ1NpbXBsZScgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTGlua1RhYmxlU2ltcGxlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMaW5rVGFibGVTdHJnID0+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgdGhlIGNvbXBsZXggbGluayB0YWJsZQogICAgaWYgKCAkTGlua1RhYmxlU3RyZyAmJiAkTGlua1RhYmxlVmlld01vZGUgZXEgJ0NvbXBsZXgnICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUYWJsZUNvbXBsZXgnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExpbmtUYWJsZVN0cmcgPT4gJExpbmtUYWJsZVN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFydGljbGUgZmlsdGVyIGlzIGFjdGl2YXRlZCBpbiBzeXNjb25maWcKICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyQWN0aXZlfSApIHsKCiAgICAgICAgaWYgKCAkU2VsZi0+e1pvb21UaW1lbGluZX0gKSB7CgogICAgICAgICAgICAjIGJ1aWxkIGV2ZW50IHR5cGUgbGlzdCBmb3IgZmlsdGVyIGRpYWxvZwogICAgICAgICAgICAkUGFyYW17RXZlbnRUeXBlRmlsdGVyU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkU2VsZi0+e0hpc3RvcnlUeXBlTWFwcGluZ30sCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkU2VsZi0+e0V2ZW50VHlwZUZpbHRlcn0tPntFdmVudFR5cGVJRH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRXZlbnRUeXBlRmlsdGVyJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFdmVudFR5cGVGaWx0ZXJEaWFsb2cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBhcnRpY2xlIHR5cGVzCiAgICAgICAgICAgIG15ICVBcnRpY2xlVHlwZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVUeXBlTGlzdCgKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIGFydGljbGUgdHlwZSBsaXN0IGZvciBmaWx0ZXIgZGlhbG9nCiAgICAgICAgICAgICRQYXJhbXtBcnRpY2xlVHlwZUZpbHRlclN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVBcnRpY2xlVHlwZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57QXJ0aWNsZVR5cGVJRH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnQXJ0aWNsZVR5cGVGaWx0ZXInLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgc2VuZGVyIHR5cGVzCiAgICAgICAgICAgIG15ICVBcnRpY2xlU2VuZGVyVHlwZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVTZW5kZXJUeXBlTGlzdCgKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIGFydGljbGUgc2VuZGVyIHR5cGUgbGlzdCBmb3IgZmlsdGVyIGRpYWxvZwogICAgICAgICAgICAkUGFyYW17QXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXJTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlQXJ0aWNsZVNlbmRlclR5cGVzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e0FydGljbGVTZW5kZXJUeXBlSUR9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0FydGljbGVTZW5kZXJUeXBlRmlsdGVyJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVGlja2V0IElECiAgICAgICAgICAgICRQYXJhbXtUaWNrZXRJRH0gPSAkU2VsZi0+e1RpY2tldElEfTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRmlsdGVyRGlhbG9nJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgIH0KCiAgICAjIGNoZWNrIGlmIHRpY2tldCBuZWVkIHRvIGJlIG1hcmtlZCBhcyBzZWVuCiAgICBteSAkQXJ0aWNsZUFsbFNlZW4gPSAxOwogICAgQVJUSUNMRToKICAgIGZvciBteSAkQXJ0aWNsZSAoQEFydGljbGVCb3gpIHsKCiAgICAgICAgIyBpZ25vcmUgc3lzdGVtIHNlbmRlciB0eXBlCiAgICAgICAgbmV4dCBBUlRJQ0xFCiAgICAgICAgICAgIGlmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Ok5ld0FydGljbGVJZ25vcmVTeXN0ZW1TZW5kZXInKQogICAgICAgICAgICAmJiAkQXJ0aWNsZS0+e1NlbmRlclR5cGV9IGVxICdzeXN0ZW0nOwoKICAgICAgICAjIGxhc3QgQVJUSUNMRSBpZiBhcnRpY2xlIHdhcyBub3Qgc2hvd24KICAgICAgICBpZiAoICEkQXJ0aWNsZUZsYWdzeyAkQXJ0aWNsZS0+e0FydGljbGVJRH0gfS0+e1NlZW59ICkgewogICAgICAgICAgICAkQXJ0aWNsZUFsbFNlZW4gPSAwOwogICAgICAgICAgICBsYXN0IEFSVElDTEU7CiAgICAgICAgfQogICAgfQoKICAgICMgbWFyayB0aWNrZXQgYXMgc2VlbiBpZiBhbGwgYXJ0aWNsZSBhcmUgc2hvd24KICAgIGlmICgkQXJ0aWNsZUFsbFNlZW4pIHsKICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZsYWdTZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBLZXkgICAgICA9PiAnU2VlbicsCiAgICAgICAgICAgIFZhbHVlICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgaW5pdCBqcwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdUaWNrZXRab29tSW5pdCcsCiAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICk7CgogICAgIyByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgIERhdGEgICAgICAgICA9PiB7ICVQYXJhbSwgJVRpY2tldCwgJUFjbEFjdGlvbiB9LAogICAgKTsKfQoKc3ViIF9BcnRpY2xlVHJlZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVUaWNrZXQgICAgICAgICAgPSAleyAkUGFyYW17VGlja2V0fSB9OwogICAgbXkgJUFydGljbGVGbGFncyAgICA9ICV7ICRQYXJhbXtBcnRpY2xlRmxhZ3N9IH07CiAgICBteSBAQXJ0aWNsZUJveCAgICAgID0gQHsgJFBhcmFte0FydGljbGVCb3h9IH07CiAgICBteSAkQXJ0aWNsZU1heExpbWl0ID0gJFBhcmFte0FydGljbGVNYXhMaW1pdH07CiAgICBteSAkQXJ0aWNsZUlEICAgICAgID0gJFBhcmFte0FydGljbGVJRH07CiAgICBteSAkVGFibGVDbGFzc2VzOwoKICAgICMgYnVpbGQgdGhyZWFkIHN0cmluZwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdUcmVlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBUYWJsZUNsYXNzZXMgPT4gJFRhYmxlQ2xhc3NlcywKICAgICAgICAgICAgWm9vbVRpbWVsaW5lID0+ICRTZWxmLT57Wm9vbVRpbWVsaW5lfSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRQYXJhbXtQYWdpbmF0aW9ufSAmJiAhJFNlbGYtPntab29tVGltZWxpbmV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVQYWdlcycsCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte1BhZ2luYXRpb259LAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiBleHBhbmQvY29sbGFwc2UgdmlldyBpcyB1c2FibGUgKG5vdCBhdmFpbGFibGUgZm9yIHRvbyBtYW55CiAgICAjIGFydGljbGVzKQogICAgaWYgKCAkU2VsZi0+e1pvb21FeHBhbmR9ICYmICQjQXJ0aWNsZUJveCA8ICRBcnRpY2xlTWF4TGltaXQgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ29sbGFwc2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgWm9vbUV4cGFuZCAgICAgPT4gJFNlbGYtPntab29tRXhwYW5kfSwKICAgICAgICAgICAgICAgIFpvb21FeHBhbmRTb3J0ID0+ICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9LAogICAgICAgICAgICAgICAgUGFnZSAgICAgICAgICAgPT4gJFBhcmFte1BhZ2V9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57Wm9vbVRpbWVsaW5lfSApIHsKCiAgICAgICAgIyBzaG93IHRyaWdnZXIgZm9yIGNocm9uaWNhbCB2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ2hyb25pY2FsJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFpvb21FeHBhbmQgICAgID0+ICRTZWxmLT57Wm9vbUV4cGFuZH0sCiAgICAgICAgICAgICAgICBab29tRXhwYW5kU29ydCA9PiAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSwKICAgICAgICAgICAgICAgIFBhZ2UgICAgICAgICAgID0+ICRQYXJhbXtQYWdlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkI0FydGljbGVCb3ggPCAkQXJ0aWNsZU1heExpbWl0ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0V4cGFuZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgIEFydGljbGVJRCAgICAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBab29tRXhwYW5kICAgICA9PiAkU2VsZi0+e1pvb21FeHBhbmR9LAogICAgICAgICAgICAgICAgWm9vbUV4cGFuZFNvcnQgPT4gJFNlbGYtPntab29tRXhwYW5kU29ydH0sCiAgICAgICAgICAgICAgICBQYWdlICAgICAgICAgICA9PiAkUGFyYW17UGFnZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFydGljbGUgZmlsdGVyIGlzIGFjdGl2YXRlZCBpbiBzeXNjb25maWcKICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyQWN0aXZlfSApIHsKCiAgICAgICAgIyBkZWZpbmUgaGlnaGxpZ2h0IHN0eWxlIGZvciBsaW5rcyBpZiBmaWx0ZXIgaXMgYWN0aXZlCiAgICAgICAgbXkgJEhpZ2hsaWdodFN0eWxlID0gJ21lbnUnOwogICAgICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyfSApIHsKICAgICAgICAgICAgJEhpZ2hsaWdodFN0eWxlID0gJ1ByaW9yaXR5SUQtNSc7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIGFydGljbGUgZmlsdGVyIGxpbmtzCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZpbHRlckRpYWxvZ0xpbmsnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEhpZ2hsaWdodFN0eWxlID0+ICRIaWdobGlnaHRTdHlsZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIGFydGljbGUgZmlsdGVyIHJlc2V0IGxpbmsgb25seSBpZiBmaWx0ZXIgaXMgc2V0CiAgICAgICAgaWYgKAogICAgICAgICAgICAoICEkU2VsZi0+e1pvb21UaW1lbGluZX0gJiYgJFNlbGYtPntBcnRpY2xlRmlsdGVyfSApCiAgICAgICAgICAgIHx8ICggJFNlbGYtPntab29tVGltZWxpbmV9ICYmICRTZWxmLT57RXZlbnRUeXBlRmlsdGVyfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRmlsdGVyUmVzZXRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBhcnRpY2xlIHRyZWUKICAgIGlmICggISRTZWxmLT57Wm9vbVRpbWVsaW5lfSApIHsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUxpc3QnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRhYmxlQ2xhc3NlcyA9PiAkVGFibGVDbGFzc2VzLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIEFSVElDTEU6CiAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICBteSAlQXJ0aWNsZSA9ICUkQXJ0aWNsZVRtcDsKCiAgICAgICAgICAgICMgYXJ0aWNsZSBmaWx0ZXIgaXMgYWN0aXZhdGVkIGluIHN5c2NvbmZpZyBhbmQgdGhlcmUgYXJlIGFydGljbGVzCiAgICAgICAgICAgICMgdGhhdCBwYXNzZWQgdGhlIGZpbHRlcgogICAgICAgICAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0gJiYgJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e1Nob3duQXJ0aWNsZUlEc30gKSB7CgogICAgICAgICAgICAgICAgICAgICMgZG8gbm90IHNob3cgYXJ0aWNsZSBpbiB0cmVlIGlmIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBmaWx0ZXIKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57U2hvd25BcnRpY2xlSURzfS0+eyAkQXJ0aWNsZXtBcnRpY2xlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyBhcnRpY2xlIGZsYWdzCiAgICAgICAgICAgIG15ICRDbGFzcyAgICAgID0gJyc7CiAgICAgICAgICAgIG15ICRDbGFzc1JvdyAgID0gJyc7CiAgICAgICAgICAgIG15ICROZXdBcnRpY2xlID0gMDsKCiAgICAgICAgICAgICMgaWdub3JlIHN5c3RlbSBzZW5kZXIgdHlwZXMKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRBcnRpY2xlRmxhZ3N7ICRBcnRpY2xle0FydGljbGVJRH0gfS0+e1NlZW59CiAgICAgICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICAgICAgISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Ok5ld0FydGljbGVJZ25vcmVTeXN0ZW1TZW5kZXInKQogICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Ok5ld0FydGljbGVJZ25vcmVTeXN0ZW1TZW5kZXInKQogICAgICAgICAgICAgICAgICAgICYmICRBcnRpY2xle1NlbmRlclR5cGV9IG5lICdzeXN0ZW0nCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICROZXdBcnRpY2xlID0gMTsKCiAgICAgICAgICAgICAgICAjIHNob3cgdGlja2V0IGZsYWdzCgogICAgICAgICAgICAgICAgIyBhbHdheXMgc2hvdyBhcmNoaXZlZCB0aWNrZXRzIGFzIHNlZW4KICAgICAgICAgICAgICAgIGlmICggJFRpY2tldHtBcmNoaXZlRmxhZ30gbmUgJ3knICkgewogICAgICAgICAgICAgICAgICAgICRDbGFzcyAgICAuPSAnIFVucmVhZEFydGljbGVzJzsKICAgICAgICAgICAgICAgICAgICAkQ2xhc3NSb3cgLj0gJyBVbnJlYWRBcnRpY2xlcyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBqdXN0IHNob3cgdGlja2V0IGZsYWdzIGlmIGFnZW50IGJlbG9uZ3MgdG8gdGhlIHRpY2tldAogICAgICAgICAgICAgICAgbXkgJFNob3dNZXRhOwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VXNlcklEfSA9PSAkQXJ0aWNsZXtPd25lcklEfQogICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57VXNlcklEfSA9PSAkQXJ0aWNsZXtSZXNwb25zaWJsZUlEfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkU2hvd01ldGEgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAhJFNob3dNZXRhICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OldhdGNoZXInKSApIHsKICAgICAgICAgICAgICAgICAgICBteSAlV2F0Y2ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFdhdGNoR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRXYXRjaHsgJFNlbGYtPntVc2VySUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTaG93TWV0YSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2hvdyB0aWNrZXQgZmxhZ3MKICAgICAgICAgICAgICAgIGlmICgkU2hvd01ldGEpIHsKICAgICAgICAgICAgICAgICAgICAkQ2xhc3MgLj0gJyBSZW1hcmthYmxlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRDbGFzcyAuPSAnIE9yZGluYXJ5JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiB0aGlzIGlzIHRoZSBzaG93biBhcnRpY2xlIC09PiBzZXQgY2xhc3MgdG8gYWN0aXZlCiAgICAgICAgICAgIGlmICggJEFydGljbGVJRCBlcSAkQXJ0aWNsZXtBcnRpY2xlSUR9ICYmICEkU2VsZi0+e1pvb21FeHBhbmR9ICkgewogICAgICAgICAgICAgICAgJENsYXNzUm93IC49ICcgQWN0aXZlJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJFRtcFN1YmplY3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRBcnRpY2xle1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBuZWVkIHRvIHNob3cgYWxzbyBleHBhbmQvY29sbGFwc2UgaWNvbgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJENsYXNzLAogICAgICAgICAgICAgICAgICAgIENsYXNzUm93ICAgICAgID0+ICRDbGFzc1JvdywKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICA9PiAkVG1wU3ViamVjdCwKICAgICAgICAgICAgICAgICAgICBab29tRXhwYW5kICAgICA9PiAkU2VsZi0+e1pvb21FeHBhbmR9LAogICAgICAgICAgICAgICAgICAgIFpvb21FeHBhbmRTb3J0ID0+ICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGFydGljbGUgZmxhZ3MKICAgICAgICAgICAgIyBBbHdheXMgdXNlIHVzZXIgaWQgMSBiZWNhdXNlIG90aGVyIHVzZXJzIGFsc28gaGF2ZSB0byBzZWUgdGhlIGltcG9ydGFudCBmbGFnCiAgICAgICAgICAgIG15ICVBcnRpY2xlSW1wb3J0YW50RmxhZ3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGbGFnR2V0KAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBpbXBvcnRhbnQgZmxhZwogICAgICAgICAgICBpZiAoICRBcnRpY2xlSW1wb3J0YW50RmxhZ3N7SW1wb3J0YW50fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1JbXBvcnRhbnRBcnRpY2xlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhbHdheXMgc2hvdyBhcmNoaXZlZCB0aWNrZXRzIGFzIHNlZW4KICAgICAgICAgICAgaWYgKCAkTmV3QXJ0aWNsZSAmJiAkVGlja2V0e0FyY2hpdmVGbGFnfSBuZSAneScgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtTmV3QXJ0aWNsZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQnVnZml4IGZvciBJRTc6IGEgdGFibGUgY2VsbCBzaG91bGQgbm90IGJlIGVtcHR5CiAgICAgICAgICAgICMgKGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBjZWxsIGJvcmRlcnMgYXJlIG5vdCBzaG93bik6CiAgICAgICAgICAgICMgd2UgYWRkIGFuIGVtcHR5IGVsZW1lbnQgaGVyZQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1Ob05ld0FydGljbGUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIERldGVybWluZSBjb21tdW5pY2F0aW9uIGRpcmVjdGlvbgogICAgICAgICAgICBpZiAoICRBcnRpY2xle0FydGljbGVUeXBlfSA9fiAvLWludGVybmFsJC9zbXggKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdUcmVlSXRlbURpcmVjdGlvbkludGVybmFsJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtTZW5kZXJUeXBlfSBlcSAnY3VzdG9tZXInICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1RyZWVJdGVtRGlyZWN0aW9uSW5jb21pbmcnICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdUcmVlSXRlbURpcmVjdGlvbk91dGdvaW5nJyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYXR0YWNobWVudCBpbmZvCiAgICAgICAgICAgICMgQnVnZml4IGZvciBJRTc6IGEgdGFibGUgY2VsbCBzaG91bGQgbm90IGJlIGVtcHR5CiAgICAgICAgICAgICMgKGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBjZWxsIGJvcmRlcnMgYXJlIG5vdCBzaG93bik6CiAgICAgICAgICAgICMgd2UgYWRkIGFuIGVtcHR5IGVsZW1lbnQgaGVyZQogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZXtBdG1zfSB8fCAhJXsgJEFydGljbGV7QXRtc30gfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1Ob0F0dGFjaG1lbnQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICBteSAkQXR0YWNobWVudHMgPSAkU2VsZi0+X0NvbGxlY3RBcnRpY2xlQXR0YWNobWVudHMoCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1BdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gJEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgdGltZWxpbmUgdmlldwogICAgZWxzZSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBoaXN0b3J5CiAgICAgICAgbXkgQEhpc3RvcnlMaW5lcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SGlzdG9yeUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhcnRpY2xlcyBmb3IgbGF0ZXIgdXNlCiAgICAgICAgbXkgQENocm9uaWNhbEFydGljbGVCb3ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFN0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50ID0+IDIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEFydGljbGVzQnlBcnRpY2xlSUQgPSB7fTsKICAgICAgICBmb3IgbXkgJEFydGljbGUgKCBzb3J0IEBDaHJvbmljYWxBcnRpY2xlQm94ICkgewoKICAgICAgICAgICAgIyBnZXQgYXR0YWNobWVudCBpbmRleCAod2l0aG91dCBhdHRhY2htZW50cykKICAgICAgICAgICAgbXkgJUF0bUluZGV4ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQXR0YWNobWVudEluZGV4KAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgICAgICAgICAgPT4gJEFydGljbGUtPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZSAgICAgICAgICAgICAgICAgICAgPT4gJEFydGljbGUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkQXJ0aWNsZS0+e0F0bXN9ID0gXCVBdG1JbmRleDsKICAgICAgICAgICAgJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEFydGljbGUtPntBcnRpY2xlSUR9IH0gPSAkQXJ0aWNsZTsKICAgICAgICB9CgogICAgICAgICMgZG8gbm90IGRpc3BsYXkgdGhlc2UgdHlwZXMKICAgICAgICBteSBAVHlwZXNEb2RnZSA9IHF3KAogICAgICAgICAgICBNaXNjCiAgICAgICAgICAgIEFyY2hpdmVGbGFnVXBkYXRlCiAgICAgICAgICAgIExvb3BQcm90ZWN0aW9uCiAgICAgICAgICAgIFJlbW92ZQogICAgICAgICAgICBTdWJzY3JpYmUKICAgICAgICAgICAgVW5zdWJzY3JpYmUKICAgICAgICAgICAgU3lzdGVtUmVxdWVzdAogICAgICAgICAgICBTZW5kQWdlbnROb3RpZmljYXRpb24KICAgICAgICAgICAgU2VuZEN1c3RvbWVyTm90aWZpY2F0aW9uCiAgICAgICAgICAgIFNlbmRBdXRvUmVqZWN0CiAgICAgICAgKTsKCiAgICAgICAgIyBzb3J0IG91dCBub24tZmlsdGVyZWQgZXZlbnQgdHlwZXMgKGlmIGFwcGxpY2FibGUpCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0V2ZW50VHlwZUZpbHRlcn0tPntFdmVudFR5cGVJRH0KICAgICAgICAgICAgJiYgSXNBcnJheVJlZldpdGhEYXRhKCAkU2VsZi0+e0V2ZW50VHlwZUZpbHRlcn0tPntFdmVudFR5cGVJRH0gKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBmb3IgbXkgJEV2ZW50VHlwZSAoIHNvcnQga2V5cyAleyAkU2VsZi0+e0hpc3RvcnlUeXBlTWFwcGluZ30gfSApIHsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkRXZlbnRUeXBlIG5lICdOZXdUaWNrZXQnICYmICFncmVwIHsgJF8gZXEgJEV2ZW50VHlwZSB9CiAgICAgICAgICAgICAgICAgICAgQHsgJFNlbGYtPntFdmVudFR5cGVGaWx0ZXJ9LT57RXZlbnRUeXBlSUR9IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAVHlwZXNEb2RnZSwgJEV2ZW50VHlwZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB0eXBlcyB3aGljaCBjYW4gYmUgZGVzY3JpYmVkIGFzICdhY3Rpb24gb24gYSB0aWNrZXQnCiAgICAgICAgbXkgQFR5cGVzVGlja2V0QWN0aW9uID0gcXcoCiAgICAgICAgICAgIFNlcnZpY2VVcGRhdGUKICAgICAgICAgICAgU0xBVXBkYXRlCiAgICAgICAgICAgIFN0YXRlVXBkYXRlCiAgICAgICAgICAgIFNldFBlbmRpbmdUaW1lCiAgICAgICAgICAgIFVubG9jawogICAgICAgICAgICBMb2NrCiAgICAgICAgICAgIFJlc3BvbnNpYmxlVXBkYXRlCiAgICAgICAgICAgIE93bmVyVXBkYXRlCiAgICAgICAgICAgIEN1c3RvbWVyVXBkYXRlCiAgICAgICAgICAgIE5ld1RpY2tldAogICAgICAgICAgICBUaWNrZXRMaW5rQWRkCiAgICAgICAgICAgIFRpY2tldExpbmtEZWxldGUKICAgICAgICAgICAgVGlja2V0RHluYW1pY0ZpZWxkVXBkYXRlCiAgICAgICAgICAgIE1vdmUKICAgICAgICAgICAgTWVyZ2VkCiAgICAgICAgICAgIFByaW9yaXR5VXBkYXRlCiAgICAgICAgICAgIFRpdGxlVXBkYXRlCiAgICAgICAgICAgIFR5cGVVcGRhdGUKICAgICAgICAgICAgRXNjYWxhdGlvblJlc3BvbnNlVGltZU5vdGlmeUJlZm9yZQogICAgICAgICAgICBFc2NhbGF0aW9uUmVzcG9uc2VUaW1lU3RhcnQKICAgICAgICAgICAgRXNjYWxhdGlvblJlc3BvbnNlVGltZVN0b3AKICAgICAgICAgICAgRXNjYWxhdGlvblNvbHV0aW9uVGltZU5vdGlmeUJlZm9yZQogICAgICAgICAgICBFc2NhbGF0aW9uU29sdXRpb25UaW1lU3RhcnQKICAgICAgICAgICAgRXNjYWxhdGlvblNvbHV0aW9uVGltZVN0b3AKICAgICAgICAgICAgRXNjYWxhdGlvblVwZGF0ZVRpbWVOb3RpZnlCZWZvcmUKICAgICAgICAgICAgRXNjYWxhdGlvblVwZGF0ZVRpbWVTdGFydAogICAgICAgICAgICBFc2NhbGF0aW9uVXBkYXRlVGltZVN0b3AKICAgICAgICAgICAgVGltZUFjY291bnRpbmcKICAgICAgICApOwoKICAgICAgICAjIHR5cGVzIHdoaWNoIGFyZSB1c3VhbGx5IGJlaW5nIGNvbm5lY3RlZCB0byBzb21lIGtpbmQgb2YKICAgICAgICAjIGF1dG9tYXRpYyBwcm9jZXNzIChlLmcuIHRyaWdnZXJlZCBieSBhbm90aGVyIGFjdGlvbikKICAgICAgICBteSBAVHlwZXNUaWNrZXRBdXRvQWN0aW9uID0gcXcoCiAgICAgICAgICAgIFNlbmRBdXRvRm9sbG93VXAKICAgICAgICAgICAgU2VuZEF1dG9SZWplY3QKICAgICAgICAgICAgU2VuZEF1dG9SZXBseQogICAgICAgICk7CgogICAgICAgICMgdHlwZXMgd2hpY2ggY2FuIGJlIGNvbnNpZGVyZWQgYXMgaW50ZXJuYWwKICAgICAgICBteSBAVHlwZXNJbnRlcm5hbCA9IHF3KAogICAgICAgICAgICBBZGROb3RlCiAgICAgICAgICAgIENoYXRJbnRlcm5hbAogICAgICAgICAgICBFbWFpbEFnZW50SW50ZXJuYWwKICAgICAgICApOwoKICAgICAgICAjIG91dGdvaW5nIHR5cGVzCiAgICAgICAgbXkgQFR5cGVzT3V0Z29pbmcgPSBxdygKICAgICAgICAgICAgRm9yd2FyZAogICAgICAgICAgICBFbWFpbEFnZW50CiAgICAgICAgICAgIFBob25lQ2FsbEFnZW50CiAgICAgICAgICAgIEJvdW5jZQogICAgICAgICAgICBTZW5kQW5zd2VyCiAgICAgICAgKTsKCiAgICAgICAgIyBpbmNvbWluZyB0eXBlcwogICAgICAgIG15IEBUeXBlc0luY29taW5nID0gcXcoCiAgICAgICAgICAgIEVtYWlsQ3VzdG9tZXIKICAgICAgICAgICAgQWRkTm90ZUN1c3RvbWVyCiAgICAgICAgICAgIFBob25lQ2FsbEN1c3RvbWVyCiAgICAgICAgICAgIEZvbGxvd1VwCiAgICAgICAgICAgIFdlYlJlcXVlc3RDdXN0b21lcgogICAgICAgICAgICBDaGF0RXh0ZXJuYWwKICAgICAgICApOwoKICAgICAgICBteSBAVHlwZXNMZWZ0ID0gKAogICAgICAgICAgICBAVHlwZXNPdXRnb2luZywKICAgICAgICAgICAgQFR5cGVzSW50ZXJuYWwsCiAgICAgICAgICAgIEBUeXBlc1RpY2tldEF1dG9BY3Rpb24sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFR5cGVzUmlnaHQgPSAoCiAgICAgICAgICAgIEBUeXBlc0luY29taW5nLAogICAgICAgICAgICBAVHlwZXNUaWNrZXRBY3Rpb24sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFR5cGVzV2l0aEFydGljbGVzID0gKAogICAgICAgICAgICBAVHlwZXNPdXRnb2luZywKICAgICAgICAgICAgQFR5cGVzSW50ZXJuYWwsCiAgICAgICAgICAgIEBUeXBlc0luY29taW5nLAogICAgICAgICAgICAnUGhvbmVDYWxsQ3VzdG9tZXInLAogICAgICAgICk7CgogICAgICAgIG15ICVIaXN0b3J5SXRlbXM7CiAgICAgICAgbXkgJEl0ZW1Db3VudGVyID0gMDsKICAgICAgICBteSAkTGFzdENyZWF0ZVRpbWU7CiAgICAgICAgbXkgJExhc3RDcmVhdGVTeXN0ZW1UaW1lOwoKICAgICAgICAjIEdldCBtYXBwaW5nIG9mIGhpc3RvcnkgdHlwZXMgdG8gcmVhZGFibGUgc3RyaW5ncwogICAgICAgIG15ICVIaXN0b3J5VHlwZXM7CiAgICAgICAgbXkgJUhpc3RvcnlUeXBlQ29uZmlnID0gJXsgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpIaXN0b3J5VHlwZXMnKSAvLyB7fSB9OwogICAgICAgIGZvciBteSAkRW50cnkgKCBzb3J0IGtleXMgJUhpc3RvcnlUeXBlQ29uZmlnICkgewogICAgICAgICAgICAlSGlzdG9yeVR5cGVzID0gKAogICAgICAgICAgICAgICAgJUhpc3RvcnlUeXBlcywKICAgICAgICAgICAgICAgICV7ICRIaXN0b3J5VHlwZUNvbmZpZ3skRW50cnl9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBISVNUT1JZSVRFTToKICAgICAgICBmb3IgbXkgJEl0ZW0gKCByZXZlcnNlIEBIaXN0b3J5TGluZXMgKSB7CgogICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkSXRlbS0+e0hpc3RvcnlUeXBlfSB9IEBUeXBlc0RvZGdlICkgewogICAgICAgICAgICAgICAgbmV4dCBISVNUT1JZSVRFTTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEl0ZW0tPntDb3VudGVyfSA9ICRJdGVtQ291bnRlcisrOwoKICAgICAgICAgICAgIyBjaGVjayB3aGljaCBjb2xvciB0aGUgaXRlbSBzaG91bGQgaGF2ZQogICAgICAgICAgICBpZiAoICRJdGVtLT57SGlzdG9yeVR5cGV9IGVxICdOZXdUaWNrZXQnICkgewoKICAgICAgICAgICAgICAgICMgaWYgdGhlICdOZXdUaWNrZXQnIGl0ZW0gaGFzIGFuIGFydGljbGUsIGRpc3BsYXkgdGhpcyAiY3JlYXRpb24gYXJ0aWNsZSIgZXZlbnQgc2VwYXJhdGVseQogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17SXRlbXN9IH0sIHsKICAgICAgICAgICAgICAgICAgICAgICAgJXskSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICAgICAgICAgICAgPT4gJEl0ZW0tPntDb3VudGVyfSsrLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgID0+ICdOZXdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZVJlYWRhYmxlID0+ICdUaWNrZXQgQ3JlYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIE9yaWVudGF0aW9uICAgICAgICAgPT4gJ1JpZ2h0JywKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnTmV3VGlja2V0JzsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJEl0ZW0tPntBcnRpY2xlSUR9OwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkSXRlbS0+e05hbWV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNwZWNpYWwgdHJlYXRtZW50IGZvciBjZXJ0YWluIHR5cGVzLCBlLmcuIGV4dGVybmFsIG5vdGVzIGZyb20gY3VzdG9tZXJzCiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICRJdGVtLT57QXJ0aWNsZUlEfQogICAgICAgICAgICAgICAgJiYgJEl0ZW0tPntIaXN0b3J5VHlwZX0gZXEgJ0FkZE5vdGUnCiAgICAgICAgICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH0gKQogICAgICAgICAgICAgICAgJiYgJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH0tPntTZW5kZXJUeXBlfSBlcSAnY3VzdG9tZXInCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRJdGVtLT57Q2xhc3N9ID0gJ1R5cGVJbmNvbWluZyc7CgogICAgICAgICAgICAgICAgIyBXZSBmYWtlIGEgY3VzdG9tIGhpc3RvcnkgdHlwZSBiZWNhdXNlIGV4dGVybmFsIG5vdGVzIGZyb20gY3VzdG9tZXJzIHN0aWxsCiAgICAgICAgICAgICAgICAjIGhhdmUgdGhlIGhpc3RvcnkgdHlwZSAnQWRkTm90ZScgd2hpY2ggZG9lcyBub3QgYWxsb3cgZm9yIGRpc3Rpbmd1aXNoaW5nLgogICAgICAgICAgICAgICAgJEl0ZW0tPntIaXN0b3J5VHlwZX0gPSAnQWRkTm90ZUN1c3RvbWVyJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzcGVjaWFsIHRyZWF0bWVudCBmb3IgaW50ZXJuYWwgZW1haWxzCiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICRJdGVtLT57QXJ0aWNsZUlEfQogICAgICAgICAgICAgICAgJiYgJEl0ZW0tPntIaXN0b3J5VHlwZX0gZXEgJ0VtYWlsQWdlbnQnCiAgICAgICAgICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH0gKQogICAgICAgICAgICAgICAgJiYgJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH0tPntBcnRpY2xlVHlwZX0gZXEgJ2VtYWlsLWludGVybmFsJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSAgICAgICA9ICdUeXBlTm90ZUludGVybmFsJzsKICAgICAgICAgICAgICAgICRJdGVtLT57SGlzdG9yeVR5cGV9ID0gJ0VtYWlsQWdlbnRJbnRlcm5hbCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGNlcnRhaW4gdHlwZXMsIGUuZy4gZXh0ZXJuYWwgbm90ZXMgZnJvbSBjdXN0b21lcnMKICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlSUR9CiAgICAgICAgICAgICAgICAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH0gKQogICAgICAgICAgICAgICAgJiYgJEFydGljbGVzQnlBcnRpY2xlSUQtPnsgJEl0ZW0tPntBcnRpY2xlSUR9IH0tPntBcnRpY2xlVHlwZX0gZXEgJ2NoYXQtZXh0ZXJuYWwnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRJdGVtLT57SGlzdG9yeVR5cGV9ID0gJ0NoYXRFeHRlcm5hbCc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSAgICAgICA9ICdUeXBlSW5jb21pbmcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICRJdGVtLT57QXJ0aWNsZUlEfQogICAgICAgICAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRBcnRpY2xlc0J5QXJ0aWNsZUlELT57ICRJdGVtLT57QXJ0aWNsZUlEfSB9ICkKICAgICAgICAgICAgICAgICYmICRBcnRpY2xlc0J5QXJ0aWNsZUlELT57ICRJdGVtLT57QXJ0aWNsZUlEfSB9LT57QXJ0aWNsZVR5cGV9IGVxICdjaGF0LWludGVybmFsJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0hpc3RvcnlUeXBlfSA9ICdDaGF0SW50ZXJuYWwnOwogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gICAgICAgPSAnVHlwZUludGVybmFsJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICAgICAkSXRlbS0+e0hpc3RvcnlUeXBlfSBlcSAnRm9yd2FyZCcKICAgICAgICAgICAgICAgICYmICRJdGVtLT57QXJ0aWNsZUlEfQogICAgICAgICAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRBcnRpY2xlc0J5QXJ0aWNsZUlELT57ICRJdGVtLT57QXJ0aWNsZUlEfSB9ICkKICAgICAgICAgICAgICAgICYmICRBcnRpY2xlc0J5QXJ0aWNsZUlELT57ICRJdGVtLT57QXJ0aWNsZUlEfSB9LT57QXJ0aWNsZVR5cGV9IGVxICdlbWFpbC1pbnRlcm5hbCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEl0ZW0tPntDbGFzc30gPSAnVHlwZU5vdGVJbnRlcm5hbCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCBncmVwIHsgJF8gZXEgJEl0ZW0tPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNUaWNrZXRBY3Rpb24gKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSA9ICdUeXBlVGlja2V0QWN0aW9uJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIGdyZXAgeyAkXyBlcSAkSXRlbS0+e0hpc3RvcnlUeXBlfSB9IEBUeXBlc1RpY2tldEF1dG9BY3Rpb24gKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSA9ICdUeXBlVGlja2V0QXV0b0FjdGlvbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCBncmVwIHsgJF8gZXEgJEl0ZW0tPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNJbnRlcm5hbCApIHsKICAgICAgICAgICAgICAgICRJdGVtLT57Q2xhc3N9ID0gJ1R5cGVOb3RlSW50ZXJuYWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggZ3JlcCB7ICRfIGVxICRJdGVtLT57SGlzdG9yeVR5cGV9IH0gQFR5cGVzSW5jb21pbmcgKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSA9ICdUeXBlSW5jb21pbmcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggZ3JlcCB7ICRfIGVxICRJdGVtLT57SGlzdG9yeVR5cGV9IH0gQFR5cGVzT3V0Z29pbmcgKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSA9ICdUeXBlT3V0Z29pbmcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlbW92ZSBhcnRpY2xlIGluZm9ybWF0aW9uIGZyb20gdHlwZXMgd2hpY2ggc2hvdWxkIG5vdCBkaXNwbGF5IGFydGljbGVzCiAgICAgICAgICAgIGlmICggIWdyZXAgeyAkXyBlcSAkSXRlbS0+e0hpc3RvcnlUeXBlfSB9IEBUeXBlc1dpdGhBcnRpY2xlcyApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkSXRlbS0+e0FydGljbGVJRH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGFydGljbGUgKGlmIHByZXNlbnQpCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0gPSAkQXJ0aWNsZXNCeUFydGljbGVJRC0+eyAkSXRlbS0+e0FydGljbGVJRH0gfTsKCiAgICAgICAgICAgICAgICAjIHNlY3VyaXR5PSJyZXN0cmljdGVkIiBtYXkgYnJlYWsgU1NPIC0gZGlzYWJsZSB0aGlzIGZlYXR1cmUgaWYgcmVxdWVzdGVkCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEaXNhYmxlTVNJRnJhbWVTZWN1cml0eVJlc3RyaWN0ZWQnKSApIHsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0FydGljbGVEYXRhfS0+e01TU2VjdXJpdHlSZXN0cmljdGVkfSA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0tPntNU1NlY3VyaXR5UmVzdHJpY3RlZH0gPSAnc2VjdXJpdHk9InJlc3RyaWN0ZWQiJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAlQXJ0aWNsZUZsYWdzQWxsID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRmxhZ0dldCgKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEl0ZW0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAlQXJ0aWNsZUZsYWdzTWUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGbGFnR2V0KAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0tPntBcnRpY2xlSXNJbXBvcnRhbnR9ID0gJEFydGljbGVGbGFnc0FsbHtJbXBvcnRhbnR9OwogICAgICAgICAgICAgICAgJEl0ZW0tPntBcnRpY2xlRGF0YX0tPntBcnRpY2xlSXNTZWVufSAgICAgID0gJEFydGljbGVGbGFnc01le1NlZW59OwoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0FydGljbGVEYXRhfS0+e0FydGljbGVUeXBlfSBlcSAnY2hhdC1leHRlcm5hbCcKICAgICAgICAgICAgICAgICAgICB8fCAkSXRlbS0+e0FydGljbGVEYXRhfS0+e0FydGljbGVUeXBlfSBlcSAnY2hhdC1pbnRlcm5hbCcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntJc0NoYXRBcnRpY2xlfSA9IDE7CgogICAgICAgICAgICAgICAgICAgICMgZGlzcGxheSBvbmx5IHRoZSBmaXJzdCB0aHJlZSAoc2hvcnRlbmVkKSBsaW5lcyBvZiBhIGNoYXJ0IGFydGljbGUKICAgICAgICAgICAgICAgICAgICBteSAkQ2hhdE1lc3NhZ2VzID0gJFNlbGYtPntKU09OT2JqZWN0fS0+RGVjb2RlKAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLT57QXJ0aWNsZURhdGF9LT57Qm9keX0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJEl0ZW1Db3VudGVyID0gMDsKCiAgICAgICAgICAgICAgICAgICAgQ0hBVElURU06CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRNZXNzYWdlRGF0YSAoIHNvcnQgeyAkYS0+e0lEfSA8PT4gJGItPntJRH0gfSBAeyRDaGF0TWVzc2FnZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRNZXNzYWdlRGF0YS0+e1N5c3RlbUdlbmVyYXRlZH0gPT0gMSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0FydGljbGVEYXRhfS0+e0JvZHlDaGF0fSAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ2hhdE1lc3NhZ2UgU3lzdGVtR2VuZXJhdGVkIj48c3Bhbj5bWyUgRGF0YS5DcmVhdGVUaW1lIHwgaHRtbCAlXV08L3NwYW4+IC0gWyUgRGF0YS5NZXNzYWdlVGV4dCB8IGh0bWwgJV08L2Rpdj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJE1lc3NhZ2VEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0FydGljbGVEYXRhfS0+e0JvZHlDaGF0fSAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ2hhdE1lc3NhZ2UiPjxzcGFuPltbJSBEYXRhLkNyZWF0ZVRpbWUgfCBodG1sICVdXTwvc3Bhbj4gLSBbJSBEYXRhLkNoYXR0ZXJOYW1lIHwgaHRtbCAlXTogWyUgRGF0YS5NZXNzYWdlVGV4dCB8IGh0bWwgJV08L2Rpdj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJE1lc3NhZ2VEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkSXRlbUNvdW50ZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBDSEFUSVRFTSBpZiAkSXRlbUNvdW50ZXIgPT0gNzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgZW1wdHkgbGluZXMKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0FydGljbGVEYXRhfS0+e0JvZHl9ID1+IHN7XltcblxyXSt9e314bXNnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntOYW1lfSAmJiAkSXRlbS0+e05hbWV9ID1+IG0vXiUlL3ggKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntOYW1lfSA9fiBzL14lJS8veGc7CiAgICAgICAgICAgICAgICAgICAgbXkgQFZhbHVlcyA9IHNwbGl0KCAvJSUveCwgJEl0ZW0tPntOYW1lfSApOwogICAgICAgICAgICAgICAgICAgICRJdGVtLT57TmFtZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJEhpc3RvcnlUeXBlc3sgJEl0ZW0tPntIaXN0b3J5VHlwZX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgQFZhbHVlcywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBub3QgbmVlZGVkIHBsYWNlIGhvbGRlcgogICAgICAgICAgICAgICAgICAgICRJdGVtLT57TmFtZX0gPX4gcy9cJXMvL3hnOwoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBJRHMKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e05hbWV9ID1+IHMvXHMrXChcZFwpLy94ZzsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e05hbWV9ID1+IHMvXHMrXChJRD1cZFwpLy94ZzsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e05hbWV9ID1+IHMvXHMrXChJRD1cKS8veGc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbWFrZSB0aGUgaGlzdG9yeSB0eXBlIG1vcmUgcmVhZGFibGUgKGlmIGFwcGxpY2FibGUpCiAgICAgICAgICAgICRJdGVtLT57SGlzdG9yeVR5cGVSZWFkYWJsZX0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntIaXN0b3J5VHlwZU1hcHBpbmd9LT57ICRJdGVtLT57SGlzdG9yeVR5cGV9IH0gfHwgJEl0ZW0tPntIaXN0b3J5VHlwZX07CgogICAgICAgICAgICAjIGdyb3VwIGl0ZW1zIHdoaWNoIGhhcHBlbmVkIChuZWFybHkpIGNvaW5jaWRlbnRseSB0b2dldGhlcgogICAgICAgICAgICAkSXRlbS0+e0NyZWF0ZVN5c3RlbVRpbWV9ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEl0ZW0tPntDcmVhdGVUaW1lfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIHR3byBldmVudHMgdGhhdCBoYXBwZW5lZCAnbmVhcmx5JyB0aGUgc2FtZSB0aW1lLCB0cmVhdAogICAgICAgICAgICAjIHRoZW0gYXMgaWYgdGhleSBoYXBwZW5lZCBleGFjdGx5IG9uIHRoZSBzYW1lIHRpbWUgKHRyZXNob2xkIDUgc2Vjb25kcykKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJExhc3RDcmVhdGVTeXN0ZW1UaW1lCiAgICAgICAgICAgICAgICAmJiAkSXRlbS0+e0NyZWF0ZVN5c3RlbVRpbWV9IDw9ICRMYXN0Q3JlYXRlU3lzdGVtVGltZQogICAgICAgICAgICAgICAgJiYgJEl0ZW0tPntDcmVhdGVTeXN0ZW1UaW1lfSA+PSAoICRMYXN0Q3JlYXRlU3lzdGVtVGltZSAtIDUgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRIaXN0b3J5SXRlbXN7JExhc3RDcmVhdGVUaW1lfSB9LCAkSXRlbTsKICAgICAgICAgICAgICAgICRJdGVtLT57Q3JlYXRlVGltZX0gPSAkTGFzdENyZWF0ZVRpbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwdXNoIEB7ICRIaXN0b3J5SXRlbXN7ICRJdGVtLT57Q3JlYXRlVGltZX0gfSB9LCAkSXRlbTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJExhc3RDcmVhdGVUaW1lICAgICAgID0gJEl0ZW0tPntDcmVhdGVUaW1lfTsKICAgICAgICAgICAgJExhc3RDcmVhdGVTeXN0ZW1UaW1lID0gJEl0ZW0tPntDcmVhdGVTeXN0ZW1UaW1lfTsKICAgICAgICB9CgogICAgICAgIG15ICRTb3J0QnlBcnRpY2xlID0gc3ViIHsKCiAgICAgICAgICAgIG15ICRJc0EgPSBncmVwIHsgJF8gZXEgJGEtPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNXaXRoQXJ0aWNsZXM7CiAgICAgICAgICAgIG15ICRJc0IgPSBncmVwIHsgJF8gZXEgJGItPntIaXN0b3J5VHlwZX0gfSBAVHlwZXNXaXRoQXJ0aWNsZXM7CiAgICAgICAgICAgICRJc0IgY21wICRJc0E7CiAgICAgICAgfTsKCiAgICAgICAgIyBzb3J0IGhpc3RvcnkgaXRlbXMgYmFzZWQgb24gaXRlbXMgd2l0aCBhcnRpY2xlcwogICAgICAgICMgdGhlc2UgaXRlbXMgc2hvdWxkIGFsd2F5cyBiZSBvbiB0b3Agb2YgYSBsaXN0IG9mIGNvbm5lY3RlZCBpdGVtcwogICAgICAgICRJdGVtQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRJdGVtICggcmV2ZXJzZSBzb3J0IGtleXMgJUhpc3RvcnlJdGVtcyApIHsKCiAgICAgICAgICAgIGZvciBteSAkU3ViSXRlbSAoIHNvcnQgJFNvcnRCeUFydGljbGUgQHsgJEhpc3RvcnlJdGVtc3skSXRlbX0gfSApIHsKICAgICAgICAgICAgICAgICRTdWJJdGVtLT57Q291bnRlcn0gPSAkSXRlbUNvdW50ZXIrKzsKCiAgICAgICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkU3ViSXRlbS0+e0hpc3RvcnlUeXBlfSB9IEBUeXBlc1JpZ2h0ICkgewogICAgICAgICAgICAgICAgICAgICRTdWJJdGVtLT57T3JpZW50YXRpb259ID0gJ1JpZ2h0JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTdWJJdGVtLT57T3JpZW50YXRpb259ID0gJ0xlZnQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17SXRlbXN9IH0sICRTdWJJdGVtOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBUaWNrZXRJRCBmb3IgdXNhZ2UgaW4gSlMKICAgICAgICAkUGFyYW17VGlja2V0SUR9ID0gJFNlbGYtPntUaWNrZXRJRH07CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Nocm9uaWNhbFZpZXcnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBqdW1wIHRvIHNlbGVjdGVkIGFydGljbGUKICAgICAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Nob3dTZWxlY3RlZEFydGljbGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbmRlciBhY3Rpb24gbWVudSBmb3IgYWxsIGFydGljbGVzCiAgICAgICAgZm9yIG15ICRBcnRpY2xlSUQgKCBzb3J0IGtleXMgJXskQXJ0aWNsZXNCeUFydGljbGVJRH0gKSB7CgogICAgICAgICAgICBteSBATWVudUl0ZW1zID0gJFNlbGYtPl9BcnRpY2xlTWVudSgKICAgICAgICAgICAgICAgIFRpY2tldCAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXR9LAogICAgICAgICAgICAgICAgQWNsQWN0aW9uICAgICAgICAgPT4gJFBhcmFte0FjbEFjdGlvbn0sCiAgICAgICAgICAgICAgICBBcnRpY2xlICAgICAgICAgICA9PiAkQXJ0aWNsZXNCeUFydGljbGVJRC0+eyRBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgU3RhbmRhcmRSZXNwb25zZXMgPT4gJFBhcmFte1N0YW5kYXJkUmVzcG9uc2VzfSwKICAgICAgICAgICAgICAgIFN0YW5kYXJkRm9yd2FyZHMgID0+ICRQYXJhbXtTdGFuZGFyZEZvcndhcmRzfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgID0+ICdTdGF0aWMnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0Nocm9uaWNhbFZpZXdUaWNrZXRBY3Rpb25zJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBNZW51SXRlbXMgPT4gXEBNZW51SXRlbXMsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzIGJveAogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkQXJ0aWNsZXNCeUFydGljbGVJRC0+eyRBcnRpY2xlSUR9LT57QXRtc30gKSApIHsKCiAgICAgICAgICAgICAgICBteSAkQXJ0aWNsZUF0dGFjaG1lbnRzID0gJFNlbGYtPl9Db2xsZWN0QXJ0aWNsZUF0dGFjaG1lbnRzKAogICAgICAgICAgICAgICAgICAgIEFydGljbGUgPT4gJEFydGljbGVzQnlBcnRpY2xlSUQtPnskQXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDaHJvbmljYWxWaWV3QXJ0aWNsZUF0dGFjaG1lbnRzJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gJEFydGljbGVBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsgJVBhcmFtLCAlVGlja2V0IH0sCiAgICApOwp9CgpzdWIgX1RpY2tldEl0ZW1TZWVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQEFydGljbGVJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVJbmRleCgKICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgKTsKCiAgICBmb3IgbXkgJEFydGljbGVJRCAoQEFydGljbGVJRHMpIHsKICAgICAgICAkU2VsZi0+X0FydGljbGVJdGVtU2VlbigKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcnRpY2xlSXRlbVNlZW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG1hcmsgc2hvd24gYXJ0aWNsZSBhcyBzZWVuCiAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGbGFnU2V0KAogICAgICAgIEFydGljbGVJRCA9PiAkUGFyYW17QXJ0aWNsZUlEfSwKICAgICAgICBLZXkgICAgICAgPT4gJ1NlZW4nLAogICAgICAgIFZhbHVlICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FydGljbGVJdGVtIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVRpY2tldCAgICA9ICV7ICRQYXJhbXtUaWNrZXR9IH07CiAgICBteSAlQXJ0aWNsZSAgID0gJXsgJFBhcmFte0FydGljbGV9IH07CiAgICBteSAlQWNsQWN0aW9uID0gJXsgJFBhcmFte0FjbEFjdGlvbn0gfTsKCiAgICAjIGNsZWFudXAgc3ViamVjdAogICAgJEFydGljbGV7U3ViamVjdH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJEFydGljbGV7VGlja2V0TnVtYmVyfSwKICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgU2l6ZSAgICAgICAgID0+IDAsCiAgICApOwoKICAgICMgc2hvdyBhcnRpY2xlIGFjdGlvbnMKICAgIG15IEBNZW51SXRlbXMgPSAkU2VsZi0+X0FydGljbGVNZW51KAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBcnRpY2xlSXRlbScsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24sIE1lbnVJdGVtcyA9PiBcQE1lbnVJdGVtcyB9LAogICAgKTsKCiAgICAjIHNob3cgY3JlYXRlZCBieSBpZiBkaWZmZXJlbnQgZnJvbSBVc2VyIElEIDEKICAgIGlmICggJEFydGljbGV7Q3JlYXRlZEJ5fSA+IDEgKSB7CiAgICAgICAgJEFydGljbGV7Q3JlYXRlZEJ5VXNlcn0gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTmFtZSggVXNlcklEID0+ICRBcnRpY2xle0NyZWF0ZWRCeX0gKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQ3JlYXRlZEJ5JywKICAgICAgICAgICAgRGF0YSA9PiB7JUFydGljbGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhbHdheXMgc2hvdyBhcmNoaXZlZCB0aWNrZXRzIGFzIHNlZW4KICAgIGlmICggJFRpY2tldHtBcmNoaXZlRmxhZ30gbmUgJ3knICkgewoKICAgICAgICAjIG1hcmsgc2hvd24gYXJ0aWNsZSBhcyBzZWVuCiAgICAgICAgaWYgKCAkUGFyYW17VHlwZX0gZXEgJ09uTG9hZCcgKSB7CiAgICAgICAgICAgICRTZWxmLT5fQXJ0aWNsZUl0ZW1TZWVuKCBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRTZWxmLT57Wm9vbUV4cGFuZH0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJFBhcmFte0FjdHVhbEFydGljbGVJRH0KICAgICAgICAgICAgICAgICYmICRQYXJhbXtBY3R1YWxBcnRpY2xlSUR9ID09ICRBcnRpY2xle0FydGljbGVJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlSXRlbU1hcmtBc1NlZW4nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZG8gc29tZSBzdHJpcHMgJiYgcXVvdGluZwogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKHF3KEZyb20gVG8gQ2MpKSB7CiAgICAgICAgbmV4dCBLRVkgaWYgISRBcnRpY2xleyRLZXl9OwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jvd1JlY2lwaWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRBcnRpY2xleyRLZXl9LAogICAgICAgICAgICAgICAgUmVhbG5hbWUgPT4gJEFydGljbGV7ICRLZXkgLiAnUmVhbG5hbWUnIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYWNjb3VudGVkIGFydGljbGUgdGltZQogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Olpvb21UaW1lRGlzcGxheScpCiAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFjY291bnRUaW1lJykKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJEFydGljbGVUaW1lID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVBY2NvdW50ZWRUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnVGltZScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZVRpbWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIGFydGljbGUgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkID0gJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWydBcnRpY2xlJ10sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntEeW5hbWljRmllbGRGaWx0ZXJ9IHx8IHt9LAogICAgKTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmFsdWU7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJFZhbHVlIGVxICcnOwoKICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT4KICAgICAgICAgICAgICAgIEdldCgnVGlja2V0OjpGcm9udGVuZDo6RHluYW1pY0ZpZWxkc1pvb21NYXhTaXplQXJ0aWNsZScpCiAgICAgICAgICAgICAgICB8fCAxNjAsICAgICMgbGltaXQgZm9yIGFydGljbGUgZGlzcGxheQogICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICk7CgogICAgICAgIG15ICRMYWJlbCA9ICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH07CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRWYWx1ZVN0cmctPntMaW5rfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgZWxlbWVudAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUR5bmFtaWNGaWVsZExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwKCiAgICAgICAgICAgICAgICAgICAgIyBhbGlhcyBmb3IgdGlja2V0IHRpdGxlLCBUaXRsZSB3aWxsIGJlIG92ZXJ3cml0dGVuCiAgICAgICAgICAgICAgICAgICAgVGlja2V0VGl0bGUgICAgICAgICAgICAgICAgID0+ICRUaWNrZXR7VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntUaXRsZX0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRwdXQgbm9uIGxpbmsgZWxlbWVudAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUR5bmFtaWNGaWVsZFBsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVEeW5hbWljRmllbGQnIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFZhbHVlU3RyZy0+e0xpbmt9ICkgewoKICAgICAgICAgICAgIyBvdXRwdXQgbGluayBlbGVtZW50CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRHluYW1pY0ZpZWxkJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVUaWNrZXQsCgogICAgICAgICAgICAgICAgICAgICMgYWxpYXMgZm9yIHRpY2tldCB0aXRsZSwgVGl0bGUgd2lsbCBiZSBvdmVyd3JpdHRlbgogICAgICAgICAgICAgICAgICAgIFRpY2tldFRpdGxlICAgICAgICAgICAgICAgICA9PiAkVGlja2V0e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmt9LAogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0cHV0IG5vbiBsaW5rIGVsZW1lbnQKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVEeW5hbWljRmllbGQnIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ1BsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcnVuIGFydGljbGUgdmlldyBtb2R1bGVzCiAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVWaWV3TW9kdWxlJyk7CiAgICBpZiAoIHJlZiAkQ29uZmlnIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICV7JENvbmZpZ307CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15IEBEYXRhID0gJE9iamVjdC0+Q2hlY2soCiAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICVUaWNrZXQsIENvbmZpZyA9PiAkSm9ic3skSm9ifQogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJERhdGFSZWYgKEBEYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkRGF0YVJlZi0+e1N1Y2Nlc3NmdWx9ICkgewogICAgICAgICAgICAgICAgICAgICREYXRhUmVmLT57UmVzdWx0fSA9ICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YVJlZi0+e1Jlc3VsdH0gPSAnTm90aWNlJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVPcHRpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJERhdGFSZWYsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGZvciBteSAkV2FybmluZyAoIEB7ICREYXRhUmVmLT57V2FybmluZ3N9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZU9wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFdhcm5pbmcsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaWx0ZXIgb3B0aW9uCiAgICAgICAgICAgICRPYmplY3QtPkZpbHRlcigKICAgICAgICAgICAgICAgIEFydGljbGUgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgJVRpY2tldCwgQ29uZmlnID0+ICRKb2JzeyRKb2J9CiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICVBcnRpY2xlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlR2V0KAogICAgICAgIEFydGljbGVJRCAgICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICApOwoKICAgICMgZ2V0IGF0dGFjaG1lbnQgaW5kZXggKHdpdGhvdXQgYXR0YWNobWVudHMpCiAgICBteSAlQXRtSW5kZXggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVBdHRhY2htZW50SW5kZXgoCiAgICAgICAgQXJ0aWNsZUlEICAgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAkU2VsZi0+e1N0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50fSwKICAgICAgICBBcnRpY2xlICAgICAgICAgICAgICAgICAgICA9PiBcJUFydGljbGUsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgICRBcnRpY2xle0F0bXN9ID0gXCVBdG1JbmRleDsKCiAgICAjIGFkZCBibG9jayBmb3IgYXR0YWNobWVudHMKICAgIGlmICggJEFydGljbGV7QXRtc30gJiYgJXsgJEFydGljbGV7QXRtc30gfSApIHsKICAgICAgICBteSAlQXRtSW5kZXggPSAleyAkQXJ0aWNsZXtBdG1zfSB9OwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVBdHRhY2htZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwoKICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVBdHRhY2htZW50TW9kdWxlJyk7CiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEZpbGVJRCAoIHNvcnQga2V5cyAlQXRtSW5kZXggKSB7CiAgICAgICAgICAgIG15ICVGaWxlID0gJXsgJEF0bUluZGV4eyRGaWxlSUR9IH07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQXR0YWNobWVudFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlRmlsZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcnVuIGFydGljbGUgYXR0YWNobWVudCBtb2R1bGVzCiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiByZWYgJENvbmZpZyBuZSAnSEFTSCc7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXskQ29uZmlnfTsKICAgICAgICAgICAgSk9COgogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICBteSAlRGF0YSA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICBGaWxlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkRmlsZUlELAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIHRoZSBkaXNwbGF5IG9mIHRoZSBmaWxlc2l6ZQogICAgICAgICAgICAgICAgaWYgKCAkSm9iIGVxICcyLUhUTUwtVmlld2VyJyAmJiAhJURhdGEgKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7RGF0YUZpbGVTaXplfSA9ICIsICIgLiAkRmlsZXtGaWxlc2l6ZX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRKb2IgZXEgJzItSFRNTC1WaWV3ZXInICYmICVEYXRhICkgewogICAgICAgICAgICAgICAgICAgICREYXRhe0RhdGFGaWxlU2l6ZX0gPSAiLCAiIC4gJERhdGF7RmlsZXNpemV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICREYXRhe0Jsb2NrfSB8fCAnQXJ0aWNsZUF0dGFjaG1lbnRSb3dMaW5rJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslRGF0YX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgU3BlY2lhbCB0cmVhdG1lbnQgZm9yIGNoYXQgYXJ0aWNsZXMKICAgIGlmICggJEFydGljbGV7QXJ0aWNsZVR5cGV9IGVxICdjaGF0LWV4dGVybmFsJyB8fCAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gZXEgJ2NoYXQtaW50ZXJuYWwnICkgewoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCb2R5Q2hhdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2hhdE1lc3NhZ2VzID0+ICRTZWxmLT57SlNPTk9iamVjdH0tPkRlY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIHNob3cgYm9keSBhcyBodG1sIG9yIHBsYWluIHRleHQKICAgIG15ICRWaWV3TW9kZSA9ICdCb2R5SFRNTCc7CgogICAgIyBpbiBjYXNlIHNob3cgcGxhaW4gYXJ0aWNsZSBib2R5IChpZiBubyBodG1sIGJvZHkgYXMgYXR0YWNobWVudCBleGlzdHMgb2YgaWYgcmljaAogICAgIyB0ZXh0IGlzIG5vdCBlbmFibGVkKQogICAgaWYgKCAhJFNlbGYtPntSaWNoVGV4dH0gfHwgISRBcnRpY2xle0F0dGFjaG1lbnRJRE9mSFRNTEJvZHl9ICkgewogICAgICAgICRWaWV3TW9kZSA9ICdCb2R5UGxhaW4nOwoKICAgICAgICAjIHJlbWVtYmVyIHBsYWluIGJvZHkgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBieSBBcnRpY2xlVmlld01vZHVsZXMKICAgICAgICAkQXJ0aWNsZXtCb2R5UGxhaW59ID0gJEFydGljbGV7Qm9keX07CgogICAgICAgICMgaHRtbCBxdW90aW5nCiAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIE5ld0xpbmUgICAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld05ld0xpbmUnKSwKICAgICAgICAgICAgVGV4dCAgICAgICAgICAgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgICAgIFZNYXggICAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld0xpbmVzJykgfHwgNTAwMCwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgc2VjdXJpdHk9InJlc3RyaWN0ZWQiIG1heSBicmVhayBTU08gLSBkaXNhYmxlIHRoaXMgZmVhdHVyZSBpZiByZXF1ZXN0ZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Rpc2FibGVNU0lGcmFtZVNlY3VyaXR5UmVzdHJpY3RlZCcpICkgewogICAgICAgICRBcnRpY2xle01TU2VjdXJpdHlSZXN0cmljdGVkfSA9ICcnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEFydGljbGV7TVNTZWN1cml0eVJlc3RyaWN0ZWR9ID0gJ3NlY3VyaXR5PSJyZXN0cmljdGVkIic7CiAgICB9CgogICAgIyBzaG93IGJvZHkKICAgICMgQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIGFuIGFub255bW91cyBjb3B5IG9mICVBcnRpY2xlIGFuZCBwYXNzIGl0IHRvCiAgICAjIHRoZSBMYXlvdXRPYmplY3QsIGJlY2F1c2UgJUFydGljbGUgbWF5IGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMuCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFZpZXdNb2RlLAogICAgICAgIERhdGEgPT4geyVBcnRpY2xlfSwKICAgICk7CgogICAgIyBzaG93IG1lc3NhZ2UgYWJvdXQgbGlua3MgaW4gaWZyYW1lcywgaWYgdXNlciBkaWRuJ3QgY2xvc2UgaXQgYWxyZWFkeQogICAgaWYgKCAkVmlld01vZGUgZXEgJ0JvZHlIVE1MJyAmJiAhJFNlbGYtPntEb05vdFNob3dCcm93c2VyTGlua01lc3NhZ2V9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0Jyb3dzZXJMaW5rTWVzc2FnZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJlc3RvcmUgcGxhaW4gYm9keSBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGJ5IEFydGljbGVWaWV3TW9kdWxlcwogICAgaWYgKCAhJFNlbGYtPntSaWNoVGV4dH0gfHwgISRBcnRpY2xle0F0dGFjaG1lbnRJRE9mSFRNTEJvZHl9ICkgewogICAgICAgICRBcnRpY2xle0JvZHl9ID0gJEFydGljbGV7Qm9keVBsYWlufTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcnRpY2xlTWVudSB7CgogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVGlja2V0ICAgID0gJXsgJFBhcmFte1RpY2tldH0gfTsKICAgIG15ICVBcnRpY2xlICAgPSAleyAkUGFyYW17QXJ0aWNsZX0gfTsKICAgIG15ICVBY2xBY3Rpb24gPSAleyAkUGFyYW17QWNsQWN0aW9ufSB9OwoKICAgIG15IEBNZW51SXRlbXM7CgogICAgbXkgJUFjbEFjdGlvbkxvb2t1cCA9IHJldmVyc2UgJUFjbEFjdGlvbjsKCiAgICAjIHNlbGVjdCB0aGUgb3V0cHV0IHRlbXBsYXRlCiAgICBpZiAoICRBcnRpY2xle0FydGljbGVUeXBlfSAhfiAvXihub3RlfGVtYWlsLW5vdGl8Y2hhdCkvaSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBjb21wb3NlIGxpbmsgc2hvdWxkIGJlIHNob3duCiAgICAgICAgaWYgKAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICAgICAmJiAoICRBY2xBY3Rpb25Mb29rdXB7QWdlbnRUaWNrZXRDb21wb3NlfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZScpOwogICAgICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgIG15ICRPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJE9rICkgewogICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgICAgICAgICBteSAkTG9ja2VkID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrR2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRMb2NrZWQpIHsKICAgICAgICAgICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRBY2Nlc3MpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBTdGFuZGFyZFJlc3BvbnNlc1N0cmcKICAgICAgICAgICAgICAgIG15ICVTdGFuZGFyZFJlc3BvbnNlSGFzaCA9ICV7ICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc30gfHwge30gfTsKCiAgICAgICAgICAgICAgICAjIGdldCByZXZlcnMgU3RhbmRhcmRSZXNwb25zZUhhc2ggYmVjYXVzZSB3ZSBuZWVkIHRvIHNvcnQgYnkgVmFsdWVzCiAgICAgICAgICAgICAgICAjIGZyb20gJVJldmVyc2VTdGFuZGFyZFJlc3BvbnNlSGFzaCB3ZSBnZXQgdmFsdWUgb2YgS2V5IGJ5ICVTdGFuZGFyZFJlc3BvbnNlSGFzaCBWYWx1ZQogICAgICAgICAgICAgICAgIyBhbmQgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSBpcyBjcmVhdGVkIGFzIGFycmF5IG9mIGhhc2hlcyB3aXRoIGVsZW1lbnRzIEtleSBhbmQgVmFsdWUKCiAgICAgICAgICAgICAgICBteSAlUmV2ZXJzZVN0YW5kYXJkUmVzcG9uc2VIYXNoID0gcmV2ZXJzZSAlU3RhbmRhcmRSZXNwb25zZUhhc2g7CiAgICAgICAgICAgICAgICBteSBAU3RhbmRhcmRSZXNwb25zZUFycmF5ICAgICAgID0gbWFwIHsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRSZXZlcnNlU3RhbmRhcmRSZXNwb25zZUhhc2h7JF99LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkXwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gc29ydCB2YWx1ZXMgJVN0YW5kYXJkUmVzcG9uc2VIYXNoOwoKICAgICAgICAgICAgICAgICMgdXNlIHRoaXMgYXJyYXkgdHdpY2UgKGFsc28gZm9yIFJlcGx5IEFsbCksIHNvIGNvcHkgaXQgZmlyc3QKICAgICAgICAgICAgICAgIG15IEBTdGFuZGFyZFJlc3BvbnNlQXJyYXlSZXBseUFsbCA9IEBTdGFuZGFyZFJlc3BvbnNlQXJyYXk7CgogICAgICAgICAgICAgICAgdW5zaGlmdCgKICAgICAgICAgICAgICAgICAgICBAU3RhbmRhcmRSZXNwb25zZUFycmF5LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnLSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdSZXBseScpIC4gJyAtJywKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYnVpbGQgaHRtbCBzdHJpbmcKICAgICAgICAgICAgICAgIG15ICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNlSUQnLAogICAgICAgICAgICAgICAgICAgIElEICAgPT4gJ1Jlc3BvbnNlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXEBTdGFuZGFyZFJlc3BvbnNlQXJyYXksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlICAgICAgICAgICAgICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICAgICAgICAgIERyb3Bkb3duVHlwZSAgICAgICAgICA9PiAnUmVwbHknLAogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzU3RyZyA9PiAkU3RhbmRhcmRSZXNwb25zZXNTdHJnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnUmVwbHknLAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgPT4gJ0FnZW50VGlja2V0Q29tcG9zZScsCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgID0+ICdSZXBseScgLiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlRWxlbWVudElEICAgICA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiByZXBseSBhbGwgaXMgbmVlZGVkCiAgICAgICAgICAgICAgICBteSAkUmVjaXBpZW50cyA9ICcnOwogICAgICAgICAgICAgICAgS0VZOgogICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KEZyb20gVG8gQ2MpKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISRBcnRpY2xleyRLZXl9OwogICAgICAgICAgICAgICAgICAgIGlmICgkUmVjaXBpZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAnLCAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAkQXJ0aWNsZXskS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRSZWNpcGllbnRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoJFJlY2lwaWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkRW1haWxQYXJzZXIgPSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXItPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZGUgPT4gJ1N0YW5kYWxvbmUnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFkZHJlc3NlcyA9ICRFbWFpbFBhcnNlci0+U3BsaXRBZGRyZXNzTGluZSggTGluZSA9PiAkUmVjaXBpZW50cyApOwogICAgICAgICAgICAgICAgICAgIEFERFJFU1M6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBZGRyZXNzIChAQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbWFpbCA9ICRFbWFpbFBhcnNlci0+R2V0RW1haWxBZGRyZXNzKCBFbWFpbCA9PiAkQWRkcmVzcyApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEFERFJFU1MgaWYgISRFbWFpbDsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9LT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRFbWFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBRERSRVNTIGlmICRJc0xvY2FsOwogICAgICAgICAgICAgICAgICAgICAgICAkUmVjaXBpZW50Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRSZWNpcGllbnRDb3VudCA+IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgdW5zaGlmdCgKICAgICAgICAgICAgICAgICAgICAgICAgQFN0YW5kYXJkUmVzcG9uc2VBcnJheVJlcGx5QWxsLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAnMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnLSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUmVwbHkgQWxsJykgLiAnIC0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zZUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICA9PiAnUmVzcG9uc2VJREFsbCcgLiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxAU3RhbmRhcmRSZXNwb25zZUFycmF5UmVwbHlBbGwsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlICAgICAgICAgICAgICA9PiAnRHJvcGRvd24nLAogICAgICAgICAgICAgICAgICAgICAgICBEcm9wZG93blR5cGUgICAgICAgICAgPT4gJ1JlcGx5JywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRSZXNwb25zZXNTdHJnID0+ICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcsCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnUmVwbHkgQWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgID0+ICdBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgPT4gJ0FnZW50VGlja2V0Q29tcG9zZScsCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICA9PiAnUmVwbHlBbGwnIC4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmVwbHlBbGwgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlRWxlbWVudElEICAgICA9PiAnUmVzcG9uc2VJREFsbCcgLiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgZm9yd2FyZCBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgICAgICMgKG9ubHkgc2hvdyBmb3J3YXJkIG9uIGVtYWlsLWV4dGVybmFsLCBlbWFpbC1pbnRlcm5hbCwgcGhvbmUsIHdlYnJlcXVlc3QgYW5kIGZheAogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Rm9yd2FyZH0KICAgICAgICAgICAgJiYgJEFjbEFjdGlvbkxvb2t1cHtBZ2VudFRpY2tldEZvcndhcmR9CiAgICAgICAgICAgICYmICRBcnRpY2xle0FydGljbGVUeXBlfSA9fiAvXihlbWFpbC1leHRlcm5hbHxlbWFpbC1pbnRlcm5hbHxwaG9uZXx3ZWJyZXF1ZXN0fGZheCkkL2kKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRGb3J3YXJkJyk7CiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICAgICAgbXkgJE9LID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkT0sgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrR2V0KCBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSApICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJEFjY2VzcykgewoKICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQYXJhbXtTdGFuZGFyZEZvcndhcmRzfSApICkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBTdGFuZGFyZEZvcndhcmRzU3RyZwogICAgICAgICAgICAgICAgICAgIG15ICVTdGFuZGFyZEZvcndhcmRIYXNoID0gJXsgJFBhcmFte1N0YW5kYXJkRm9yd2FyZHN9IH07CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IHJldmVycyBAU3RhbmRhcmRGb3J3YXJkSGFzaCBiZWNhdXNlIHdlIG5lZWQgdG8gc29ydCBieSBWYWx1ZXMKICAgICAgICAgICAgICAgICAgICAjIGZyb20gJVJldmVyc2VTdGFuZGFyRm9yd2FyZCB3ZSBnZXQgdmFsdWUgb2YgS2V5IGJ5ICVTdGFuZGFyZEZvcndhcmRIYXNoIFZhbHVlCiAgICAgICAgICAgICAgICAgICAgIyBhbmQgQFN0YW5kYXJkRm9yd2FyZEFycmF5IGlzIGNyZWF0ZWQgYXMgYXJyYXkgb2YgaGFzaGVzIHdpdGggZWxlbWVudHMgS2V5IGFuZCBWYWx1ZQogICAgICAgICAgICAgICAgICAgIG15ICVSZXZlcnNlU3RhbmRhckZvcndhcmQgPSByZXZlcnNlICVTdGFuZGFyZEZvcndhcmRIYXNoOwogICAgICAgICAgICAgICAgICAgIG15IEBTdGFuZGFyZEZvcndhcmRBcnJheSAgPSBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkUmV2ZXJzZVN0YW5kYXJGb3J3YXJkeyRffSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRfCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IHNvcnQgdmFsdWVzICVTdGFuZGFyZEZvcndhcmRIYXNoOwoKICAgICAgICAgICAgICAgICAgICB1bnNoaWZ0KAogICAgICAgICAgICAgICAgICAgICAgICBAU3RhbmRhcmRGb3J3YXJkQXJyYXksCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICctICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdGb3J3YXJkJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcgLScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBidWlsZCBodG1sIHN0cmluZwogICAgICAgICAgICAgICAgICAgIG15ICRTdGFuZGFyZEZvcndhcmRzU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZvcndhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICA9PiAnRm9yd2FyZFRlbXBsYXRlSUQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxAU3RhbmRhcmRGb3J3YXJkQXJyYXksCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlICAgICAgICAgICAgID0+ICdEcm9wZG93bicsCiAgICAgICAgICAgICAgICAgICAgICAgIERyb3Bkb3duVHlwZSAgICAgICAgID0+ICdGb3J3YXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRGb3J3YXJkc1N0cmcgPT4gJFN0YW5kYXJkRm9yd2FyZHNTdHJnLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICA9PiAnRm9yd2FyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgID0+ICdBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICA9PiAnQWdlbnRUaWNrZXRGb3J3YXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgPT4gJ0ZvcndhcmQnIC4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9yd2FyZEVsZW1lbnRJRCAgICAgPT4gJ0ZvcndhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICAgICAgICAgICAgICBJdGVtVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdGb3J3YXJkIGFydGljbGUgdmlhIG1haWwnLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRm9yd2FyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aW9uPUFnZW50VGlja2V0Rm9yd2FyZDtUaWNrZXRJRD0kVGlja2V0e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGV7QXJ0aWNsZUlEfSIKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGJvdW5jZSBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgICAgICMgKG9ubHkgc2hvdyBmb3J3YXJkIG9uIGVtYWlsLWV4dGVybmFsIGFuZCBlbWFpbC1pbnRlcm5hbAogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Qm91bmNlfQogICAgICAgICAgICAmJiAkQWNsQWN0aW9uTG9va3Vwe0FnZW50VGlja2V0Qm91bmNlfQogICAgICAgICAgICAmJiAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gPX4gL14oZW1haWwtZXh0ZXJuYWx8ZW1haWwtaW50ZXJuYWwpJC9pCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Qm91bmNlJyk7CiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICAgICAgbXkgJE9LID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkT0sgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UmVxdWlyZWRMb2NrfSApIHsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrR2V0KCBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSApICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJEFjY2VzcykgewoKICAgICAgICAgICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICAgICAgICAgIEl0ZW1UeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQm91bmNlIEFydGljbGUgdG8gYSBkaWZmZXJlbnQgbWFpbCBhZGRyZXNzJywKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnQm91bmNlJywKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpb249QWdlbnRUaWNrZXRCb3VuY2U7VGlja2V0SUQ9JFRpY2tldHtUaWNrZXRJRH07QXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH0iCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgc3BsaXQgbGluayBzaG91bGQgYmUgc2hvd24KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQaG9uZX0KICAgICAgICAmJiAkQWNsQWN0aW9uTG9va3Vwe0FnZW50VGlja2V0UGhvbmV9CiAgICAgICAgJiYgJEFydGljbGV7QXJ0aWNsZVR5cGV9ICF+IC9eKGNoYXQtZXh0ZXJuYWx8Y2hhdC1pbnRlcm5hbCkkL2kKICAgICAgICApCiAgICB7CgogICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICBJdGVtVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdTcGxpdCB0aGlzIGFydGljbGUnLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnU3BsaXQnLAogICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAiQWN0aW9uPUFnZW50VGlja2V0UGhvbmU7VGlja2V0SUQ9JFRpY2tldHtUaWNrZXRJRH07QXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH07TGlua1RpY2tldElEPSRUaWNrZXR7VGlja2V0SUR9IgogICAgICAgIH07CiAgICB9CgogICAgIyBjaGVjayBpZiBwcmludCBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFByaW50fQogICAgICAgICYmICRBY2xBY3Rpb25Mb29rdXB7QWdlbnRUaWNrZXRQcmludH0KICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJE9LID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCRPSykgewoKICAgICAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgICAgICBJdGVtVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUHJpbnQgdGhpcyBhcnRpY2xlJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcmludCcsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAiQWN0aW9uPUFnZW50VGlja2V0UHJpbnQ7VGlja2V0SUQ9JFRpY2tldHtUaWNrZXRJRH07QXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH0iCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgcGxhaW4gbGluayBzaG91bGQgYmUgc2hvd24KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQbGFpbn0KICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGxhaW5WaWV3JykKICAgICAgICAmJiAkQWNsQWN0aW9uTG9va3Vwe0FnZW50VGlja2V0UGxhaW59CiAgICAgICAgJiYgJEFydGljbGV7QXJ0aWNsZVR5cGV9ID1+IC9lbWFpbC9pCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRPSyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICgkT0spIHsKCiAgICAgICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICAgICAgSXRlbVR5cGUgICAgPT4gJ0xpbmsnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1ZpZXcgdGhlIHNvdXJjZSBmb3IgdGhpcyBBcnRpY2xlJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQbGFpbiBGb3JtYXQnLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgIkFjdGlvbj1BZ2VudFRpY2tldFBsYWluO1RpY2tldElEPSRUaWNrZXR7VGlja2V0SUR9O0FydGljbGVJRD0kQXJ0aWNsZXtBcnRpY2xlSUR9IiwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgIyBPd25lciBhbmQgUmVzcG9uc2libGUgY2FuIG1hcmsgYXJ0aWNsZXMgYXMgaW1wb3J0YW50IG9yIHJlbW92ZSBtYXJrCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntVc2VySUR9ID09ICRUaWNrZXR7T3duZXJJRH0KICAgICAgICB8fCAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAgICAgJiYgJFNlbGYtPntVc2VySUR9ID09ICRUaWNrZXR7UmVzcG9uc2libGVJRH0KICAgICAgICApCiAgICAgICAgKQogICAgewoKICAgICAgICAjIEFsd2F5cyB1c2UgdXNlciBpZCAxIGJlY2F1c2Ugb3RoZXIgdXNlcnMgYWxzbyBoYXZlIHRvIHNlZSB0aGUgaW1wb3J0YW50IGZsYWcKICAgICAgICBteSAlQXJ0aWNsZUZsYWdzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRmxhZ0dldCgKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRBcnRpY2xlSXNJbXBvcnRhbnQgPSAkQXJ0aWNsZUZsYWdze0ltcG9ydGFudH07CgogICAgICAgIG15ICRMaW5rCiAgICAgICAgICAgID0gIkFjdGlvbj1BZ2VudFRpY2tldFpvb207U3ViYWN0aW9uPU1hcmtBc0ltcG9ydGFudDtUaWNrZXRJRD0kVGlja2V0e1RpY2tldElEfTtBcnRpY2xlSUQ9JEFydGljbGV7QXJ0aWNsZUlEfSI7CiAgICAgICAgbXkgJERlc2NyaXB0aW9uID0gJ01hcmsnOwogICAgICAgIGlmICgkQXJ0aWNsZUlzSW1wb3J0YW50KSB7CiAgICAgICAgICAgICREZXNjcmlwdGlvbiA9ICdVbm1hcmsnOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgaW1wb3J0YW50IG1lbnUgaXRlbQogICAgICAgIHB1c2ggQE1lbnVJdGVtcywgewogICAgICAgICAgICBJdGVtVHlwZSAgICA9PiAnTGluaycsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICREZXNjcmlwdGlvbiwKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJERlc2NyaXB0aW9uLAogICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGluaywKICAgICAgICB9OwogICAgfQoKICAgICMgY2hlY2sgaWYgaW50ZXJuYWwgcmVwbHkgbGluayBzaG91bGQgYmUgc2hvd24KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXROb3RlfQogICAgICAgICYmICRBY2xBY3Rpb25Mb29rdXB7QWdlbnRUaWNrZXROb3RlfQogICAgICAgICYmICRBcnRpY2xle0FydGljbGVUeXBlfSA9fiAvXm5vdGUtKGludGVybmFsfGV4dGVybmFsKSQvaQogICAgICAgICkKICAgIHsKCiAgICAgICAgbXkgJExpbmsgICAgICAgID0gIkFjdGlvbj1BZ2VudFRpY2tldE5vdGU7VGlja2V0SUQ9JFRpY2tldHtUaWNrZXRJRH07UmVwbHlUb0FydGljbGU9JEFydGljbGV7QXJ0aWNsZUlEfSI7CiAgICAgICAgbXkgJERlc2NyaXB0aW9uID0gJ1JlcGx5IHRvIG5vdGUnOwoKICAgICAgICAjIHNldCBpbXBvcnRhbnQgbWVudSBpdGVtCiAgICAgICAgcHVzaCBATWVudUl0ZW1zLCB7CiAgICAgICAgICAgIEl0ZW1UeXBlICAgID0+ICdMaW5rJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJERlc2NyaXB0aW9uLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAkRGVzY3JpcHRpb24sCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICdBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24nLAogICAgICAgICAgICBMaW5rICAgICAgICA9PiAkTGluaywKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiBATWVudUl0ZW1zOwp9CgpzdWIgX0NvbGxlY3RBcnRpY2xlQXR0YWNobWVudHMgewoKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUFydGljbGUgPSAleyAkUGFyYW17QXJ0aWNsZX0gfTsKCiAgICBteSAlQXR0YWNobWVudHM7CgogICAgIyBkb3dubG9hZCB0eXBlCiAgICBteSAkVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBdHRhY2htZW50RG93bmxvYWRUeXBlJykgfHwgJ2F0dGFjaG1lbnQnOwoKICAgICRBcnRpY2xle0F0bUNvdW50fSA9IHNjYWxhciBrZXlzICV7ICRBcnRpY2xle0F0bXN9IC8vIHt9IH07CgogICAgIyBpZiBhdHRhY2htZW50IHdpbGwgYmUgZm9yY2VkIHRvIGRvd25sb2FkLCBkb24ndCBvcGVuIGEgbmV3IGRvd25sb2FkIHdpbmRvdyEKICAgIG15ICRUYXJnZXQgPSAndGFyZ2V0PSJBdHRhY2htZW50V2luZG93IiAnOwogICAgaWYgKCAkVHlwZSA9fiAvaW5saW5lL2kgKSB7CiAgICAgICAgJFRhcmdldCA9ICd0YXJnZXQ9ImF0dGFjaG1lbnQiICc7CiAgICB9CgogICAgJEF0dGFjaG1lbnRze1pvb21BdHRhY2htZW50RGlzcGxheUNvdW50fSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Olpvb21BdHRhY2htZW50RGlzcGxheUNvdW50Jyk7CgogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkRmlsZUlEICggc29ydCBrZXlzICV7ICRBcnRpY2xle0F0bXN9IH0gKSB7CiAgICAgICAgcHVzaCBAeyAkQXR0YWNobWVudHN7RmlsZXN9IH0sIHsKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICV7ICRBcnRpY2xle0F0bXN9LT57JEZpbGVJRH0gfSwKICAgICAgICAgICAgRmlsZUlEID0+ICRGaWxlSUQsCiAgICAgICAgICAgIFRhcmdldCA9PiAkVGFyZ2V0LAogICAgICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlQXR0YWNobWVudHM7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyVGlja2V0UHJpbnQucG0gLSBwcmludCBsYXlvdXQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi80NzhlZTY2NWM1MzViNjgwMjljZWQ0ZGNhMTk3YjUyMzViN2IxOTJmL0tlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyVGlja2V0UHJpbnQucG0KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFByaW50OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQREY7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE5lZWRlZCAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgQ29uZmlnT2JqZWN0IE1haW5PYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICROZWVkZWQhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VXNlck9iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57UERGT2JqZWN0fSAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpQREYtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0JhY2tlbmRPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCB0aGUgY29uZmlndXJhdGlvbiB0byBjaGVjayBmb3IgcHJpbnRhYmxlIG9iamVjdHMKICAgICRTZWxmLT57Q29uZmlnfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldFpvb20iKTsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZEZpbHRlcn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRQcmludCIpLT57RHluYW1pY0ZpZWxkfTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0OwogICAgbXkgJFF1ZXVlSUQ7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdOZWVkIFRpY2tldElEIScgKTsKICAgIH0KICAgICRRdWV1ZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRRdWV1ZUlEKCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgaWYgKCAhJFF1ZXVlSUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gJ05lZWQgVGlja2V0SUQhJyApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIGlmICgKICAgICAgICAhJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRDdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICApCiAgICAgICAgKQogICAgewoKICAgICAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lck5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgfQoKICAgICMgZ2V0IGNvbnRlbnQKICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKIyAtLS0KICAgICk7CiMgLS0tCiMgSVRTTQojIC0tLQoKICAgICMgc2V0IGNyaXRpY2FsaXR5IGFuZCBpbXBhY3QKICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJFRpY2tldHtEeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5fSB8fCAnLSc7CiAgICAkVGlja2V0e0ltcGFjdH0gICAgICA9ICRUaWNrZXR7RHluYW1pY0ZpZWxkX0lUU01JbXBhY3R9ICAgICAgfHwgJy0nOwojIC0tLQogICAgbXkgQEN1c3RvbWVyQXJ0aWNsZVR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxpc3QoIFR5cGUgPT4gJ0N1c3RvbWVyJyApOwogICAgbXkgQEFydGljbGVCb3ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZVR5cGUgICAgICAgICAgICAgICAgPT4gXEBDdXN0b21lckFydGljbGVUeXBlcywKICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgICA9PiAwLAogICAgKTsKCiAgICAjIGN1c3RvbWVyIGluZm8KICAgIG15ICVDdXN0b21lckRhdGE7CiAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFRpY2tldHtDdXN0b21lcklEfSApIHsKICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBDdXN0b21lcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHNvbWUgaHRtbCBxdW90aW5nCiAgICAkVGlja2V0e0FnZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKAogICAgICAgIEFnZSAgID0+ICRUaWNrZXR7QWdlfSwKICAgICAgICBTcGFjZSA9PiAnICcKICAgICk7CiAgICBpZiAoICRUaWNrZXR7VW50aWxUaW1lfSApIHsKICAgICAgICAkVGlja2V0e1BlbmRpbmdVbnRpbH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1VudGlsVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFRpY2tldHtQZW5kaW5nVW50aWx9ID0gJy0nOwogICAgfQoKICAgICMgZ2VuZXJhdGUgcGRmIG91dHB1dAogICAgaWYgKCAkU2VsZi0+e1BERk9iamVjdH0gKSB7CiAgICAgICAgbXkgJFByaW50ZWRCeSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdwcmludGVkIGJ5Jyk7CiAgICAgICAgbXkgJFRpbWUgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1RpbWV9OwogICAgICAgIG15ICVQYWdlOwoKICAgICAgICAjIGdldCBtYXhpbXVtIG51bWJlciBvZiBwYWdlcwogICAgICAgICRQYWdle01heFBhZ2VzfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQREY6Ok1heFBhZ2VzJyk7CiAgICAgICAgaWYgKCAhJFBhZ2V7TWF4UGFnZXN9IHx8ICRQYWdle01heFBhZ2VzfSA8IDEgfHwgJFBhZ2V7TWF4UGFnZXN9ID4gMTAwMCApIHsKICAgICAgICAgICAgJFBhZ2V7TWF4UGFnZXN9ID0gMTAwOwogICAgICAgIH0KICAgICAgICBteSAkSGVhZGVyUmlnaHQgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6SG9vaycpIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9OwogICAgICAgIG15ICRIZWFkbGluZUxlZnQgPSAkSGVhZGVyUmlnaHQ7CiAgICAgICAgbXkgJFRpdGxlICAgICAgICA9ICRIZWFkZXJSaWdodDsKICAgICAgICBpZiAoICRUaWNrZXR7VGl0bGV9ICkgewogICAgICAgICAgICAkSGVhZGxpbmVMZWZ0ID0gJFRpY2tldHtUaXRsZX07CiAgICAgICAgICAgICRUaXRsZSAuPSAnIC8gJyAuICRUaWNrZXR7VGl0bGV9OwogICAgICAgIH0KCiAgICAgICAgJFBhZ2V7TWFyZ2luVG9wfSAgICAgPSAzMDsKICAgICAgICAkUGFnZXtNYXJnaW5SaWdodH0gICA9IDQwOwogICAgICAgICRQYWdle01hcmdpbkJvdHRvbX0gID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luTGVmdH0gICAgPSA0MDsKICAgICAgICAkUGFnZXtIZWFkZXJSaWdodH0gICA9ICRIZWFkZXJSaWdodDsKICAgICAgICAkUGFnZXtIZWFkbGluZUxlZnR9ICA9ICRIZWFkbGluZUxlZnQ7CiAgICAgICAgJFBhZ2V7SGVhZGxpbmVSaWdodH0gPSAkUHJpbnRlZEJ5IC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckxhc3RuYW1lfSAuICcgKCcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJFbWFpbH0gLiAnKSAnCiAgICAgICAgICAgIC4gJFRpbWU7CiAgICAgICAgJFBhZ2V7Rm9vdGVyTGVmdH0gPSAnJzsKICAgICAgICAkUGFnZXtQYWdlVGV4dH0gICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdQYWdlJyk7CiAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSAgPSAxOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgcGRmIGRvY3VtZW50CiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Eb2N1bWVudE5ldygKICAgICAgICAgICAgVGl0bGUgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcm9kdWN0JykgLiAnOiAnIC4gJFRpdGxlLAogICAgICAgICAgICBFbmNvZGUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGZpcnN0IHBkZiBwYWdlCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKCiAgICAgICAgIyB0eXBlIG9mIHByaW50IHRhZwogICAgICAgIG15ICRQcmludFRhZyA9ICcnOwoKICAgICAgICAkUHJpbnRUYWcgPSAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdUaWNrZXQnKSApIC4gJyAnIC4KICAgICAgICAgICAgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUHJpbnQnKSApOwoKICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJFByaW50VGFnLAogICAgICAgICAgICBIZWlnaHQgICA9PiA5LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGQnLAogICAgICAgICAgICBBbGlnbiAgICA9PiAncmlnaHQnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA5LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTYsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGlja2V0IGluZm9zCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRUaWNrZXRJbmZvcygKICAgICAgICAgICAgUGFnZURhdGEgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGlja2V0IGR5bmFtaWMgZmllbGRzCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRUaWNrZXREeW5hbWljRmllbGRzKAogICAgICAgICAgICBQYWdlRGF0YSAgID0+IFwlUGFnZSwKICAgICAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBjdXN0b21lciBpbmZvcwogICAgICAgIGlmICglQ3VzdG9tZXJEYXRhKSB7CiAgICAgICAgICAgICRTZWxmLT5fUERGT3V0cHV0Q3VzdG9tZXJJbmZvcygKICAgICAgICAgICAgICAgIFBhZ2VEYXRhICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBhcnRpY2xlcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0QXJ0aWNsZXMoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgID0+IFwlUGFnZSwKICAgICAgICAgICAgQXJ0aWNsZURhdGEgPT4gXEBBcnRpY2xlQm94LAogICAgICAgICk7CgogICAgICAgICMgcmV0dXJuIHRoZSBwZGYgZG9jdW1lbnQKICAgICAgICBteSAkRmlsZW5hbWUgPSAnVGlja2V0XycgLiAkVGlja2V0e1RpY2tldE51bWJlcn07CiAgICAgICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICk7CiAgICAgICAgJE0gPSBzcHJpbnRmKCAiJTAyZCIsICRNICk7CiAgICAgICAgJEQgPSBzcHJpbnRmKCAiJTAyZCIsICREICk7CiAgICAgICAgJGggPSBzcHJpbnRmKCAiJTAyZCIsICRoICk7CiAgICAgICAgJG0gPSBzcHJpbnRmKCAiJTAyZCIsICRtICk7CiAgICAgICAgbXkgJFBERlN0cmluZyA9ICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnRPdXRwdXQoKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUgLiAiXyIgLiAiJFktJE0tJEQiIC4gIl8iIC4gIiRoLSRtLnBkZiIsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJhcHBsaWNhdGlvbi9wZGYiLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkUERGU3RyaW5nLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2VuZXJhdGUgaHRtbCBvdXRwdXQKICAgIGVsc2UgewoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRIZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwoKICAgICAgICAjIG91dHB1dCBjdXN0b21lciBpbmZvcwogICAgICAgIGlmICglQ3VzdG9tZXJEYXRhKSB7CiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclRhYmxlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRDdXN0b21lclZpZXdUYWJsZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICAgICBNYXggID0+IDEwMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyB0aWNrZXQKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fSFRNTE1hc2soCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFydGljbGVCb3ggPT4gXEBBcnRpY2xlQm94LAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50Rm9vdGVyKCk7CgogICAgICAgICMgcmV0dXJuIG91dHB1dAogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX1BERk91dHB1dFRpY2tldEluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBUaWNrZXREYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVUaWNrZXQgPSAleyAkUGFyYW17VGlja2V0RGF0YX0gfTsKICAgIG15ICVQYWdlICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CgogICAgIyBjcmVhdGUgbGVmdCB0YWJsZQogICAgbXkgJFRhYmxlTGVmdCA9IFtdOwoKICAgICMgYWRkIHRpY2tldCBkYXRhLCByZXNwZWN0aW5nIEF0dHJpYnV0ZXNWaWV3IGNvbmZpZ3VyYXRpb24KIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFN0YXRlIFByaW9yaXR5IFF1ZXVlIE93bmVyKSkgewogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFN0YXRlIFF1ZXVlIE93bmVyKSkgewojIC0tLQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57JEF0dHJpYnV0ZX0gKSB7CiAgICAgICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkQXR0cmlidXRlKSAuICc6JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkVGlja2V0eyRBdHRyaWJ1dGV9ICkKICAgICAgICAgICAgICAgICAgICB8fCAkVGlja2V0eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICB9OwogICAgICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHRpY2tldCByZXNwb25zaWJsZQogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJgogICAgICAgICRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+e1Jlc3BvbnNpYmxlfQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUmVzcG9uc2libGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtSZXNwb25zaWJsZX0sCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgdHlwZSByb3csIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57VHlwZX0gKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1R5cGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtUeXBlfSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlTGVmdH0sICRSb3cgKTsKICAgIH0KCiAgICAjIGFkZCBzZXJ2aWNlIHJvdywgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57U2VydmljZX0KICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJFJvd1NlcnZpY2UgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTZXJ2aWNlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7U2VydmljZX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NlcnZpY2UgKTsKICAgIH0KCiAgICAjIGFkZCBzbGEgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+e1NMQX0gKQogICAgewogICAgICAgIG15ICRSb3dTTEEgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdTTEEnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtTTEF9IHx8ICctJywKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlTGVmdH0sICRSb3dTTEEgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICBteSAkVGFibGVMZWZ0RXh0ZW5kZWQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NyaXRpY2FsaXR5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRUaWNrZXR7Q3JpdGljYWxpdHl9KSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdJbXBhY3QnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFRpY2tldHtJbXBhY3R9KSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdQcmlvcml0eScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgkVGlja2V0e1ByaW9yaXR5fSksCiAgICAgICAgfSwKICAgIF07CiAgICBwdXNoIEB7JFRhYmxlTGVmdH0sIEB7JFRhYmxlTGVmdEV4dGVuZGVkfTsKIyAtLS0KCiAgICAjIGNyZWF0ZSByaWdodCB0YWJsZQogICAgbXkgJFRhYmxlUmlnaHQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3VzdG9tZXJJRCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQWdlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkVGlja2V0e0FnZX0gKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NyZWF0ZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgJFRpY2tldHtDcmVhdGVkfSwKICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JywKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgXTsKCiAgICBteSAkUm93cyA9IEB7JFRhYmxlTGVmdH07CiAgICBpZiAoIEB7JFRhYmxlUmlnaHR9ID4gJFJvd3MgKSB7CiAgICAgICAgJFJvd3MgPSBAeyRUYWJsZVJpZ2h0fTsKICAgIH0KCiAgICBteSAlVGFibGVQYXJhbTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57VmFsdWV9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtDb250ZW50fSAgICAgICAgID0gJyAnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNGRkZGRkYnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzRde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57VmFsdWV9OwogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gMTcwLjU7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsyXXtXaWR0aH0gPSA0OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bM117V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVs0XXtXaWR0aH0gPSAxNzAuNTsKCiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgPSA2OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yRXZlbn0gPSAnI0FBQUFBQSc7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3JPZGR9ICA9ICcjREREREREJzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgICAgID0gMTsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgID0gMzsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgUEFHRToKICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgbGFzdCBQQUdFOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgJVBhZ2UsCiAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0RHluYW1pY0ZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFnZURhdGEgVGlja2V0RGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkT3V0cHV0ID0gMDsKICAgIG15ICVUaWNrZXQgPSAleyAkUGFyYW17VGlja2V0RGF0YX0gfTsKICAgIG15ICVQYWdlICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93ID0gMDsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGQgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ1RpY2tldCddLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkRmlsdGVyfSB8fCB7fSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSB0YWJsZQogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBza2lwIGR5bmFtaWMgZmllbGQgaWYgaXMgbm90IGRlc2luZ2VkIGZvciBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBteSAkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUnLAogICAgICAgICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZTsKCiAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWYWx1ZTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgIiI7CgogICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIEhUTUxPdXRwdXQgICAgICAgICA9PiAwLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICk7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKQogICAgICAgICAgICAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFZhbHVlU3RyZy0+e1ZhbHVlfTsKCiAgICAgICAgJFJvdysrOwogICAgICAgICRPdXRwdXQgPSAxOwogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgb3V0cHV0IHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnVGlja2V0IER5bmFtaWMgRmllbGRzJyksCiAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNCwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcwogICAgICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZQogICAgICAgIFBBR0U6CiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3QgUEFHRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dEN1c3RvbWVySW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIEN1c3RvbWVyRGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkT3V0cHV0ICAgICAgID0gMDsKICAgIG15ICVDdXN0b21lckRhdGEgPSAleyAkUGFyYW17Q3VzdG9tZXJEYXRhfSB9OwogICAgbXkgJVBhZ2UgICAgICAgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CiAgICBteSAkTWFwID0gJEN1c3RvbWVyRGF0YXtDb25maWd9LT57TWFwfTsKCiAgICAjIGNoZWNrIGlmIGN1c3RvbWVyIGNvbXBhbnkgc3VwcG9ydCBpcyBlbmFibGVkCiAgICBpZiAoICRDdXN0b21lckRhdGF7Q29uZmlnfS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9ICkgewogICAgICAgIG15ICRNYXAyID0gJEN1c3RvbWVyRGF0YXtDb21wYW55Q29uZmlnfS0+e01hcH07CiAgICAgICAgaWYgKCRNYXAyKSB7CiAgICAgICAgICAgIHB1c2goIEB7JE1hcH0sIEB7JE1hcDJ9ICk7CiAgICAgICAgfQogICAgfQogICAgZm9yIG15ICRGaWVsZCAoIEB7JE1hcH0gKSB7CiAgICAgICAgaWYgKCAkeyRGaWVsZH1bM10gJiYgJEN1c3RvbWVyRGF0YXsgJHskRmllbGR9WzBdIH0gKSB7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJHskRmllbGR9WzFdICkgLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEN1c3RvbWVyRGF0YXsgJHskRmllbGR9WzBdIH07CgogICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgICRPdXRwdXQgPSAxOwogICAgICAgIH0KICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgIGlmICgkT3V0cHV0KSB7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC0xNSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0N1c3RvbWVyIEluZm9ybWF0aW9uJyksCiAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNCwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcwogICAgICAgICRUYWJsZVBhcmFte1R5cGV9ICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgPSAzOwoKICAgICAgICAjIG91dHB1dCB0YWJsZQogICAgICAgIFBBR0U6CiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3QgUEFHRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1BERk91dHB1dEFydGljbGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBBcnRpY2xlRGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlUGFnZSA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICBteSAkQXJ0aWNsZUNvdW50ZXIgPSAxOwogICAgZm9yIG15ICRBcnRpY2xlVG1wICggQHsgJFBhcmFte0FydGljbGVEYXRhfSB9ICkgewogICAgICAgIGlmICggJEFydGljbGVDb3VudGVyID09IDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICAgICAgVGV4dCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0FydGljbGVzJyksCiAgICAgICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgICAgICBZICAgID0+IDIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAlQXJ0aWNsZSA9ICV7JEFydGljbGVUbXB9OwoKICAgICAgICAjIGdldCBhdHRhY2htZW50IHN0cmluZwogICAgICAgIG15ICVBdG1JbmRleCA9ICgpOwogICAgICAgIGlmICggJEFydGljbGV7QXRtc30gKSB7CiAgICAgICAgICAgICVBdG1JbmRleCA9ICV7ICRBcnRpY2xle0F0bXN9IH07CiAgICAgICAgfQogICAgICAgIG15ICRBdHRhY2htZW50czsKICAgICAgICBmb3IgbXkgJEZpbGVJRCAoIHNvcnQga2V5cyAlQXRtSW5kZXggKSB7CiAgICAgICAgICAgIG15ICVGaWxlID0gJXsgJEF0bUluZGV4eyRGaWxlSUR9IH07CiAgICAgICAgICAgICRBdHRhY2htZW50cyAuPSAkRmlsZXtGaWxlbmFtZX0gLiAnICgnIC4gJEZpbGV7RmlsZXNpemV9IC4gIilcbiI7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIGFydGljbGUgaW5mbyB0YWJsZQogICAgICAgIG15ICVUYWJsZVBhcmFtMTsKICAgICAgICBteSAkUm93ID0gMDsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTYsCiAgICAgICAgKTsKCiAgICAgICAgIyBhcnRpY2xlIG51bWJlciB0YWcKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICcgICAgIyAnIC4gJEFydGljbGVDb3VudGVyLAogICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gMiwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAocXcoRnJvbSBUbyBDYyBTdWJqZWN0KSkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xleyRQYXJhbWV0ZXJ9ICkgewogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFBhcmFtZXRlcikgLiAnOic7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRBcnRpY2xleyRQYXJhbWV0ZXJ9OwogICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3JlYXRlZCcpIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgJEFydGljbGV7Q3JlYXRlZH0sCiAgICAgICAgICAgICdEYXRlRm9ybWF0JywKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fQogICAgICAgICAgICAuPSAnICcgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYnknKTsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9CiAgICAgICAgICAgIC49ICcgJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkQXJ0aWNsZXtTZW5kZXJUeXBlfSApOwogICAgICAgICRSb3crKzsKCiAgICAgICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICAgICAgT2JqZWN0VHlwZSAgPT4gWydBcnRpY2xlJ10sCiAgICAgICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkRmlsdGVyfSB8fCB7fSwKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIHRhYmxlCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICMgc2tpcCB0aGUgZHluYW1pYyBmaWVsZCBpZiBpcyBub3QgZGVzaW5nZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgICAgICBteSAkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGU7CgogICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJFZhbHVlOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgIiI7CgogICAgICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkVmFsdWVTdHJnID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgSFRNTE91dHB1dCAgICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICkKICAgICAgICAgICAgICAgIC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFZhbHVlU3RyZy0+e1ZhbHVlfTsKICAgICAgICAgICAgJFJvdysrOwogICAgICAgIH0KCiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdUeXBlJykgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRBcnRpY2xle0FydGljbGVUeXBlfSApOwogICAgICAgICRSb3crKzsKCiAgICAgICAgaWYgKCRBdHRhY2htZW50cykgewogICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdBdHRhY2htZW50JykgLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgIGNob21wKCRBdHRhY2htZW50cyk7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQXR0YWNobWVudHM7CiAgICAgICAgfQogICAgICAgICRUYWJsZVBhcmFtMXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICAgICAkVGFibGVQYXJhbTF7Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICApOwoKICAgICAgICAjIHRhYmxlIHBhcmFtcyAoYXJ0aWNsZSBpbmZvcykKICAgICAgICAkVGFibGVQYXJhbTF7VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFtMXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbTF7Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW0xe0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgICAgICRUYWJsZVBhcmFtMXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbTF7UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChhcnRpY2xlIGluZm9zKQogICAgICAgIFBBR0U6CiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0xID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0xLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW0xe1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3QgUEFHRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBcnRpY2xlVHlwZX0gZXEgJ2NoYXQtZXh0ZXJuYWwnIHx8ICRBcnRpY2xle0FydGljbGVUeXBlfSBlcSAnY2hhdC1pbnRlcm5hbCcgKQogICAgICAgIHsKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5EZWNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRBcnRpY2xle0JvZHl9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRMaW5lczsKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRBcnRpY2xle0JvZHl9ICkgKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJExpbmUgKCBAeyAkQXJ0aWNsZXtCb2R5fSB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJExpbmUtPntTeXN0ZW1HZW5lcmF0ZWR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTGluZXMgLj0gJ1snIC4gJExpbmUtPntDcmVhdGVUaW1lfSAuICddICcgLiAkTGluZS0+e01lc3NhZ2VUZXh0fSAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkTGluZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICdbJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGluZS0+e0NyZWF0ZVRpbWV9IC4gJ10gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGluZS0+e0NoYXR0ZXJOYW1lfSAuICcgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGluZS0+e01lc3NhZ2VUZXh0fSAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRBcnRpY2xle0JvZHl9ID0gJExpbmVzOwogICAgICAgIH0KCiAgICAgICAgIyB0YWJsZSBwYXJhbXMgKGFydGljbGUgYm9keSkKICAgICAgICBteSAlVGFibGVQYXJhbTI7CiAgICAgICAgJFRhYmxlUGFyYW0ye0NlbGxEYXRhfVswXVswXXtDb250ZW50fSA9ICRBcnRpY2xle0JvZHl9IHx8ICcgJzsKICAgICAgICAkVGFibGVQYXJhbTJ7VHlwZX0gICAgICAgICAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW0ye0JvcmRlcn0gICAgICAgICAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW0ye0ZvbnR9ICAgICAgICAgICAgICAgICAgICA9ICdNb25vc3BhY2VkJzsKICAgICAgICAkVGFibGVQYXJhbTJ7Rm9udFNpemV9ICAgICAgICAgICAgICAgID0gNzsKICAgICAgICAkVGFibGVQYXJhbTJ7QmFja2dyb3VuZENvbG9yfSAgICAgICAgID0gJyNEREREREQnOwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nfSAgICAgICAgICAgICAgICAgPSA0OwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nVG9wfSAgICAgICAgICAgICAgPSA4OwogICAgICAgICRUYWJsZVBhcmFtMntQYWRkaW5nQm90dG9tfSAgICAgICAgICAgPSA4OwoKICAgICAgICAjIG91dHB1dCB0YWJsZSAoYXJ0aWNsZSBib2R5KQogICAgICAgIFBBR0U6CiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0yID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0yLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW0ye1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3QgUEFHRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwKICAgICAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkQXJ0aWNsZUNvdW50ZXIrKzsKICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX0hUTUxNYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBvdXRwdXQgc3RhdGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57U3RhdGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFN0YXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHByaW9yaXR5CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+e1ByaW9yaXR5fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBxdWV1ZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBdHRyaWJ1dGVzVmlld30tPntRdWV1ZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0UXVldWUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgdHlwZSwgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntBdHRyaWJ1dGVzVmlld30tPntUeXBlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHNlcnZpY2UsIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICYmICRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+e1NlcnZpY2V9CiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gJFBhcmFte1NlcnZpY2V9IHx8ICctJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHNsYSwgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntBdHRyaWJ1dGVzVmlld30tPntTTEF9ICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTTEEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNMQSA9PiAkUGFyYW17U0xBfSB8fCAnLScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBvd25lcgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBdHRyaWJ1dGVzVmlld30tPntPd25lcn0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3duZXInLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgcmVzcG9uc2libGUKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57UmVzcG9uc2libGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFJlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgbXkgJER5bmFtaWNGaWVsZCA9ICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgID0+IFsnVGlja2V0J10sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJFNlbGYtPntEeW5hbWljRmllbGRGaWx0ZXJ9IHx8IHt9LAogICAgKTsKCiAgICAjIGZsYWcgdG8gY29udHJvbCB0aGUgaGVhZGVyIHByaW50CiAgICBteSAkSGVhZGVyRmxhZyA9IDA7CgogICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyREeW5hbWljRmllbGR9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBza2lwIHRoZSBkeW5hbWljIGZpZWxkIGlmIGlzIG5vdCBkZXNpbmdlZCBmb3IgY3VzdG9tZXIgaW50ZXJmYWNlCiAgICAgICAgbXkgJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlJywKICAgICAgICApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGU7CgogICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPlZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWYWx1ZTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgIiI7CgogICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRTZWxmLT57QmFja2VuZE9iamVjdH0tPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIEhUTUxPdXRwdXQgICAgICAgICA9PiAxLAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gMjAsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkaXNwbGF5IHRoZSBoZWFkZXIgb25seSBvbmNlCiAgICAgICAgaWYgKCAhJEhlYWRlckZsYWcgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRIZWFkZXInLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEhlYWRlckZsYWcgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJExhYmVsID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGV4YW1wbGUgb2YgZHluYW1pYyBmaWVsZHMgb3JkZXIgY3VzdG9taXphdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldER5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBhcnRpY2xlIHN0dWZmCiAgICBteSAkU2VsZWN0ZWRBcnRpY2xlSUQgPSAkUGFyYW17QXJ0aWNsZUlEfSB8fCAnJzsKICAgIG15IEBBcnRpY2xlQm94ID0gQHsgJFBhcmFte0FydGljbGVCb3h9IH07CgogICAgIyBnZXQgbGFzdCBjdXN0b21lciBhcnRpY2xlCiAgICBmb3IgbXkgJEFydGljbGVUbXAgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgbXkgJUFydGljbGUgPSAleyRBcnRpY2xlVG1wfTsKCiAgICAgICAgIyBnZXQgYXR0YWNobWVudCBzdHJpbmcKICAgICAgICBteSAlQXRtSW5kZXggPSAoKTsKICAgICAgICBpZiAoICRBcnRpY2xle0F0bXN9ICkgewogICAgICAgICAgICAlQXRtSW5kZXggPSAleyAkQXJ0aWNsZXtBdG1zfSB9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17J0FydGljbGU6OkFUTSd9ID0gJyc7CiAgICAgICAgZm9yIG15ICRGaWxlSUQgKCBzb3J0IGtleXMgJUF0bUluZGV4ICkgewogICAgICAgICAgICBteSAlRmlsZSA9ICV7ICRBdG1JbmRleHskRmlsZUlEfSB9OwogICAgICAgICAgICAkRmlsZXtGaWxlbmFtZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJEZpbGV7RmlsZW5hbWV9ICk7CiAgICAgICAgICAgIG15ICREb3dubG9hZFRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgiRG93bmxvYWQiKTsKICAgICAgICAgICAgJFBhcmFteydBcnRpY2xlOjpBVE0nfQogICAgICAgICAgICAgICAgLj0gJzxhIGhyZWY9IicKICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9CiAgICAgICAgICAgICAgICAuICdBY3Rpb249Q3VzdG9tZXJUaWNrZXRBdHRhY2htZW50OycKICAgICAgICAgICAgICAgIC4gIkFydGljbGVJRD0kQXJ0aWNsZXtBcnRpY2xlSUR9O0ZpbGVJRD0kRmlsZUlEXCIgdGFyZ2V0PVwiYXR0YWNobWVudFwiICIKICAgICAgICAgICAgICAgIC4gInRpdGxlPVwiJERvd25sb2FkVGV4dDogJEZpbGV7RmlsZW5hbWV9XCI+IgogICAgICAgICAgICAgICAgLiAiJEZpbGV7RmlsZW5hbWV9PC9hPiAkRmlsZXtGaWxlc2l6ZX08YnIvPiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRBcnRpY2xle0FydGljbGVUeXBlfSBlcSAnY2hhdC1leHRlcm5hbCcgKSB7CiAgICAgICAgICAgICRBcnRpY2xle0NoYXRNZXNzYWdlc30gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpLT5EZWNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+ICRBcnRpY2xle0JvZHl9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xle0lzQ2hhdH0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgY2hlY2sgaWYganVzdCBhIG9ubHkgaHRtbCBlbWFpbAogICAgICAgICAgICBteSAkTWltZVR5cGVUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja01pbWVUeXBlKAogICAgICAgICAgICAgICAgJVBhcmFtLCAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRNaW1lVHlwZVRleHQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtUZXh0Tm90ZX0gPSAkTWltZVR5cGVUZXh0OwogICAgICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gICA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgaHRtbCBxdW90aW5nCiAgICAgICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICBOZXdMaW5lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld05ld0xpbmUnKSwKICAgICAgICAgICAgICAgICAgICBUZXh0ICAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICAgICAgICAgIFZNYXggICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TGluZXMnKSB8fCA1MDAwLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkbyBzb21lIHN0cmlwcyAmJiBxdW90aW5nCiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCkpIHsKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXskUGFyYW1ldGVyfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFBhcmFtZXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJEFydGljbGV7JFBhcmFtZXRlcn0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgICAgIG15ICREeW5hbWljRmllbGQgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgICAgIE9iamVjdFR5cGUgID0+IFsnQXJ0aWNsZSddLAogICAgICAgICAgICBGaWVsZEZpbHRlciA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZEZpbHRlcn0gfHwge30sCiAgICAgICAgKTsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGlja2V0IG9iamVjdAogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICMgc2tpcCB0aGUgZHluYW1pYyBmaWVsZCBpZiBpcyBub3QgZGVzaW5nZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgICAgICBteSAkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGU7CgogICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJFZhbHVlOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgIiI7CgogICAgICAgICAgICAjIGdldCBwcmludCBzdHJpbmcgZm9yIHRoaXMgZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkVmFsdWVTdHJnID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgSFRNTE91dHB1dCAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJExhYmVsID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAgICAgIyAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAjICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgIyAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyVGlja2V0UHJpbnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKMTsK
IyAtLQojIEFBQUlUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnR0IC0gJFRleHQgdmFyaWFibGUgZmlsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgQ29tbW9uClslIFRyYW5zbGF0ZSgiQWRkIGRlY2lzaW9uIHRvIHRpY2tldCIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIkRlY2lzaW9uIERhdGUiKSB8IGh0bWwgJV0KWyUgVHJhbnNsYXRlKCJEZWNpc2lvbiBSZXN1bHQiKSB8IGh0bWwgJV0KWyUgVHJhbnNsYXRlKCJEdWUgRGF0ZSIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIlJlYXNvbiIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIlJlY292ZXJ5IFN0YXJ0IFRpbWUiKSB8IGh0bWwgJV0KWyUgVHJhbnNsYXRlKCJSZXBhaXIgU3RhcnQgVGltZSIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoIlJldmlldyBSZXF1aXJlZCIpIHwgaHRtbCAlXQpbJSBUcmFuc2xhdGUoImNsb3NlZCB3aXRoIHdvcmthcm91bmQiKSB8IGh0bWwgJV0K
IyAtLQojIEFnZW50VGlja2V0QWN0aW9uQ29tbW9uLnR0IC0gcHJvdmlkZXMgY29tbW9uIEhUTUwgZm9ybSBmb3Igc2V2ZXJhbCBtYXNrcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi80NzhlZTY2NWM1MzViNjgwMjljZWQ0ZGNhMTk3YjUyMzViN2IxOTJmL0tlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9BZ2VudFRpY2tldEFjdGlvbkNvbW1vbi50dAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvcGVydGllcyIpICVdCgo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSIgaWQ9IkNvbXBvc2UiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJSZXBseVRvQXJ0aWNsZSIgdmFsdWU9IlslIERhdGEuUmVwbHlUb0FydGljbGUgfCBodG1sICVdIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmQiIGlkPSJFeHBhbmQiIHZhbHVlPSIiLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSIvPgojIC0tLQojIElUU00KIyAtLS0KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJJbXBhY3RSQyIgbmFtZT0iSW1wYWN0UkMiIHZhbHVlPSIwIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUHJpb3JpdHlSQyIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgIDxoMT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQWdlbnRUaWNrZXRGcmVlVGV4dCIpICVdClslIFRyYW5zbGF0ZSgiQ2hhbmdlIEZyZWUgVGV4dCBvZiBUaWNrZXQiKSB8IGh0bWwgJV06ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldEZyZWVUZXh0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQWdlbnRUaWNrZXRPd25lciIpICVdClslIFRyYW5zbGF0ZSgiQ2hhbmdlIE93bmVyIG9mIFRpY2tldCIpIHwgaHRtbCAlXToKWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckFnZW50VGlja2V0T3duZXIiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldENsb3NlIikgJV0KWyUgVHJhbnNsYXRlKCJDbG9zZSBUaWNrZXQiKSB8IGh0bWwgJV06ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldENsb3NlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQWdlbnRUaWNrZXROb3RlIikgJV0KWyUgVHJhbnNsYXRlKCJBZGQgTm90ZSB0byBUaWNrZXQiKSB8IGh0bWwgJV06ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldE5vdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldFBlbmRpbmciKSAlXQpbJSBUcmFuc2xhdGUoIlNldCBQZW5kaW5nIikgfCBodG1sICVdOgpbJSBSZW5kZXJCbG9ja0VuZCgiSGVhZGVyQWdlbnRUaWNrZXRQZW5kaW5nIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyQWdlbnRUaWNrZXRQcmlvcml0eSIpICVdClslIFRyYW5zbGF0ZSgiQ2hhbmdlIFByaW9yaXR5IG9mIFRpY2tldCIpIHwgaHRtbCAlXToKWyUgUmVuZGVyQmxvY2tFbmQoIkhlYWRlckFnZW50VGlja2V0UHJpb3JpdHkiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldFJlc3BvbnNpYmxlIikgJV0KWyUgVHJhbnNsYXRlKCJDaGFuZ2UgUmVzcG9uc2libGUgb2YgVGlja2V0IikgfCBodG1sICVdOgpbJSBSZW5kZXJCbG9ja0VuZCgiSGVhZGVyQWdlbnRUaWNrZXRSZXNwb25zaWJsZSIpICVdCiMgLS0tCiMgSVRTTQojIC0tLQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJIZWFkZXJBZ2VudFRpY2tldERlY2lzaW9uIikgJV0KICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQ2hhbmdlIERlY2lzaW9uIG9mIFRpY2tldCIpIHwgaHRtbCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiSGVhZGVyQWdlbnRUaWNrZXREZWNpc2lvbiIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkhlYWRlckFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQiKSAlXQogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0IikgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXJBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIikgJV0KIyAtLS0KWyUgRGF0YS5UaWNrZXROdW1iZXIgJV0gLSBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQogICAgICAgICAgICA8L2gxPgogICAgICAgICAgICA8cCBjbGFzcz0iQXN0ZXJpc2tFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJBbGwgZmllbGRzIG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrICgqKSBhcmUgbWFuZGF0b3J5LiIpIHwgaHRtbCAlXTwvcD4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldEJhY2siKSAlXQogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIiBocmVmPSIjIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCAmIGNsb3NlIHdpbmRvdyIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0QmFjayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlByb3BlcnRpZXNMb2NrIikgJV0KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlRoZSB0aWNrZXQgaGFzIGJlZW4gbG9ja2VkIikgfCBodG1sICVdLgogICAgICAgICAgICAgICAgPGEgY2xhc3M9IlVuZG9DbG9zZVBvcHVwIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRMb2NrO1N1YmFjdGlvbj1VbmxvY2s7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCAlXTtbJSBFbnYoIkNoYWxsZW5nZVRva2VuUGFyYW0iKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVW5kbyAmIGNsb3NlIHdpbmRvdyIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3A+ClslIFJlbmRlckJsb2NrRW5kKCJQcm9wZXJ0aWVzTG9jayIpICVdCgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiV2lkZ2V0VGlja2V0QWN0aW9ucyIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBFeHBhbmRlZCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlRpY2tldCBTZXR0aW5ncyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWwiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaXRsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlRpdGxlIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJUaXRsZSIgbmFtZT0iVGl0bGUiIHZhbHVlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuVGl0bGVJbnZhbGlkIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGl0bGUiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlR5cGVJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlR5cGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUeXBlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUeXBlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiQoJyNUeXBlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNDb21wb3NlJyksICdBSkFYVXBkYXRlJywgJ1R5cGVJRCcsIFsgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdOZXdPd25lcklEJywgJ09sZE93bmVySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXdTdGF0ZUlEJywgJ05ld1ByaW9yaXR5SUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdIF0pOwp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJUeXBlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlF1ZXVlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV3UXVldWVJRCI+WyUgVHJhbnNsYXRlKCJRdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlF1ZXVlc1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5ld1F1ZXVlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmV3UXVldWVJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNOZXdRdWV1ZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3UXVldWVJRCcsIFsgJ1R5cGVJRCcsICdTZXJ2aWNlSUQnLCAnTmV3T3duZXJJRCcsICdPbGRPd25lcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV3U3RhdGVJRCcsICdOZXdQcmlvcml0eUlEJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJRdWV1ZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgaW52YWxpZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU2VydmljZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJywgWyAnVHlwZUlEJywgJ1NMQUlEJywgJ05ld093bmVySUQnLCAnT2xkT3duZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05ld1N0YXRlSUQnLCAnTmV3UHJpb3JpdHlJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiMgLS0tCiMgSVRTTQojIC0tLQojICAgIH0pOwoKLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgICAgIC8vIHNob3cgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZQogICAgICAgIElUU00uQWdlbnQuSW5jaWRlbnRTdGF0ZS5TaG93SW5jaWRlbnRTdGF0ZSh7CiAgICAgICAgICAgIEFjdGlvbjogJ1slIEVudigiQWN0aW9uIikgJV0nLAogICAgICAgICAgICBUaWNrZXRJRDogWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0sCiAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgfSk7Cn0pOwojIC0tLQovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPlslIFRyYW5zbGF0ZSgiU2VydmljZSBJbmNpZGVudCBTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciIgY2xhc3M9IlZhbHVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlU2lnbmFsIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZSI+Jm5ic3A7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAtLS0KWyUgUmVuZGVyQmxvY2tFbmQoIlNlcnZpY2UiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU2VydmljZU1hbmRhdG9yeSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlNlcnZpY2VJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgaW52YWxpZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU2VydmljZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJywgWyAnVHlwZUlEJywgJ1NMQUlEJywgJ05ld093bmVySUQnLCAnT2xkT3duZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05ld1N0YXRlSUQnLCAnTmV3UHJpb3JpdHlJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiMgLS0tCiMgSVRTTQojIC0tLQojICAgIH0pOwoKLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgICAgIC8vIHNob3cgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZQogICAgICAgIElUU00uQWdlbnQuSW5jaWRlbnRTdGF0ZS5TaG93SW5jaWRlbnRTdGF0ZSh7CiAgICAgICAgICAgIEFjdGlvbjogJ1slIEVudigiQWN0aW9uIikgJV0nLAogICAgICAgICAgICBUaWNrZXRJRDogWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0sCiAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgfSk7Cn0pOwojIC0tLQovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPlslIFRyYW5zbGF0ZSgiU2VydmljZSBJbmNpZGVudCBTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciIgY2xhc3M9IlZhbHVlIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlU2lnbmFsIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZSI+Jm5ic3A7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAtLS0KWyUgUmVuZGVyQmxvY2tFbmQoIlNlcnZpY2VNYW5kYXRvcnkiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU0xBIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU0xBSUQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TTEFTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU0xBSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ29tcG9zZScpLCAnQUpBWFVwZGF0ZScsICdTTEFJRCcsIFsgJ1R5cGVJRCcsICdTZXJ2aWNlSUQnLCAnTmV3T3duZXJJRCcsICdPbGRPd25lcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV3U3RhdGVJRCcsICdOZXdQcmlvcml0eUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlNMQSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTTEFNYW5kYXRvcnkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTTEFJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgTGV2ZWwgQWdyZWVtZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU0xBU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU0xBSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTTEFJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTTEFJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNDb21wb3NlJyksICdBSkFYVXBkYXRlJywgJ1NMQUlEJywgWyAnVHlwZUlEJywgJ1NlcnZpY2VJRCcsICdOZXdPd25lcklEJywgJ09sZE93bmVySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXdTdGF0ZUlEJywgJ05ld1ByaW9yaXR5SUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdIF0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiU0xBTWFuZGF0b3J5IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk93bmVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV3T3duZXJJRCI+WyUgVHJhbnNsYXRlKCJOZXcgT3duZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOZXdPd25lclR5cGUiIHZhbHVlPSJOZXciIHRpdGxlPSJTZWxlY3QgbmV3IG93bmVyIiBbJSBEYXRhLml0ZW0oIk5ld093bmVyVHlwZTo6TmV3IikgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuT3duZXJTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOZXdPd25lcklEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlBsZWFzZSBzZXQgYSBuZXcgb3duZXIhIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iT2xkT3duZXJJRCI+WyUgVHJhbnNsYXRlKCJQcmV2aW91cyBPd25lciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik9sZCIgdGl0bGU9IlNlbGVjdCBvbGQgb3duZXIiIFslIERhdGEuaXRlbSgiTmV3T3duZXJUeXBlOjpPbGQiKSAlXSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5PbGRPd25lclN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik9sZE93bmVySURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCBhIG5ldyBvd25lciEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjTmV3T3duZXJJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNDb21wb3NlJyksICdBSkFYVXBkYXRlJywgJ05ld093bmVySUQnLCBbICdUeXBlSUQnLCAnU2VydmljZUlEJywgJ1NMQUlEJywgJ09sZE93bmVySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXdTdGF0ZUlEJywgJ05ld1ByaW9yaXR5SUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdIF0pOwogICAgICAgIENvcmUuQWdlbnQuVGlja2V0QWN0aW9uLlNlbGVjdFJhZGlvQnV0dG9uKCdOZXcnLCdOZXdPd25lclR5cGUnKTsKICAgIH0pOwogICAgJCgnI09sZE93bmVySUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ29tcG9zZScpLCAnQUpBWFVwZGF0ZScsICdPbGRPd25lcklEJywgWyAnVHlwZUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdOZXdPd25lcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV3U3RhdGVJRCcsICdOZXdQcmlvcml0eUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKICAgICAgICBDb3JlLkFnZW50LlRpY2tldEFjdGlvbi5TZWxlY3RSYWRpb0J1dHRvbignT2xkJywnTmV3T3duZXJUeXBlJyk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJPd25lciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZXNwb25zaWJsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5ld1Jlc3BvbnNpYmxlSUQiPlslIFRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZXNwb25zaWJsZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNOZXdSZXNwb25zaWJsZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3UmVzcG9uc2libGVJRCcsIFsgJ1R5cGVJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnTmV3T3duZXJJRCcsICdPbGRPd25lcklEJywgJ05ld1N0YXRlSUQnLCAnTmV3UHJpb3JpdHlJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV0gXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJSZXNwb25zaWJsZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGF0ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5ld1N0YXRlSUQiPlslIFRyYW5zbGF0ZSgiTmV4dCBzdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNOZXdTdGF0ZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3U3RhdGVJRCcsIFsnVHlwZUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdOZXdPd25lcklEJywgJ09sZE93bmVySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXdQcmlvcml0eUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YXRlUGVuZGluZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlBlbmRpbmcgZGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5EYXRlU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEYXlTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiRGF0ZSBpbnZhbGlkISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkhvdXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiRGF0ZSBpbnZhbGlkISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkZvciBhbGwgcGVuZGluZyogc3RhdGVzLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXRlUGVuZGluZyIpICVdClslIFJlbmRlckJsb2NrRW5kKCJTdGF0ZSIpICVdCiMgLS0tCiMgSVRTTQojIC0tLQoKIyBzaG93IHRoZSBpbXBhY3QKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9JVFNNSW1wYWN0IikgJV0KIyAtLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIlByaW9yaXR5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV3UHJpb3JpdHlJRCI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Qcmlvcml0eVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNOZXdQcmlvcml0eUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3UHJpb3JpdHlJRCcsIFsnVHlwZUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdOZXdPd25lcklEJywgJ09sZE93bmVySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXdTdGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXSBdKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlByaW9yaXR5IikgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiV2lkZ2V0VGlja2V0QWN0aW9ucyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXaWRnZXREeW5hbWljRmllbGRzIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBFeHBhbmRlZCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJUb2dnbGUgdGhpcyB3aWRnZXQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiRHluYW1pYyBGaWVsZHMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiV2lkZ2V0RHluYW1pY0ZpZWxkcyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJXaWRnZXRBcnRpY2xlIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBbJSBEYXRhLldpZGdldFN0YXR1cyB8IGh0bWwgJV0iIGlkPSJXaWRnZXRBcnRpY2xlIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSB0aGlzIHdpZGdldCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJBZGQgQXJ0aWNsZSIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsIj4KWyUgSUYgRGF0YS5XaWRnZXRTdGF0dXMgPT0gJ0V4cGFuZGVkJyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkNyZWF0ZUFydGljbGUiIG5hbWU9IkNyZWF0ZUFydGljbGUiIHZhbHVlPSIxIiAvPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDcmVhdGVBcnRpY2xlIj5bJSBUcmFuc2xhdGUoIkNyZWF0ZSBhbiBBcnRpY2xlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iQ3JlYXRlQXJ0aWNsZSIgbmFtZT0iQ3JlYXRlQXJ0aWNsZSIgdmFsdWU9IjEiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlN1YmplY3RMYWJlbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdWJqZWN0Ij5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlN1YmplY3RMYWJlbCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlN1YmplY3RMYWJlbE1hbmRhdG9yeSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTdWJqZWN0Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja0VuZCgiU3ViamVjdExhYmVsTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlN1YmplY3QiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSJbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdIiBjbGFzcz0iVzc1cGMgVmFsaWRhdGUgWyUgRGF0YS5TdWJqZWN0SW52YWxpZCAlXSBbJSBEYXRhLlN1YmplY3RSZXF1aXJlZCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlN1YmplY3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU3ViamVjdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRPcHRpb25zIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk9wdGlvbnMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KCjwhLS0gT3V0cHV0RmlsdGVySG9va19UaWNrZXRPcHRpb25zQmVnaW4gLS0+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTcGVsbENoZWNrIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iT3B0aW9uU3BlbGxDaGVjayI+WyBbJSBUcmFuc2xhdGUoIlNwZWxsIGNoZWNrIikgfCBodG1sICVdIF08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJTcGVsbENoZWNrIikgJV0KCjwhLS0gT3V0cHV0RmlsdGVySG9va19UaWNrZXRPcHRpb25zRW5kIC0tPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0T3B0aW9ucyIpICVdCgo8IS0tIE91dHB1dEZpbHRlckhvb2tfTm9UaWNrZXRPcHRpb25zRmFsbGJhY2sgLS0+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGFuZGFyZFRlbXBsYXRlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YW5kYXJkVGVtcGxhdGVJRCI+WyUgVHJhbnNsYXRlKCJUZXh0IFRlbXBsYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFuZGFyZFRlbXBsYXRlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIlNldHRpbmcgYSB0ZW1wbGF0ZSB3aWxsIG92ZXJ3cml0ZSBhbnkgdGV4dCBvciBhdHRhY2htZW50LiIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU3RhbmRhcmRUZW1wbGF0ZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uQ29uZmlybVRlbXBsYXRlT3ZlcndyaXRlKCdSaWNoVGV4dCcsICQodGhpcyksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0NvbXBvc2UnKSwgJ0FKQVhVcGRhdGUnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJywgWydSaWNoVGV4dEZpZWxkJ10pOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUmljaFRleHRMYWJlbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSaWNoVGV4dCI+WyUgVHJhbnNsYXRlKCJUZXh0IikgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrRW5kKCJSaWNoVGV4dExhYmVsIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmljaFRleHRMYWJlbE1hbmRhdG9yeSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJSaWNoVGV4dCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlJpY2hUZXh0TGFiZWxNYW5kYXRvcnkiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0RmllbGQiIGNsYXNzPSJSaWNoVGV4dEZpZWxkIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmljaFRleHQiKSAlXQpbJSBJbnNlcnRUZW1wbGF0ZSgiUmljaFRleHRFZGl0b3IudHQiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiUmljaFRleHQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQiIGNsYXNzPSJSaWNoVGV4dCBWYWxpZGF0ZSBbJSBEYXRhLkJvZHlJbnZhbGlkICVdIFslIERhdGEuQm9keVJlcXVpcmVkICVdIiBuYW1lPSJCb2R5IiByb3dzPSIxNSIgY29scz0iWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUiKSAlXSI+WyUgRGF0YS5Cb2R5IHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBdHRhY2htZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSAoWyUgRGF0YS5GaWxlc2l6ZSB8IGh0bWwgJV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9IkF0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIG5hbWU9IkF0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSIgY2xhc3M9IlNwYWNpbmdMZWZ0Ij5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkF0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIG5hbWU9IkF0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIC8+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXScpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciAkRm9ybSA9ICQoJyNBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykuY2xvc2VzdCgnZm9ybScpOwogICAgICAgICQoJyNBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykudmFsKDEpOwogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgJEZvcm0udHJpZ2dlcignc3VibWl0Jyk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBdHRhY2htZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkZpbGVVcGxvYWQiIGlkPSJGaWxlVXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkF0dGFjaG1lbnRVcGxvYWQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjRmlsZVVwbG9hZCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciAkRm9ybSA9ICQoJyNGaWxlVXBsb2FkJykuY2xvc2VzdCgnZm9ybScpOwogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgJEZvcm0uZmluZCgnI0F0dGFjaG1lbnRVcGxvYWQnKS52YWwoJzEnKS5lbmQoKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZVR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQXJ0aWNsZVR5cGVJRCI+WyUgVHJhbnNsYXRlKCJOb3RlIHR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQXJ0aWNsZVR5cGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVUeXBlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpbWVVbml0c0xhYmVsIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpbWVVbml0cyI+WyUgVHJhbnNsYXRlKCJUaW1lIHVuaXRzIikgfCBodG1sICVdIFslIFRyYW5zbGF0ZShDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyIpKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0c0xhYmVsIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzTGFiZWxNYW5kYXRvcnkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGltZVVuaXRzIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgiVGltZSB1bml0cyIpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMiKSkgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrRW5kKCJUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpbWVVbml0cyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVVbml0cyIgaWQ9IlRpbWVVbml0cyIgdmFsdWU9IlslIERhdGEuVGltZVVuaXRzIHwgaHRtbCAlXSIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1RpbWVVbml0cyBbJSBEYXRhLlRpbWVVbml0c1JlcXVpcmVkIHwgaHRtbCAlXSBbJSBEYXRhLlRpbWVVbml0c0ludmFsaWQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGltZVVuaXRzRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkludmFsaWQgdGltZSEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGltZVVuaXRzU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaW1lVW5pdHMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmZvcm1BZGRpdGlvbmFsQWdlbnRzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkluZm9ybUFnZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkluZm9ybVVzZXJJRCI+WyUgVHJhbnNsYXRlKCJJbmZvcm0gQWdlbnQiKSB8IGh0bWwgJV06IChbJSBUcmFuc2xhdGUoIk9wdGlvbmFsIikgfCBodG1sICVdKTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiSW5mb3JtQWdlbnQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZvbHZlZEFnZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ikludm9sdmVkVXNlcklEIj5bJSBUcmFuc2xhdGUoIkluZm9ybSBpbnZvbHZlZCBBZ2VudHMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSW52b2x2ZWRBZ2VudFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52b2x2ZWRBZ2VudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkhlcmUgeW91IGNhbiBzZWxlY3QgYWRkaXRpb25hbCBhZ2VudHMgd2hpY2ggc2hvdWxkIHJlY2VpdmUgYSBub3RpZmljYXRpb24gcmVnYXJkaW5nIHRoZSBuZXcgYXJ0aWNsZS4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgpbJSBSZW5kZXJCbG9ja0VuZCgiSW5mb3JtQWRkaXRpb25hbEFnZW50cyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkluZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk5vdGUgd2lsbCBiZSAoYWxzbykgcmVjZWl2ZWQgYnk6IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlVzZXJMaXN0V2l0aG91dFNlbGVjdGlvbiIgdmFsdWU9IlslIERhdGEuVXNlckxpc3RXaXRob3V0U2VsZWN0aW9uICB8IGh0bWwgJV0iIC8+ClslIFJlbmRlckJsb2NrU3RhcnQoIkluZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb25TaW5nbGVVc2VyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5Vc2VyRW1haWwgJV0iPlslIERhdGEuVXNlckZ1bGxuYW1lICVdPC9zcGFuPlslIFJlbmRlckJsb2NrU3RhcnQoIkluZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb25TaW5nbGVVc2VyU2VwYXJhdG9yIikgJV0sWyUgUmVuZGVyQmxvY2tFbmQoIkluZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb25TaW5nbGVVc2VyU2VwYXJhdG9yIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkluZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb25TaW5nbGVVc2VyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KWyUgUmVuZGVyQmxvY2tFbmQoIkluZm9ybUFnZW50c1dpdGhvdXRTZWxlY3Rpb24iKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJXaWRnZXRBcnRpY2xlIikgJV0KCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGb290ZXIiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBQcmltYXJ5IiBpZD0ic3VibWl0UmljaFRleHQiIGFjY2Vzc2tleT0iZyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIChnKSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJTdWJtaXQiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Zvcm0+ClslIFJlbmRlckJsb2NrRW5kKCJQcm9wZXJ0aWVzIikgJV0KCiNMYXllcnMKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQ29uZmlnLlNldCgnTG9jYWxpemF0aW9uLkRlbGV0ZScsICdbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXScpOwogICAgQ29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uSW5pdCgpOwojIC0tLQojIElUU00KIyAtLS0KLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgICAgIC8vIHNob3cgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZSAodGhpcyBwYXJ0IGhlcmUgaXMgaW1wb3J0YW50IGlmIHRoZSBwYWdlIGlzIHJlbG9hZGVkIGR1ZSB0byBlLmcuIGF0dGFjaG1lbnQgdXBsb2FkKQogICAgICAgIElUU00uQWdlbnQuSW5jaWRlbnRTdGF0ZS5TaG93SW5jaWRlbnRTdGF0ZSh7CiAgICAgICAgICAgIEFjdGlvbjogJ1slIEVudigiQWN0aW9uIikgJV0nLAogICAgICAgICAgICBUaWNrZXRJRDogWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0sCiAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgfSk7CiMgLS0tCi8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQo=
IyAtLQojIEFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQudHQgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIGZyZWUgdGV4dCBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTYgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKWyUgSW5zZXJ0VGVtcGxhdGUoIkFnZW50VGlja2V0QWN0aW9uQ29tbW9uLnR0IikgJV0K
IyAtLQojIEFnZW50VGlja2V0RGVjaXNpb24udHQgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIGRlY2lzaW9uIG1hc2sKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvNDc4ZWU2NjVjNTM1YjY4MDI5Y2VkNGRjYTE5N2I1MjM1YjdiMTkyZi9LZXJuZWwvT3V0cHV0L0hUTUwvU3RhbmRhcmQvQWdlbnRUaWNrZXROb3RlLnR0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpbJSBJbnNlcnRUZW1wbGF0ZSgiQWdlbnRUaWNrZXRBY3Rpb25Db21tb24udHQiKSAlXQo=
IyAtLQojIEFnZW50VGlja2V0RW1haWwudHQgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIGFnZW50IGVtYWlsCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTYgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJG9yaWdpbjogaHR0cHM6Ly9naXRodWIuY29tL09UUlMvb3Rycy9ibG9iLzQ3OGVlNjY1YzUzNWI2ODAyOWNlZDRkY2ExOTdiNTIzNWI3YjE5MmYvS2VybmVsL091dHB1dC9IVE1ML1N0YW5kYXJkL0FnZW50VGlja2V0RW1haWwudHQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIEluc2VydFRlbXBsYXRlKCJBZ2VudEN1c3RvbWVyU2VhcmNoLnR0IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gRm9ybVNjcmVlbiI+CgogICAgPGgxPlslIFRyYW5zbGF0ZSgiQ3JlYXRlIE5ldyBFbWFpbCBUaWNrZXQiKSB8IGh0bWwgJV08L2gxPgogICAgPHAgY2xhc3M9IkFzdGVyaXNrRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiQWxsIGZpZWxkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayAoKikgYXJlIG1hbmRhdG9yeS4iKSB8IGh0bWwgJV08L3A+CgogICAgPGRpdiBjbGFzcz0iTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJMYXN0Ij4KCiAgICAgICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+CiMgc2hvdyBjdXN0b21lciBpbmZvIHRhYmxlClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVyVGFibGUiKSAlXQogICAgICAgICAgICA8ZGl2IGlkPSJDdXN0b21lckluZm8iIGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDdXN0b21lciBJbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ3VzdG9tZXJUYWJsZSAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJUYWJsZSIpICVdCiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSIgaWQ9Ik5ld0VtYWlsVGlja2V0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZU5ldyIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUiIGlkPSJFeHBhbmRDdXN0b21lck5hbWUiIHZhbHVlPSIwIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJPd25lckFsbCIgaWQ9Ik93bmVyQWxsIiB2YWx1ZT0iWyUgRGF0YS5Pd25lckFsbCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlc3BvbnNpYmxlQWxsIiBpZD0iUmVzcG9uc2libGVBbGwiIHZhbHVlPSJbJSBEYXRhLlJlc3BvbnNpYmxlQWxsIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJlU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJQcmVTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJVc2VyIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIvPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiMgZXhhbXBsZSB0ZW1wbGF0ZSBmb3IgY3VzdG9taXphdGlvbnMsIHNlZSBoaWRkZW4gZm9ybSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCiMgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRlbXBsYXRlcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0iJCgnI1RlbXBsYXRlMScpLnN1Ym1pdCgpIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJFeGFtcGxlIFRlbXBsYXRlIikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIkV4YW1wbGUgVGVtcGxhdGUiKSB8IGh0bWwgJV08L2J1dHRvbj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlR5cGVJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlR5cGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlR5cGVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcjVHlwZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnVHlwZUlEJywgWyAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0VHlwZSIpICVdCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkRlc3QiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiRnJvbSBxdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Gcm9tU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZXN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVzdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKJCgnI0Rlc3QnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIHZhciBTaWduYXR1cmVVUkwgPSAnWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPVNpZ25hdHVyZTtEZXN0PScgKyAkKHRoaXMpLnZhbCgpOwogICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ0Rlc3QnLCBbJ1R5cGVJRCcsICdTaWduYXR1cmUnLCAnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIGlmICghQ29yZS5Db25maWcuR2V0KCdTZXNzaW9uSURDb29raWUnKSkgewogICAgICAgIFNpZ25hdHVyZVVSTCArPSAnOycgKyBDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25OYW1lJykgKyAnPScgKyBDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25JRCcpOwogICAgfQogICAgJCgnI1NpZ25hdHVyZScpLmF0dHIoJ3NyYycsIFNpZ25hdHVyZVVSTCk7Cn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnLkN1c3RvbWVyVGlja2V0UmFkaW8nKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIEN1c3RvbWVyS2V5OwogICAgICAgIGlmICggJCh0aGlzKS5hdHRyKCdjaGVja2VkJykgKXsKCiAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0gJCggJyNDdXN0b21lcktleV8nICskKHRoaXMpLnZhbCgpICkudmFsKCk7CiAgICAgICAgICAgIC8vIGdldCBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guUmVsb2FkQ3VzdG9tZXJJbmZvKEN1c3RvbWVyS2V5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgJCgnLkN1c3RvbWVyVGlja2V0UmVtb3ZlJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5SZW1vdmVDdXN0b21lclRpY2tldCggJCh0aGlzKSApOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkZyb21FeHRlcm5hbEN1c3RvbWVyIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guQWRkVGlja2V0Q3VzdG9tZXIoICdUb0N1c3RvbWVyJywgIlslIERhdGEuRW1haWwgfCBodG1sICVdIiwgIlslIERhdGEuQ3VzdG9tZXIgfCBodG1sICVdIiwgdHJ1ZSApOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkZyb21FeHRlcm5hbEN1c3RvbWVyIikgJV0KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVG9DdXN0b21lciIgY2xhc3M9Ik1hbmRhdG9yeSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj5bJSBUcmFuc2xhdGUoIlRvIGN1c3RvbWVyIHVzZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iVG9DdXN0b21lciIgdHlwZT0idGV4dCIgbmFtZT0iVG9DdXN0b21lciIgdmFsdWU9IiIgY2xhc3M9IkN1c3RvbWVyQXV0b0NvbXBsZXRlIFc3NXBjIFslIERhdGEuVG9Jc0xvY2FsQWRkcmVzcyB8IGh0bWwgJV0gWyUgRGF0YS5Ub0ludmFsaWQgfCBodG1sICVdIiBhdXRvY29tcGxldGU9Im9mZiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVG9DdXN0b21lclNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRvU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJQbGVhc2UgaW5jbHVkZSBhdCBsZWFzdCBvbmUgY3VzdG9tZXIgdXNlciBmb3IgdGhlIHRpY2tldC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJUb1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVG9Jc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgYWRkcmVzcyBpcyByZWdpc3RlcmVkIGFzIHN5c3RlbSBhZGRyZXNzIGFuZCBjYW5ub3QgYmUgdXNlZDogJXMiLCBEYXRhLlRvKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJUb0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFslIERhdGEuQ3VzdG9tZXJIaWRkZW5Db250YWluZXIgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZW1wbGF0ZVRvQ3VzdG9tZXIgSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lclNlbGVjdGVkIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZWxlY3QgdGhpcyBjdXN0b21lciBhcyB0aGUgbWFpbiBjdXN0b21lci4iKSB8IGh0bWwgJV0iIGlkPSJDdXN0b21lclNlbGVjdGVkIiBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRSYWRpbyIgdHlwZT0icmFkaW8iIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lcktleSIgaWQ9IkN1c3RvbWVyS2V5IiBjbGFzcz0iQ3VzdG9tZXJLZXkiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJDdXN0b21lclRpY2tldFRleHQgUmFkaW8iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvIGN1c3RvbWVyIHVzZXIiKSB8IGh0bWwgJV0iIG5hbWU9IkN1c3RvbWVyVGlja2V0VGV4dCIgaWQ9IkN1c3RvbWVyVGlja2V0VGV4dCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgcmVhZG9ubHk9InJlYWRvbmx5IiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IlJlbW92ZUN1c3RvbWVyVGlja2V0IiBjbGFzcz0iUmVtb3ZlQnV0dG9uIEN1c3RvbWVyVGlja2V0UmVtb3ZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgVGlja2V0IEN1c3RvbWVyIFVzZXIiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGlja2V0Q3VzdG9tZXJDb250ZW50VG9DdXN0b21lciIgY2xhc3M9IkN1c3RvbWVyQ29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJCb3hMYWJlbCI+WyUgVHJhbnNsYXRlKCJUbyIpIHwgaHRtbCAlXTwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTXVsdGlwbGVDdXN0b21lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lclNlbGVjdGVkIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZWxlY3QgdGhpcyBjdXN0b21lciBhcyB0aGUgbWFpbiBjdXN0b21lci4iKSB8IGh0bWwgJV0iIGlkPSJDdXN0b21lclNlbGVjdGVkIiBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRSYWRpbyIgdHlwZT0icmFkaW8iIHZhbHVlPSJbJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgWyUgRGF0YS5DdXN0b21lclNlbGVjdGVkIHwgaHRtbCAlXSAgWyUgRGF0YS5DdXN0b21lckRpc2FibGVkIHwgaHRtbCAlXSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgaWQ9IkN1c3RvbWVyS2V5X1slIERhdGEuQ291bnQgfCBodG1sICVdIiBjbGFzcz0iQ3VzdG9tZXJLZXkiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJLZXkgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJDdXN0b21lclRpY2tldFRleHQgWyUgRGF0YS5DdXN0b21lckVycm9yIHwgaHRtbCAlXSIgbmFtZT0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIGlkPSJDdXN0b21lclRpY2tldFRleHRfWyUgRGF0YS5Db3VudCAlXSIgdHlwZT0idGV4dCIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJFbGVtZW50IHwgaHRtbCAlXSIgcmVhZG9ubHk9InJlYWRvbmx5IiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJSZW1vdmVDdXN0b21lclRpY2tldF9bJSBEYXRhLkNvdW50ICVdIiBjbGFzcz0iUmVtb3ZlQnV0dG9uIEN1c3RvbWVyVGlja2V0UmVtb3ZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSBUaWNrZXQgQ3VzdG9tZXIgVXNlciIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lckVycm9yRXhwbGFudGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkV4cGxhbmF0aW9uIEVycm9yIj5bJSBUcmFuc2xhdGUoIlBsZWFzZSByZW1vdmUgdGhpcyBlbnRyeSBhbmQgZW50ZXIgYSBuZXcgb25lIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDdXN0b21lclRpY2tldFRleHRfWyUgRGF0YS5Db3VudCAlXVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGVtYWlsIGFkZHJlc3MgaXMgbm90IGFsbG93ZWQgZHVlIHRvIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbi4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkTVhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBlbWFpbCBhZGRyZXNzIGZhaWxlZCBNWCBjaGVjay4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJbnZhbGlkTVhTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkludmFsaWRETlNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiRE5TIHByb2JsZW0sIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gYW5kIHRoZSBlcnJvciBsb2cuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZEROU1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW52YWxpZFN5bnRheFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGUgc3ludGF4IG9mIHRoaXMgZW1haWwgYWRkcmVzcyBpcyBpbmNvcnJlY3QuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZFN5bnRheFNlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgYWRkcmVzcyBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgYWRkcmVzcyBsaXN0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIklzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTXVsdGlwbGVDdXN0b21lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNdWx0aXBsZUN1c3RvbWVyQ291bnRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lclRpY2tldENvdW50ZXJUb0N1c3RvbWVyIiBpZD0iQ3VzdG9tZXJUaWNrZXRDb3VudGVyVG9DdXN0b21lciIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lckNvdW50ZXIgfCBodG1sICVdIi8+ClslIFJlbmRlckJsb2NrRW5kKCJNdWx0aXBsZUN1c3RvbWVyQ291bnRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDY0N1c3RvbWVyIj5bJSBUcmFuc2xhdGUoIkNjIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkNjQ3VzdG9tZXIiIHR5cGU9InRleHQiIG5hbWU9IkNjQ3VzdG9tZXIiIHZhbHVlPSIiIGNsYXNzPSJDdXN0b21lckF1dG9Db21wbGV0ZSBXNzVwYyBbJSBEYXRhLkNjSXNMb2NhbEFkZHJlc3MgfCBodG1sICVdIFslIERhdGEuQ2NJbnZhbGlkIHwgaHRtbCAlXSIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDY0N1c3RvbWVyU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgYWRkcmVzcyBpcyByZWdpc3RlcmVkIGFzIHN5c3RlbSBhZGRyZXNzIGFuZCBjYW5ub3QgYmUgdXNlZDogJXMiLCBEYXRhLkNjKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDY0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBbJSBEYXRhLkNjQ3VzdG9tZXJIaWRkZW5Db250YWluZXIgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZW1wbGF0ZUNjQ3VzdG9tZXIgU3BhY2luZ1RvcFNtYWxsIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ2NDdXN0b21lcktleSIgaWQ9IkNjQ3VzdG9tZXJLZXkiIGNsYXNzPSJDdXN0b21lcktleSIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGV4dCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ2MiKSB8IGh0bWwgJV0iIG5hbWU9IkNjQ3VzdG9tZXJUaWNrZXRUZXh0IiBpZD0iQ2NDdXN0b21lclRpY2tldFRleHQiIHR5cGU9InRleHQiIHZhbHVlPSIiIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJDY1JlbW92ZUN1c3RvbWVyVGlja2V0IiBjbGFzcz0iUmVtb3ZlQnV0dG9uIEN1c3RvbWVyVGlja2V0UmVtb3ZlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgQ2MiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGlja2V0Q3VzdG9tZXJDb250ZW50Q2NDdXN0b21lciIgY2xhc3M9IkNjQ3VzdG9tZXJDb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkJveExhYmVsIj5bJSBUcmFuc2xhdGUoIkNjIikgfCBodG1sICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDY011bHRpcGxlQ3VzdG9tZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ2NDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgaWQ9IkNjQ3VzdG9tZXJLZXlfWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIGNsYXNzPSJDdXN0b21lcktleSIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lcktleSB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGV4dCBbJSBEYXRhLkN1c3RvbWVyRXJyb3IgfCBodG1sICVdIiBuYW1lPSJDY0N1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdIiBpZD0iQ2NDdXN0b21lclRpY2tldFRleHRfWyUgRGF0YS5Db3VudCAlXSIgdHlwZT0idGV4dCIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJFbGVtZW50IHwgaHRtbCAlXSIgcmVhZG9ubHk9InJlYWRvbmx5IiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJDY1JlbW92ZUN1c3RvbWVyVGlja2V0X1slIERhdGEuQ291bnQgJV0iIGNsYXNzPSJSZW1vdmVCdXR0b24gQ3VzdG9tZXJUaWNrZXRSZW1vdmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIENjIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KClslIFJlbmRlckJsb2NrU3RhcnQoIkNjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJFeHBsYW5hdGlvbiBFcnJvciI+WyUgVHJhbnNsYXRlKCJQbGVhc2UgcmVtb3ZlIHRoaXMgZW50cnkgYW5kIGVudGVyIGEgbmV3IG9uZSB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkNjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDY0N1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2NDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDY0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2NJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZW1haWwgYWRkcmVzcyBpcyBub3QgYWxsb3dlZCBkdWUgdG8gdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkNjSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2NJbnZhbGlkTVhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBlbWFpbCBhZGRyZXNzIGZhaWxlZCBNWCBjaGVjay4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDY0ludmFsaWRNWFNlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2NJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkROUyBwcm9ibGVtLCBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGFuZCB0aGUgZXJyb3IgbG9nLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkNjSW52YWxpZEROU1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2NJbnZhbGlkU3ludGF4U2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoZSBzeW50YXggb2YgdGhpcyBlbWFpbCBhZGRyZXNzIGlzIGluY29ycmVjdC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDY0ludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNjSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgYWRkcmVzcyBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgYWRkcmVzcyBsaXN0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkNjSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDY011bHRpcGxlQ3VzdG9tZXIiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNjTXVsdGlwbGVDdXN0b21lckNvdW50ZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJUaWNrZXRDb3VudGVyQ2NDdXN0b21lciIgaWQ9IkN1c3RvbWVyVGlja2V0Q291bnRlckNjQ3VzdG9tZXIiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJDb3VudGVyIHwgaHRtbCAlXSIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJCY2NDdXN0b21lciI+WyUgVHJhbnNsYXRlKCJCY2MiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iQmNjQ3VzdG9tZXIiIHR5cGU9InRleHQiIG5hbWU9IkJjY0N1c3RvbWVyIiB2YWx1ZT0iIiBjbGFzcz0iQ3VzdG9tZXJBdXRvQ29tcGxldGUgVzc1cGMgWyUgRGF0YS5CY2NJc0xvY2FsQWRkcmVzcyB8IGh0bWwgJV0gWyUgRGF0YS5CY2NJbnZhbGlkIHwgaHRtbCAlXSIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJCY2NDdXN0b21lclNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkJjY0lzTG9jYWxBZGRyZXNzU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBhZGRyZXNzIGlzIHJlZ2lzdGVyZWQgYXMgc3lzdGVtIGFkZHJlc3MgYW5kIGNhbm5vdCBiZSB1c2VkOiAlcyIsIERhdGEuQmNjKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJCY2NJc0xvY2FsQWRkcmVzc1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBbJSBEYXRhLkJjY0N1c3RvbWVySGlkZGVuQ29udGFpbmVyIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGVtcGxhdGVCY2NDdXN0b21lciBTcGFjaW5nVG9wU21hbGwgSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJCY2NDdXN0b21lcktleSIgaWQ9IkJjY0N1c3RvbWVyS2V5IiBjbGFzcz0iQ3VzdG9tZXJLZXkiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJDdXN0b21lclRpY2tldFRleHQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkJjYyIpIHwgaHRtbCAlXSIgbmFtZT0iQmNjQ3VzdG9tZXJUaWNrZXRUZXh0IiBpZD0iQmNjQ3VzdG9tZXJUaWNrZXRUZXh0IiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iIiByZWFkb25seT0icmVhZG9ubHkiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iQmNjUmVtb3ZlQ3VzdG9tZXJUaWNrZXQiIGNsYXNzPSJSZW1vdmVCdXR0b24gQ3VzdG9tZXJUaWNrZXRSZW1vdmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlJlbW92ZSBCY2MiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGlja2V0Q3VzdG9tZXJDb250ZW50QmNjQ3VzdG9tZXIiIGNsYXNzPSJCY2NDdXN0b21lckNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iQm94TGFiZWwiPlslIFRyYW5zbGF0ZSgiQmNjIikgfCBodG1sICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCY2NNdWx0aXBsZUN1c3RvbWVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkJjY0N1c3RvbWVyS2V5X1slIERhdGEuQ291bnQgfCBodG1sICVdIiBpZD0iQmNjQ3VzdG9tZXJLZXlfWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIGNsYXNzPSJDdXN0b21lcktleSIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lcktleSB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGV4dCBbJSBEYXRhLkN1c3RvbWVyRXJyb3IgfCBodG1sICVdIiBuYW1lPSJCY2NDdXN0b21lclRpY2tldFRleHRfWyUgRGF0YS5Db3VudCAlXSIgaWQ9IkJjY0N1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lckVsZW1lbnQgfCBodG1sICVdIiByZWFkb25seT0icmVhZG9ubHkiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkJjY1JlbW92ZUN1c3RvbWVyVGlja2V0X1slIERhdGEuQ291bnQgJV0iIGNsYXNzPSJSZW1vdmVCdXR0b24gQ3VzdG9tZXJUaWNrZXRSZW1vdmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIEJjYyIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCY2NDdXN0b21lckVycm9yRXhwbGFudGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkV4cGxhbmF0aW9uIEVycm9yIj5bJSBUcmFuc2xhdGUoIlBsZWFzZSByZW1vdmUgdGhpcyBlbnRyeSBhbmQgZW50ZXIgYSBuZXcgb25lIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQmNjQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJCY2NDdXN0b21lclRpY2tldFRleHRfWyUgRGF0YS5Db3VudCAlXVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkJjY0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkJjY0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQmNjSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGVtYWlsIGFkZHJlc3MgaXMgbm90IGFsbG93ZWQgZHVlIHRvIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbi4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJCY2NJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCY2NJbnZhbGlkTVhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBlbWFpbCBhZGRyZXNzIGZhaWxlZCBNWCBjaGVjay4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJCY2NJbnZhbGlkTVhTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJjY0ludmFsaWRETlNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiRE5TIHByb2JsZW0sIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gYW5kIHRoZSBlcnJvciBsb2cuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQmNjSW52YWxpZEROU1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQmNjSW52YWxpZFN5bnRheFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGUgc3ludGF4IG9mIHRoaXMgZW1haWwgYWRkcmVzcyBpcyBpbmNvcnJlY3QuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQmNjSW52YWxpZFN5bnRheFNlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQmNjSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgYWRkcmVzcyBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgYWRkcmVzcyBsaXN0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkJjY0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQmNjTXVsdGlwbGVDdXN0b21lciIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQmNjTXVsdGlwbGVDdXN0b21lckNvdW50ZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJUaWNrZXRDb3VudGVyQmNjQ3VzdG9tZXIiIGlkPSJDdXN0b21lclRpY2tldENvdW50ZXJCY2NDdXN0b21lciIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lckNvdW50ZXIgfCBodG1sICVdIi8+ClslIFJlbmRlckJsb2NrRW5kKCJCY2NNdWx0aXBsZUN1c3RvbWVyQ291bnRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21lcklEIj5bJSBUcmFuc2xhdGUoIkN1c3RvbWVySUQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDdXN0b21lcklEIiBpZD0iQ3VzdG9tZXJJRCIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV0iIFslIElGIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRFbWFpbDo6Q3VzdG9tZXJJRFJlYWRPbmx5IikgJV0gcmVhZG9ubHkgWyUgRU5EICVdIGNsYXNzPSJXNzVwYyIvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlcnZpY2VJRCI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNlcnZpY2VTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIGludmFsaWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NlcnZpY2VJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTZXJ2aWNlSUQnLCBbJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgfSk7CgovKmdsb2JhbCBJVFNNOiB0cnVlICovCiAgICAgICAgLy8gc2hvdyBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCBzaWduYWwgZm9yIHRoZSBzZWxlY3RlZCBzZXJ2aWNlCiAgICAgICAgSVRTTS5BZ2VudC5JbmNpZGVudFN0YXRlLlNob3dJbmNpZGVudFN0YXRlKHsKICAgICAgICAgICAgQWN0aW9uOiAnWyUgRW52KCJBY3Rpb24iKSAlXScsCiAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgfSk7Cn0pOwojIC0tLQovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBzdHlsZT0iZGlzcGxheTpub25lOyI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIEluY2lkZW50IFN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVDb250YWluZXIiIGNsYXNzPSJWYWx1ZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZVNpZ25hbCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlIj4mbmJzcDs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgLS0tClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRTZXJ2aWNlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFNlcnZpY2VNYW5kYXRvcnkiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlNlcnZpY2VJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNlcnZpY2VTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIGludmFsaWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NlcnZpY2VJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTZXJ2aWNlSUQnLCBbJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgfSk7CgovKmdsb2JhbCBJVFNNOiB0cnVlICovCiAgICAgICAgLy8gc2hvdyBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCBzaWduYWwgZm9yIHRoZSBzZWxlY3RlZCBzZXJ2aWNlCiAgICAgICAgSVRTTS5BZ2VudC5JbmNpZGVudFN0YXRlLlNob3dJbmNpZGVudFN0YXRlKHsKICAgICAgICAgICAgQWN0aW9uOiAnWyUgRW52KCJBY3Rpb24iKSAlXScsCiAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgfSk7Cn0pOwojIC0tLQovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBzdHlsZT0iZGlzcGxheTpub25lOyI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIEluY2lkZW50IFN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVDb250YWluZXIiIGNsYXNzPSJWYWx1ZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZVNpZ25hbCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlIj4mbmJzcDs8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgLS0tClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRTZXJ2aWNlTWFuZGF0b3J5IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFNMQSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU0xBSUQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU0xBU3RyZyAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NMQUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1NMQUlEJywgWydUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdTZXJ2aWNlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFNMQSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTTEFNYW5kYXRvcnkiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlNMQUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlNlcnZpY2UgTGV2ZWwgQWdyZWVtZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNMQVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU0xBSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTTEFJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTTEFJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTTEFJRCcsIFsnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnU2VydmljZUlEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRTTEFNYW5kYXRvcnkiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3duZXJTZWxlY3Rpb24iKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5ld1VzZXJJRCI+WyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5PcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJPd25lclNlbGVjdGlvbkdldEFsbCIgY2xhc3M9IkdldEFsbEFKQVgiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkdldCBhbGwiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJHZXQgYWxsIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXJlZnJlc2giPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcjT3duZXJTZWxlY3Rpb25HZXRBbGwnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgJCgnI093bmVyQWxsJykudmFsKCcxJyk7IC8vIE5lZWRlZD8gV2h5PwogICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ093bmVyQWxsJywgWydOZXdVc2VySUQnXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgJCgnI05ld1VzZXJJRCcpLmZvY3VzKCk7CiAgICB9KTsKICAgIHJldHVybiBmYWxzZTsKfSk7CgokKCcjTmV3VXNlcklEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3VXNlcklEJywgWyAnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiT3duZXJTZWxlY3Rpb24iKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVzcG9uc2libGVTZWxlY3Rpb24iKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5ld1Jlc3BvbnNpYmxlSUQiPlslIFRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVzcG9uc2libGVPcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJSZXNwb25zaWJsZVNlbGVjdGlvbkdldEFsbCIgY2xhc3M9IkdldEFsbEFKQVgiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkdldCBhbGwiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKCJHZXQgYWxsIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXJlZnJlc2giPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcjUmVzcG9uc2libGVTZWxlY3Rpb25HZXRBbGwnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgJCgnI1Jlc3BvbnNpYmxlQWxsJykudmFsKCcxJyk7IC8vIE5lZWRlZD8gV2h5PwogICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1Jlc3BvbnNpYmxlQWxsJywgWydOZXdSZXNwb25zaWJsZUlEJ10sIGZ1bmN0aW9uKCkgewogICAgICAgICQoJyNOZXdSZXNwb25zaWJsZUlEJykuZm9jdXMoKTsKICAgIH0pOwogICAgcmV0dXJuIGZhbHNlOwp9KTsKCiQoJyNOZXdSZXNwb25zaWJsZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnTmV3UmVzcG9uc2libGVJRCcsIFsgJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwp9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVzcG9uc2libGVTZWxlY3Rpb24iKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3B0aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WYWx1ZSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBEYXRhLkludmFsaWQgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk9wdGlvbiIpICVdCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlN1YmplY3QiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJWYWxpZGF0ZV9SZXF1aXJlZCBbJSBEYXRhLlN1YmplY3RJbnZhbGlkIHwgaHRtbCAlXSBXNzVwYyAiIG5hbWU9IlN1YmplY3QiIGlkPSJTdWJqZWN0IiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldE9wdGlvbnMiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk9wdGlvbnMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+Cgo8IS0tIE91dHB1dEZpbHRlckhvb2tfVGlja2V0T3B0aW9uc0JlZ2luIC0tPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3BlbGxDaGVjayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJPcHRpb25TcGVsbENoZWNrIj5bIFslIFRyYW5zbGF0ZSgiU3BlbGwgY2hlY2siKSB8IGh0bWwgJV0gXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIlNwZWxsQ2hlY2siKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBZGRyZXNzQm9vayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJPcHRpb25BZGRyZXNzQm9vayI+WyBbJSBUcmFuc2xhdGUoIkFkZHJlc3MgYm9vayIpIHwgaHRtbCAlXSBdPC9hPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWRkcmVzc0Jvb2siKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPcHRpb25DdXN0b21lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJPcHRpb25DdXN0b21lciI+WyBbJSBUcmFuc2xhdGUoIkN1c3RvbWVyIHVzZXIiKSB8IGh0bWwgJV0gXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIk9wdGlvbkN1c3RvbWVyIikgJV0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudExpbmtPYmplY3Q7TW9kZT1UZW1wb3Jhcnk7U291cmNlT2JqZWN0PVRpY2tldDtTb3VyY2VLZXk9WyUgRGF0YS5Gb3JtSUQgfCB1cmkgJV07VGFyZ2V0SWRlbnRpZmllcj1JVFNNQ29uZmlnSXRlbSIgaWQ9Ik9wdGlvbkxpbmtUaWNrZXQiIGNsYXNzPSJBc1BvcHVwIj5bIFslIFRyYW5zbGF0ZSgiTGluayB0aWNrZXQiKSB8IGh0bWwgJV0gXTwvYT4KIyAtLS0KCjwhLS0gT3V0cHV0RmlsdGVySG9va19UaWNrZXRPcHRpb25zRW5kIC0tPgoKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRPcHRpb25zIikgJV0KCjwhLS0gT3V0cHV0RmlsdGVySG9va19Ob1RpY2tldE9wdGlvbnNGYWxsYmFjayAtLT4KClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YW5kYXJkVGVtcGxhdGVJRCI+WyUgVHJhbnNsYXRlKCJUZXh0IFRlbXBsYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YW5kYXJkVGVtcGxhdGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIlNldHRpbmcgYSB0ZW1wbGF0ZSB3aWxsIG92ZXJ3cml0ZSBhbnkgdGV4dCBvciBhdHRhY2htZW50LiIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTdGFuZGFyZFRlbXBsYXRlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFnZW50LlRpY2tldEFjdGlvbi5Db25maXJtVGVtcGxhdGVPdmVyd3JpdGUoJ1JpY2hUZXh0JywgJCh0aGlzKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJywgWydSaWNoVGV4dEZpZWxkJ10pOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJSaWNoVGV4dCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJUZXh0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRGaWVsZCIgY2xhc3M9IlJpY2hUZXh0RmllbGQiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUmljaFRleHQiKSAlXQpbJSBJbnNlcnRUZW1wbGF0ZSgiUmljaFRleHRFZGl0b3IudHQiKSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiUmljaFRleHQiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgY2xhc3M9IlJpY2hUZXh0IFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuQm9keUludmFsaWQgfCBodG1sICVdIiBuYW1lPSJCb2R5IiB0aXRsZT0iTWVzc2FnZSBib2R5IiByb3dzPSIxNSIgY29scz0iWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYUVtYWlsIikgJV0iPlslIERhdGEuQm9keSB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTaWduYXR1cmUiPlslIFRyYW5zbGF0ZSgiU2lnbmF0dXJlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNpZ25hdHVyZSIgdmFsdWU9IlslIERhdGEuU2lnbmF0dXJlIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIGhlaWdodD0iMTQwIiB3aWR0aD0iNjIwIiBmcmFtZWJvcmRlcj0iMCIgaWQ9IlNpZ25hdHVyZSIgY2xhc3M9IlNpZ25hdHVyZSIgc3JjPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249U2lnbmF0dXJlO1F1ZXVlSUQ9WyUgRGF0YS5RdWV1ZUlEIHwgaHRtbCAlXSI+PC9pZnJhbWU+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8dWw+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBdHRhY2htZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSAoWyUgRGF0YS5GaWxlc2l6ZSB8IGh0bWwgJV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiBuYW1lPSJBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV0iIGNsYXNzPSJTcGFjaW5nTGVmdCI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQXR0YWNobWVudERlbGV0ZVslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgbmFtZT0iQXR0YWNobWVudERlbGV0ZVslIERhdGEuRmlsZUlEIHwgaHRtbCAlXSIgLz4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyICRGb3JtID0gJCgnI0F0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0nKS5jbG9zZXN0KCdmb3JtJyk7CiAgICAgICAgJCgnI0F0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0nKS52YWwoMSk7CiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKCRGb3JtKTsKICAgICAgICAkRm9ybS50cmlnZ2VyKCdzdWJtaXQnKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBdHRhY2htZW50IikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJGaWxlVXBsb2FkIiBuYW1lPSJGaWxlVXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQXR0YWNobWVudFVwbG9hZCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IjAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcjRmlsZVVwbG9hZCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgIHZhciAkRm9ybSA9ICQoJyNGaWxlVXBsb2FkJykuY2xvc2VzdCgnZm9ybScpOwogICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKCRGb3JtKTsKICAgICRGb3JtLmZpbmQoJyNBdHRhY2htZW50VXBsb2FkJykudmFsKCcxJykuZW5kKCkuc3VibWl0KCk7Cn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5leHRTdGF0ZUlEIj5bJSBUcmFuc2xhdGUoIk5leHQgdGlja2V0IHN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5leHRTdGF0ZXNTdHJnICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjTmV4dFN0YXRlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnTmV4dFN0YXRlSUQnLCBbICdUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCdOZXdSZXNwb25zaWJsZUlEJywgJ1ByaW9yaXR5SUQnLCAnU2VydmljZUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJQZW5kaW5nIGRhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUGVuZGluZ0RhdGVTdHJpbmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGF5U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkRhdGUgaW52YWxpZCEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkhvdXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiRGF0ZSBpbnZhbGlkISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgiRm9yIGFsbCBwZW5kaW5nKiBzdGF0ZXMuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiMgLS0tCiMgSVRTTQojIC0tLQoKIyBzaG93IHRoZSBpbXBhY3QKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QiKSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9JVFNNSW1wYWN0IikgJV0KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJQcmlvcml0eUlEIj5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlByaW9yaXR5U3RyZyAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1ByaW9yaXR5SUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnUHJpb3JpdHlJRCcsIFsgJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnU2VydmljZUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQyIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+CiMgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzTGFiZWwiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpbWVVbml0cyI+WyUgVHJhbnNsYXRlKCJUaW1lIHVuaXRzIikgfCBodG1sICVdIFslIFRyYW5zbGF0ZShDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyIpKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0c0xhYmVsIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzTGFiZWxNYW5kYXRvcnkiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlRpbWVVbml0cyI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJUaW1lIHVuaXRzIikgfCBodG1sICVdIFslIFRyYW5zbGF0ZShDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyIpKSB8IGh0bWwgJV06PC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0c0xhYmVsTWFuZGF0b3J5IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfVGltZVVuaXRzIFslIERhdGEuVGltZVVuaXRzUmVxdWlyZWQgfCBodG1sICVdIFslIERhdGEuVGltZVVuaXRzSW52YWxpZCB8IGh0bWwgJV0iIG5hbWU9IlRpbWVVbml0cyIgaWQ9IlRpbWVVbml0cyIgdmFsdWU9IlslIERhdGEuVGltZVVuaXRzIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaW1lVW5pdHNFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCB0aW1lISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGltZVVuaXRzU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0cyIpICVdCgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIGlkPSJzdWJtaXRSaWNoVGV4dCIgYWNjZXNza2V5PSJnIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZW5kIG1haWwiKSB8IGh0bWwgJV0gKGcpIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNlbmQgbWFpbCIpIHwgaHRtbCAlXSIgPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1lbnZlbG9wZS1vIj48L2k+IFslIFRyYW5zbGF0ZSgiU2VuZCBtYWlsIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJDdXN0b21lclRpY2tldHMiPjwvZGl2Pgo8L2Rpdj4KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCkNvcmUuQWdlbnQuVGlja2V0QWN0aW9uLkluaXQoKTsKQ29yZS5Db25maWcuU2V0KCdMb2NhbGl6YXRpb24uRGVsZXRlJywgWyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IEpTT04gJV0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICQoJ2EuQXNQb3B1cCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7IENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKCAkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgJ0FjdGlvbicpOyByZXR1cm4gZmFsc2U7IH0gKTsKCi8qZ2xvYmFsIElUU006IHRydWUgKi8KICAgICAgICAvLyBzaG93IHNlcnZpY2UgaW5jaWRlbnQgc3RhdGUgYW5kIHNpZ25hbCBmb3IgdGhlIHNlbGVjdGVkIHNlcnZpY2UgKHRoaXMgcGFydCBoZXJlIGlzIGltcG9ydGFudCBpZiB0aGUgcGFnZSBpcyByZWxvYWRlZCBkdWUgdG8gZS5nLiBhdHRhY2htZW50IHVwbG9hZCkKICAgICAgICBJVFNNLkFnZW50LkluY2lkZW50U3RhdGUuU2hvd0luY2lkZW50U3RhdGUoewogICAgICAgICAgICBBY3Rpb246ICdbJSBFbnYoIkFjdGlvbiIpICVdJywKICAgICAgICAgICAgU2VydmljZUlEOiAkKCcjU2VydmljZUlEJykudmFsKCkKICAgICAgICB9KTsKIyAtLS0KLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgojIGV4YW1wbGUgdGVtcGxhdGUgZm9ybSBmb3IgY3VzdG9taXphdGlvbnMKIzxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBpZD0iVGVtcGxhdGUxIj4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVOZXciLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUiIHZhbHVlPSIyIi8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IkV4YW1wbGUgU3ViamVjdCIvPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSJOYW1lOgojUHJvZHVjdDoKI0NvbW1lbnQ6Ii8+CiM8L2Zvcm0+Cg==
IyAtLQojIEFnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0udHQgLSBwcm92aWRlcyBIVE1MIFRpY2tldCBPdmVydmlldwojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi80NzhlZTY2NWM1MzViNjgwMjljZWQ0ZGNhMTk3YjUyMzViN2IxOTJmL0tlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9BZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtLnR0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50QWN0aW9uUm93IikgJV0KPHVsIGNsYXNzPSJBY3Rpb25zIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRBY3Rpb25Sb3dCdWxrIikgJV0KICAgIDxsaSBjbGFzcz0iQWx3YXlzUHJlc2VudCI+CiAgICAgICAgPHNwYW4+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IGFsbCIpIHwgaHRtbCAlXSIgaWQ9IlNlbGVjdEFsbFRpY2tldHMiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICA8bGFiZWwgY2xhc3M9IkludmlzaWJsZVRleHQiIGZvcj0iU2VsZWN0QWxsVGlja2V0cyI+WyUgVHJhbnNsYXRlKCJTZWxlY3QgYWxsIikgfCBodG1sICVdPC9sYWJlbD4KICAgICAgICA8L3NwYW4+CiAgICA8L2xpPgogICAgPGxpIGlkPSJCdWxrQWN0aW9uIiBjbGFzcz0iQWx3YXlzUHJlc2VudCBJbmFjdGl2ZSBbJSBEYXRhLkNTUyB8IGh0bWwgJV0iPgogICAgICAgIDxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYT4KICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEFjdGlvblJvd0J1bGsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEFjdGlvblJvd0l0ZW0iKSAlXQogICAgPGxpPjxhIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5MaW5rIHwgaHRtbCAlXSIgdGl0bGU9IlslIERhdGEuRGVzY3JpcHRpb24gfCBodG1sICVdIj5bJSBEYXRhLk5hbWUgfCBodG1sICVdPC9hPjwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEFjdGlvblJvd0l0ZW0iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEFjdGlvblJvd0hUTUwiKSAlXQogICAgWyUgRGF0YS5IVE1MICVdClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEFjdGlvblJvd0hUTUwiKSAlXQo8L3VsPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRBY3Rpb25Sb3ciKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRIZWFkZXIiKSAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5VSS5BY3Rpb25Sb3cuSW5pdCgpOwoKICAgICQoJ2EuQXNQb3B1cCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgdmFyIE1hdGNoZXMsCiAgICAgICAgICAgIFBvcHVwVHlwZSA9ICdUaWNrZXRBY3Rpb24nOwoKICAgICAgICBNYXRjaGVzID0gJCh0aGlzKS5hdHRyKCdjbGFzcycpLm1hdGNoKC9Qb3B1cFR5cGVfKFx3KykvKTsKICAgICAgICBpZiAoTWF0Y2hlcykgewogICAgICAgICAgICBQb3B1cFR5cGUgPSBNYXRjaGVzWzFdOwogICAgICAgIH0KCiAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoJCh0aGlzKS5hdHRyKCdocmVmJyksIFBvcHVwVHlwZSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKPHVsIGlkPSJUaWNrZXRPdmVydmlld01lZGl1bSIgY2xhc3M9Ik92ZXJ2aWV3IE92ZXJ2aWV3TWVkaXVtIj4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50SGVhZGVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk5vVGlja2V0Rm91bmQiKSAlXQogICAgPGxpIGlkPSJFbXB0eU1lc3NhZ2VNZWRpdW0iPgogICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gdGlja2V0IGRhdGEgZm91bmQuIikgfCBodG1sICVdCiAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9UaWNrZXRGb3VuZCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudENvbnRlbnQiKSAlXQogICAgPGxpIGlkPSJUaWNrZXRJRF9bJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgY2xhc3M9Ik1hc3RlckFjdGlvbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIklubGluZUFjdGlvblJvdyIpICVdCiAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9ucyBJbmxpbmVBY3Rpb25zIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5saW5lQWN0aW9uUm93SXRlbSIpICVdCiAgICAgICAgICAgICAgICA8bGk+PGEgaWQ9IlslIERhdGEuSUQgfCBodG1sICVdWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgfCBodG1sICVdIiB0aXRsZT0iWyUgRGF0YS5EZXNjcmlwdGlvbiB8IEludGVycG9sYXRlIHwgaHRtbCAlXSI+WyUgRGF0YS5OYW1lIHwgSW50ZXJwb2xhdGUgfCBodG1sICVdPC9hPjwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJJbmxpbmVBY3Rpb25Sb3dJdGVtIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5saW5lQWN0aW9uUm93SXRlbUhUTUwiKSAlXQogICAgICAgICAgICAgICAgWyUgRGF0YS5IVE1MICVdClslIFJlbmRlckJsb2NrRW5kKCJJbmxpbmVBY3Rpb25Sb3dJdGVtSFRNTCIpICVdCiAgICAgICAgICAgIDwvdWw+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAvLyBTdG9wIHByb3BhZ2F0aW9uIG9uIGNsaWNrIG9uIGEgcGFydCBvZiB0aGUgSW5saWVuQWN0aW9uUm93IHdpdGhvdXQgYSBsaW5rCiAgICAvLyBPdGhlcndpc2UgdGhhdCB3b3VsZCB0cmlnZ2VyIHRoZSBsaS13aWRlIGxpbmsgdG8gdGhlIHRpY2tldHpvb20KICAgICQoJ3VsLklubGluZUFjdGlvbnMnKS5jbGljayhmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBFdmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgICAgIGlmIChFdmVudC5zdG9wUHJvcGFnYXRpb24pIHsKICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiSW5saW5lQWN0aW9uUm93IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQnVsayIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNoZWNrYm94Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ2hlY2tib3giIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJUaWNrZXRJRCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgdGlja2V0IikgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkJ1bGsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWV0YUljb24iKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ2xhc3NTcGFuIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPgogICAgICAgICAgICAgICAgICAgIDxlbT5bJSBUcmFuc2xhdGUoRGF0YS5UaXRsZSkgfCBodG1sICVdPC9lbT4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJNZXRhSWNvbiIpICVdClslIFJlbmRlckJsb2NrRW5kKCJNZXRhIikgJV0KICAgICAgICAgICAgPGgyPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayI+WyUgQ29uZmlnKCJUaWNrZXQ6Okhvb2siKSAlXTogWyUgRGF0YS5UaWNrZXROdW1iZXIgJV0gJm5kYXNoOyBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9oMj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWVudUl0ZW0iKSAlXQogICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkxpbmsgJV0iIFslIERhdGEuTGlua1BhcmFtICVdIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvbikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJNZW51SXRlbSIpICVdCiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iSW5mb3MiPgogICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRnJvbSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5Gcm9tIHwgaHRtbCAlXSI+WyUgRGF0YS5Gcm9tUmVhbG5hbWUgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFnZSIpIHwgaHRtbCAlXTwvbGFiZWw+WyUgRGF0YS5BZ2UgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlF1ZXVlIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBEYXRhLlF1ZXVlIHwgaHRtbCAlXSI+WyUgRGF0YS5RdWV1ZSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lcklEUlciKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkN1c3RvbWVySUQiKSB8IGh0bWwgJV08L2xhYmVsPlslIElGIERhdGEuQ3VzdG9tZXJJRCAlXTxhIGhyZWY9IlslIENvbmZpZygiQ3VzdG9tZXJEQkxpbmsiKSB8IEludGVycG9sYXRlICVdIiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiBbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rVGFyZ2V0IikgJV0+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXTwvYT5bJSBFTkQgJV0KI1slIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lcklEUlciKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJJRFJPIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDdXN0b21lcklEIikgfCBodG1sICVdPC9sYWJlbD5bJSBEYXRhLkN1c3RvbWVySUQgfCBodG1sICVdCiNbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJJRFJPIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz48ZGl2IHRpdGxlPSJbJSBEYXRhLkN1c3RvbWVyTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuQ3VzdG9tZXJOYW1lIHwgaHRtbCAlXTwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWUKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdPC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDFMaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxTGluayIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQxUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48c3Bhbj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDFQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJGaXJzdCBSZXNwb25zZSBUaW1lIikgfCBodG1sICVdPC9sYWJlbD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuRmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lQ2xhc3MgfCBodG1sICVdIj5bJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVXBkYXRlIFRpbWUiKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLlVwZGF0ZVRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLlVwZGF0ZVRpbWVDbGFzcyB8IGh0bWwgJV0iPlslIERhdGEuVXBkYXRlVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVXBkYXRlVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNvbHV0aW9uIFRpbWUiKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTb2x1dGlvblRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuU29sdXRpb25UaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5Tb2x1dGlvblRpbWVDbGFzcyB8IGh0bWwgJV0iPlslIERhdGEuU29sdXRpb25UaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5Tb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRvIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBEYXRhLlRvIHwgaHRtbCAlXSI+WyUgRGF0YS5Ub1JlYWxuYW1lIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdPC9sYWJlbD5bJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIlR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5UeXBlIHwgaHRtbCAlXSI+WyUgRGF0YS5UeXBlIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDIgaXMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMkxpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDJMaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDJQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxzcGFuPlslIERhdGEuVmFsdWUgJV08L3NwYW4+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMlBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlVwZGF0ZSBUaW1lIikgfCBodG1sICVdPC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIlVwZGF0ZVRpbWUiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLlVwZGF0ZVRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLlVwZGF0ZVRpbWVDbGFzcyB8IGh0bWwgJV0iPlslIERhdGEuVXBkYXRlVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIlVwZGF0ZVRpbWUiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSI+WyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5Vc2VyRmlyc3RuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLlVzZXJMYXN0bmFtZSB8IGh0bWwgJV0gKFslIERhdGEuT3duZXIgfCBodG1sICVdKSI+WyUgRGF0YS5Vc2VyRmlyc3RuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLlVzZXJMYXN0bmFtZSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTG9jayIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTG9jaykgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Mb2NrKSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuU2VydmljZSB8IGh0bWwgJV0iPlslIERhdGEuU2VydmljZSB8IGh0bWwgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNlcnZpY2UiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuU0xBIHwgaHRtbCAlXSI+WyUgRGF0YS5TTEEgfCBodG1sICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lcklEUlciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3VzdG9tZXJJRCIpIHwgaHRtbCAlXTwvbGFiZWw+PGEgaHJlZj0iWyUgQ29uZmlnKCJDdXN0b21lckRCTGluayIpICVdIiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiBbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rVGFyZ2V0IikgJV0+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVySURSVyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVySURSTyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDdXN0b21lcklEIikgfCBodG1sICVdPC9sYWJlbD5bJSBEYXRhLkN1c3RvbWVySUQgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lcklEUk8iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+PGRpdiB0aXRsZT0iWyUgRGF0YS5DdXN0b21lck5hbWUgfCBodG1sICVdIj5bJSBEYXRhLkN1c3RvbWVyTmFtZSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQzIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWUKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDMiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdPC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDNMaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQzTGluayIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQzUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48c3Bhbj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDNQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDMiKSAlXQojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTb2x1dGlvbiBUaW1lIikgfCBodG1sICVdPC9sYWJlbD4KI1slIFJlbmRlckJsb2NrU3RhcnQoIlNvbHV0aW9uVGltZSIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuU29sdXRpb25UaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5Tb2x1dGlvblRpbWVDbGFzcyB8IGh0bWwgJV0iPlslIERhdGEuU29sdXRpb25UaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5Tb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJTb2x1dGlvblRpbWUiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcCBDZW50ZXIgRHluYW1pY0ZpZWxkU2VwYXJhdG9yIj48L2Rpdj4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJJbmZvcyI+CiAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlUm93IikgJV0KICAgICAgICAgICAgICAgICAgICA8dHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZExpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48c3Bhbj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZFRhYmxlUm93IikgJV0KICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgIDwvdGFibGU+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZSIpICVdCiAgICAgICAgPC9kaXY+CiAgICA8L2xpPgoKWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50Q29udGVudCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEZvb3RlciIpICVdCjwvdWw+Cgo8Zm9ybSBuYW1lPSJidWxrIiBhY3Rpb249IiI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgo8L2Zvcm0+Cgo8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0ibWF0cml4Ij4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50VGlja2V0QnVsayIvPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEZvb3RlckJ1bGtJdGVtIikgJV0KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iIi8+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEZvb3RlckJ1bGtJdGVtIikgJV0KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iIi8+CjwvZm9ybT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50Rm9vdGVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50TWVudUl0ZW1Nb3ZlRm9ybSIpICVdCjxsaSBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iPgogICAgPGZvcm0gdGl0bGU9IlslIFRyYW5zbGF0ZSgiTW92ZSB0aWNrZXQgdG8gYSBkaWZmZXJlbnQgcXVldWUiKSB8IGh0bWwgJV0iIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldE1vdmUiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJRdWV1ZUlEIiB2YWx1ZT0iWyUgRGF0YS5RdWV1ZUlEIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICA8bGFiZWwgZm9yPSJEZXN0UXVldWVJRCIgY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIHF1ZXVlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgWyUgRGF0YS5Nb3ZlUXVldWVzU3RyZyAlXQogICAgPC9mb3JtPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnLklubGluZUFjdGlvbnMsIC5PdmVydmlld0FjdGlvbnMnKS5vbignY2hhbmdlJywgJ3NlbGVjdFtuYW1lPURlc3RRdWV1ZUlEXScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICQodGhpcykuY2xvc2VzdCgnZm9ybScpLnN1Ym1pdCgpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQo8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRNZW51SXRlbU1vdmVGb3JtIikgJV0KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRSZWFkeUFjdGlvblJvd0FkZCIpICVdClslIEZPUkVBQ0ggTWVudUVsZW1lbnQgSU4gRGF0YS5EYXRhICVdCiAgICBbJSBNZW51RWxlbWVudC5OYW1lID0gSW50ZXJwb2xhdGUoTWVudUVsZW1lbnQuTmFtZSkgJV0KICAgIFslIE1lbnVFbGVtZW50LkxpbmsgPSBJbnRlcnBvbGF0ZShNZW51RWxlbWVudC5MaW5rKSAlXQogICAgWyUgTWVudUVsZW1lbnQuRGVzY3JpcHRpb24gPSBJbnRlcnBvbGF0ZShNZW51RWxlbWVudC5EZXNjcmlwdGlvbikgJV0KWyUgRU5EICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5VSS5BY3Rpb25Sb3cuQWRkQWN0aW9ucygkKCcjVGlja2V0SURfWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0nKSwgWyUgSlNPTihEYXRhLkRhdGEpICVdKTsKLy9dXT48L3NjcmlwdD4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50UmVhZHlBY3Rpb25Sb3dBZGQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudFJlYWR5U3RhcnQiKSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuVUkuSW5pdENoZWNrYm94U2VsZWN0aW9uKCQoJ2Rpdi5DaGVja2JveCcpKTsKICAgICQoJy5NYXN0ZXJBY3Rpb24nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKTsKICAgICAgICAvLyBwcmV2ZW50IE1hc3RlckFjdGlvbiBvbiBEeW5hbWljIEZpZWxkcyBsaW5rcwogICAgICAgIGlmICgkKEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ0R5bmFtaWNGaWVsZExpbmsnKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gb25seSBhY3QgaWYgdGhlIGxpbmsgd2FzIG5vdCBjbGlja2VkIGRpcmVjdGx5CiAgICAgICAgaWYgKEV2ZW50LnRhcmdldCAhPT0gJE1hc3RlckFjdGlvbkxpbmsuZ2V0KDApKSB7CiAgICAgICAgICAgIGlmIChFdmVudC5jdHJsS2V5IHx8IEV2ZW50Lm1ldGFLZXkpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKCRNYXN0ZXJBY3Rpb25MaW5rLmF0dHIoJ2hyZWYnKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRSZWFkeVN0YXJ0IikgJV0KWyUgRU5EICVdCg==
IyAtLQojIEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3LnR0IC0gcHJvdmlkZXMgSFRNTCBUaWNrZXQgT3ZlcnZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvNDc4ZWU2NjVjNTM1YjY4MDI5Y2VkNGRjYTE5N2I1MjM1YjdiMTkyZi9LZXJuZWwvT3V0cHV0L0hUTUwvU3RhbmRhcmQvQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcudHQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRBY3Rpb25Sb3ciKSAlXQo8dWwgY2xhc3M9IkFjdGlvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEFjdGlvblJvd0J1bGsiKSAlXQogICAgPGxpIGNsYXNzPSJBbHdheXNQcmVzZW50Ij4KICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZWxlY3QgYWxsIikgfCBodG1sICVdIiBpZD0iU2VsZWN0QWxsVGlja2V0cyIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iSW52aXNpYmxlVGV4dCIgZm9yPSJTZWxlY3RBbGxUaWNrZXRzIj5bJSBUcmFuc2xhdGUoIlNlbGVjdCBhbGwiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgIDwvc3Bhbj4KICAgIDwvbGk+CiAgICA8bGkgaWQ9IkJ1bGtBY3Rpb24iIGNsYXNzPSJBbHdheXNQcmVzZW50IEluYWN0aXZlIFslIERhdGEuQ1NTIHwgaHRtbCAlXSI+CiAgICAgICAgPGEgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPgogICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50QWN0aW9uUm93QnVsayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50QWN0aW9uUm93SXRlbSIpICVdCiAgICA8bGk+PGEgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBEYXRhLkxpbmsgfCBodG1sICVdIiB0aXRsZT0iWyUgRGF0YS5EZXNjcmlwdGlvbiB8IGh0bWwgJV0iPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50QWN0aW9uUm93SXRlbSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50QWN0aW9uUm93SFRNTCIpICVdCiAgICBbJSBEYXRhLkhUTUwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50QWN0aW9uUm93SFRNTCIpICVdCjwvdWw+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEFjdGlvblJvdyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEhlYWRlciIpICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLlVJLkFjdGlvblJvdy5Jbml0KCk7CgogICAgJCgnYS5Bc1BvcHVwJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgTWF0Y2hlcywKICAgICAgICAgICAgUG9wdXBUeXBlID0gJ1RpY2tldEFjdGlvbic7CgogICAgICAgIE1hdGNoZXMgPSAkKHRoaXMpLmF0dHIoJ2NsYXNzJykubWF0Y2goL1BvcHVwVHlwZV8oXHcrKS8pOwogICAgICAgIGlmIChNYXRjaGVzKSB7CiAgICAgICAgICAgIFBvcHVwVHlwZSA9IE1hdGNoZXNbMV07CiAgICAgICAgfQoKICAgICAgICBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cCgkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgUG9wdXBUeXBlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgo8dWwgaWQ9IlRpY2tldE92ZXJ2aWV3TGFyZ2UiIGNsYXNzPSJPdmVydmlldyBPdmVydmlld0xhcmdlIFslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50SGVhZGVyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk5vVGlja2V0Rm91bmQiKSAlXQogICAgPGxpIGlkPSJFbXB0eU1lc3NhZ2VMYXJnZSI+CiAgICAgICAgWyUgVHJhbnNsYXRlKCJObyB0aWNrZXQgZGF0YSBmb3VuZC4iKSB8IGh0bWwgJV0KICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJOb1RpY2tldEZvdW5kIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkRvY3VtZW50Q29udGVudCIpICVdCiAgICA8bGkgaWQ9IlRpY2tldElEX1slIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiBjbGFzcz0iTWFzdGVyQWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50IFslIERhdGEuQWRkaXRpb25hbENsYXNzZXMgfCBodG1sICVdIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW5saW5lQWN0aW9uUm93IikgJV0KICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIElubGluZUFjdGlvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmxpbmVBY3Rpb25Sb3dJdGVtIikgJV0KICAgICAgICAgICAgICAgIDxsaT48YSBpZD0iWyUgRGF0YS5JRCB8IGh0bWwgJV1bJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBEYXRhLkRlc2NyaXB0aW9uIHwgSW50ZXJwb2xhdGUgfCBodG1sICVdIj5bJSBEYXRhLk5hbWUgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV08L2E+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIklubGluZUFjdGlvblJvd0l0ZW0iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbmxpbmVBY3Rpb25Sb3dJdGVtSFRNTCIpICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLkhUTUwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIklubGluZUFjdGlvblJvd0l0ZW1IVE1MIikgJV0KICAgICAgICAgICAgPC91bD4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIC8vIFN0b3AgcHJvcGFnYXRpb24gb24gY2xpY2sgb24gYSBwYXJ0IG9mIHRoZSBJbmxpZW5BY3Rpb25Sb3cgd2l0aG91dCBhIGxpbmsKICAgIC8vIE90aGVyd2lzZSB0aGF0IHdvdWxkIHRyaWdnZXIgdGhlIGxpLXdpZGUgbGluayB0byB0aGUgdGlja2V0em9vbQogICAgJCgndWwuSW5saW5lQWN0aW9ucycpLmNsaWNrKGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIEV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7CiAgICAgICAgaWYgKEV2ZW50LnN0b3BQcm9wYWdhdGlvbikgewogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICB9CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJJbmxpbmVBY3Rpb25Sb3ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCdWxrIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2hlY2tib3giPgogICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJDaGVja2JveCIgdHlwZT0iY2hlY2tib3giIG5hbWU9IlRpY2tldElEIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZWxlY3QgdGhpcyB0aWNrZXQiKSB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQnVsayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk1ldGEiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZXRhSWNvbiIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuVGl0bGUpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iWyUgRGF0YS5DbGFzc1NwYW4gfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPGVtPlslIFRyYW5zbGF0ZShEYXRhLlRpdGxlKSB8IGh0bWwgJV08L2VtPgogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk1ldGFJY29uIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIk1ldGEiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJJbmZvcyI+CiAgICAgICAgICAgICAgICA8aDI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdIiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJNYXN0ZXJBY3Rpb25MaW5rIj5bJSBDb25maWcoIlRpY2tldDo6SG9vayIpICVdOiBbJSBEYXRhLlRpY2tldE51bWJlciAlXSAmbmRhc2g7IFslIERhdGEuVGl0bGUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC9oMj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWVudUl0ZW0iKSAlXQogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdWyUgRGF0YS5MaW5rICVdIiBbJSBEYXRhLkxpbmtQYXJhbSAlXSBjbGFzcz0ibWVudWl0ZW0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5EZXNjcmlwdGlvbikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJNZW51SXRlbSIpICVdCiAgICAgICAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQWdlIikgfCBodG1sICVdPC9sYWJlbD5bJSBEYXRhLkFnZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUXVldWUiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuUXVldWUgfCBodG1sICVdIj5bJSBEYXRhLlF1ZXVlIHwgdHJ1bmNhdGUoMjYpIHwgaHRtbCAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV08L2xhYmVsPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlN0YXRlIikgfCBodG1sICVdPC9sYWJlbD48ZGl2IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuU2VydmljZSB8IGh0bWwgJV0iPlslIERhdGEuU2VydmljZSB8IHRydW5jYXRlKDI2KSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNMQSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuU0xBIHwgaHRtbCAlXSI+WyUgRGF0YS5TTEEgfCB0cnVuY2F0ZSgyNikgfCBodG1sICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiT3duZXIiKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIERhdGEuVXNlckZpcnN0bmFtZSB8IGh0bWwgJV0gWyUgRGF0YS5Vc2VyTGFzdG5hbWUgfCBodG1sICVdIChbJSBEYXRhLk93bmVyIHwgaHRtbCAlXSkiPlslIERhdGEuVXNlckZpcnN0bmFtZSB8IHRydW5jYXRlKDE1KSB8IGh0bWwgJV0gWyUgRGF0YS5Vc2VyTGFzdG5hbWUgfCB0cnVuY2F0ZSgxNSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkxvY2siKSB8IGh0bWwgJV08L2xhYmVsPjxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkxvY2spIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTG9jaykgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9Ik1pZGRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+ClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVySUQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkN1c3RvbWVySUQiKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lcklEUlciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIENvbmZpZygiQ3VzdG9tZXJEQkxpbmsiKSB8IEludGVycG9sYXRlICVdIiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiBbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rVGFyZ2V0IikgJV0+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXTwvYT48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVySURSVyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVySURSTyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXSI+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJJRFJPIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJOYW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkN1c3RvbWVyTmFtZSB8IGh0bWwgJV0iPlslIERhdGEuQ3VzdG9tZXJOYW1lIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJOYW1lIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVySUQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkZpcnN0IFJlc3BvbnNlIFRpbWUiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZUNsYXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuRmlyc3RSZXNwb25zZVRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZpcnN0UmVzcG9uc2VUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTwvbGFiZWw+PGRpdiB0aXRsZT0iWyUgRGF0YS5UeXBlIHwgaHRtbCAlXSI+WyUgRGF0YS5UeXBlIHwgaHRtbCAlXTwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJVcGRhdGUgVGltZSIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuVXBkYXRlVGltZVdvcmtpbmdUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuVXBkYXRlVGltZUNsYXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5VcGRhdGVUaW1lSHVtYW4gfCBodG1sICVdIC8gWyUgRGF0YS5VcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTb2x1dGlvblRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNvbHV0aW9uIFRpbWUiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLlNvbHV0aW9uVGltZVdvcmtpbmdUaW1lIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuU29sdXRpb25UaW1lQ2xhc3MgfCBodG1sICVdIj5bJSBEYXRhLlNvbHV0aW9uVGltZUh1bWFuIHwgaHRtbCAlXSAvIFslIERhdGEuU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTb2x1dGlvblRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iTWlkZGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDcml0aWNhbGl0eSIpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5Dcml0aWNhbGl0eSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkNyaXRpY2FsaXR5KSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiSW1wYWN0IikgfCBodG1sICVdPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLkltcGFjdCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkltcGFjdCkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkVGFibGVSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IlslIERhdGEuQ2xhc3MgJV0iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRMaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxzcGFuPlslIERhdGEuVmFsdWUgJV08L3NwYW4+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRUYWJsZVJvdyIpICVdCgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgYW5kIEZpZWxkMiBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lcwojICAgICAgICAgICAgICAgICAgICA8dHI+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQxX1RhYmxlUm93UmVjb3JkIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTwvbGFiZWw+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQxX1RhYmxlUm93UmVjb3JkTGluayIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMV9UYWJsZVJvd1JlY29yZExpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMV9UYWJsZVJvd1JlY29yZFBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PHNwYW4+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxX1RhYmxlUm93UmVjb3JkUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KI1slIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfRmllbGQxX1RhYmxlUm93UmVjb3JkIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAgICAgICAgICAgICAgICAgICAgPHRyPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMl9UYWJsZVJvd1JlY29yZCIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV08L2xhYmVsPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0ZpZWxkMl9UYWJsZVJvd1JlY29yZExpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDJfVGFibGVSb3dSZWNvcmRMaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDJfVGFibGVSb3dSZWNvcmRQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxzcGFuPlslIERhdGEuVmFsdWUgJV08L3NwYW4+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMl9UYWJsZVJvd1JlY29yZFBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMl9UYWJsZVJvd1JlY29yZCIpICVdCiMgICAgICAgICAgICAgICAgICAgIDwvdHI+CgogICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVzUHJldmlld0FyZWEiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJQcmV2aWV3Ij4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlUHJldmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBEYXRhLkZyb20gfCBodG1sICVdICZuZGFzaDsgWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSAmbmRhc2g7IFslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkhlYWRsaW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Gcm9tUmVhbG5hbWUgfCB0cnVuY2F0ZSg1MCkgfCBodG1sICVdICZuZGFzaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlN1YmplY3QiPlslIERhdGEuU3ViamVjdCB8IHRydW5jYXRlKDcwKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEYXRlVGltZSI+WyUgRGF0YS5DcmVhdGVkIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDbGVhciI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIaWRkZW5CbG9jayI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVQcmV2aWV3QWN0aW9uUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZVByZXZpZXdBY3Rpb25Sb3dJdGVtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIiBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgaWQ9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRGF0YS5BY3Rpb24gfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFydGljbGVJRCIgdmFsdWU9IlslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlcGx5QWxsIiB2YWx1ZT0iWyUgRGF0YS5SZXBseUFsbCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJSZXNwb25zZUlEWyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdIiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFuZGFyZFJlc3BvbnNlc1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0gc2VsZWN0W25hbWU9UmVzcG9uc2VJRF0nKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgVVJMOwoKICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA+IDApIHsKICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICQodGhpcykucGFyZW50cygpLnNlcmlhbGl6ZSgpOwogICAgICAgICAgICBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cChVUkwsICdUaWNrZXRBY3Rpb24nKTsKICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHNlbGVjdCBib3ggc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBmcm9tIHRoZSBzYW1lIHdpbmRvdwogICAgICAgICAgICAkKHRoaXMpLnZhbCgnMCcpOwogICAgICAgIH0KICAgIH0pOwogICAgLy8gbWFrZSBzdXJlIHRoaXMgY2xpY2sgZXZlbnQgZG9lcyBub3QgYnViYmxlIHVwIHRvIHRoZSB0YWJsZSByb3cgYW5kIGV4ZWN1dGUgaXRzIGNsaWNrIGhhbmRsZXIKICAgICQoJyNbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0gc2VsZWN0W25hbWU9UmVzcG9uc2VJRF0nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVQcmV2aWV3QWN0aW9uUm93SXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhckxlZnQiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlUHJldmlld0FjdGlvblJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50IEFydGljbGVCb2R5Ij4KWyUgRGF0YS5Cb2R5Tm90ZSAlXQpbJSBEYXRhLkJvZHkgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZVByZXZpZXciKSAlXQogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlc1ByZXZpZXdBcmVhIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50Q29udGVudCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudEZvb3RlciIpICVdCjwvdWw+CgoKPGZvcm0gbmFtZT0iYnVsayIgYWN0aW9uPSIiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIiLz4KPC9mb3JtPgoKPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9Im1hdHJpeCI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldEJ1bGsiLz4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRGb290ZXJCdWxrSXRlbSIpICVdCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRGb290ZXJCdWxrSXRlbSIpICVdCiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgo8L2Zvcm0+ClslIFJlbmRlckJsb2NrRW5kKCJEb2N1bWVudEZvb3RlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudE1lbnVJdGVtTW92ZUZvcm0iKSAlXQo8bGkgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KICAgIDxmb3JtIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1vdmUgdGlja2V0IHRvIGEgZGlmZmVyZW50IHF1ZXVlIikgfCBodG1sICVdIiBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldE1vdmUiLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJRdWV1ZUlEIiB2YWx1ZT0iWyUgRGF0YS5RdWV1ZUlEIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICA8bGFiZWwgZm9yPSJEZXN0UXVldWVJRCIgY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQ2hhbmdlIHF1ZXVlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgWyUgRGF0YS5Nb3ZlUXVldWVzU3RyZyAlXQogICAgPC9mb3JtPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnLklubGluZUFjdGlvbnMsIC5PdmVydmlld0FjdGlvbnMnKS5vbignY2hhbmdlJywgJ3NlbGVjdFtuYW1lPURlc3RRdWV1ZUlEXScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICQodGhpcykuY2xvc2VzdCgnZm9ybScpLnN1Ym1pdCgpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQo8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRG9jdW1lbnRNZW51SXRlbU1vdmVGb3JtIikgJV0KClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRG9jdW1lbnRSZWFkeUFjdGlvblJvd0FkZCIpICVdClslIEZPUkVBQ0ggTWVudUVsZW1lbnQgSU4gRGF0YS5EYXRhICVdCiAgICBbJSBNZW51RWxlbWVudC5OYW1lID0gSW50ZXJwb2xhdGUoTWVudUVsZW1lbnQuTmFtZSkgJV0KICAgIFslIE1lbnVFbGVtZW50LkxpbmsgPSBJbnRlcnBvbGF0ZShNZW51RWxlbWVudC5MaW5rKSAlXQogICAgWyUgTWVudUVsZW1lbnQuRGVzY3JpcHRpb24gPSBJbnRlcnBvbGF0ZShNZW51RWxlbWVudC5EZXNjcmlwdGlvbikgJV0KWyUgRU5EICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5VSS5BY3Rpb25Sb3cuQWRkQWN0aW9ucygkKCcjVGlja2V0SURfWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0nKSwgWyUgSlNPTihEYXRhLkRhdGEpICVdKTsKLy9dXT48L3NjcmlwdD4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50UmVhZHlBY3Rpb25Sb3dBZGQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEb2N1bWVudFJlYWR5U3RhcnQiKSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuVUkuSW5pdENoZWNrYm94U2VsZWN0aW9uKCQoJ2Rpdi5DaGVja2JveCcpKTsKICAgICQoJy5NYXN0ZXJBY3Rpb24nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKTsKCiAgICAgICAgLy8gaWYgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIHNlbGVjdCB0ZXh0IGZyb20gYW4gYXJ0aWNsZSwgTWFzdGVyQWN0aW9uIHNob3VsZCBub3QgYmUgZXhlY3V0ZWQKICAgICAgICBpZiAodHlwZW9mIEV2ZW50LnRhcmdldCA9PT0gJ29iamVjdCcgJiYgKCQoRXZlbnQudGFyZ2V0KS5oYXNDbGFzcygnQXJ0aWNsZUJvZHknKSB8fCAkKEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ0FjdGlvblJvdycpKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBwcmV2ZW50IE1hc3RlckFjdGlvbiBvbiBEeW5hbWljIEZpZWxkcyBsaW5rcwogICAgICAgIGlmICgkKEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ0R5bmFtaWNGaWVsZExpbmsnKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8vIG9ubHkgYWN0IGlmIHRoZSBsaW5rIHdhcyBub3QgY2xpY2tlZCBkaXJlY3RseQogICAgICAgIGlmIChFdmVudC50YXJnZXQgIT09ICRNYXN0ZXJBY3Rpb25MaW5rLmdldCgwKSkgewogICAgICAgICAgICBpZiAoRXZlbnQuY3RybEtleSB8fCBFdmVudC5tZXRhS2V5KSB7CiAgICAgICAgICAgICAgICB3aW5kb3cub3BlbigkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJE1hc3RlckFjdGlvbkxpbmsuYXR0cignaHJlZicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9KTsKICAgIENvcmUuVUkuQWNjb3JkaW9uLkluaXQoJCgnLlByZXZpZXcgPiB1bCcpLCAnbGkgaDMgYScsICcuSGlkZGVuQmxvY2snKTsKLy9dXT48L3NjcmlwdD4KWyUgUmVuZGVyQmxvY2tFbmQoIkRvY3VtZW50UmVhZHlTdGFydCIpICVdClslIEVORCAlXQo=
IyAtLQojIEFnZW50VGlja2V0UGhvbmUudHQgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIHBob25lCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTYgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJG9yaWdpbjogaHR0cHM6Ly9naXRodWIuY29tL09UUlMvb3Rycy9ibG9iLzQ3OGVlNjY1YzUzNWI2ODAyOWNlZDRkY2ExOTdiNTIzNWI3YjE5MmYvS2VybmVsL091dHB1dC9IVE1ML1N0YW5kYXJkL0FnZW50VGlja2V0UGhvbmUudHQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIEluc2VydFRlbXBsYXRlKCJBZ2VudEN1c3RvbWVyU2VhcmNoLnR0IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gRm9ybVNjcmVlbiI+CgogICAgWyUgSUYgRGF0YS5UaWNrZXRJRCAlXQogICAgPGgxPlslIFRyYW5zbGF0ZSgiU3BsaXQgSW50byBOZXcgUGhvbmUgVGlja2V0IikgfCBodG1sICVdPC9oMT4KICAgIFslIEVMU0lGIERhdGEuRnJvbUNoYXRJRCAlXQogICAgPGgxPlslIFRyYW5zbGF0ZSgiU2F2ZSBDaGF0IEludG8gTmV3IFBob25lIFRpY2tldCIpIHwgaHRtbCAlXTwvaDE+CiAgICBbJSBFTFNFICVdCiAgICA8aDE+WyUgVHJhbnNsYXRlKCJDcmVhdGUgTmV3IFBob25lIFRpY2tldCIpIHwgaHRtbCAlXTwvaDE+CiAgICBbJSBFTkQgJV0KCiAgICA8cCBjbGFzcz0iQXN0ZXJpc2tFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJBbGwgZmllbGRzIG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrICgqKSBhcmUgbWFuZGF0b3J5LiIpIHwgaHRtbCAlXTwvcD4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckxhc3QiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJUYWJsZSIpICVdCiAgICAgICAgICAgIDxkaXYgaWQ9IkN1c3RvbWVySW5mbyIgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkN1c3RvbWVyIEluZm9ybWF0aW9uIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5DdXN0b21lclRhYmxlICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lclRhYmxlIikgJV0KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIiBpZD0iTmV3UGhvbmVUaWNrZXQiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlTmV3Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSJbJSBEYXRhLkZvcm1JRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkV4cGFuZEN1c3RvbWVyTmFtZSIgaWQ9IkV4cGFuZEN1c3RvbWVyTmFtZSIgdmFsdWU9IjAiLz4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJbXBhY3RSQyIgdmFsdWU9IjAiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByaW9yaXR5UkMiIHZhbHVlPSIwIi8+CiMgLS0tCiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJPd25lckFsbCIgaWQ9Ik93bmVyQWxsIiB2YWx1ZT0iWyUgRGF0YS5Pd25lckFsbCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlc3BvbnNpYmxlQWxsIiBpZD0iUmVzcG9uc2libGVBbGwiIHZhbHVlPSJbJSBEYXRhLlJlc3BvbnNpYmxlQWxsIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJlU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJQcmVTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJVc2VyIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTGlua1RpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5MaW5rVGlja2V0SUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGcm9tQ2hhdElEIiB2YWx1ZT0iWyUgRGF0YS5Gcm9tQ2hhdElEIHwgaHRtbCAlXSIvPgoKICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiMgZXhhbXBsZSB0ZW1wbGF0ZSBmb3IgY3VzdG9taXphdGlvbnMsIHNlZSBoaWRkZW4gZm9ybSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCiMgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRlbXBsYXRlcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0iJCgnI1RlbXBsYXRlMScpLnN1Ym1pdCgpIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJFeGFtcGxlIFRlbXBsYXRlIikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIkV4YW1wbGUgVGVtcGxhdGUiKSB8IGh0bWwgJV08L2J1dHRvbj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0VHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVHlwZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUeXBlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjVHlwZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1R5cGVJRCcsIFsnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFR5cGUiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJGcm9tQ3VzdG9tZXIiIGNsYXNzPSJNYW5kYXRvcnkiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IkZyb21DdXN0b21lciIgdHlwZT0idGV4dCIgbmFtZT0iRnJvbUN1c3RvbWVyIiB2YWx1ZT0iIiBjbGFzcz0iQ3VzdG9tZXJBdXRvQ29tcGxldGUgVzc1cGMgWyUgRGF0YS5Gcm9tSW52YWxpZCB8IGh0bWwgJV0iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGcm9tQ3VzdG9tZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGcm9tU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJQbGVhc2UgaW5jbHVkZSBhdCBsZWFzdCBvbmUgY3VzdG9tZXIgZm9yIHRoZSB0aWNrZXQuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiRnJvbVNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBbJSBEYXRhLkN1c3RvbWVySGlkZGVuQ29udGFpbmVyIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGVtcGxhdGVGcm9tQ3VzdG9tZXIgU3BhY2luZ1RvcFNtYWxsIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgY3VzdG9tZXIgYXMgdGhlIG1haW4gY3VzdG9tZXIuIikgfCBodG1sICVdIiBpZD0iQ3VzdG9tZXJTZWxlY3RlZCIgY2xhc3M9IkN1c3RvbWVyVGlja2V0UmFkaW8iIHR5cGU9InJhZGlvIiB2YWx1ZT0iIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJLZXkiIGlkPSJDdXN0b21lcktleSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdIiBuYW1lPSJDdXN0b21lclRpY2tldFRleHQiIGlkPSJDdXN0b21lclRpY2tldFRleHQiIHR5cGU9InRleHQiIHZhbHVlPSIiIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJSZW1vdmVDdXN0b21lclRpY2tldCIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIFRpY2tldCBDdXN0b21lciBVc2VyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldEN1c3RvbWVyQ29udGVudEZyb21DdXN0b21lciIgY2xhc3M9IkN1c3RvbWVyQ29udGFpbmVyIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTXVsdGlwbGVDdXN0b21lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wU21hbGwgIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VsZWN0IHRoaXMgY3VzdG9tZXIgYXMgdGhlIG1haW4gY3VzdG9tZXIuIikgfCBodG1sICVdIiBpZD0iQ3VzdG9tZXJTZWxlY3RlZCIgY2xhc3M9IkN1c3RvbWVyVGlja2V0UmFkaW8iIHR5cGU9InJhZGlvIiB2YWx1ZT0iWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIFslIERhdGEuQ3VzdG9tZXJTZWxlY3RlZCB8IGh0bWwgJV0gIFslIERhdGEuQ3VzdG9tZXJEaXNhYmxlZCB8IGh0bWwgJV0gLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iQ3VzdG9tZXJLZXlfWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0iIGlkPSJDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgY2xhc3M9IkN1c3RvbWVyS2V5IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyS2V5IHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIFslIERhdGEuQ3VzdG9tZXJFcnJvciB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkN1c3RvbWVyIHVzZXIiKSB8IGh0bWwgJV0iIG5hbWU9IkN1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdIiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIHR5cGU9InRleHQiIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyRWxlbWVudCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iUmVtb3ZlQ3VzdG9tZXJUaWNrZXRfWyUgRGF0YS5Db3VudCAlXSIgY2xhc3M9IlJlbW92ZUJ1dHRvbiBDdXN0b21lclRpY2tldFJlbW92ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1taW51cy1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgVGlja2V0IEN1c3RvbWVyIFVzZXIiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJFeHBsYW5hdGlvbiBFcnJvciI+WyUgVHJhbnNsYXRlKCJQbGVhc2UgcmVtb3ZlIHRoaXMgZW50cnkgYW5kIGVudGVyIGEgbmV3IG9uZSB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkN1c3RvbWVyRXJyb3JFeHBsYW50aW9uIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkludmFsaWRDb25maWdTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBlbWFpbCBhZGRyZXNzIGlzIG5vdCBhbGxvd2VkIGR1ZSB0byB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZW1haWwgYWRkcmVzcyBmYWlsZWQgTVggY2hlY2suIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkROUyBwcm9ibGVtLCBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGFuZCB0aGUgZXJyb3IgbG9nLiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkludmFsaWRETlNTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhlIHN5bnRheCBvZiB0aGlzIGVtYWlsIGFkZHJlc3MgaXMgaW5jb3JyZWN0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIklzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk11bHRpcGxlQ3VzdG9tZXIiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIk11bHRpcGxlQ3VzdG9tZXJDb3VudGVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkN1c3RvbWVyVGlja2V0Q291bnRlckZyb21DdXN0b21lciIgaWQ9IkN1c3RvbWVyVGlja2V0Q291bnRlckZyb21DdXN0b21lciIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iWyUgRGF0YS5DdXN0b21lckNvdW50ZXIgfCBodG1sICVdIi8+ClslIFJlbmRlckJsb2NrRW5kKCJNdWx0aXBsZUN1c3RvbWVyQ291bnRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnLkN1c3RvbWVyVGlja2V0UmFkaW8nKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIEN1c3RvbWVyS2V5OwogICAgICAgIGlmICggJCh0aGlzKS5hdHRyKCdjaGVja2VkJykgKXsKCiAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0gJCggJyNDdXN0b21lcktleV8nICskKHRoaXMpLnZhbCgpICkudmFsKCk7CiAgICAgICAgICAgIC8vIGdldCBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guUmVsb2FkQ3VzdG9tZXJJbmZvKEN1c3RvbWVyS2V5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgJCgnLkN1c3RvbWVyVGlja2V0UmVtb3ZlJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5SZW1vdmVDdXN0b21lclRpY2tldCggJCh0aGlzKSApOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkZyb21FeHRlcm5hbEN1c3RvbWVyIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guQWRkVGlja2V0Q3VzdG9tZXIoICdGcm9tQ3VzdG9tZXInLCAiWyUgRGF0YS5FbWFpbCB8IGh0bWwgJV0iLCAiWyUgRGF0YS5DdXN0b21lciB8IGh0bWwgJV0iLCB0cnVlICk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiRnJvbUV4dGVybmFsQ3VzdG9tZXIiKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21lcklEIj5bJSBUcmFuc2xhdGUoIkN1c3RvbWVySUQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDdXN0b21lcklEIiBpZD0iQ3VzdG9tZXJJRCIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV0iIFslIElGIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQaG9uZTo6Q3VzdG9tZXJJRFJlYWRPbmx5IikgJV0gcmVhZG9ubHkgWyUgRU5EICVdIGNsYXNzPSJXNzVwYyIvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iRGVzdCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJUbyBxdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ub1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVzdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlc3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjRGVzdCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdEZXN0JywgWydUeXBlSUQnLCAnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSUQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiU2VydmljZSBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXJ2aWNlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJywgWydUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiMgLS0tCiMgSVRTTQojIC0tLQojICAgIH0pOwoKLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgICAgIC8vIHNob3cgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZQogICAgICAgIElUU00uQWdlbnQuSW5jaWRlbnRTdGF0ZS5TaG93SW5jaWRlbnRTdGF0ZSh7CiAgICAgICAgICAgIEFjdGlvbjogJ1slIEVudigiQWN0aW9uIikgJV0nLAogICAgICAgICAgICBTZXJ2aWNlSUQ6ICQoJyNTZXJ2aWNlSUQnKS52YWwoKQogICAgICAgIH0pOwp9KTsKIyAtLS0KLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPlslIFRyYW5zbGF0ZSgiU2VydmljZSBJbmNpZGVudCBTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBjbGFzcz0iVmFsdWUiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVTaWduYWwiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZSI+Jm5ic3A7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgojIC0tLQpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U2VydmljZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTZXJ2aWNlTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTZXJ2aWNlSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiU2VydmljZSBpbnZhbGlkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXJ2aWNlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJywgWydUeXBlSUQnLCAnRGVzdCcsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiMgLS0tCiMgSVRTTQojIC0tLQojICAgIH0pOwoKLypnbG9iYWwgSVRTTTogdHJ1ZSAqLwogICAgICAgIC8vIHNob3cgc2VydmljZSBpbmNpZGVudCBzdGF0ZSBhbmQgc2lnbmFsIGZvciB0aGUgc2VsZWN0ZWQgc2VydmljZQogICAgICAgIElUU00uQWdlbnQuSW5jaWRlbnRTdGF0ZS5TaG93SW5jaWRlbnRTdGF0ZSh7CiAgICAgICAgICAgIEFjdGlvbjogJ1slIEVudigiQWN0aW9uIikgJV0nLAogICAgICAgICAgICBTZXJ2aWNlSUQ6ICQoJyNTZXJ2aWNlSUQnKS52YWwoKQogICAgICAgIH0pOwp9KTsKIyAtLS0KLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZUNvbnRhaW5lciIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPlslIFRyYW5zbGF0ZSgiU2VydmljZSBJbmNpZGVudCBTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJbmNpZGVudFN0YXRlQ29udGFpbmVyIiBjbGFzcz0iVmFsdWUiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iU2VydmljZUluY2lkZW50U3RhdGVTaWduYWwiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJTZXJ2aWNlSW5jaWRlbnRTdGF0ZSI+Jm5ic3A7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgojIC0tLQpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U2VydmljZU1hbmRhdG9yeSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNMQUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgTGV2ZWwgQWdyZWVtZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNMQVN0cmcgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTTEFJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTTEFJRCcsIFsnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnU2VydmljZUlEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRTTEEiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0U0xBTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTTEFJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TTEFTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNMQUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU0xBSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU0xBSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU0xBSUQnLCBbJ1R5cGVJRCcsICdEZXN0JywgJ05ld1VzZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ1NlcnZpY2VJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U0xBTWFuZGF0b3J5IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIk93bmVyU2VsZWN0aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdVc2VySUQiPlslIFRyYW5zbGF0ZSgiT3duZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuT3B0aW9uU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iT3duZXJTZWxlY3Rpb25HZXRBbGwiIGNsYXNzPSJHZXRBbGxBSkFYIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJHZXQgYWxsIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiR2V0IGFsbCIpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1yZWZyZXNoIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNPd25lclNlbGVjdGlvbkdldEFsbCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgJCgnI093bmVyQWxsJykudmFsKCcxJyk7IC8vIE5lZWRlZD8gV2h5PwogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdPd25lckFsbCcsIFsnTmV3VXNlcklEJ10sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCcjTmV3VXNlcklEJykuZm9jdXMoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKCiAgICAkKCcjTmV3VXNlcklEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ05ld1VzZXJJRCcsIFsgJ1R5cGVJRCcsICdEZXN0JywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPd25lclNlbGVjdGlvbiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZXNwb25zaWJsZVNlbGVjdGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV3UmVzcG9uc2libGVJRCI+WyUgVHJhbnNsYXRlKCJSZXNwb25zaWJsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5SZXNwb25zaWJsZU9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IlJlc3BvbnNpYmxlU2VsZWN0aW9uR2V0QWxsIiBjbGFzcz0iR2V0QWxsQUpBWCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiR2V0IGFsbCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIkdldCBhbGwiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcmVmcmVzaCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjUmVzcG9uc2libGVTZWxlY3Rpb25HZXRBbGwnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICQoJyNSZXNwb25zaWJsZUFsbCcpLnZhbCgnMScpOyAvLyBOZWVkZWQ/IFdoeT8KICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnUmVzcG9uc2libGVBbGwnLCBbJ05ld1Jlc3BvbnNpYmxlSUQnXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJyNOZXdSZXNwb25zaWJsZUlEJykuZm9jdXMoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKCiAgICAkKCcjTmV3UmVzcG9uc2libGVJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdOZXdSZXNwb25zaWJsZUlEJywgWyAnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU2VydmljZUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RvJywgJ0NjJywgJ0JjYycsICdTdGFuZGFyZFRlbXBsYXRlSUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVzcG9uc2libGVTZWxlY3Rpb24iKSAlXQoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTdWJqZWN0Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iVzc1cGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5TdWJqZWN0SW52YWxpZCB8IGh0bWwgJV0iIHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIGlkPSJTdWJqZWN0IiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldE9wdGlvbnMiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk9wdGlvbnMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+Cgo8IS0tIE91dHB1dEZpbHRlckhvb2tfVGlja2V0T3B0aW9uc0JlZ2luIC0tPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3BlbGxDaGVjayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJPcHRpb25TcGVsbENoZWNrIj5bIFslIFRyYW5zbGF0ZSgiU3BlbGwgY2hlY2siKSB8IGh0bWwgJV0gXTwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIlNwZWxsQ2hlY2siKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiT3B0aW9uQ3VzdG9tZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iT3B0aW9uQ3VzdG9tZXIiPlsgWyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdIF08L2E+ClslIFJlbmRlckJsb2NrRW5kKCJPcHRpb25DdXN0b21lciIpICVdCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRMaW5rT2JqZWN0O01vZGU9VGVtcG9yYXJ5O1NvdXJjZU9iamVjdD1UaWNrZXQ7U291cmNlS2V5PVslIERhdGEuRm9ybUlEIHwgdXJpICVdO1RhcmdldElkZW50aWZpZXI9SVRTTUNvbmZpZ0l0ZW0iIGlkPSJPcHRpb25MaW5rVGlja2V0IiBjbGFzcz0iQXNQb3B1cCI+WyBbJSBUcmFuc2xhdGUoIkxpbmsgdGlja2V0IikgfCBodG1sICVdIF08L2E+CiMgLS0tCgo8IS0tIE91dHB1dEZpbHRlckhvb2tfVGlja2V0T3B0aW9uc0VuZCAtLT4KCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0T3B0aW9ucyIpICVdCgo8IS0tIE91dHB1dEZpbHRlckhvb2tfTm9UaWNrZXRPcHRpb25zRmFsbGJhY2sgLS0+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTdGFuZGFyZFRlbXBsYXRlIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGFuZGFyZFRlbXBsYXRlSUQiPlslIFRyYW5zbGF0ZSgiVGV4dCBUZW1wbGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFuZGFyZFRlbXBsYXRlU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJTZXR0aW5nIGEgdGVtcGxhdGUgd2lsbCBvdmVyd3JpdGUgYW55IHRleHQgb3IgYXR0YWNobWVudC4iKSAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU3RhbmRhcmRUZW1wbGF0ZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uQ29uZmlybVRlbXBsYXRlT3ZlcndyaXRlKCdSaWNoVGV4dCcsICQodGhpcyksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcsIFsnUmljaFRleHRGaWVsZCddKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJTdGFuZGFyZFRlbXBsYXRlIikgJV0KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iUmljaFRleHQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiVGV4dCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0RmllbGQiIGNsYXNzPSJSaWNoVGV4dEZpZWxkIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlJpY2hUZXh0IikgJV0KWyUgSW5zZXJ0VGVtcGxhdGUoIlJpY2hUZXh0RWRpdG9yLnR0IikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlJpY2hUZXh0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgY2xhc3M9IlJpY2hUZXh0IFZhbGlkYXRlX1JlcXVpcmVkIFslIERhdGEuUmljaFRleHRJbnZhbGlkIHwgaHRtbCAlXSIgbmFtZT0iQm9keSIgdGl0bGU9Ik1lc3NhZ2UgYm9keSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgJV0iPlslIERhdGEuQm9keSB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8dWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdIChbJSBEYXRhLkZpbGVzaXplIHwgaHRtbCAlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9IkF0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIG5hbWU9IkF0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXSIgY2xhc3M9IlNwYWNpbmdMZWZ0Ij5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiBuYW1lPSJBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiAvPgpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI0F0dGFjaG1lbnREZWxldGVCdXR0b25bJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgJEZvcm0gPSAkKCcjQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXScpLmNsb3Nlc3QoJ2Zvcm0nKTsKICAgICAgICAkKCcjQXR0YWNobWVudERlbGV0ZVslIERhdGEuRmlsZUlEIHwgaHRtbCAlXScpLnZhbCgxKTsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJEZvcm0pOwogICAgICAgICRGb3JtLnRyaWdnZXIoJ3N1Ym1pdCcpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iRmlsZVVwbG9hZCIgbmFtZT0iRmlsZVVwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkF0dGFjaG1lbnRVcGxvYWQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNGaWxlVXBsb2FkJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciAkRm9ybSA9ICQoJyNGaWxlVXBsb2FkJykuY2xvc2VzdCgnZm9ybScpOwogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgJEZvcm0uZmluZCgnI0F0dGFjaG1lbnRVcGxvYWQnKS52YWwoJzEnKS5lbmQoKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDaGF0QXJ0aWNsZVByZXZpZXciKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNoYXQgcHJvdG9jb2wiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNoYXRQcm90b2NvbCI+ClslIElOQ0xVREUgIkNoYXREaXNwbGF5LnR0IiAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPlslIFRyYW5zbGF0ZSgnVGhlIGNoYXQgd2lsbCBiZSBhcHBlbmRlZCBhcyBhIHNlcGFyYXRlIGFydGljbGUuJykgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDaGF0QXJ0aWNsZVByZXZpZXciKSAlXQoKCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5leHRTdGF0ZUlEIj5bJSBUcmFuc2xhdGUoIk5leHQgdGlja2V0IHN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OZXh0U3RhdGVzU3RyZyAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI05leHRTdGF0ZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ05leHRTdGF0ZUlEJywgWyAnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywnTmV3UmVzcG9uc2libGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUbycsICdDYycsICdCY2MnLCAnU3RhbmRhcmRUZW1wbGF0ZUlEJyBbJSBEYXRhLkR5bmFtaWNGaWVsZE5hbWVzU3RyZyAlXV0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUGVuZGluZyBkYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5QZW5kaW5nRGF0ZVN0cmluZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGF5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkRhdGUgaW52YWxpZCEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJIb3VyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIkRhdGUgaW52YWxpZCEiKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJGb3IgYWxsIHBlbmRpbmcqIHN0YXRlcy4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgLS0tCiMgSVRTTQojIC0tLQoKIyBzaG93IHRoZSBpbXBhY3QKWyUgUmVuZGVyQmxvY2tTdGFydCgiRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0lUU01JbXBhY3QiKSAlXQojIC0tLQoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUHJpb3JpdHlJRCI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUHJpb3JpdHlTdHJnICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjUHJpb3JpdHlJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdQcmlvcml0eUlEJywgWyAnVHlwZUlEJywgJ0Rlc3QnLCAnTmV3VXNlcklEJywnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdTZXJ2aWNlSUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVG8nLCAnQ2MnLCAnQmNjJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcgWyUgRGF0YS5EeW5hbWljRmllbGROYW1lc1N0cmcgJV1dKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfRmllbGQyIikgJV0KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSI+CiMgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGltZVVuaXRzTGFiZWwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUaW1lVW5pdHMiPlslIFRyYW5zbGF0ZSgiVGltZSB1bml0cyIpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMiKSkgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrRW5kKCJUaW1lVW5pdHNMYWJlbCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpbWVVbml0c0xhYmVsTWFuZGF0b3J5IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGltZVVuaXRzIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIlRpbWUgdW5pdHMiKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIikpIHwgaHRtbCAlXTo8L2xhYmVsPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGltZVVuaXRzTGFiZWxNYW5kYXRvcnkiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaW1lVW5pdHMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9Ilc1MHBjIFZhbGlkYXRlX1RpbWVVbml0cyBbJSBEYXRhLlRpbWVVbml0c1JlcXVpcmVkIHwgaHRtbCAlXSBbJSBEYXRhLlRpbWVVbml0c0ludmFsaWQgfCBodG1sICVdIiBuYW1lPSJUaW1lVW5pdHMiIGlkPSJUaW1lVW5pdHMiIHZhbHVlPSJbJSBEYXRhLlRpbWVVbml0cyB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaW1lVW5pdHNFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiSW52YWxpZCB0aW1lISIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpbWVVbml0c1NlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpbWVVbml0cyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiBpZD0ic3VibWl0UmljaFRleHQiIGFjY2Vzc2tleT0iZyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ3JlYXRlIikgfCBodG1sICVdIChnKSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJDcmVhdGUiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIkNyZWF0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJUaWNrZXRzIj48L2Rpdj4KICAgIDwvZGl2PgoKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQWdlbnQuVGlja2V0QWN0aW9uLkluaXQoKTsKICAgIENvcmUuQ29uZmlnLlNldCgnTG9jYWxpemF0aW9uLkRlbGV0ZScsIFslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBKU09OICVdKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkKCdhLkFzUG9wdXAnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgeyBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cCgkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgJ0FjdGlvbicpOyByZXR1cm4gZmFsc2U7fSk7CgovKmdsb2JhbCBJVFNNOiB0cnVlICovCiAgICAgICAgLy8gc2hvdyBzZXJ2aWNlIGluY2lkZW50IHN0YXRlIGFuZCBzaWduYWwgZm9yIHRoZSBzZWxlY3RlZCBzZXJ2aWNlICh0aGlzIHBhcnQgaGVyZSBpcyBpbXBvcnRhbnQgaWYgdGhlIHBhZ2UgaXMgcmVsb2FkZWQgZHVlIHRvIGUuZy4gYXR0YWNobWVudCB1cGxvYWQpCiAgICAgICAgSVRTTS5BZ2VudC5JbmNpZGVudFN0YXRlLlNob3dJbmNpZGVudFN0YXRlKHsKICAgICAgICAgICAgQWN0aW9uOiAnWyUgRW52KCJBY3Rpb24iKSAlXScsCiAgICAgICAgICAgIFNlcnZpY2VJRDogJCgnI1NlcnZpY2VJRCcpLnZhbCgpCiAgICAgICAgfSk7CiMgLS0tCi8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKIyBleGFtcGxlIHRlbXBsYXRlIGZvcm0gZm9yIGN1c3RvbWl6YXRpb25zCiM8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgaWQ9IlRlbXBsYXRlMSI+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlTmV3Ii8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIi8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kQ3VzdG9tZXJOYW1lIiB2YWx1ZT0iMSIvPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmplY3QiIHZhbHVlPSJFeGFtcGxlIFN1YmplY3QiLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iTmFtZToKI1Byb2R1Y3Q6CiNDb21tZW50OiIvPgojPC9mb3JtPgo=
IyAtLQojIEFnZW50VGlja2V0UHJpbnQudHQgLSBwcm92aWRlcyBIVE1MIHByaW50IHZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvNDc4ZWU2NjVjNTM1YjY4MDI5Y2VkNGRjYTE5N2I1MjM1YjdiMTkyZi9LZXJuZWwvT3V0cHV0L0hUTUwvU3RhbmRhcmQvQWdlbnRUaWNrZXRQcmludC50dAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+WyUgQ29uZmlnKCJUaWNrZXQ6Okhvb2siKSAlXTogWyUgRGF0YS5UaWNrZXROdW1iZXIgfCBodG1sICVdIC8gWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L3RkPgogICAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxMCIgd2lkdGg9IjEwMCUiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGlja2V0LUluZm8iKSB8IGh0bWwgJV06CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjQwJSI+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iNjAlIj5bJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdOjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC90ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJRdWV1ZSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBEYXRhLlF1ZXVlIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJMb2NrIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIFRyYW5zbGF0ZShEYXRhLkxvY2spIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJDdXN0b21lcklEIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiT3duZXIiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5Pd25lciB8IGh0bWwgJV0gKFslIERhdGEuVXNlckZpcnN0bmFtZSB8IGh0bWwgJV0gWyUgRGF0YS5Vc2VyTGFzdG5hbWUgfCBodG1sICVdKTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZXNwb25zaWJsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlJlc3BvbnNpYmxlIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuUmVzcG9uc2libGVTdHJpbmcgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJSZXNwb25zaWJsZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFR5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuVHlwZSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFR5cGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTZXJ2aWNlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBEYXRhLlNlcnZpY2UgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgTGV2ZWwgQWdyZWVtZW50IikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuU0xBIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U2VydmljZSIpICVdCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJDcml0aWNhbGl0eSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5Dcml0aWNhbGl0eSkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIkltcGFjdCIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5JbXBhY3QpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI0MCUiPlslIFRyYW5zbGF0ZSgiQWdlIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI2MCUiPlslIERhdGEuQWdlIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjY291bnRlZFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJBY2NvdW50ZWQgdGltZSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBEYXRhLlRpY2tldFRpbWVVbml0cyB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjY291bnRlZFRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQZW5kaW5nVW50aWwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJQZW5kaW5nIHRpbGwiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5QZW5kaW5nVW50aWwgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJQZW5kaW5nVW50aWwiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaXJzdFJlc3BvbnNlVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIkZpcnN0IFJlc3BvbnNlIFRpbWUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiVXBkYXRlIFRpbWUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5VcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJVcGRhdGVUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU29sdXRpb25UaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiU29sdXRpb24gVGltZSIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj5bJSBEYXRhLlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiU29sdXRpb25UaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIzMCUiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIzMCUiPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGQiKSAlXQoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3RkPgojICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KIyAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L2Rpdj4KIyAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgPC90cj4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3RkPgojICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KIyAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L2Rpdj4KIyAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgPC90cj4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQyIikgJV0KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTGluayIpICVdCiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJMaW5rZWQtT2JqZWN0IikgfCBodG1sICVdOgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTGlua1R5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyMCUiPlslIFRyYW5zbGF0ZShEYXRhLkxpbmtUeXBlTmFtZSkgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMaW5rVHlwZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1N0cmcgJV08YnIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1R5cGVSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1R5cGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGluayIpICVdCiAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjQiIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDdXN0b21lciBJbmZvIikgfCBodG1sICVdOgogICAgICAgICAgICBbJSBEYXRhLkN1c3RvbWVyVGFibGUgJV0KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPCEtLSBzdGFydCB0aWNrZXQgWyUgRGF0YS5UaWNrZXROdW1iZXIgJV0gLS0+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGUiKSAlXQo8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNjQwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGJnY29sb3I9IiMwMDAwMDAiIGNsYXNzPSJjb250YWluZXIiPgogICAgPHRyPgogICAgICAgIDx0ZD4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjY0MCIgY2VsbHBhZGRpbmc9IjEwIiBjZWxsc3BhY2luZz0iMSIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBiZ2NvbG9yPSIjZmZmZmZmIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMDAlIiBjbGFzcz0ic21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIxIj4KIyBGcm9tOiwgVG86LCBDYzoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPlslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPiA8ZGl2IHRpdGxlPSJbJSBEYXRhLlZhbHVlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSB8IHRydW5jYXRlKDE2MCkgfCBodG1sICVdPC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiBbJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSAlXSBbJSBUcmFuc2xhdGUoImJ5IikgfCBodG1sICVdIFslIFRyYW5zbGF0ZShEYXRhLlNlbmRlclR5cGUpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIHNob3cgRHluYW1pYyBGaWVsZHMgZm9yIGVhY2ggQXJ0aWNsZQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkIikgJV0KIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRfRmllbGQxIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1JSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KI1slIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IFslIFRyYW5zbGF0ZShEYXRhLkFydGljbGVUeXBlKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudCIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gWyUgRGF0YS5pdGVtKCJBcnRpY2xlOjpBVE0iKSAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgpbJSBEYXRhLlRleHROb3RlICVdClslIElGIERhdGEuSXNDaGF0ID09IDEgJV0KWyUgSU5DTFVERSAiQ2hhdERpc3BsYXkudHQiICVdClslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZT4KWyUgRGF0YS5Cb2R5ICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJlPgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KPCEtLSBlbmQgdGlja2V0IC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8YnIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZSIpICVdCg==
IyAtLQojIEFnZW50VGlja2V0Wm9vbS50dCAtIHByb3ZpZGVzIEhUTUwgZm9yIEFnZW50VGlja2V0Wm9vbS5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi80NzhlZTY2NWM1MzViNjgwMjljZWQ0ZGNhMTk3YjUyMzViN2IxOTJmL0tlcm5lbC9PdXRwdXQvSFRNTC9TdGFuZGFyZC9BZ2VudFRpY2tldFpvb20udHQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVGaWx0ZXJEaWFsb2ciKSAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NldEFydGljbGVGaWx0ZXInKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dDb250ZW50RGlhbG9nKCQoJyNBcnRpY2xlRmlsdGVyRGlhbG9nJyksIFslIFRyYW5zbGF0ZSgiQXJ0aWNsZSBmaWx0ZXIiKSB8IEpTT04gJV0sICcyMHB4JywgJ0NlbnRlcicsIHRydWUsIFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTGFiZWw6IFslIFRyYW5zbGF0ZSgiQXBwbHkiKSB8IEpTT04gJV0sCiAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBEYXRhID0gQ29yZS5BSkFYLlNlcmlhbGl6ZUZvcm0oJCgnI0FydGljbGVGaWx0ZXJEaWFsb2dGb3JtJykpOwogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwgRGF0YSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9LCAndGV4dCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMYWJlbDogWyUgVHJhbnNsYXRlKCJSZXNldCIpIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI0FydGljbGVUeXBlRmlsdGVyJykudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAkKCcjQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXInKS52YWwoJycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgXSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CiAgICAkKCcjUmVzZXRBcnRpY2xlRmlsdGVyJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgQWN0aW9uOiAgICAgICAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICAgICAgU3ViYWN0aW9uOiAgICAnQXJ0aWNsZUZpbHRlclNldCcsCiAgICAgICAgICAgIFRpY2tldElEOiAgICAgIlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiwKICAgICAgICAgICAgU2F2ZURlZmF1bHRzOiAxCiAgICAgICAgfTsKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksIERhdGEsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgfSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCjxkaXYgaWQ9IkFydGljbGVGaWx0ZXJEaWFsb2ciIGNsYXNzPSJIaWRkZW4iPgogICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGlkPSJBcnRpY2xlRmlsdGVyRGlhbG9nRm9ybSIgbmFtZT0iQXJ0aWNsZUZpbHRlckRpYWxvZ0Zvcm0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJBZ2VudFRpY2tldFpvb20iIG5hbWU9IkFjdGlvbiIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJBcnRpY2xlRmlsdGVyU2V0IiBuYW1lPSJTdWJhY3Rpb24iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iIG5hbWU9IlRpY2tldElEIi8+CiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJBcnRpY2xlVHlwZUZpbHRlciI+WyUgVHJhbnNsYXRlKCJBcnRpY2xlIFR5cGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5BcnRpY2xlVHlwZUZpbHRlclN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJBcnRpY2xlU2VuZGVyVHlwZUZpbHRlciI+WyUgVHJhbnNsYXRlKCJTZW5kZXIgVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkFydGljbGVTZW5kZXJUeXBlRmlsdGVyU3RyaW5nICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNhdmVEZWZhdWx0cyI+WyUgVHJhbnNsYXRlKCJTYXZlIGZpbHRlciBzZXR0aW5ncyBhcyBkZWZhdWx0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IlNhdmVEZWZhdWx0cyIgbmFtZT0iU2F2ZURlZmF1bHRzIiB2YWx1ZT0iMSIgLz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KICAgIDwvZm9ybT4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRmlsdGVyRGlhbG9nIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkV2ZW50VHlwZUZpbHRlckRpYWxvZyIpICVdClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjU2V0QXJ0aWNsZUZpbHRlcicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgJCgnI0V2ZW50VHlwZUZpbHRlckRpYWxvZycpLmZpbmQoJ2Zvcm0nKS5jc3MoJ3dpZHRoJywgJzUwMHB4Jyk7CiAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coJCgnI0V2ZW50VHlwZUZpbHRlckRpYWxvZycpLCBbJSBUcmFuc2xhdGUoIkV2ZW50IFR5cGUgRmlsdGVyIikgfCBKU09OICVdLCAnMjBweCcsICdDZW50ZXInLCB0cnVlLCBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIExhYmVsOiBbJSBUcmFuc2xhdGUoIkFwcGx5IikgfCBKU09OICVdLAogICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IENvcmUuQUpBWC5TZXJpYWxpemVGb3JtKCQoJyNFdmVudFR5cGVGaWx0ZXJEaWFsb2dGb3JtJykpOwogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwgRGF0YSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9LCAndGV4dCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMYWJlbDogWyUgVHJhbnNsYXRlKCJSZXNldCIpIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI0V2ZW50VHlwZUZpbHRlcicpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICBdKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKICAgICQoJyNSZXNldEFydGljbGVGaWx0ZXInKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICBBY3Rpb246ICAgICAgICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgICAgICBTdWJhY3Rpb246ICAgICdFdmVuVHlwZUZpbHRlclNldCcsCiAgICAgICAgICAgIFRpY2tldElEOiAgICAgIlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiwKICAgICAgICAgICAgU2F2ZURlZmF1bHRzOiAxCiAgICAgICAgfTsKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksIERhdGEsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgfSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCjxkaXYgaWQ9IkV2ZW50VHlwZUZpbHRlckRpYWxvZyIgY2xhc3M9IkhpZGRlbiI+CiAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgaWQ9IkV2ZW50VHlwZUZpbHRlckRpYWxvZ0Zvcm0iIG5hbWU9IkV2ZW50VHlwZUZpbHRlckRpYWxvZ0Zvcm0iPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJBZ2VudFRpY2tldFpvb20iIG5hbWU9IkFjdGlvbiIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIHZhbHVlPSJFdmVuVHlwZUZpbHRlclNldCIgbmFtZT0iU3ViYWN0aW9uIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiBuYW1lPSJUaWNrZXRJRCIvPgogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iQXJ0aWNsZVR5cGVGaWx0ZXIiPlslIFRyYW5zbGF0ZSgiRXZlbnQgVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkV2ZW50VHlwZUZpbHRlclN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJTYXZlRGVmYXVsdHMiPlslIFRyYW5zbGF0ZSgiU2F2ZSBhcyBkZWZhdWx0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IlNhdmVEZWZhdWx0cyIgbmFtZT0iU2F2ZURlZmF1bHRzIiB2YWx1ZT0iMSIgLz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KICAgIDwvZm9ybT4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJFdmVudFR5cGVGaWx0ZXJEaWFsb2ciKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGVhZGVyIikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gWyUgSUYgRGF0YS5Vc2VBcnRpY2xlQ29sb3JzICVdVXNlQXJ0aWNsZUNvbG9yc1slIEVORCAlXSI+CiAgICA8ZGl2IGNsYXNzPSJDbGVhckxlZnQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0iSGVhZGxpbmUiPgogICAgICAgIDxkaXYgY2xhc3M9IkZsYWciIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdIj48c3BhbiBjbGFzcz0iUHJpb3JpdHlJRC1bJSBEYXRhLlByaW9yaXR5SUQgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC9zcGFuPjwvZGl2PgogICAgICAgIDxoMSB0aXRsZT0iWyUgVHJhbnNsYXRlKCJab29tIikgfCBodG1sICVdIFslIERhdGEuSG9vayAlXVslIERhdGEuVGlja2V0TnVtYmVyICVdICZuZGFzaDsgWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPgogICAgICAgICAgICBbJSBEYXRhLkhvb2sgJV1bJSBEYXRhLlRpY2tldE51bWJlciAlXSA8c3Bhbj4mbWRhc2g7PC9zcGFuPiBbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXQogICAgICAgIDwvaDE+CiAgICA8L2Rpdj4KCiMgSWZyYW1lIHVzZWQgZm9yIGZpeGluZyBidWcjODU0NTogQXR0YWNobWVudCBkb3dubG9hZCBub3QgcG9zc2libGUgaWYgcG9wIHVwIG9mIGFub3RoZXIgYWN0aW9uIGlzIG9wZW4KIyBBbGwgZG93bmxvYWRzIChlLmcuIGF0dGFjaG1lbnRzKSBoYXZlIHRoaXMgaWZyYW1lIGFzIHRhcmdldC4gVGhpcyBwcmV2ZW50cyB0aGUgYnJvd3NlciBmcm9tIHNlbmRpbmcKIyBhbiBodHRwIHJlcXVlc3QgdG8gdGhlIFRpY2tldFpvb20gd2luZG93LiBJdCBzZW5kcyB0aGUgZG93bmxvYWQgcmVxdWVzdCB0byB0aGlzIGlmcmFtZSBpbnN0ZWFkLgojIFNlbmRpbmcgdGhlIGRvd25sb2FkIHJlcXVlc3QgdG8gdGhlIG1haW4gd2luZG93IHdvdWxkIGxlYWQgdG8gYW4gYWxlcnQgbWVzc2FnZSBhYm91dCBsZWF2aW5nIHRoZSBwYWdlCiMgaWYgYXQgdGhlIHNhbWUgdGltZSBhIHBvcHVwIHdpbmRvdyAoZS5nLiBmb3IgYSB0aWNrZXQgYW5zd2VyKSBpcyBvcGVuZWQuCiAgICA8aWZyYW1lIHNyYz0iYWJvdXQ6YmxhbmsiIHdpZHRoPSIwIiBoZWlnaHQ9IjAiIG5hbWU9IkF0dGFjaG1lbnRXaW5kb3ciIGlkPSJBdHRhY2htZW50V2luZG93Ij48L2lmcmFtZT4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckxhc3QiPgogICAgICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKERhdGEuV2lkZ2V0VGl0bGUpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBOYXJyb3ciPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcmNoaXZlRmxhZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFyY2hpdmUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBUcmFuc2xhdGUoIlRoaXMgdGlja2V0IGlzIGFyY2hpdmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJjaGl2ZUZsYWciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUeXBlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdIj5bJSBEYXRhLlR5cGUgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUeXBlIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFnZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLkFnZSAlXSI+WyUgRGF0YS5BZ2UgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5DcmVhdGVkIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdIj5bJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkNyZWF0ZWRCeSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkNyZWF0ZWQgYnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5DcmVhdGVkQnlVc2VyICVdIj5bJSBEYXRhLkNyZWF0ZWRCeVVzZXIgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNyZWF0ZWRCeSIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5TdGF0ZSkgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJMb2NrZWQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTG9jaykgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Mb2NrKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlByaW9yaXR5KSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlByaW9yaXR5KSB8IGh0bWwgJV08L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgLS0tCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJRdWV1ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlF1ZXVlIHwgaHRtbCAlXSI+WyUgRGF0YS5RdWV1ZSB8IGh0bWwgfCByZXBsYWNlKCc6OicsICc8d2JyPjo6PHdicj4nKSAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojIC0tLQojIElUU00KIyAtLS0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3duZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0gWyUgRGF0YS5PdXRPZk9mZmljZU1lc3NhZ2UgfCBodG1sICVdIChbJSBEYXRhLlVzZXJMb2dpbiB8IGh0bWwgJV0pIj5bJSBEYXRhLlVzZXJGdWxsbmFtZSB8IGh0bWwgJV0gWyUgRGF0YS5PdXRPZk9mZmljZU1lc3NhZ2UgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPd25lciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJlc3BvbnNpYmxlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIFslIERhdGEuT3V0T2ZPZmZpY2VNZXNzYWdlIHwgaHRtbCAlXSAoWyUgRGF0YS5Vc2VyTG9naW4gfCBodG1sICVdKSI+WyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIFslIERhdGEuT3V0T2ZPZmZpY2VNZXNzYWdlIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVzcG9uc2libGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIj4KIyAtLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIlNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOjwvbGFiZWw+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5TZXJ2aWNlIHwgaHRtbCAlXSI+WyUgRGF0YS5TZXJ2aWNlIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5TZXJ2aWNlIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNU2VydmljZVpvb207U2VydmljZUlEPVslIERhdGEuU2VydmljZUlEIHwgdXJpICVdOyIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuU2VydmljZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU2VydmljZSBJbmNpZGVudCBTdGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iWyUgRGF0YS5DdXJJbmNpU2lnbmFsIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkN1ckluY2lTdGF0ZSkgfCBodG1sICVdIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZShEYXRhLkN1ckluY2lTdGF0ZSkgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU2VydmljZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlNMQSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgTGV2ZWwgQWdyZWVtZW50IikgfCBodG1sICVdOjwvbGFiZWw+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5TTEEgfCBodG1sICVdIj5bJSBEYXRhLlNMQSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuU0xBIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRJVFNNU0xBWm9vbTtTTEFJRD1bJSBEYXRhLlNMQUlEIHwgdXJpICVdOyIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuU0xBIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBOYXJyb3ciPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaXJzdFJlc3BvbnNlVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkZpcnN0IFJlc3BvbnNlIFRpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLkZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZUNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZUh1bWFuIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlyc3RSZXNwb25zZVRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJVcGRhdGVUaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiVXBkYXRlIFRpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBUaW1lIikgfCBodG1sICVdOiBbJSBEYXRhLlVwZGF0ZVRpbWVXb3JraW5nVGltZSB8IGh0bWwgJV0iIGNsYXNzPSJbJSBEYXRhLlVwZGF0ZVRpbWVDbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVXBkYXRlVGltZUh1bWFuIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5VcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIHwgTG9jYWxpemUoIlRpbWVTaG9ydCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJVcGRhdGVUaW1lIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU29sdXRpb25UaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU29sdXRpb24gVGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIFRpbWUiKSB8IGh0bWwgJV06IFslIERhdGEuU29sdXRpb25UaW1lV29ya2luZ1RpbWUgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5Tb2x1dGlvblRpbWVDbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU29sdXRpb25UaW1lSHVtYW4gfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU29sdXRpb25UaW1lIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHlfTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5X0xpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUNyaXRpY2FsaXR5X1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHlfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHkiKSAlXQoKClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNSW1wYWN0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01JbXBhY3RfTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUltcGFjdF9MaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01JbXBhY3RfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01JbXBhY3RfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNSW1wYWN0IikgJV0KCgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIFRpZ2h0Ij4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmV2aWV3UmVxdWlyZWQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJldmlld1JlcXVpcmVkX0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXZpZXdSZXF1aXJlZF9MaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXZpZXdSZXF1aXJlZF9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJldmlld1JlcXVpcmVkX1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJldmlld1JlcXVpcmVkIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25SZXN1bHQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uUmVzdWx0X0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvblJlc3VsdF9MaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvblJlc3VsdF9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uUmVzdWx0X1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uUmVzdWx0IikgJV0KCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uRGF0ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25EYXRlX0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01EZWNpc2lvbkRhdGVfTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25EYXRlX1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNRGVjaXNpb25EYXRlX1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTURlY2lzaW9uRGF0ZSIpICVdCgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXBhaXJTdGFydFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJlcGFpclN0YXJ0VGltZV9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmVwYWlyU3RhcnRUaW1lX0xpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJlcGFpclN0YXJ0VGltZV9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJlcGFpclN0YXJ0VGltZV9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZXBhaXJTdGFydFRpbWUiKSAlXQoKClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNUmVjb3ZlcnlTdGFydFRpbWUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJlY292ZXJ5U3RhcnRUaW1lX0xpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZWNvdmVyeVN0YXJ0VGltZV9MaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0lUU01SZWNvdmVyeVN0YXJ0VGltZV9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJlY292ZXJ5U3RhcnRUaW1lX1BsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTVJlY292ZXJ5U3RhcnRUaW1lIikgJV0KCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUR1ZURhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUR1ZURhdGVfTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUR1ZURhdGVfTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNRHVlRGF0ZV9QbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfSVRTTUR1ZURhdGVfUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9JVFNNRHVlRGF0ZSIpICVdCgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiMgLS0tCgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBOYXJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDdXN0b21lcklEIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rIikgfCBJbnRlcnBvbGF0ZSAlXSIgY2xhc3M9IlslIENvbmZpZygiQ3VzdG9tZXJEQkxpbmtDbGFzcyIpICVdIiBbJSBDb25maWcoIkN1c3RvbWVyREJMaW5rVGFyZ2V0IikgJV0+WyUgRGF0YS5DdXN0b21lcklEIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRvdGFsQWNjb3VudGVkVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkFjY291bnRlZCB0aW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5UaWNrZXRUaW1lVW5pdHMgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KClslIFJlbmRlckJsb2NrRW5kKCJUb3RhbEFjY291bnRlZFRpbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQZW5kaW5nVW50aWwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJQZW5kaW5nIHRpbGwiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIFslIERhdGEuUGVuZGluZ1VudGlsQ2xhc3MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUGVuZGluZ1VudGlsICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5VbnRpbFRpbWVIdW1hbiB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlBlbmRpbmdVbnRpbCIpICVdCiMgLS0tCiMgSVRTTQojIC0tLQojWyUgUmVuZGVyQmxvY2tTdGFydCgiT3duZXIiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiT3duZXIiKSB8IGh0bWwgJV06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuVXNlckZ1bGxuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLk91dE9mT2ZmaWNlTWVzc2FnZSB8IGh0bWwgJV0gKFslIERhdGEuVXNlckxvZ2luIHwgaHRtbCAlXSkiPlslIERhdGEuVXNlckZ1bGxuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLk91dE9mT2ZmaWNlTWVzc2FnZSB8IGh0bWwgJV08L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMKI1slIFJlbmRlckJsb2NrRW5kKCJPd25lciIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSZXNwb25zaWJsZSIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJSZXNwb25zaWJsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIFslIERhdGEuT3V0T2ZPZmZpY2VNZXNzYWdlIHwgaHRtbCAlXSAoWyUgRGF0YS5Vc2VyTG9naW4gfCBodG1sICVdKSI+WyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdIFslIERhdGEuT3V0T2ZPZmZpY2VNZXNzYWdlIHwgaHRtbCAlXTwvcD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIwojWyUgUmVuZGVyQmxvY2tFbmQoIlJlc3BvbnNpYmxlIikgJV0KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc0RhdGEiKSAlXQogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCBOYXJyb3ciPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiUHJvY2VzcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlByb2Nlc3MgfCBodG1sICVdIj5bJSBEYXRhLlByb2Nlc3MgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBY3Rpdml0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5BY3Rpdml0eSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5BY3Rpdml0eSkgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2Nlc3NEYXRhIikgJV0KCiMgc2hvdyB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRMaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkUGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgZHluYW1pYyBmaWVsZCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiMgTm90ZTogRmllbGQxIGFuZCBGaWVsZDIgYXJlIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzIGFuZCBoYWQgdG8gYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsCiMgZmllbGQgbmFtZXMKIyAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIE5hcnJvdyI+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQxIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMV9MaW5rIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rICVdIiB0YXJnZXQ9Il9ibGFuayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMV9MaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDFfUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDFfUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgojICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93Ij4KI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQyX0xpbmsiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgJV0iIHRhcmdldD0iX2JsYW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvc3Bhbj4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQyX0xpbmsiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMl9QbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMl9QbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiMgc2hvdyBjdXN0b21lciBpbmZvIHRhYmxlClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVyVGFibGUiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDdXN0b21lciBJbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ3VzdG9tZXJUYWJsZSAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJUYWJsZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxpbmtUYWJsZVNpbXBsZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBEb250UHJpbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJMaW5rZWQgT2JqZWN0cyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1RhYmxlU3RyZyAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlU2ltcGxlIikgJV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRNZW51IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1bJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgY2xhc3M9IlslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBbJSBEYXRhLkxpbmtQYXJhbSAlXSB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuRGVzY3JpcHRpb24pIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldE1lbnUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRNZW51UGhvbmVBc0Ryb3Bkb3duIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIiBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0iZ2V0IiBpZD0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRGF0YS5BY3Rpb24gfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iWyUgRGF0YS5QaG9uZUVsZW1lbnRJRCB8IGh0bWwgJV0iIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5TdGFuZGFyZFJlcGx5U3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKJCgnI1slIERhdGEuRm9ybUlEIHwgaHRtbCAlXSBzZWxlY3RbbmFtZT1bJSBEYXRhLlBob25lRWxlbWVudElEIHwgaHRtbCAlXV0nKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIHZhciBVUkw7CgogICAgaWYgKCQodGhpcykudmFsKCkgPiAwKSB7CiAgICAgICAgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsgJCh0aGlzKS5wYXJlbnRzKCkuc2VyaWFsaXplKCk7CiAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoVVJMLCAnVGlja2V0QWN0aW9uJyk7CiAgICAgICAgLy8gcmVzZXQgdGhlIHNlbGVjdCBib3ggc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBmcm9tIHRoZSBzYW1lIHdpbmRvdwogICAgICAgICQodGhpcykudmFsKCcwJyk7CiAgICB9Cn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRNZW51UGhvbmVBc0Ryb3Bkb3duIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTW92ZUxpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gdGl0bGU9IlslIFRyYW5zbGF0ZSgiTW92ZSB0aWNrZXQgdG8gYSBkaWZmZXJlbnQgcXVldWUiKSB8IGh0bWwgJV0iIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRUaWNrZXRNb3ZlIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlF1ZXVlSUQiIHZhbHVlPSJbJSBEYXRhLlF1ZXVlSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iRGVzdFF1ZXVlSUQiIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIlF1ZXVlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTW92ZVF1ZXVlc1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjRGVzdFF1ZXVlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJNb3ZlTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIk1vdmVGb3JtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRNb3ZlO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07IiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDaGFuZ2UgUXVldWUiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiUXVldWUiKSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTW92ZUZvcm0iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcm9jZXNzV2lkZ2V0IikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKdmFyIFdpZGdldFdpZHRoICAgPSBwYXJzZUludCgkKCcjRHluYW1pY0ZpZWxkc1dpZGdldCcpLmlubmVyV2lkdGgoKSAtIDE1LCAxMCksCiAgICBGaWVsZHNQZXJSb3cgID0gNCwKICAgIEZpZWxkTWFyZ2luICAgPSBwYXJzZUludCgkKCcuRHluYW1pY0ZpZWxkQXV0b1Jlc2l6ZScpLmNzcygnbWFyZ2luLXJpZ2h0JyksIDEwKSArIDIsCiAgICBGaWVsZFdpZHRoICAgID0gMDsKCi8vIGRlZmluZSBhbW91bnQgb2YgZmllbGRzIHBlciByb3cgZGVwZW5kaW5nIG9uIGRpc3BsYXkgcmVzb2x1dGlvbgppZiAoIFdpZGdldFdpZHRoIDwgMTAwMCApIHsKICAgIEZpZWxkc1BlclJvdyA9IDM7Cn0KaWYgKCBXaWRnZXRXaWR0aCA8IDYwMCApIHsKICAgIEZpZWxkc1BlclJvdyA9IDI7Cn0KaWYgKCBXaWRnZXRXaWR0aCA8IDQwMCApIHsKICAgIEZpZWxkc1BlclJvdyA9IDE7Cn0KCi8vIGRldGVybWluZSB0aGUgbmVlZGVkIGZpZWxkIHdpZHRoIGFuZCByZXNpemUgdGhlIGZpZWxkcwpGaWVsZFdpZHRoID0gcGFyc2VJbnQoV2lkZ2V0V2lkdGggLyBGaWVsZHNQZXJSb3cgLSBGaWVsZE1hcmdpbiAtIDEsIDEwKTsKJCgnLkR5bmFtaWNGaWVsZEF1dG9SZXNpemUnKS53aWR0aChGaWVsZFdpZHRoKTsKCiQoJy5TaG93RmllbGRJbmZvT3ZlcmxheScpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CgogICAgdmFyIE92ZXJsYXlUaXRsZSAgPSAkKHRoaXMpLmNsb3Nlc3QoJ2xhYmVsJykuYXR0cigndGl0bGUnKSwKICAgICAgICBPdmVybGF5SFRNTCAgID0gJCh0aGlzKS5jbG9zZXN0KCcuRmllbGRDb250YWluZXInKS5maW5kKCcuVmFsdWUnKS5odG1sKCk7CgogICAgT3ZlcmxheUhUTUwgPSAnPGRpdiBjbGFzcz0iRmllbGRPdmVybGF5Ij4nICsgT3ZlcmxheUhUTUwgKyAnPC9kaXY+JzsKCiAgICBDb3JlLlVJLkRpYWxvZy5TaG93RGlhbG9nKHsKICAgICAgICBNb2RhbDogdHJ1ZSwKICAgICAgICBUaXRsZTogT3ZlcmxheVRpdGxlLAogICAgICAgIEhUTUw6IE92ZXJsYXlIVE1MLAogICAgICAgIFBvc2l0aW9uVG9wOiAnMTAwcHgnLAogICAgICAgIFBvc2l0aW9uTGVmdDogJ0NlbnRlcicsCiAgICAgICAgQ2xvc2VPbkVzY2FwZTogdHJ1ZSwKICAgICAgICBCdXR0b25zOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGU6ICdDbG9zZScsCiAgICAgICAgICAgICAgICBMYWJlbDogWyUgVHJhbnNsYXRlKCJDbG9zZSIpIHwgSlNPTiAlXSwKICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5Gb3JtLkVuYWJsZUZvcm0oJCgnZm9ybVtuYW1lPSJjb21wb3NlIl0nKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgXQogICAgfSk7Cn0pOwovL11dPjwvc2NyaXB0PgpbJSBFTkQgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIEV4cGFuZGVkIiBpZD0iRHluYW1pY0ZpZWxkc1dpZGdldCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPjxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb3IgaGlkZSB0aGUgY29udGVudCIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+PGkgY2xhc3M9ImZhIGZhLWNhcmV0LWRvd24iPjwvaT48L2E+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZShEYXRhLldpZGdldFRpdGxlKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5leHRBY3Rpdml0eURpYWxvZ3MiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGlnaHRSb3cgQm90dG9tIj4KICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGk+PHN0cm9uZz5bJSBEYXRhLkFjdGl2aXR5TmFtZSB8IGh0bWwgJV06PC9zdHJvbmc+PC9saT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aXZpdHlEaWFsb2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0aXRsZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgY2xhc3M9IkFzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbiIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0UHJvY2VzcztTdWJhY3Rpb249RGlzcGxheUFjdGl2aXR5RGlhbG9nO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07UHJvY2Vzc0VudGl0eUlEPVslIERhdGEuUHJvY2Vzc0VudGl0eUlEIHwgdXJpICVdO0FjdGl2aXR5RGlhbG9nRW50aXR5SUQ9WyUgRGF0YS5BY3Rpdml0eURpYWxvZ0VudGl0eUlEIHwgdXJpICVdIj5bJSBEYXRhLk5hbWUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aXZpdHlEaWFsb2ciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvdWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vQWN0aXZpdHlEaWFsb2dzIikgJV0KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iQWN0aW9uTWVzc2FnZSI+WyUgVHJhbnNsYXRlKCJUaGVyZSBhcmUgbm8gZGlhbG9ncyBhdmFpbGFibGUgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvY2Vzcy4iKSB8IGh0bWwgJV08L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJOb0FjdGl2aXR5RGlhbG9ncyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJOZXh0QWN0aXZpdHlEaWFsb2dzIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgUHJvY2Vzc0luZm8iPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByb2Nlc3NJbmZvcm1hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZEdyb3VwcyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlByb2Nlc3NXaWRnZXREeW5hbWljRmllbGRHcm91cFNlcGFyYXRvciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9IkZpZWxkU2V0U2VwYXJhdG9yIj5bJSBEYXRhLk5hbWUgJV08L2gyPgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZEdyb3VwU2VwYXJhdG9yIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENvbnRhaW5lciBEeW5hbWljRmllbGRBdXRvUmVzaXplIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgdGl0bGU9IlslIERhdGEuTGFiZWwgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZFZhbHVlT3ZlcmxheVRyaWdnZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iU2hvd0ZpZWxkSW5mb092ZXJsYXkiPis8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkVmFsdWVPdmVybGF5VHJpZ2dlciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUgQ3V0VmFsdWUgRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSAlXSI+CjwhLS0gT3V0cHV0RmlsdGVySG9va19XaWRnZXREeW5hbWljRmllbGRCZWdpbiAtLT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZExpbmsiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iWyUgRGF0YS5UaXRsZSAlXSI+PGEgaHJlZj0iWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iRHluYW1pY0ZpZWxkTGluayI+WyUgRGF0YS5WYWx1ZSAlXTwvYT48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkTGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlByb2Nlc3NXaWRnZXREeW5hbWljRmllbGRQbGFpbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsdWUgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2Nlc3NXaWRnZXREeW5hbWljRmllbGRQbGFpbiIpICVdCjwhLS0gT3V0cHV0RmlsdGVySG9va19XaWRnZXREeW5hbWljRmllbGRFbmQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZUxvbmciPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkVmFsdWVMb25nIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WYWx1ZSAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZFZhbHVlTG9uZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvY2Vzc1dpZGdldER5bmFtaWNGaWVsZCIpICVdClslIFJlbmRlckJsb2NrRW5kKCJQcm9jZXNzV2lkZ2V0RHluYW1pY0ZpZWxkR3JvdXBzIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2Nlc3NXaWRnZXQiKSAlXQoKICAgICAgICAgICAgPGRpdiBpZD0iQXJ0aWNsZVRyZWUiPgpbJSBEYXRhLkFydGljbGVUcmVlICVdCiAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSGludE5vQXJ0aWNsZXMiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGl0ZW0gaGFzIG5vIGFydGljbGVzIHlldC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkhpbnROb0FydGljbGVzIikgJV0KCiAgICAgICAgICAgIDxkaXYgaWQ9IkFydGljbGVJdGVtcyI+ClslIERhdGEuQXJ0aWNsZUl0ZW1zICVdCiAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTGlua1RhYmxlQ29tcGxleCIpICVdCiAgICAgICAgICAgIFslIERhdGEuTGlua1RhYmxlU3RyZyAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlQ29tcGxleCIpICVdCgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDwvZGl2PgoKPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJIZWFkZXIiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJlZSIpICVdCjxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldEFjdGlvbiBUb2dnbGUiPgogICAgICAgICAgICA8YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+CiAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPgogICAgICAgICAgICA8L2E+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGgyPgogICAgICAgIFslIElGIERhdGEuWm9vbVRpbWVsaW5lICVdCiAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGlja2V0IFRpbWVsaW5lIFZpZXciKSB8IGh0bWwgJV0KICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQXJ0aWNsZSBPdmVydmlldyIpIHwgaHRtbCAlXSAtIFslIERhdGEuQXJ0aWNsZUNvdW50IHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoIkFydGljbGUocykiKSB8IGh0bWwgJV0KICAgICAgICBbJSBFTkQgJV0KICAgICAgICA8L2gyPgogICAgICAgIDxkaXYgY2xhc3M9IkFkZGl0aW9uYWxJbmZvcm1hdGlvbiBDb250cm9sUm93Ij4KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVQYWdlcyIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFydGljbGVQYWdlcyBJY29ucyI+CiAgICAgICAgWyUgRk9SRUFDSCBwYWdlIElOIFsxIC4uIERhdGEuUGFnZXNdOyAlXQogICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO0FydGljbGVQYWdlPVslIHBhZ2UgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoJ1BhZ2UnKSAlXSBbJSBwYWdlICVdIiBkYXRhLXBhZ2U9IlslIHBhZ2UgJV0iIFslIElGIHBhZ2UgPT0gRGF0YS5DdXJyZW50UGFnZSAlXWNsYXNzPSJBY3RpdmUiWyUgRU5EICVdPlslIHBhZ2UgJV08L2E+CiAgICAgICAgWyUgRU5EOyAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVQYWdlcyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVGaWx0ZXJEaWFsb2dMaW5rIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUZpbHRlciBJY29ucyI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJBcnRpY2xlIEZpbHRlciIpIHwgaHRtbCAlXTo8L3NwYW4+CiMgT25seSBzaG93IG9uZTogU2V0IG9yIFJlc2V0LgojWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUZpbHRlclNldExpbmsiKSAlXQogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IlNldEFydGljbGVGaWx0ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkFkZCBGaWx0ZXIiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1maWx0ZXIiPjwvaT48c3Bhbj5bJSBUcmFuc2xhdGUoIlNldCIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUZpbHRlclNldExpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRmlsdGVyUmVzZXRMaW5rIikgJV0KICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJSZXNldEFydGljbGVGaWx0ZXIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlJlc2V0IEZpbHRlciIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLXRyYXNoLW8iPjwvaT48c3Bhbj5bJSBUcmFuc2xhdGUoIlJlc2V0IikgfCBodG1sICVdPC9zcGFuPjwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVGaWx0ZXJSZXNldExpbmsiKSAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVGaWx0ZXJEaWFsb2dMaW5rIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZVZpZXcgSWNvbnMiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiQXJ0aWNsZSIpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoIlZpZXciKSB8IGh0bWwgJV06PC9zcGFuPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFeHBhbmQiKSAlXQogICAgICAgICAgICAgICAgPGEgY2xhc3M9Ik9uZUFydGljbGUgQWN0aXZlIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07QXJ0aWNsZUlEPVslIERhdGEuQXJ0aWNsZUlEIHwgdXJpICVdO1pvb21FeHBhbmQ9MDtBcnRpY2xlUGFnZT1bJSBEYXRhLlBhZ2UgfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb25lIGFydGljbGUiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1taW51cyI+PC9pPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2hvdyBvbmUgYXJ0aWNsZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQWxsQXJ0aWNsZXMiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV07Wm9vbUV4cGFuZD0xO0FydGljbGVQYWdlPVslIERhdGEuUGFnZSB8IHVyaSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBhbGwgYXJ0aWNsZXMiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1iYXJzIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IGFsbCBhcnRpY2xlcyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgIFslIElGIENvbmZpZygiQ2hyb25pY2FsVmlld0VuYWJsZWQiKSA9PSAxICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2hyb25pY2FsIFslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07Wm9vbVRpbWVsaW5lPTEiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgVGlja2V0IFRpbWVsaW5lIFZpZXciKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jbG9jay1vIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IFRpY2tldCBUaW1lbGluZSBWaWV3IikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJFeHBhbmQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDb2xsYXBzZSIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iT25lQXJ0aWNsZSIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IHVyaSAlXTtab29tRXhwYW5kPTAiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb25lIGFydGljbGUiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1taW51cyI+PC9pPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2hvdyBvbmUgYXJ0aWNsZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQWxsQXJ0aWNsZXMgQWN0aXZlIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07QXJ0aWNsZUlEPVslIERhdGEuQXJ0aWNsZUlEIHwgdXJpICVdO1pvb21FeHBhbmQ9MSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBhbGwgYXJ0aWNsZXMiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1iYXJzIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IGFsbCBhcnRpY2xlcyIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgIFslIElGIENvbmZpZygiQ2hyb25pY2FsVmlld0VuYWJsZWQiKSA9PSAxICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2hyb25pY2FsIFslIERhdGEuQ2xhc3MgfCBodG1sICVdIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07Wm9vbVRpbWVsaW5lPTEiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgVGlja2V0IFRpbWVsaW5lIFZpZXciKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jbG9jay1vIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IFRpY2tldCBUaW1lbGluZSBWaWV3IikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJDb2xsYXBzZSIpICVdClslIElGIENvbmZpZygiQ2hyb25pY2FsVmlld0VuYWJsZWQiKSA9PSAxICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNocm9uaWNhbCIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iT25lQXJ0aWNsZSIgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IHVyaSAlXTtab29tRXhwYW5kPTAiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgb25lIGFydGljbGUiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1taW51cyI+PC9pPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2hvdyBvbmUgYXJ0aWNsZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQWxsQXJ0aWNsZXMiIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV07Wm9vbUV4cGFuZD0xIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IGFsbCBhcnRpY2xlcyIpIHwgaHRtbCAlXSI+PGkgY2xhc3M9ImZhIGZhLWJhcnMiPjwvaT48c3Bhbj5bJSBUcmFuc2xhdGUoIlNob3cgYWxsIGFydGljbGVzIikgfCBodG1sICVdPC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDaHJvbmljYWwgQWN0aXZlIiBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07Wm9vbVRpbWVsaW5lPTEiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNob3cgVGlja2V0IFRpbWVsaW5lIFZpZXciKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jbG9jay1vIj48L2k+PHNwYW4+WyUgVHJhbnNsYXRlKCJTaG93IFRpY2tldCBUaW1lbGluZSBWaWV3IikgfCBodG1sICVdPC9zcGFuPjwvYT4KWyUgUmVuZGVyQmxvY2tFbmQoIkNocm9uaWNhbCIpICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVMaXN0IikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJUaWNrZXRMaXN0Ij4KICAgICAgICAgICAgPGRpdiBpZD0iQXJ0aWNsZVRhYmxlQm9keSIgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTY3JvbGxlciI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGlkPSJBcnRpY2xlVGFibGUiIGNsYXNzPSJEYXRhVGFibGUgWyUgRGF0YS5UYWJsZUNsYXNzZXMgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVW5yZWFkQXJ0aWNsZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iVW5yZWFkQXJ0aWNsZXMiIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlVucmVhZCBhcnRpY2xlcyIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVW5yZWFkQXJ0aWNsZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJObyBTb3J0YWJsZSI+PGEgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJOby4iKSB8IGh0bWwgJV08L2E+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IlR5cGUgU29ydGFibGUiPjxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTwvYT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iRGlyZWN0aW9uIFNvcnRhYmxlIj48YSBocmVmPSIjIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEaXJlY3Rpb24iKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1leGNoYW5nZSI+PC9pPjwvYT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iRnJvbSBTb3J0YWJsZSI+PGEgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJGcm9tIikgfCBodG1sICVdPC9hPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJTdWJqZWN0IFNvcnRhYmxlIj48YSBocmVmPSIjIj5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV08L2E+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNyZWF0ZWQgU29ydGFibGUiPjxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTwvYT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQXR0YWNobWVudHMgTGFzdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnRzIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1wYXBlcmNsaXAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRyZWVJdGVtIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iWyUgRGF0YS5TZW5kZXJUeXBlIHwgaHRtbCAlXS1bJSBEYXRhLkFydGljbGVUeXBlIHwgaHRtbCAlXSBbJSBEYXRhLkNsYXNzUm93IHwgaHRtbCAlXSIgaWQ9IlJvd1slIERhdGEuQ291bnQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iWyUgRGF0YS5DbGFzcyB8IGh0bWwgJV0gVW5yZWFkQXJ0aWNsZXMgRml4ZWQgTm9uVGV4dENvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmVlSXRlbUltcG9ydGFudEFydGljbGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW1wb3J0YW50QXJ0aWNsZXMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkltcG9ydGFudCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtaW5mby1jaXJjbGUiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbT5bJSBUcmFuc2xhdGUoIkltcG9ydGFudCIpIHwgaHRtbCAlXTwvZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyZWVJdGVtSW1wb3J0YW50QXJ0aWNsZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRyZWVJdGVtTmV3QXJ0aWNsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVW5yZWFkIEFydGljbGUhIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtc3RhciI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbU5ld0FydGljbGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmVlSXRlbU5vTmV3QXJ0aWNsZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJOb0NvbnRlbnQiPjwvc3Bhbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyZWVJdGVtTm9OZXdBcnRpY2xlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iTm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNvdW50IHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBjbGFzcz0iQXJ0aWNsZUluZm8iIG5hbWU9IkxpbmtbJSBEYXRhLkNvdW50IHwgdXJpICVdIiB2YWx1ZT0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0Wm9vbTtTdWJhY3Rpb249QXJ0aWNsZVVwZGF0ZTtDb3VudD1bJSBEYXRhLkNvdW50IHwgdXJpICVdO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCBodG1sICVdO0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV07Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJBcnRpY2xlSUQiIHZhbHVlPSJbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IlslIERhdGEuQ291bnQgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJUeXBlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5bJSBUcmFuc2xhdGUoRGF0YS5TZW5kZXJUeXBlKSB8IGh0bWwgJV0gJm5kYXNoOyBbJSBUcmFuc2xhdGUoRGF0YS5BcnRpY2xlVHlwZSkgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IlslIFRyYW5zbGF0ZShEYXRhLlNlbmRlclR5cGUpIHwgaHRtbCAlXSAmbmRhc2g7IFslIFRyYW5zbGF0ZShEYXRhLkFydGljbGVUeXBlKSB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkRpcmVjdGlvbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRyZWVJdGVtRGlyZWN0aW9uSW5jb21pbmciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iRGlyZWN0aW9uIEluY29taW5nIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJJbmNvbWluZyBtZXNzYWdlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1sb25nLWFycm93LWxlZnQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IjAiIC8+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbURpcmVjdGlvbkluY29taW5nIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJlZUl0ZW1EaXJlY3Rpb25PdXRnb2luZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEaXJlY3Rpb24gT3V0Z29pbmciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk91dGdvaW5nIG1lc3NhZ2UiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWxvbmctYXJyb3ctcmlnaHQiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zcXVhcmUtbyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IjEiIC8+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbURpcmVjdGlvbk91dGdvaW5nIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJlZUl0ZW1EaXJlY3Rpb25JbnRlcm5hbCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEaXJlY3Rpb24gSW50ZXJuYWwiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkludGVybmFsIG1lc3NhZ2UiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9IlNvcnREYXRhIiB2YWx1ZT0iMiIgLz4KWyUgUmVuZGVyQmxvY2tFbmQoIlRyZWVJdGVtRGlyZWN0aW9uSW50ZXJuYWwiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJGcm9tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5Gcm9tIHwgaHRtbCAlXSI+PGEgaHJlZj0iIyI+WyUgRGF0YS5Gcm9tUmVhbG5hbWUgfCB0cnVuY2F0ZSgzNCkgfCBodG1sICVdPC9hPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBjbGFzcz0iU29ydERhdGEiIHZhbHVlPSJbJSBEYXRhLkZyb20gfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJTdWJqZWN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSI+PGEgaHJlZj0iIyI+WyUgRGF0YS5TdWJqZWN0IHwgdHJ1bmNhdGUoMzYpIHwgaHRtbCAlXTwvYT48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9IlNvcnREYXRhIiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ3JlYXRlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lU2hvcnQiKSAlXTwvYT4KIyBJbmNsdWRlIGN1c3RvbSBzb3J0aW5nIGluZm9ybWF0aW9uOiBkYXRlIGluIElTTyBmb3JtYXQuCiMgT3RoZXIgZGF0ZSBmb3JtYXRzIGNhbm5vdCBiZSBzb3J0ZWQgcmVsaWFibHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IlslIERhdGEuQ3JlYXRlZCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkF0dGFjaG1lbnRzIEF0dGFjaG1lbnQgRml4ZWQgTm9uVGV4dENvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUcmVlSXRlbUF0dGFjaG1lbnQiKSAlXQpbJSBQUk9DRVNTIEFydGljbGVBdHRhY2htZW50cy50dCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiVHJlZUl0ZW1BdHRhY2htZW50IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVHJlZUl0ZW1Ob0F0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTm9Db250ZW50Ij48L3NwYW4+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbU5vQXR0YWNobWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJUcmVlSXRlbSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGFuZGxlIHVpLXJlc2l6YWJsZS1oYW5kbGUgdWktcmVzaXphYmxlLXMiPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPlslIFRyYW5zbGF0ZSgiUmVzaXplIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUxpc3QiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2hyb25pY2FsVmlldyIpICVdCgogICAgICAgIDxkaXYgY2xhc3M9IkNocm9uaWNhbFZpZXdUaWNrZXRBY3Rpb25zIEhpZGRlbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkNocm9uaWNhbFZpZXdUaWNrZXRBY3Rpb25zIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iVGlja2V0QWN0aW9ucyBBcnRpY2xlSURfWyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdIj4KWyUgUFJPQ0VTUyBBcnRpY2xlQWN0aW9uTWVudS50dCAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNocm9uaWNhbFZpZXdUaWNrZXRBY3Rpb25zIikgJV0KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iQ2hyb25pY2FsVmlld0FydGljbGVBdHRhY2htZW50cyBIaWRkZW4iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDaHJvbmljYWxWaWV3QXJ0aWNsZUF0dGFjaG1lbnRzIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUF0dGFjaG1lbnRzIEFydGljbGVJRF9bJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iPgpbJSBQUk9DRVNTIEFydGljbGVBdHRhY2htZW50cy50dCAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNocm9uaWNhbFZpZXdBcnRpY2xlQXR0YWNobWVudHMiKSAlXQogICAgICAgIDwvZGl2PgoKICAgICAgICA8dWwgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgICAgIDxsaSBpZD0iVGVtcGxhdGVMaXN0SXRlbSI+CiAgICAgICAgICAgICAgICA8aDM+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVW5yZWFkQXJ0aWNsZXMgUmVtYXJrYWJsZSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiTWFyayB0aGlzIGFydGljbGUgYXMgcmVhZCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zdGFyIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWluZm8tY2lyY2xlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJJbXBvcnRhbnQiKSB8IGh0bWwgJV0iPjwvaT4KICAgICAgICAgICAgICAgICAgICA8ZW0+PC9lbT4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nIGNsYXNzPSJUeXBlIj48L3N0cm9uZz4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj48c3Bhbj48L3NwYW4+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJTaG93RnVsbEFydGljbGVUZXh0IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IEZ1bGwgVGV4dCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zZWFyY2gtcGx1cyI+PC9pPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvaDM+CiAgICAgICAgICAgIDwvbGk+CiAgICAgICAgPC91bD4KCiAgICAgICAgPGRpdiBpZD0iVGVtcGxhdGVBcnRpY2xlRGF0YSIgY2xhc3M9IkhpZGRlbiI+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ic3ViamVjdCI+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06IDwvc3Ryb25nPgogICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZnJvbSI+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5bJSBUcmFuc2xhdGUoIkZyb20iKSB8IGh0bWwgJV06IDwvc3Ryb25nPgogICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0idG8iPgogICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+WyUgVHJhbnNsYXRlKCJUbyIpIHwgaHRtbCAlXTogPC9zdHJvbmc+CiAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJjYyI+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5bJSBUcmFuc2xhdGUoIkNjIikgfCBodG1sICVdOiA8L3N0cm9uZz4KICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhpZGRlbiBGdWxsQXJ0aWNsZVBsYWluVGV4dCIgZGF0YS10aXRsZT0iWyUgVHJhbnNsYXRlKCJGdWxsIEFydGljbGUgVGV4dCIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDaHJvbmljYWxQbGFpblRleHQiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHAgY2xhc3M9IlBsYWluVGV4dCI+PC9wPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIaWRkZW4gQXJ0aWNsZUlGcmFtZSIgZGF0YS10aXRsZT0iWyUgVHJhbnNsYXRlKCJGdWxsIEFydGljbGUgVGV4dCIpIHwgaHRtbCAlXSI+PC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9IkNocm9uaWNhbFZpZXcgWyUgSUYgRGF0YS5Vc2VBcnRpY2xlQ29sb3JzICVdVXNlQXJ0aWNsZUNvbG9yc1slIEVORCAlXSI+CiAgICAgICAgICAgIDx1bCBjbGFzcz0iTGlzdExlZnQiPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJOb0V2ZW50cyI+WyUgVHJhbnNsYXRlKCJObyBtb3JlIGV2ZW50cyBmb3VuZC4gUGxlYXNlIHRyeSBjaGFuZ2luZyB0aGUgZmlsdGVyIHNldHRpbmdzLiIpIHwgaHRtbCAlXTwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDx1bCBjbGFzcz0iTGlzdFJpZ2h0Ij48L3VsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPSJmYSBmYS1zcGlubmVyIGZhLXNwaW4iPjwvaT48L3NwYW4+CiAgICAgICAgPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCgpbJSBJRiBDb25maWcoIkNocm9uaWNhbFZpZXdFbmFibGVkIikgPT0gMSAlXQp2YXIgVGlja2V0SUQgICAgPSBbJSBEYXRhLlRpY2tldElEIHwgSlNPTiAlXSwKICAgIExpc3RPYmplY3RzID0gWwpbJSBGT1JFQUNIIEl0ZW0gSU4gRGF0YS5JdGVtcyAlXQogICAgewogICAgICAgICdvcmllbnRhdGlvbicgICA6IFslIEl0ZW0uT3JpZW50YXRpb24gfCBKU09OICVdLAogICAgICAgICdvcmRlcicgICAgICAgICA6IFslIEl0ZW0uQ291bnRlciB8IEpTT04gJV0sCiAgICAgICAgJ2lkJyAgICAgICAgICAgIDogIlslIElGIEl0ZW0uQXJ0aWNsZUlEICVdQXJ0aWNsZUlEX1slIEl0ZW0uQXJ0aWNsZUlEICVdWyUgRU5EICVdIiwKICAgICAgICAnY2xhc3MnICAgICAgICAgOiBbJSBJdGVtLkNsYXNzIHwgSlNPTiAlXSwKICAgICAgICAndGltZScgICAgICAgICAgOiBbJSBJdGVtLkNyZWF0ZVRpbWUgfCBKU09OICVdLAogICAgICAgICd0aW1lX2xvbmcnICAgICA6IFslIEl0ZW0uQ3JlYXRlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpIHwgSlNPTiAlXSwKICAgICAgICAndHlwZScgICAgICAgICAgOiBbJSBJdGVtLkhpc3RvcnlUeXBlIHwgSlNPTiAlXSwKICAgICAgICAndHlwZV9yZWFkYWJsZScgOiBbJSBUcmFuc2xhdGUoSXRlbS5IaXN0b3J5VHlwZVJlYWRhYmxlKSB8IEpTT04gJV0sCiAgICAgICAgJ25hbWUnICAgICAgICAgIDogWyUgSXRlbS5OYW1lIHwgSlNPTiAlXSwKICAgICAgICAnYXJ0aWNsZV9pZCcgICAgOiBbJSBJdGVtLkFydGljbGVJRCB8IEpTT04gJV0sCiAgICAgICAgJ2lzX2NoYXQnICAgICAgIDogWyUgSXRlbS5Jc0NoYXRBcnRpY2xlIHwgSlNPTiAlXSwKICAgICAgICAnYXJ0aWNsZV9kYXRhJyAgOiB7CiAgICAgICAgWyUgSUYgSXRlbS5BcnRpY2xlSUQgJV0KICAgICAgICAgICAgJ3N1YmplY3QnOiBbJSBJdGVtLkFydGljbGVEYXRhLlN1YmplY3QgfCBodG1sIHwgSlNPTiAlXSwKICAgICAgICAgICAgJ2Zyb20nICAgOiBbJSBJdGVtLkFydGljbGVEYXRhLkZyb20gfCBodG1sIHwgSlNPTiAlXSwKICAgICAgICAgICAgJ3RvJyAgICAgOiBbJSBJdGVtLkFydGljbGVEYXRhLlRvIHwgaHRtbCB8IEpTT04gJV0sCiAgICAgICAgICAgICdjYycgICAgIDogWyUgSXRlbS5BcnRpY2xlRGF0YS5DYyB8IGh0bWwgfCBKU09OICVdLAogICAgICAgICAgICAnaXNfaW1wb3J0YW50JyA6IFslIEl0ZW0uQXJ0aWNsZURhdGEuQXJ0aWNsZUlzSW1wb3J0YW50IHwgSlNPTiAlXSwKICAgICAgICAgICAgJ2lzX3NlZW4nIDogWyUgSXRlbS5BcnRpY2xlRGF0YS5BcnRpY2xlSXNTZWVuIHwgSlNPTiAlXSwKICAgICAgICAgICAgJ3RleHQnICAgOiBbJSBJRiBJdGVtLklzQ2hhdEFydGljbGUgJV1bJSBJdGVtLkFydGljbGVEYXRhLkJvZHlDaGF0IHwgSlNPTiAlXVslIEVMU0UgJV1bJSBJdGVtLkFydGljbGVEYXRhLkJvZHkgfCB0cnVuY2F0ZSg2NTApIHwgSlNPTiAlXVslIEVORCAlXSwKICAgICAgICAgICAgJ3RleHRfbG9uZycgOiBbJSBJRiBJdGVtLklzQ2hhdEFydGljbGUgJV1bJSBJdGVtLkFydGljbGVEYXRhLkJvZHkgJV1bJSBFTFNFICVdWyUgSUYgIUl0ZW0uQXJ0aWNsZURhdGEuQXR0YWNobWVudElET2ZIVE1MQm9keSAlXVslIEl0ZW0uQXJ0aWNsZURhdGEuQm9keSB8IEpTT04gJV1bJSBFTFNFICVdIiJbJSBFTkQgJV1bJSBFTkQgJV0sCiAgICAgICAgICAgICdhdHRhY2htZW50X2lkJyA6IFslIEl0ZW0uQXJ0aWNsZURhdGEuQXR0YWNobWVudElET2ZIVE1MQm9keSB8IEpTT04gJV0sCiAgICAgICAgICAgICdpZnJhbWVfaHRtbCcgOiAnPGlmcmFtZSBzYW5kYm94PSJhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IiBkYXRhLXVybD0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUFnZW50VGlja2V0QXR0YWNobWVudDtTdWJhY3Rpb249SFRNTFZpZXc7QXJ0aWNsZUlEPVslIEl0ZW0uQXJ0aWNsZUlEIHwgaHRtbCAlXTtGaWxlSUQ9WyUgSXRlbS5BcnRpY2xlRGF0YS5BdHRhY2htZW50SURPZkhUTUxCb2R5IHwgaHRtbCAlXTtbJSBFbnYoIlNlc3Npb25OYW1lIikgfCBodG1sICVdPVslIEVudigiU2Vzc2lvbklEIikgfCBodG1sICVdIiBbJSBEYXRhLk1TU2VjdXJpdHlSZXN0cmljdGVkICVdIHdpZHRoPSIxMDAlIiBmcmFtZWJvcmRlcj0iMCIgaWQ9IklmcmFtZVslIEl0ZW0uQXJ0aWNsZUlEIHwgaHRtbCAlXSIgY2xhc3M9IkNocm9uaWNhbEFydGljbGVpRnJhbWUiIHNyYz0iIj48L2lmcmFtZT4nCiAgICAgICAgWyUgRU5EICVdCiAgICAgICAgfQogICAgfVslIElGICFsb29wLmxhc3QgJV0sWyUgRU5EICVdClslIEVORCAlXQpdOwoKQ29yZS5BZ2VudC5UaWNrZXRab29tLkNocm9uaWNhbFZpZXcuSW5pdChUaWNrZXRJRCwgTGlzdE9iamVjdHMpOwoKWyUgRU5EICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTaG93U2VsZWN0ZWRBcnRpY2xlIikgJV0KaWYgKCQoJyNBcnRpY2xlX1slIERhdGEuQXJ0aWNsZUlEICVdJykubGVuZ3RoKSB7CiAgICAkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7IHNjcm9sbFRvcDogKCQoJyNBcnRpY2xlX1slIERhdGEuQXJ0aWNsZUlEICVdJykub2Zmc2V0KCkudG9wKX0sIDApOwp9ClslIFJlbmRlckJsb2NrRW5kKCJTaG93U2VsZWN0ZWRBcnRpY2xlIikgJV0KLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2hyb25pY2FsVmlldyIpICVdCgogICAgPC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVHJlZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlSXRlbSIpICVdCjxkaXY+CiAgICA8YSBuYW1lPSJBcnRpY2xlWyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdIj48L2E+CiAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUgRXhwYW5kZWQgWyUgRGF0YS5TZW5kZXJUeXBlIHwgaHRtbCAlXS1bJSBEYXRhLkFydGljbGVUeXBlIHwgaHRtbCAlXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0QWN0aW9uIFRvZ2dsZSI+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgfCB1cmkgJV07QXJ0aWNsZUlEPVslIERhdGEuQXJ0aWNsZUlEIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTaG93IG9yIGhpZGUgdGhlIGNvbnRlbnQiKSB8IGh0bWwgJV0iPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1yaWdodCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+PC9hPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiQXJ0aWNsZSIpIHwgaHRtbCAlXSAjWyUgRGF0YS5Db3VudCB8IGh0bWwgJV0gJm5kYXNoOyBbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWRkaXRpb25hbEluZm9ybWF0aW9uIFNwYWNpbmdMb2FkZXIiPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdOiBbJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUNyZWF0ZWRCeSIpICVdCiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoImJ5IikgfCBodG1sICVdIFslIERhdGEuQ3JlYXRlZEJ5VXNlciB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVDcmVhdGVkQnkiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KClslIFBST0NFU1MgQXJ0aWNsZUFjdGlvbk1lbnUudHQgJV0KCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFydGljbGVNYWlsSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJvd1JlY2lwaWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV0iPlslIERhdGEuUmVhbG5hbWUgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJvd1JlY2lwaWVudCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJvd0RhdGEiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuVmFsdWUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dEYXRhIikgJV0KCiMgc2hvdyBhcnRpY2xlIGR5bmFtaWMgZmllbGRzClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRMaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlRpdGxlICVdIj48YSBocmVmPSJbJSBEYXRhLkxpbmsgfCBJbnRlcnBvbGF0ZSAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJEeW5hbWljRmllbGRMaW5rIj5bJSBEYXRhLlZhbHVlICVdPC9hPjwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGRMaW5rIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlRpdGxlICVdIj5bJSBEYXRhLlZhbHVlICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZFBsYWluIikgJV0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkIikgJV0KCiMgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZpeGVkIGR5bmFtaWMgZmllbGQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojIE5vdGU6IEZpZWxkMSBhbmQgRmllbGQyIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWVzCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkRmllbGQxIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkRmllbGQxTGluayIpICVdCiMgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuVGl0bGUgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9wPgojWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGQxTGluayIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkRmllbGQxUGxhaW4iKSAlXQojICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBEYXRhLlRpdGxlICVdIj5bJSBEYXRhLlZhbHVlICVdPC9wPgojWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGRGaWVsZDFQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZEZpZWxkMSIpICVdCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkRmllbGQyIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvbGFiZWw+CiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkRmllbGQyTGluayIpICVdCiMgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuVGl0bGUgJV0iPjxhIGhyZWY9IlslIERhdGEuTGluayB8IEludGVycG9sYXRlICVdIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9IkR5bmFtaWNGaWVsZExpbmsiPlslIERhdGEuVmFsdWUgJV08L2E+PC9wPgojWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGRGaWVsZDJMaW5rIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRGaWVsZDJQbGFpbiIpICVdCiMgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IlslIERhdGEuVGl0bGUgJV0iPlslIERhdGEuVmFsdWUgJV08L3A+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZEZpZWxkMlBsYWluIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlRHluYW1pY0ZpZWxkRmllbGQyIikgJV0KCiMgc2hvdyBhcnRpY2xlIG9wdGlvbnMgbGlrZSBzaWduZWQsIGNyeXB0ZWQsIC4uLgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlT3B0aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKERhdGEuS2V5KSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlZhbHVlIHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuUmVzdWx0IHwgaHRtbCAlXSBWYWx1ZSI+WyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlT3B0aW9uIikgJV0KCiMgICAgICAgICAgICAgICAgICAgIDwhLS0gSW5jbHVkZSB0aGUgZnVsbCBzdWJqZWN0IHNvIHRoYXQgaXQgY2FuIGJlIGNvcGllZC4gVGhlIG9uZSBpbiB0aGUgdGl0bGUgYmFyIGlzIHNob3J0ZW5lZC4gLS0+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgojIHNob3cgYXJ0aWNsZSBhY2NvdW50ZWQgdGltZQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlQWNjb3VudGVkVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLlZhbHVlIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQWNjb3VudGVkVGltZSIpICVdCgojIHNob3cgYXR0YWNobWVudHMKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlQXR0YWNobWVudFJvdyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVBdHRhY2htZW50Um93TGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJbJSBEYXRhLkNsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5MaW5rICVdIiBbJSBEYXRhLlRhcmdldCAlXSB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQWN0aW9uKSB8IGh0bWwgJV0iPlslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdPC9hPiBbJSBEYXRhLkRhdGFGaWxlU2l6ZSB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVBdHRhY2htZW50Um93TGluayIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVBdHRhY2htZW50Um93Tm9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWxlbmFtZSB8IGh0bWwgJV0sIFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQXR0YWNobWVudFJvd05vTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQXR0YWNobWVudCIpICVdCiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZU1haWxDb250ZW50Ij4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQm9keVBsYWluIikgJV0KWyUgRGF0YS5Cb2R5Tm90ZSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUJvZHkiPgpbJSBEYXRhLkJvZHkgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQm9keVBsYWluIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiQm9keUhUTUwiKSAlXQogICAgICAgICAgICAgICAgPGRpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQnJvd3NlckxpbmtNZXNzYWdlIikgJV0KIyBTaG93IGluZm8sIHRoYXQgbGlua3Mgd2l0aGluIHRoZSBpZnJhbWUgbXVzdCBiZSBjbGlja2VkIHdpdGggc3RyZy9jbWQvc2hpZnQgKGRlcGVuZGluZyBvbiB0aGUgdXNlZCBicm93c2VyIGFuZCBvcykKIyB0byBvcGVuIHRoZSBsaW5rcyBpbiBhIG5ldyB3aW5kb3cgd2l0aG91dCB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbnMgZ2l2ZW4gdG8gdGhlIGlmcmFtZQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1lc3NhZ2VCcm93c2VyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgWyUgVHJhbnNsYXRlKCJUbyBvcGVuIGxpbmtzIGluIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZSwgeW91IG1pZ2h0IG5lZWQgdG8gcHJlc3MgQ3RybCBvciBDbWQgb3IgU2hpZnQga2V5IHdoaWxlIGNsaWNraW5nIHRoZSBsaW5rIChkZXBlbmRpbmcgb24geW91ciBicm93c2VyIGFuZCBPUykuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkNsb3NlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDbG9zZSB0aGlzIG1lc3NhZ2UiKSB8IGh0bWwgJV0iIGhyZWY9IiMiPjxpIGNsYXNzPSJmYSBmYS10aW1lcyI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkJyb3dzZXJMaW5rTWVzc2FnZSIpICVdCiMgZXhlY3V0ZSBJRnJhbWUgSlMgYXN5bmNocm9ub3VzbHkuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gYmVmb3JlIG91ciBBUEkgd2FzIGxvYWRlZAojIFVzZSB0aGUgSFRNTDUgc2FuZGJveCBhdHRyaWJ1dGUgdG8gcHJldmVudCBwbHVnaW5zIGFuZCBzY3JpcHRzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW4gdGhlIGJyb3dzZXIuCiMgVXNlIElFJ3MgKG5vbi1zdGFuZGFyZCkgc2VjdXJpdHkgYXR0cmlidXRlIHRvIGFjaGlldmUgc29tZXRoaW5nIHNpbWlsYXIgaW4gb2xkZXIgSUUgYnJvd3NlcnMuIEFwcGVuZCBzZXNzaW9uIGluZm8gdG8gVVJMIGJlY2F1c2UgSUUgd2lsbCBub3Qgc2VuZCBjb29raWVzLgojIFNldCAnYWxsb3ctcG9wdXBzJyB0byBhbGxvdyBJRTEwKyB0byBvcGVuIGxpbmtzLiByZWY6IGh0dHA6Ly93d3cudzMub3JnL2h0bWwvd2cvd2lraS9DaGFuZ2VQcm9wb3NhbHMvc2FuZGJveF9hbGxvd19wb3B1cHMKICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHNhbmRib3g9ImFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXBvcHVwcyBhbGxvdy1wb3B1cHMtdG8tZXNjYXBlLXNhbmRib3giIFslIERhdGEuTVNTZWN1cml0eVJlc3RyaWN0ZWQgJV0gd2lkdGg9IjEwMCUiIGZyYW1lYm9yZGVyPSIwIiBpZD0iSWZyYW1lWyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdIiBvbmxvYWQ9IndpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbiAoKXsgaWYgKHR5cGVvZiBDb3JlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgQ29yZS5BZ2VudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIENvcmUuQWdlbnQuVGlja2V0Wm9vbSA9PT0gJ29iamVjdCcpIHsgQ29yZS5BZ2VudC5UaWNrZXRab29tLklmcmFtZUF1dG9IZWlnaHQoJCgnI0lmcmFtZVslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXScpKTsgfSB9LCA1MDApOyIgc3JjPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRBdHRhY2htZW50O1N1YmFjdGlvbj1IVE1MVmlldztBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCBodG1sICVdO0ZpbGVJRD1bJSBEYXRhLkF0dGFjaG1lbnRJRE9mSFRNTEJvZHkgfCBodG1sICVdO1slIEVudigiU2Vzc2lvbk5hbWUiKSB8IGh0bWwgJV09WyUgRW52KCJTZXNzaW9uSUQiKSB8IGh0bWwgJV0iPjwvaWZyYW1lPgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJCb2R5SFRNTCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJvZHlDaGF0IikgJV0KWyUgSU5DTFVERSAiQ2hhdERpc3BsYXkudHQiICVdClslIFJlbmRlckJsb2NrRW5kKCJCb2R5Q2hhdCIpICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlSXRlbU1hcmtBc1NlZW4iKSAlXQpbJSBXUkFQUEVSIEpTT25Eb2N1bWVudENvbXBsZXRlICVdCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5BZ2VudC5UaWNrZXRab29tLk1hcmtBc1NlZW4oWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0sIFslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUl0ZW1NYXJrQXNTZWVuIikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVJdGVtIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldEl0ZW1NYXJrQXNTZWVuIikgJV0KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQWdlbnQuVGlja2V0Wm9vbS5NYXJrVGlja2V0QXNTZWVuKFslIERhdGEuVGlja2V0SUQgfCBodG1sICVdKTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRJdGVtTWFya0FzU2VlbiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRab29tSW5pdCIpICVdCgpbJSBJTkNMVURFICJDaGF0U3RhcnRGb3JtLnR0IiAlXQoKWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQWdlbnQuVGlja2V0Wm9vbS5Jbml0KHsgQXJ0aWNsZVRhYmxlSGVpZ2h0OiBwYXJzZUludCgnWyUgRW52KCJVc2VyVGlja2V0Wm9vbUFydGljbGVUYWJsZUhlaWdodCIpICVdJywgMTApfSk7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkhUTUxBcnRpY2xlSGVpZ2h0RGVmYXVsdCcsIHBhcnNlSW50KCJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OkhUTUxBcnRpY2xlSGVpZ2h0RGVmYXVsdCIpICVdIiB8fCAwLCAxMCkpOwogICAgQ29yZS5Db25maWcuU2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpIVE1MQXJ0aWNsZUhlaWdodE1heCcsIHBhcnNlSW50KCJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OkhUTUxBcnRpY2xlSGVpZ2h0TWF4IikgJV0iIHx8IDAsIDEwKSk7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ0xhbmd1YWdlLkF0dGFjaG1lbnRWaWV3TWVzc2FnZScsIFslIFRyYW5zbGF0ZSgnQXJ0aWNsZSBjb3VsZCBub3QgYmUgb3BlbmVkISBQZXJoYXBzIGl0IGlzIG9uIGFub3RoZXIgYXJ0aWNsZSBwYWdlPycpIHwgSlNPTiAlXSk7CgogICAgJCgnYS5DcmVhdGVDaGF0UmVxdWVzdCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIFVzZXJJRCA9ICQodGhpcykuZGF0YSgndXNlci1pZCcpLAogICAgICAgICAgICAkRGlhbG9nID0gJCgnI0Rhc2hib2FyZFVzZXJPbmxpbmVDaGF0U3RhcnREaWFsb2cnKS5jbG9uZSgpOwoKICAgICAgICAkRGlhbG9nLmZpbmQoJ2lucHV0W25hbWU9Q2hhdFN0YXJ0VXNlcklEXScpLnZhbCgkKHRoaXMpLmRhdGEoJ3VzZXItaWQnKSk7CiAgICAgICAgJERpYWxvZy5maW5kKCdpbnB1dFtuYW1lPUNoYXRTdGFydFVzZXJUeXBlXScpLnZhbCgkKHRoaXMpLmRhdGEoJ3VzZXItdHlwZScpKTsKICAgICAgICAkRGlhbG9nLmZpbmQoJ2lucHV0W25hbWU9Q2hhdFN0YXJ0VXNlckZ1bGxuYW1lXScpLnZhbCgkKHRoaXMpLmRhdGEoJ3VzZXItZnVsbG5hbWUnKSk7CgogICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dDb250ZW50RGlhbG9nKCREaWFsb2cuaHRtbCgpLCBbJSBUcmFuc2xhdGUoJ1N0YXJ0IGNoYXQnKSB8IEpTT04gJV0sICcxMDBweCcsICdDZW50ZXInLCB0cnVlKTsKCiAgICAgICAgLy8gT25seSBlbmFibGUgYnV0dG9uIGlmIHRoZXJlIGlzIGEgbWVzc2FnZQogICAgICAgICQoJy5EaWFsb2cgdGV4dGFyZWFbbmFtZT0iQ2hhdFN0YXJ0Rmlyc3RNZXNzYWdlIl0nKS5vbigna2V5dXAnLCBmdW5jdGlvbigpewogICAgICAgICAgICAkKCcuRGlhbG9nIGJ1dHRvbicpLnByb3AoJ2Rpc2FibGVkJywgJCh0aGlzKS52YWwoKS5sZW5ndGggPyBmYWxzZSA6IHRydWUgKTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnLkRpYWxvZyBmb3JtJykub24oJ3N1Ym1pdCcsIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGlmICghJCgnLkRpYWxvZyB0ZXh0YXJlYVtuYW1lPUNoYXRTdGFydEZpcnN0TWVzc2FnZV0nKS52YWwoKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDbG9zZSBhZnRlciBzdWJtaXQKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2cnKSk7CiAgICAgICAgICAgIH0sIDEpOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRab29tSW5pdCIpICVdCg==
IyAtLQojIEN1c3RvbWVyVGlja2V0UHJpbnQudHQgLSBwcm92aWRlcyBIVE1MIHByaW50IHZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvNDc4ZWU2NjVjNTM1YjY4MDI5Y2VkNGRjYTE5N2I1MjM1YjdiMTkyZi9LZXJuZWwvT3V0cHV0L0hUTUwvU3RhbmRhcmQvQ3VzdG9tZXJUaWNrZXRQcmludC50dAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+WyUgQ29uZmlnKCJUaWNrZXQ6Okhvb2siKSAlXTogWyUgRGF0YS5UaWNrZXROdW1iZXIgfCBodG1sICVdIC8gWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48c21hbGw+WyUgVHJhbnNsYXRlKCJUaWNrZXQgUHJpbnQiKSB8IGh0bWwgJV08L3NtYWxsPjwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjEwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4KICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSI1MCUiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjMiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFN0YXRlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI0MCUiPlslIFRyYW5zbGF0ZSgiU3RhdGUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9IjYwJSI+WyUgVHJhbnNsYXRlKERhdGEuU3RhdGUpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U3RhdGUiKSAlXQojIC0tLQojIElUU00KIyAtLS0KI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFByaW9yaXR5IikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXTwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRQcmlvcml0eSIpICVdCiMgLS0tClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFF1ZXVlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiUXVldWUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5RdWV1ZSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFF1ZXVlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0VHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlR5cGUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5UeXBlIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0VHlwZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuU2VydmljZSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFNlcnZpY2UiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTTEEiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJTTEEiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5TTEEgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRTTEEiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRPd25lciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIk93bmVyIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuT3duZXIgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXRPd25lciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFJlc3BvbnNpYmxlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiUmVzcG9uc2libGUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5SZXNwb25zaWJsZSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldFJlc3BvbnNpYmxlIikgJV0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIkNyaXRpY2FsaXR5IikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIFRyYW5zbGF0ZShEYXRhLkNyaXRpY2FsaXR5KSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiSW1wYWN0IikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIFRyYW5zbGF0ZShEYXRhLkltcGFjdCkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlByaW9yaXR5IikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIFRyYW5zbGF0ZShEYXRhLlByaW9yaXR5KSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJDdXN0b21lcklEIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI0MCUiPlslIFRyYW5zbGF0ZSgiQWdlIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI2MCUiPlslIERhdGEuQWdlIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPlslIERhdGEuQ3JlYXRlZCB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIlNvbHV0aW9uIFRpbWUiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+WyUgRGF0YS5Tb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUgfCBMb2NhbGl6ZSgiVGltZVNob3J0IikgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlNvbHV0aW9uVGltZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMzAlIj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMzAlIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZEhlYWRlciIpICVdCiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPjxiPjxpPlslIFRyYW5zbGF0ZSgiVGlja2V0IER5bmFtaWMgRmllbGRzIikgfCBodG1sICVdPC9pPjwvYj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZEhlYWRlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGQiKSAlXQogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZCIpICVdCgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgYW5kIEZpZWxkMiBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lcwojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvZGl2PgojICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICA8L3RyPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCiMgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvZGl2PgojICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICA8L3RyPgojWyUgUmVuZGVyQmxvY2tFbmQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQ3VzdG9tZXIgSW5mbyIpIHwgaHRtbCAlXToKICAgICAgICAgICAgWyUgRGF0YS5DdXN0b21lclRhYmxlICVdCiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gc3RhcnQgdGlja2V0IFslIERhdGEuVGlja2V0TnVtYmVyICVdIC0tPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlIikgJV0KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjY0MCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBiZ2NvbG9yPSIjMDAwMDAwIiBjbGFzcz0iY29udGFpbmVyIj4KICAgIDx0cj4KICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2NDAiIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEiIGJnY29sb3I9IiNmZmZmZmYiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTAwJSIgY2xhc3M9InNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiMgRnJvbTosIFRvOiwgQ2M6ClslIFJlbmRlckJsb2NrU3RhcnQoIlJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj5bJSBUcmFuc2xhdGUoRGF0YS5LZXkpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4gPGRpdiB0aXRsZT0iWyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgfCB0cnVuY2F0ZSgxNjApIHwgaHRtbCAlXTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gWyUgRGF0YS5DcmVhdGVkIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV0gWyUgVHJhbnNsYXRlKCJieSIpIHwgaHRtbCAlXSBbJSBUcmFuc2xhdGUoRGF0YS5TZW5kZXJUeXBlKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyBzaG93IER5bmFtaWMgRmllbGRzIGZvciBlYWNoIEFydGljbGUKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMTUlIj5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZCIpICVdCiMgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZpeGVkIGR5bmFtaWMgZmllbGQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojIE5vdGU6IEZpZWxkMSBhbmQgRmllbGQyIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWVzCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC90ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI4NSUiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVEeW5hbWljRmllbGRfRmllbGQyIikgJV0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1JSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdOjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiBbJSBUcmFuc2xhdGUoRGF0YS5BcnRpY2xlVHlwZSkgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnQiKSB8IGh0bWwgJV06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+IFslIERhdGEuaXRlbSgiQXJ0aWNsZTo6QVRNIikgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KWyUgSUYgRGF0YS5Jc0NoYXQgPT0gMSAlXQpbJSBJTkNMVURFICJDaGF0RGlzcGxheS50dCIgJV0KWyUgRUxTRSAlXQpbJSBEYXRhLlRleHROb3RlICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmU+ClslIERhdGEuQm9keSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByZT4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZW5kIHRpY2tldCAtLT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPC90YWJsZT4KPGJyLz4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGUiKSAlXQo=
IyAtLQojIEN1c3RvbWVyVGlja2V0Wm9vbS50dCAtIHByb3ZpZGVzIEhUTUwgVGlja2V0Wm9vbSBmb3IgQ3VzdG9tZXJUaWNrZXRab29tLnBtCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTYgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgJG9yaWdpbjogaHR0cHM6Ly9naXRodWIuY29tL09UUlMvb3Rycy9ibG9iLzQ3OGVlNjY1YzUzNWI2ODAyOWNlZDRkY2ExOTdiNTIzNWI3YjE5MmYvS2VybmVsL091dHB1dC9IVE1ML1N0YW5kYXJkL0N1c3RvbWVyVGlja2V0Wm9vbS50dAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8ZGl2IGlkPSJNYWluQm94IiBjbGFzcz0iVGlja2V0Wm9vbSBBUklBUm9sZU1haW4iPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCYWNrIikgJV0KICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgPHVsIGNsYXNzPSJUYWJzIj4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXVslIEVudigiTGFzdFNjcmVlbk92ZXJ2aWV3IikgJV0iPiZsYXJyOyBbJSBUcmFuc2xhdGUoIkJhY2siKSB8IGh0bWwgJV08L2E+PC9saT4KICAgICAgICA8L3VsPgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQmFjayIpICVdCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJUaWNrZXRIZWFkZXIiPgogICAgICAgICAgICA8aDIgdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJpb3JpdHlGbGFnIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZsYWciIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdIj48c3BhbiBjbGFzcz0iUHJpb3JpdHlJRC1bJSBEYXRhLlByaW9yaXR5SUQgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5Qcmlvcml0eSkgfCBodG1sICVdPC9zcGFuPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJpb3JpdHlGbGFnIikgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuVGl0bGUgfCBodG1sICVdCiAgICAgICAgICAgIDwvaDI+CiAgICAgICAgICAgIDx1bCBpZD0iVGlja2V0T3B0aW9ucyI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcmludCIpICVdCiAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUN1c3RvbWVyVGlja2V0UHJpbnQ7VGlja2V0SUQ9WyUgRGF0YS5UaWNrZXRJRCB8IHVyaSAlXSIgY2xhc3M9IlByaW50IEFzUG9wdXAiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlByaW50IikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXByaW50Ij48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIFRyYW5zbGF0ZSgiUHJpbnQiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlByaW50IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkV4cGFuZCIpICVdCiAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUN1c3RvbWVyVGlja2V0Wm9vbTtUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO1pvb21FeHBhbmQ9WyUgRGF0YS5ab29tRXhwYW5kIHwgdXJpICVdIiBjbGFzcz0iWm9vbUV4cGFuZCBFeHBhbmRbJSBEYXRhLkV4cGFuZE9wdGlvbiAlXSJ9IHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5FeHBhbmRUZXh0KSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtYmFycyI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+WyUgVHJhbnNsYXRlKERhdGEuRXhwYW5kVGV4dCkgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJab29tRXhwYW5kIiBpZD0iWm9vbUV4cGFuZCIgdmFsdWU9IlslIERhdGEuWm9vbUV4cGFuZCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICA8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRXhwYW5kIikgJV0KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSNGb2xsb3dVcCIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIiBpZD0iUmVwbHlDdXN0b21lclRpY2tldCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJDdXN0b21lclRpY2tldFpvb20iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IlslIERhdGEuVGlja2V0SUQgfCBodG1sICVdIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBcnRpY2xlSUQiIHZhbHVlPSJbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgPHVsIGlkPSJNZXNzYWdlcyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGUiKSAlXQogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJbJSBEYXRhLlNlbmRlclR5cGUgfCBodG1sICVdLVslIERhdGEuQXJ0aWNsZVR5cGUgfCBodG1sICVdIFslIERhdGEuQ2xhc3MgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlSGVhZGVyIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVDb250cmFjdGVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1RpY2tldE51bWJlcj1bJSBEYXRhLlRpY2tldE51bWJlciB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV0iPlslIERhdGEuRnJvbVJlYWxuYW1lIHwgaHRtbCAlXSAmbmRhc2g7IDxzcGFuIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkV4cGFuZCBhcnRpY2xlIikgfCBodG1sICVdLi4uIj5bJSBEYXRhLlN1YmplY3QgfCBodG1sICVdPC9zcGFuPjwvYT48L2gzPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUNvbnRyYWN0ZWQiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUV4cGFuZGVkIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1RpY2tldE51bWJlcj1bJSBEYXRhLlRpY2tldE51bWJlciB8IHVyaSAlXTtBcnRpY2xlSUQ9WyUgRGF0YS5BcnRpY2xlSUQgfCB1cmkgJV0iPlslIERhdGEuRnJvbVJlYWxuYW1lIHwgaHRtbCAlXSAmbmRhc2g7IDxzcGFuIHRpdGxlPSJbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdIj5bJSBEYXRhLlN1YmplY3QgfCBodG1sICVdPC9zcGFuPjwvYT48L2gzPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUV4cGFuZGVkIikgJV0KCiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJBZ2UiIHRpdGxlPSJbJSBEYXRhLkNyZWF0ZWQgfCBMb2NhbGl6ZSgiVGltZUxvbmciKSB8IGh0bWwgJV0iPlslIERhdGEuQWdlICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQXJ0aWNsZVN0YXRlIiB2YWx1ZT0idW50b3VjaGVkIiAvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1lc3NhZ2VCb2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRGV0YWlscyBTZXBlcmF0b3JSb3ciPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlUm93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGFiZWwiPlslIFRyYW5zbGF0ZShEYXRhLktleSkgfCBodG1sICVdOjwvZGl2PiA8c3BhbiB0aXRsZT0iWyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV0iPlslIERhdGEuUmVhbG5hbWUgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkxhYmVsIj5bJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV06PC9kaXY+IDxzcGFuIHRpdGxlPSJbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdIj5bJSBEYXRhLlN1YmplY3QgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKIyBzaG93IGFydGljbGUgZHluYW1pYyBmaWVsZHMKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkxhYmVsIiB0aXRsZT0iWyUgRGF0YS5MYWJlbCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZCIpICVdCiMgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZpeGVkIGR5bmFtaWMgZmllbGQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojIE5vdGU6IEZpZWxkMSBhbmQgRmllbGQyIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWVzCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlRHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGFiZWwiIHRpdGxlPSJbJSBEYXRhLkxhYmVsIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTGFiZWwpIHwgaHRtbCAlXTo8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUR5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUR5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkxhYmVsIiB0aXRsZT0iWyUgRGF0YS5MYWJlbCB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVEeW5hbWljRmllbGRfRmllbGQyIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkFydGljbGVBdHRhY2htZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkF0dGFjaG1lbnRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJMYWJlbCI+WyUgVHJhbnNsYXRlKERhdGEuS2V5KSB8IGh0bWwgJV06PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtcGFwZXJjbGlwIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEb3dubG9hZEF0dGFjaG1lbnQiIHRpdGxlPSJbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSAtIFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQXJ0aWNsZUF0dGFjaG1lbnRSb3dMaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIERhdGEuTGluayAlXSIgWyUgRGF0YS5UYXJnZXQgJV0gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkFjdGlvbikgfCBodG1sICVdIj5bJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXTwvYT4sIFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdClslIFJlbmRlckJsb2NrRW5kKCJBcnRpY2xlQXR0YWNobWVudFJvd0xpbmsiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBcnRpY2xlQXR0YWNobWVudFJvd05vTGluayIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSwgWyUgRGF0YS5GaWxlc2l6ZSB8IGh0bWwgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGVBdHRhY2htZW50Um93Tm9MaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiQXJ0aWNsZUF0dGFjaG1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTWVzc2FnZUNvbnRlbnQiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCb2R5UGxhaW4iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Cb2R5Tm90ZSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQm9keSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJCb2R5UGxhaW4iKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCb2R5SFRNTExvYWQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJCcm93c2VyTGlua01lc3NhZ2UiKSAlXQojIFNob3cgaW5mbywgdGhhdCBsaW5rcyB3aXRoaW4gdGhlIGlmcmFtZSBtdXN0IGJlIGNsaWNrZWQgd2l0aCBzdHJnL2NtZC9zaGlmdCAoZGVwZW5kaW5nIG9uIHRoZSB1c2VkIGJyb3dzZXIgYW5kIG9zKQojIHRvIG9wZW4gdGhlIGxpbmtzIGluIGEgbmV3IHdpbmRvdyB3aXRob3V0IHRoZSBzZWN1cml0eSBwZXJtaXNzaW9ucyBnaXZlbiB0byB0aGUgaWZyYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlQnJvd3NlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgWyUgVHJhbnNsYXRlKCJUbyBvcGVuIGxpbmtzIGluIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZSwgeW91IG1pZ2h0IG5lZWQgdG8gcHJlc3MgQ3RybCBvciBDbWQgb3IgU2hpZnQga2V5IHdoaWxlIGNsaWNraW5nIHRoZSBsaW5rIChkZXBlbmRpbmcgb24geW91ciBicm93c2VyIGFuZCBPUykuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDbG9zZSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ2xvc2UgdGhpcyBtZXNzYWdlIikgfCBodG1sICVdIiBocmVmPSIjIj48aSBjbGFzcz0iZmEgZmEtdGltZXMiPjwvaT48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkJyb3dzZXJMaW5rTWVzc2FnZSIpICVdCiMgVXNlIHRoZSBIVE1MNSBzYW5kYm94IGF0dHJpYnV0ZSB0byBwcmV2ZW50IHBsdWdpbnMgYW5kIHNjcmlwdHMgZnJvbSBiZWluZyBleGVjdXRlZCBpbiB0aGUgYnJvd3Nlci4KIyBVc2UgSUUncyAobm9uLXN0YW5kYXJkKSBzZWN1cml0eSBhdHRyaWJ1dGUgdG8gYWNoaWV2ZSBzb21ldGhpbmcgc2ltaWxhciBpbiBvbGRlciBJRSBicm93c2Vycy4gQXBwZW5kIHNlc3Npb24gaW5mbyB0byBVUkwgYmVjYXVzZSBJRSB3aWxsIG5vdCBzZW5kIGNvb2tpZXMuCiMgU2V0ICdhbGxvdy1wb3B1cHMnIHRvIGFsbG93IElFMTArIHRvIG9wZW4gbGlua3MuIHJlZjogaHR0cDovL3d3dy53My5vcmcvaHRtbC93Zy93aWtpL0NoYW5nZVByb3Bvc2Fscy9zYW5kYm94X2FsbG93X3BvcHVwcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBzYW5kYm94PSJhbGxvdy1zYW1lLW9yaWdpbiBhbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IiBbJSBEYXRhLk1TU2VjdXJpdHlSZXN0cmljdGVkICVdIHRpdGxlPSJhYm91dDpibGFuayIgZnJhbWVib3JkZXI9IjAiIGlkPSJWaXNpYmxlRnJhbWUiIGNsYXNzPSJWaXNpYmxlRnJhbWUiIHNyYz0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPUN1c3RvbWVyVGlja2V0QXR0YWNobWVudDtTdWJhY3Rpb249SFRNTFZpZXc7QXJ0aWNsZUlEPVslIERhdGEuQXJ0aWNsZUlEIHwgaHRtbCAlXTtGaWxlSUQ9WyUgRGF0YS5BdHRhY2htZW50SURPZkhUTUxCb2R5IHwgaHRtbCAlXTtbJSBFbnYoIlNlc3Npb25OYW1lIikgfCBodG1sICVdPVslIEVudigiU2Vzc2lvbklEIikgfCBodG1sICVdIj48L2lmcmFtZT4KWyUgUmVuZGVyQmxvY2tFbmQoIkJvZHlIVE1MTG9hZCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJvZHlIVE1MUGxhY2Vob2xkZXIiKSAlXQojICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIZXJlIHdlIG5lZWQgdG8gYXBwZW5kIHRoZSBzZXNzaW9uIGluZm8gaWYgY29va2llcyBhcmUgZGlzYWJsZWQsIGJlY2F1c2UgdGhlIGxheW91dCBvYmplY3QgY2Fubm90IGF1dG9tYXRpY2FsbHkgZG8gdGhhdCBoZXJlLCBsaWtlIGluIHRoZSBvdGhlciBpZnJhbWUgKG9ubHkgZm9yIHNyYyBhdHRyaWJ1dGUpLiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZnJhbWUgc2FuZGJveD0iYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctcG9wdXBzIGFsbG93LXBvcHVwcy10by1lc2NhcGUtc2FuZGJveCIgWyUgRGF0YS5NU1NlY3VyaXR5UmVzdHJpY3RlZCAlXSBzcmM9ImFib3V0OmJsYW5rIiBmcmFtZWJvcmRlcj0iMCIgdGl0bGU9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1DdXN0b21lclRpY2tldEF0dGFjaG1lbnQ7U3ViYWN0aW9uPUhUTUxWaWV3O0FydGljbGVJRD1bJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV07RmlsZUlEPVslIERhdGEuQXR0YWNobWVudElET2ZIVE1MQm9keSB8IGh0bWwgJV07WyUgRGF0YS5TZXNzaW9uSW5mb3JtYXRpb24gfCBodG1sICVdO1slIEVudigiU2Vzc2lvbk5hbWUiKSB8IGh0bWwgJV09WyUgRW52KCJTZXNzaW9uSUQiKSB8IGh0bWwgJV0iPjwvaWZyYW1lPgpbJSBSZW5kZXJCbG9ja0VuZCgiQm9keUhUTUxQbGFjZWhvbGRlciIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkJvZHlDaGF0IikgJV0KWyUgSU5DTFVERSAiQ2hhdERpc3BsYXkudHQiICVdClslIFJlbmRlckJsb2NrRW5kKCJCb2R5Q2hhdCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFydGljbGUiKSAlXQogICAgICAgICAgICA8L3VsPiA8IS0tIC9NZXNzYWdlcyAtLT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9BcnRpY2xlcyIpICVdCiAgICAgICAgICAgIDx1bCBpZD0iTm9BcnRpY2xlcyI+CiAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGl0ZW0gaGFzIG5vIGFydGljbGVzIHlldC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDwvdWw+ClslIFJlbmRlckJsb2NrRW5kKCJOb0FydGljbGVzIikgJV0KICAgICAgICAgICAgPGRpdiBpZD0iWm9vbVNpZGViYXIiPgogICAgICAgICAgICAgICAgPHVsIGlkPSJNZXRhZGF0YSI+CiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5bJSBUcmFuc2xhdGUoIkluZm9ybWF0aW9uIikgfCBodG1sICVdPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+WyUgRGF0YS5Ib29rIHwgaHRtbCAlXTo8L3NwYW4+IDxzcGFuPlslIERhdGEuVGlja2V0TnVtYmVyIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVHlwZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiVHlwZSIpIHwgaHRtbCAlXTo8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBEYXRhLlR5cGUgfCBodG1sICVdIj5bJSBEYXRhLlR5cGUgfCBodG1sICVdPC9zcGFuPjwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJUeXBlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU2VydmljZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L3NwYW4+IDxzcGFuIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5TZXJ2aWNlKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlNlcnZpY2UpIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiU2VydmljZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlNMQSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiU0xBIikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlNMQSkgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5TTEEpIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiU0xBIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhdGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlN0YXRlIikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLlN0YXRlKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlN0YXRlKSB8IGh0bWwgJV08L3NwYW4+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXRlIikgJV0KIyAtLS0KIyBJVFNNCiMgLS0tClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUgfCBodG1sICVdIj5bJSBEYXRhLlZhbHVlICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGQiKSAlXQojIC0tLQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcmlvcml0eSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuUHJpb3JpdHkpIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJpb3JpdHkiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJRdWV1ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZSgiUXVldWUiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgRGF0YS5RdWV1ZSB8IGh0bWwgJV0iPlslIERhdGEuUXVldWUgfCBodG1sIHwgcmVwbGFjZSgnOjonLCAnPHdicj46Ojx3YnI+JykgJV08L3NwYW4+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlF1ZXVlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3duZXIiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIk93bmVyIikgfCBodG1sICVdOjwvc3Bhbj4gWyUgRGF0YS5Pd25lck5hbWUgfCBodG1sICVdPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk93bmVyIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVzcG9uc2libGUiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlJlc3BvbnNpYmxlIikgfCBodG1sICVdOjwvc3Bhbj4gWyUgRGF0YS5SZXNwb25zaWJsZU5hbWUgfCBodG1sICVdPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlJlc3BvbnNpYmxlIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUHJvY2Vzc0RhdGEiKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIlByb2Nlc3MiKSB8IGh0bWwgJV06PC9zcGFuPiA8c3BhbiB0aXRsZT0iWyUgRGF0YS5Qcm9jZXNzIHwgaHRtbCAlXSI+WyUgRGF0YS5Qcm9jZXNzIHwgaHRtbCAlXTwvc3Bhbj48L2xpPgogICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoIkFjdGl2aXR5IikgfCBodG1sICVdOjwvc3Bhbj4gPHNwYW4gdGl0bGU9IlslIERhdGEuQWN0aXZpdHkgfCBodG1sICVdIj5bJSBEYXRhLkFjdGl2aXR5IHwgaHRtbCAlXTwvc3Bhbj48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiUHJvY2Vzc0RhdGEiKSAlXQoKIyAtLS0KIyBJVFNNCiMgLS0tCiMjIHNob3cgdGlja2V0IGR5bmFtaWMgZmllbGRzCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXREeW5hbWljRmllbGQiKSAlXQojICAgICAgICAgICAgICAgICAgICA8bGk+CiMgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvc3Bhbj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KIyAgICAgICAgICAgICAgICAgICAgPC9saT4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGQiKSAlXQojIC0tLQojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBkeW5hbWljIGZpZWxkIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIyBOb3RlOiBGaWVsZDEgYW5kIEZpZWxkMiBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgYW5kIGhhZCB0byBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwKIyBmaWVsZCBuYW1lcwojWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMSIpICVdCiMgICAgICAgICAgICAgICAgICAgIDxsaT4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJLZXkiPlslIFRyYW5zbGF0ZShEYXRhLkxhYmVsKSB8IGh0bWwgJV06PC9zcGFuPgojICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlslIERhdGEuVGl0bGUxIHwgaHRtbCAlXSI+WyUgRGF0YS5WYWx1ZSAlXTwvc3Bhbj4KIyAgICAgICAgICAgICAgICAgICAgPC9saT4KI1slIFJlbmRlckJsb2NrRW5kKCJUaWNrZXREeW5hbWljRmllbGRfRmllbGQxIikgJV0KI1slIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldER5bmFtaWNGaWVsZF9GaWVsZDIiKSAlXQojICAgICAgICAgICAgICAgICAgICA8bGk+CiMgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iS2V5Ij5bJSBUcmFuc2xhdGUoRGF0YS5MYWJlbCkgfCBodG1sICVdOjwvc3Bhbj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJbJSBEYXRhLlRpdGxlMiB8IGh0bWwgJV0iPlslIERhdGEuVmFsdWUgJV08L3NwYW4+CiMgICAgICAgICAgICAgICAgICAgIDwvbGk+CiNbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0RHluYW1pY0ZpZWxkX0ZpZWxkMiIpICVdCgogICAgICAgICAgICAgICAgPC91bD4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTmV4dEFjdGl2aXRpZXMiKSAlXQogICAgICAgICAgICAgICAgPHVsIGlkPSJBY3Rpdml0aWVzIj4KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1lc3NhZ2VIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPlslIFRyYW5zbGF0ZSgiTmV4dCBTdGVwcyIpIHwgaHRtbCAlXTwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGl2aXR5RGlhbG9nIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+PGEgdGl0bGU9IlslIERhdGEuTmFtZSB8IGh0bWwgJV0iIGNsYXNzPSJBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24iIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1DdXN0b21lclRpY2tldFByb2Nlc3M7U3ViYWN0aW9uPURpc3BsYXlBY3Rpdml0eURpYWxvZztUaWNrZXRJRD1bJSBEYXRhLlRpY2tldElEIHwgdXJpICVdO1Byb2Nlc3NFbnRpdHlJRD1bJSBEYXRhLlByb2Nlc3NFbnRpdHlJRCB8IHVyaSAlXTtBY3Rpdml0eURpYWxvZ0VudGl0eUlEPVslIERhdGEuQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvYT48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aXZpdHlEaWFsb2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJOb0FjdGl2aXR5RGlhbG9nIikgJV0KICAgICAgICAgICAgICAgICAgICA8bGk+WyUgVHJhbnNsYXRlKCJUaGVyZSBhcmUgbm8gZGlhbG9ncyBhdmFpbGFibGUgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvY2Vzcy4iKSB8IGh0bWwgJV08L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTm9BY3Rpdml0eURpYWxvZyIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgpbJSBSZW5kZXJCbG9ja0VuZCgiTmV4dEFjdGl2aXRpZXMiKSAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRm9sbG93VXAiKSAlXQogICAgICAgICAgICA8ZGl2IGlkPSJGb2xsb3dVcCIgY2xhc3M9IlslIERhdGEuRm9sbG93VXBWaXNpYmxlIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJNZXNzZW5nZXIiPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iRG9udFByaW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN1YmplY3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9IkRvbnRQcmludCIgdHlwZT0idGV4dCIgbmFtZT0iU3ViamVjdCIgaWQ9IlN1YmplY3QiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV0iIHZhbHVlPSJbJSBEYXRhLlN1YmplY3QgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJpY2hUZXh0IiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVGV4dCIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+ClslIFJlbmRlckJsb2NrU3RhcnQoIlJpY2hUZXh0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIEluc2VydFRlbXBsYXRlKCJDdXN0b21lclJpY2hUZXh0RWRpdG9yLnR0IikgJV0KWyUgUmVuZGVyQmxvY2tFbmQoIlJpY2hUZXh0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZXBseSIpIHwgaHRtbCAlXSIgaWQ9IlJpY2hUZXh0IiBjbGFzcz0iUmljaFRleHQgRG9udFByaW50IFZhbGlkYXRlX1JlcXVpcmVkUmljaFRleHQgWyUgRGF0YS5SaWNoVGV4dEludmFsaWQgfCBodG1sICVdIiBuYW1lPSJCb2R5IiByb3dzPSIxNSIgY29scz0iWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUiKSAlXSI+WyUgRGF0YS5Cb2R5IHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UgTm9KYXZhU2NyaXB0TWVzc2FnZVslIERhdGEuUmljaFRleHRJbnZhbGlkIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iRG9udFByaW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQXR0YWNobWVudEhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJBdHRhY2htZW50Ij5bJSBUcmFuc2xhdGUoIkF0dGFjaG1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJmaWxlX3VwbG9hZCIgdGl0bGU9IkF0dGFjaG1lbnQiIGlkPSJBdHRhY2htZW50IiB0eXBlPSJmaWxlIiBzaXplPSIzMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBdHRhY2htZW50VXBsb2FkIiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iMCIgLz4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNBdHRhY2htZW50JykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgdmFyICRGb3JtID0gJCgnI0F0dGFjaG1lbnQnKS5jbG9zZXN0KCdmb3JtJyk7CiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKCRGb3JtKTsKICAgICAgICAkRm9ybS5maW5kKCcjQXR0YWNobWVudFVwbG9hZCcpLnZhbCgnMScpLmVuZCgpLnN1Ym1pdCgpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRm9sbG93VXBBdHRhY2htZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkF0dGFjaG1lbnQiIHRpdGxlPSJbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSAtIFslIERhdGEuRmlsZXNpemUgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpbGVuYW1lIHwgaHRtbCAlXSAoWyUgRGF0YS5GaWxlc2l6ZSB8IGh0bWwgJV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGlkPSJBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiBuYW1lPSJBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkF0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIG5hbWU9IkF0dGFjaG1lbnREZWxldGVbJSBEYXRhLkZpbGVJRCB8IGh0bWwgJV0iIC8+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjQXR0YWNobWVudERlbGV0ZUJ1dHRvblslIERhdGEuRmlsZUlEIHwgaHRtbCAlXScpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciAkRm9ybSA9ICQoJyNBdHRhY2htZW50RGVsZXRlQnV0dG9uWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykuY2xvc2VzdCgnZm9ybScpOwogICAgICAgICQoJyNBdHRhY2htZW50RGVsZXRlWyUgRGF0YS5GaWxlSUQgfCBodG1sICVdJykudmFsKDEpOwogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgJEZvcm0udHJpZ2dlcignc3VibWl0Jyk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZvbGxvd1VwQXR0YWNobWVudCIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiRm9sbG93VXBTdGF0ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGF0ZUlEIj5bJSBUcmFuc2xhdGUoIk5leHQgc3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4gWyUgRGF0YS5OZXh0U3RhdGVzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTdGF0ZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI1JlcGx5Q3VzdG9tZXJUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnU3RhdGVJRCcsIFsgJ1ByaW9yaXR5SUQnLCAnVGlja2V0SUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdIF0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiRm9sbG93VXBTdGF0ZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZvbGxvd1VwUHJpb3JpdHkiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUHJpb3JpdHlJRCI+WyUgVHJhbnNsYXRlKCJQcmlvcml0eSIpIHwgaHRtbCAlXTo8L2xhYmVsPiBbJSBEYXRhLlByaW9yaXR5U3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgV1JBUFBFUiBKU09uRG9jdW1lbnRDb21wbGV0ZSAlXQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNQcmlvcml0eUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI1JlcGx5Q3VzdG9tZXJUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnUHJpb3JpdHlJRCcsIFsgJ1N0YXRlSUQnLCAnVGlja2V0SUQnIFslIERhdGEuRHluYW1pY0ZpZWxkTmFtZXNTdHJnICVdIF0pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+ClslIEVORCAlXQpbJSBSZW5kZXJCbG9ja0VuZCgiRm9sbG93VXBQcmlvcml0eSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGb2xsb3dVcER5bmFtaWNGaWVsZCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZvbGxvd1VwRHluYW1pY0ZpZWxkIikgJV0KCiMgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZpeGVkIGR5bmFtaWMgZmllbGQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojIE5vdGU6IEZpZWxkMSBhbmQgRmllbGQyIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyBhbmQgaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbAojIGZpZWxkIG5hbWVzCiNbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGb2xsb3dVcER5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV0iPgojICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAgICAgICAgICAgICAgICA8L2Rpdj4KI1slIFJlbmRlckJsb2NrRW5kKCJGb2xsb3dVcER5bmFtaWNGaWVsZF9GaWVsZDEiKSAlXQojWyUgUmVuZGVyQmxvY2tTdGFydCgiRm9sbG93VXBEeW5hbWljRmllbGRfRmllbGQyIikgJV0KIyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdIj4KIyAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiMgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMgICAgICAgICAgICAgICAgPC9kaXY+CiNbJSBSZW5kZXJCbG9ja0VuZCgiRm9sbG93VXBEeW5hbWljRmllbGRfRmllbGQyIikgJV0KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvYnV0dG9uPiBbJSBUcmFuc2xhdGUoIm9yIikgfCBodG1sICVdIDxhIGlkPSJDbG9zZUJ1dHRvbiIgaHJlZj0iIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGEgaWQ9IlJlcGx5QnV0dG9uIiBjbGFzcz0iRG9udFByaW50IiBocmVmPSIiPjxpIGNsYXNzPSJmYSBmYS1yZXBseSI+PC9pPiBbJSBUcmFuc2xhdGUoIlJlcGx5IikgfCBodG1sICVdPC9hPgogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZvbGxvd1VwIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZm9ybT4KCiAgICA8L2Rpdj4KPC9kaXY+ClslIFdSQVBQRVIgSlNPbkRvY3VtZW50Q29tcGxldGUgJV0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgQ29yZS5DdXN0b21lci5UaWNrZXRab29tLkluaXQoKTsKICAgICQoJ2EuQXNQb3B1cCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoJCh0aGlzKS5hdHRyKCdocmVmJyksICdUaWNrZXRBY3Rpb24nKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKPC9zY3JpcHQ+ClslIEVORCAlXQo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRPdmVydmlld01lZGl1bS5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojICRvcmlnaW46IGh0dHBzOi8vZ2l0aHViLmNvbS9PVFJTL290cnMvYmxvYi80NzhlZTY2NWM1MzViNjgwMjljZWQ0ZGNhMTk3YjUyMzViN2IxOTJmL0tlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRPdmVydmlld01lZGl1bS5wbQojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0T3ZlcnZpZXdNZWRpdW07Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IFwlUGFyYW07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBFbmNvZGVPYmplY3QgTGF5b3V0T2JqZWN0IFVzZXJJRCBVc2VyT2JqZWN0IEdyb3VwT2JqZWN0IFRpY2tldE9iamVjdCBNYWluT2JqZWN0IFF1ZXVlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntCYWNrZW5kT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZC0+bmV3KCVQYXJhbSk7CgogICAgIyBnZXQgZHluYW1pYyBmaWVsZCBjb25maWcgZm9yIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntEeW5hbWljRmllbGRGaWx0ZXJ9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6Ok92ZXJ2aWV3TWVkaXVtIiktPntEeW5hbWljRmllbGR9OwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgc2V0IHN0b3JlZCBmaWx0ZXJzIGlmIHByZXNlbnQKICAgIG15ICRTdG9yZWRGaWx0ZXJzS2V5ID0gJ1VzZXJTdG9yZWRGaWx0ZXJDb2x1bW5zLScgLiAkU2VsZi0+e0FjdGlvbn07CiAgICBpZiAoICRQcmVmZXJlbmNlc3skU3RvcmVkRmlsdGVyc0tleX0gKSB7CiAgICAgICAgbXkgJFN0b3JlZEZpbHRlcnMgPSAkU2VsZi0+e0pTT05PYmplY3R9LT5EZWNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gJFByZWZlcmVuY2VzeyRTdG9yZWRGaWx0ZXJzS2V5fSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57U3RvcmVkRmlsdGVyc30gPSAkU3RvcmVkRmlsdGVyczsKICAgIH0KCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ1RpY2tldCddLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkRmlsdGVyfSB8fCB7fSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWN0aW9uUm93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgbXkgJEJ1bGtGZWF0dXJlID0gMDsKICAgIGlmICggJFBhcmFte0J1bGt9ICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZScpICkgewogICAgICAgIG15IEBHcm91cHM7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpICkgewogICAgICAgICAgICBAR3JvdXBzID0gQHsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSB9OwogICAgICAgIH0KICAgICAgICBpZiAoICFAR3JvdXBzICkgewogICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn07CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRBY3Rpb25Sb3cnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgaWYgKCRCdWxrRmVhdHVyZSkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50QWN0aW9uUm93QnVsaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQnVsaycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJ1biB0aWNrZXQgb3ZlcnZpZXcgZG9jdW1lbnQgaXRlbSBtZW51IG1vZHVsZXMKICAgIGlmICgKICAgICAgICAkUGFyYW17Q29uZmlnfS0+e092ZXJ2aWV3TWVudU1vZHVsZXN9CiAgICAgICAgJiYgcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpPdmVydmlld01lbnVNb2R1bGUnKSBlcSAnSEFTSCcKICAgICAgICApCiAgICB7CgogICAgICAgIG15ICVNZW51cyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpPdmVydmlld01lbnVNb2R1bGUnKSB9OwogICAgICAgIE1FTlVNT0RVTEU6CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgIG5leHQgTUVOVU1PRFVMRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRNZW51c3skTWVudX0gKTsKICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICggJE1lbnVzeyRNZW51fS0+e1ZpZXd9ICYmICRNZW51c3skTWVudX0tPntWaWV3fSBuZSAkUGFyYW17Vmlld30gKTsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSAkSXRlbSA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRJdGVtKTsKCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntCbG9ja30gZXEgJ0RvY3VtZW50QWN0aW9uUm93SXRlbScgKSB7CgogICAgICAgICAgICAgICAgIyBhZGQgc2Vzc2lvbiBpZCBpZiBuZWVkZWQKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1Nlc3Npb25JRENvb2tpZX0gJiYgJEl0ZW0tPntMaW5rfSApIHsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0xpbmt9CiAgICAgICAgICAgICAgICAgICAgICAgIC49ICc7JwogICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1Nlc3Npb25OYW1lfSAuICc9JwogICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1Nlc3Npb25JRH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgaWQKICAgICAgICAgICAgICAgICRJdGVtLT57SUR9ID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICAgICAgICAgICRJdGVtLT57SUR9ID1+IHMvKFxzfCZ8OykvL2lnOwoKICAgICAgICAgICAgICAgIG15ICRMaW5rID0gJEl0ZW0tPntMaW5rfTsKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntUYXJnZXR9ICkgewogICAgICAgICAgICAgICAgICAgICRMaW5rID0gJyMnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDbGFzcyA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1BvcHVwVHlwZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJENsYXNzID0gJ0FzUG9wdXAgUG9wdXBUeXBlXycgLiAkSXRlbS0+e1BvcHVwVHlwZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRJdGVtLT57TmFtZX0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9IC4gJEl0ZW0tPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrICAgICAgID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkSXRlbS0+e0Jsb2NrfSBlcSAnRG9jdW1lbnRBY3Rpb25Sb3dIVE1MJyApIHsKCiAgICAgICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgISRJdGVtLT57SFRNTH07CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgaW5pdCBmb3IgdGFibGUgY29udHJvbAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdEb2N1bWVudFJlYWR5U3RhcnQnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgU29ydE9yZGVyQmFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoVGlja2V0SURzIFBhZ2VTaG93biBTdGFydEhpdCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgbXkgJEJ1bGtGZWF0dXJlID0gMDsKICAgIGlmICggJFBhcmFte0J1bGt9ICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZScpICkgewogICAgICAgIG15IEBHcm91cHM7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpICkgewogICAgICAgICAgICBAR3JvdXBzID0gQHsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSB9OwogICAgICAgIH0KICAgICAgICBpZiAoICFAR3JvdXBzICkgewogICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn07CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRIZWFkZXInLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgbXkgJE91dHB1dE1ldGEgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0nLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgIG15ICRPdXRwdXRSYXcgPSAnJzsKICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dE1ldGEgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXRSYXcgLj0gJE91dHB1dE1ldGE7CiAgICB9CiAgICBteSAkT3V0cHV0ICAgICAgICA9ICcnOwogICAgbXkgJENvdW50ZXIgICAgICAgPSAwOwogICAgbXkgJENvdW50ZXJPblNpdGUgPSAwOwogICAgbXkgQFRpY2tldElEc1Nob3duOwoKICAgICMgY2hlY2sgaWYgdGhlcmUgYXJlIHRpY2tldHMgdG8gc2hvdwogICAgaWYgKCBzY2FsYXIgQHsgJFBhcmFte1RpY2tldElEc30gfSApIHsKCiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoIEB7ICRQYXJhbXtUaWNrZXRJRHN9IH0gKSB7CiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb3VudGVyID49ICRQYXJhbXtTdGFydEhpdH0KICAgICAgICAgICAgICAgICYmICRDb3VudGVyIDwgKCAkUGFyYW17UGFnZVNob3dufSArICRQYXJhbXtTdGFydEhpdH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEBUaWNrZXRJRHNTaG93biwgJFRpY2tldElEOwogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT5fU2hvdygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJENvdW50ZXJPblNpdGUsCiAgICAgICAgICAgICAgICAgICAgQnVsayAgICAgPT4gJEJ1bGtGZWF0dXJlLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRQYXJhbXtDb25maWd9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRDb3VudGVyT25TaXRlKys7CiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gJE91dHB1dCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dFJhdyAuPSAkeyRPdXRwdXR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTm9UaWNrZXRGb3VuZCcgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGJ1bGsgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoJEJ1bGtGZWF0dXJlKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRGb290ZXInLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzU2hvd24pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50Rm9vdGVyQnVsa0l0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkT3V0cHV0TWV0YSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXRNZXRhICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXRNZXRhOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhY3Rpb24gcm93IGpzIGRhdGEKCiAgICByZXR1cm4gJE91dHB1dFJhdzsKfQoKc3ViIF9TaG93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRpY2tldElEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBtb3ZlIHF1ZXVlcwogICAgbXkgJU1vdmVRdWV1ZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk1vdmVMaXN0KAogICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0FjdGlvbn0sCiAgICAgICAgVHlwZSAgICAgPT4gJ21vdmVfaW50bycsCiAgICApOwoKICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVMYXN0Q3VzdG9tZXJBcnRpY2xlKAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICApOwoKICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICk7CgogICAgIyBGYWxsYmFjayBmb3IgdGlja2V0cyB3aXRob3V0IGFydGljbGVzOiBnZXQgYXQgbGVhc3QgYmFzaWMgdGlja2V0IGRhdGEKICAgIGlmICggISVBcnRpY2xlICkgewogICAgICAgICVBcnRpY2xlID0gJVRpY2tldDsKICAgICAgICBpZiAoICEkQXJ0aWNsZXtUaXRsZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1RpdGxlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ1RoaXMgdGlja2V0IGhhcyBubyB0aXRsZSBvciBzdWJqZWN0JwogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRBcnRpY2xle1RpdGxlfTsKICAgIH0KCiAgICAjIHNob3cgdGlja2V0IGNyZWF0ZSB0aW1lIGluIGN1cnJlbnQgdmlldwogICAgJEFydGljbGV7Q3JlYXRlZH0gPSAkVGlja2V0e0NyZWF0ZWR9OwojIC0tLQojIElUU00KIyAtLS0KICAgICMgc2V0IGNyaXRpY2FsaXR5IGFuZCBpbXBhY3QKICAgICRBcnRpY2xle0NyaXRpY2FsaXR5fSA9ICRBcnRpY2xle0R5bmFtaWNGaWVsZF9JVFNNQ3JpdGljYWxpdHl9IHx8ICctJzsKICAgICRBcnRpY2xle0ltcGFjdH0gICAgICA9ICRBcnRpY2xle0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAgICAgIHx8ICctJzsKIyAtLS0KCiAgICAjIHVzZXIgaW5mbwogICAgbXkgJVVzZXJJbmZvID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRBcnRpY2xle093bmVySUR9LAogICAgKTsKICAgICVBcnRpY2xlID0gKCAlVXNlckluZm8sICVBcnRpY2xlICk7CgogICAgIyBjcmVhdGUgaHVtYW4gYWdlCiAgICAkQXJ0aWNsZXtBZ2V9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSgKICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtBZ2V9LAogICAgICAgIFNwYWNlID0+ICcgJwogICAgKTsKCiAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcyAuLi4KICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJEFydGljbGV7UXVldWVJRH0sCiAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgKTsKCiAgICAkUGFyYW17U3RhbmRhcmRSZXNwb25zZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgRGF0YSA9PiAkU3RhbmRhcmRUZW1wbGF0ZXN7QW5zd2VyfSB8fCB7fSwKICAgICk7CgogICAgIyBjdXN0b21lciBpbmZvCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57Q3VzdG9tZXJJbmZvfSApIHsKICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgJEFydGljbGV7Q3VzdG9tZXJOYW1lfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJOYW1lKAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9uczsKICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAjIGdldCBhbGwgcmVnaXN0ZXJlZCBBY3Rpb25zCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpIGVxICdIQVNIJyApIHsKCiAgICAgICAgbXkgJUFjdGlvbnMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpIH07CgogICAgICAgICMgb25seSB1c2UgdGhvc2UgQWN0aW9ucyB0aGF0IHN0YXRzIHdpdGggQWdlbnRUaWNrZXQKICAgICAgICAlUG9zc2libGVBY3Rpb25zID0gbWFwIHsgKyskQ291bnRlciA9PiAkXyB9CiAgICAgICAgICAgIGdyZXAgeyBzdWJzdHIoICRfLCAwLCBsZW5ndGggJ0FnZW50VGlja2V0JyApIGVxICdBZ2VudFRpY2tldCcgfQogICAgICAgICAgICBzb3J0IGtleXMgJUFjdGlvbnM7CiAgICB9CgogICAgbXkgJEFDTCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gXCVQb3NzaWJsZUFjdGlvbnMsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgbXkgJUFjbEFjdGlvbiA9ICVQb3NzaWJsZUFjdGlvbnM7CiAgICBpZiAoJEFDTCkgewogICAgICAgICVBY2xBY3Rpb24gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKICAgIH0KCiAgICAjIHJ1biB0aWNrZXQgcHJlIG1lbnUgbW9kdWxlcwogICAgbXkgQEFjdGlvbkl0ZW1zOwogICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlByZU1lbnVNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJU1lbnVzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlByZU1lbnVNb2R1bGUnKSB9OwogICAgICAgIE1FTlU6CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSAkSXRlbSA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRpY2tldCA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICBBQ0wgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICBDb25maWcgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBNRU5VIGlmICEkSXRlbTsKICAgICAgICAgICAgbmV4dCBNRU5VIGlmIHJlZiAkSXRlbSBuZSAnSEFTSCc7CgogICAgICAgICAgICAjIGFkZCBzZXNzaW9uIGlkIGlmIG5lZWRlZAogICAgICAgICAgICBpZiAoICEkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uSURDb29raWV9ICYmICRJdGVtLT57TGlua30gKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0xpbmt9CiAgICAgICAgICAgICAgICAgICAgLj0gJzsnCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uTmFtZX0gLiAnPScKICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1Nlc3Npb25JRH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3JlYXRlIGlkCiAgICAgICAgICAgICRJdGVtLT57SUR9ID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICAgICAgJEl0ZW0tPntJRH0gPX4gcy8oXHN8Jnw7KS8vaWc7CgogICAgICAgICAgICBteSAkT3V0cHV0OwogICAgICAgICAgICBpZiAoICRJdGVtLT57QmxvY2t9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld01lZGl1bScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRPdXRwdXQgPSAnPGxpIGlkPSInCiAgICAgICAgICAgICAgICAgICAgLiAkSXRlbS0+e0lEfQogICAgICAgICAgICAgICAgICAgIC4gJyI+PGEgaHJlZj0iIyIgdGl0bGU9IicKICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkSXRlbS0+e0Rlc2NyaXB0aW9ufSApCiAgICAgICAgICAgICAgICAgICAgLiAnIj4nCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEl0ZW0tPntOYW1lfSApCiAgICAgICAgICAgICAgICAgICAgLiAnPC9hPjwvbGk+JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE91dHB1dCA9fiBzL1xuKy8vZzsKICAgICAgICAgICAgJE91dHB1dCA9fiBzL1xzKy8gL2c7CiAgICAgICAgICAgICRPdXRwdXQgPX4gcy88XCEtLS4rPy0tPi8vZzsKCiAgICAgICAgICAgIHB1c2ggQEFjdGlvbkl0ZW1zLCB7CiAgICAgICAgICAgICAgICBIVE1MICAgICAgICA9PiAkT3V0cHV0LAogICAgICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJEl0ZW0tPntJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEl0ZW0tPntOYW1lfSApLAogICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9IC4gJEl0ZW0tPntMaW5rfSwKICAgICAgICAgICAgICAgIFRhcmdldCAgICAgID0+ICRJdGVtLT57VGFyZ2V0fSwKICAgICAgICAgICAgICAgIFBvcHVwVHlwZSAgID0+ICRJdGVtLT57UG9wdXBUeXBlfSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgPT4gJEl0ZW0tPntCbG9ja30sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBzdWJqZWN0CiAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3ViamVjdENsZWFuKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LAogICAgICAgIFN1YmplY3QgICAgICA9PiAkQXJ0aWNsZXtTdWJqZWN0fSB8fCAnJywKICAgICk7CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdEb2N1bWVudENvbnRlbnQnLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICApOwoKICAgICMgaWYgIkFjdGlvbnMgcGVyIFRpY2tldCIgKElubGluZSBBY3Rpb24gUm93KSBpcyBhY3RpdmUKICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntUaWNrZXRBY3Rpb25zUGVyVGlja2V0fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbmxpbmVBY3Rpb25Sb3cnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBBZGQgbGlzdCBlbnRyaWVzIGZvciBldmVyeSBhY3Rpb24KICAgICAgICBmb3IgbXkgJEl0ZW0gKEBBY3Rpb25JdGVtcykgewogICAgICAgICAgICBteSAkTGluayA9ICRJdGVtLT57TGlua307CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntUYXJnZXR9ICkgewogICAgICAgICAgICAgICAgJExpbmsgPSAnIyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDbGFzcyA9ICcnOwogICAgICAgICAgICBpZiAoICRJdGVtLT57UG9wdXBUeXBlfSApIHsKICAgICAgICAgICAgICAgICRDbGFzcyA9ICdBc1BvcHVwIFBvcHVwVHlwZV8nIC4gJEl0ZW0tPntQb3B1cFR5cGV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkSXRlbS0+e0Jsb2NrfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5saW5lQWN0aW9uUm93SXRlbScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgID0+ICRBcnRpY2xle1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJExpbmssCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkVGlja2V0SUQgICA9ICRQYXJhbXtUaWNrZXRJRH07CiAgICAgICAgICAgICAgICBteSAkU2VsZWN0SFRNTCA9ICRJdGVtLT57SFRNTH07CiAgICAgICAgICAgICAgICAkU2VsZWN0SFRNTCA9fiBzL2lkPSJEZXN0UXVldWVJRCIvaWQ9IkRlc3RRdWV1ZUlEJFRpY2tldElEIi94bWlnOwogICAgICAgICAgICAgICAgJFNlbGVjdEhUTUwgPX4gcy9mb3I9IkRlc3RRdWV1ZUlEIi9mb3I9IkRlc3RRdWV1ZUlEJFRpY2tldElEIi94bWlnOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmxpbmVBY3Rpb25Sb3dJdGVtSFRNTCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUwgPT4gJFNlbGVjdEhUTUwsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkUGFyYW17QnVsa30gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQnVsaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB0aWNrZXQgZmxhZ3MKICAgIG15IEBUaWNrZXRNZXRhSXRlbXMgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldE1ldGFJdGVtcygKICAgICAgICBUaWNrZXQgPT4gXCVBcnRpY2xlLAogICAgKTsKICAgIGZvciBteSAkSXRlbSAoQFRpY2tldE1ldGFJdGVtcykgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ01ldGEnLAogICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICk7CiAgICAgICAgaWYgKCRJdGVtKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNZXRhSWNvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJ1biBhcnRpY2xlIG1vZHVsZXMKICAgIGlmICggJEFydGljbGV7QXJ0aWNsZUlEfSApIHsKICAgICAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZVByZVZpZXdNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVQcmVWaWV3TW9kdWxlJykgfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRGVidWcgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG15IEBEYXRhID0gJE9iamVjdC0+Q2hlY2soCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICREYXRhUmVmIChARGF0YSkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVPcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRhUmVmLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmaWx0ZXIgb3B0aW9uCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5GaWx0ZXIoCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgKTsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICYmICggIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldENvbXBvc2V9IHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDb21wb3NlIik7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgIG15ICRPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkT2sgKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlckNvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgJiYgKAogICAgICAgICAgICAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAgICAgfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmVPdXRib3VuZCIpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyUGhvbmVPdXRib3VuZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCB0eXBlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHNlcnZpY2UKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRBcnRpY2xle1NlcnZpY2V9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtTTEF9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBmaXJzdCByZXNwb25zZSB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSApIHsKICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZUNsYXNzfSA9ICdXYXJuaW5nJwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGaXJzdFJlc3BvbnNlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdXBkYXRlIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7VXBkYXRlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtVcGRhdGVUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7VXBkYXRlVGltZVdvcmtpbmdUaW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtVcGRhdGVUaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJEFydGljbGV7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1VwZGF0ZVRpbWVDbGFzc30gPSAnV2FybmluZycKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgc29sdXRpb24gdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtTb2x1dGlvblRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7U29sdXRpb25UaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJEFydGljbGV7U29sdXRpb25UaW1lfSApIHsKICAgICAgICAgICAgJEFydGljbGV7U29sdXRpb25UaW1lQ2xhc3N9ID0gJ1dhcm5pbmcnCiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIER5bmFtaWMgZmllbGRzCiAgICAkQ291bnRlciA9IDA7CiAgICBteSAkRGlzcGxheUR5bmFtaWNGaWVsZFRhYmxlID0gMTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZ2V0IGZpZWxkIHZhbHVlCiAgICAgICAgbXkgJFZhbHVlID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+VmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoICFkZWZpbmVkICRWYWx1ZSApOwoKICAgICAgICAkQ291bnRlcisrOwoKICAgICAgICBteSAkVmFsdWVTdHJnID0gJFNlbGYtPntCYWNrZW5kT2JqZWN0fS0+RGlzcGxheVZhbHVlUmVuZGVyKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgVmFsdWVNYXhDaGFycyAgICAgID0+IDIwLAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LAogICAgICAgICk7CgogICAgICAgIG15ICRMYWJlbCA9ICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH07CgogICAgICAgICMgc2hvdyBkeW5hbWljIGZpZWxkIHRhYmxlIGlmIGF0IGxlYXN0IG9uZSBmaWVsZCBpcyBkaXNwbGF5ZWQKICAgICAgICBpZiAoICREaXNwbGF5RHluYW1pY0ZpZWxkVGFibGUgPT0gMSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICREaXNwbGF5RHluYW1pY0ZpZWxkVGFibGUgPSAwOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgcm93IGlmIGNvdW50ZXIgaXMgc3RhcnRpbmcKICAgICAgICBpZiAoICRDb3VudGVyID09IDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCBsYWJlbAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CgogICAgICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIHZhbHVlIGxpbmsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e0xpbmt9LAogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIHZhbHVlIHBsYWluCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvd1JlY29yZFBsYWluJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG9ubHkgNSBkeW5hbWljIGZpZWxkcyBieSByb3cgYXJlIGFsbG93ZWQsIHJlc2V0IGNvdXRlciBpZiBuZWVkZWQKICAgICAgICBpZiAoICRDb3VudGVyID09IDUgKSB7CiAgICAgICAgICAgICRDb3VudGVyID0gMDsKICAgICAgICB9CgogICAgICAgICMgZXhhbXBsZSBvZiBkeW5hbWljIGZpZWxkcyBvcmRlciBjdXN0b21pemF0aW9uCiAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCBsYWJlbAogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CgogICAgICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIHZhbHVlIGxpbmsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgcGxhaW4KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdQbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGZpbGwgdGhlIHJlc3Qgb2YgdGhlIER5bmFtaWMgRmllbGRzIHJvdyB3aXRoIGVtcHR5IGNlbGxzLCB0aGlzIHdpbGwgbG9vayBiZXR0ZXIKICAgIGlmICggJENvdW50ZXIgPiAwICYmICRDb3VudGVyIDwgNSApIHsKCiAgICAgICAgZm9yICggJENvdW50ZXIgKyAxIC4uLiA1ICkgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCBsYWJlbAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBwbGFpbgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRQbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnJywKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGVzdCBhY2Nlc3MgdG8gZnJvbnRlbmQgbW9kdWxlIGZvciBDdXN0b21lcgogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBBY3Rpb24gPT4gJ0FnZW50VGlja2V0Q3VzdG9tZXInLAogICAgICAgIFR5cGUgICA9PiAncncnLAogICAgKTsKICAgIGlmICgkQWNjZXNzKSB7CgogICAgICAgICMgdGVzdCBhY2Nlc3MgdG8gdGlja2V0CiAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEN1c3RvbWVyJyk7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgIG15ICRPSyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkT0sgKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGRlZmluZSBwcm9wZXIgRFRMIGJsb2NrIGJhc2VkIG9uIHBlcm1pc3Npb25zCiAgICBteSAkQ3VzdG9tZXJJREJsb2NrID0gJEFjY2VzcyA/ICdDdXN0b21lcklEUlcnIDogJ0N1c3RvbWVySURSTyc7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJEN1c3RvbWVySURCbG9jaywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgKTsKCiAgICAjIGdldCBNb3ZlUXVldWVzU3RyZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TW92ZVR5cGUnKSA9fiAvXmZvcm0kL2kgKSB7CiAgICAgICAgJFBhcmFte01vdmVRdWV1ZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Rlc3RRdWV1ZUlEJywKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJU1vdmVRdWV1ZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEFydGljbGV7UXVldWVJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRNb3ZlfQogICAgICAgICYmICggIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldE1vdmV9IHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRNb3ZlfSApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdtb3ZlJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ01vdmUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhY3Rpb24gaXRlbXMgYXMganMKICAgIGlmICggQEFjdGlvbkl0ZW1zICYmICEkUGFyYW17Q29uZmlnfS0+e1RpY2tldEFjdGlvbnNQZXJUaWNrZXR9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50UmVhZHlBY3Rpb25Sb3dBZGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcQEFjdGlvbkl0ZW1zLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtJywKICAgICAgICBEYXRhICAgICAgICAgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICApOwoKICAgIHJldHVybiBcJE91dHB1dDsKfQoxOwo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRPdmVydmlld1ByZXZpZXcucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyAkb3JpZ2luOiBodHRwczovL2dpdGh1Yi5jb20vT1RSUy9vdHJzL2Jsb2IvNDc4ZWU2NjVjNTM1YjY4MDI5Y2VkNGRjYTE5N2I1MjM1YjdiMTkyZi9LZXJuZWwvT3V0cHV0L0hUTUwvVGlja2V0T3ZlcnZpZXdQcmV2aWV3LnBtCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRPdmVydmlld1ByZXZpZXc7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzOwp1c2UgS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gXCVQYXJhbTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IEVuY29kZU9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklEIFVzZXJPYmplY3QgR3JvdXBPYmplY3QgVGlja2V0T2JqZWN0IE1haW5PYmplY3QgUXVldWVPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTeXN0ZW1BZGRyZXNzfSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntEeW5hbWljRmllbGRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0JhY2tlbmRPYmplY3R9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kLT5uZXcoJVBhcmFtKTsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIGNvbmZpZyBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZEZpbHRlcn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXdQcmV2aWV3IiktPntEeW5hbWljRmllbGR9OwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgc2V0IHN0b3JlZCBmaWx0ZXJzIGlmIHByZXNlbnQKICAgIG15ICRTdG9yZWRGaWx0ZXJzS2V5ID0gJ1VzZXJTdG9yZWRGaWx0ZXJDb2x1bW5zLScgLiAkU2VsZi0+e0FjdGlvbn07CiAgICBpZiAoICRQcmVmZXJlbmNlc3skU3RvcmVkRmlsdGVyc0tleX0gKSB7CiAgICAgICAgbXkgJFN0b3JlZEZpbHRlcnMgPSAkU2VsZi0+e0pTT05PYmplY3R9LT5EZWNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gJFByZWZlcmVuY2VzeyRTdG9yZWRGaWx0ZXJzS2V5fSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57U3RvcmVkRmlsdGVyc30gPSAkU3RvcmVkRmlsdGVyczsKICAgIH0KCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkU2VsZi0+e0R5bmFtaWNGaWVsZE9iamVjdH0tPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ1RpY2tldCddLAogICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkRmlsdGVyfSB8fCB7fSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWN0aW9uUm93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgbXkgJEJ1bGtGZWF0dXJlID0gMDsKICAgIGlmICggJFBhcmFte0J1bGt9ICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZScpICkgewogICAgICAgIG15IEBHcm91cHM7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpICkgewogICAgICAgICAgICBAR3JvdXBzID0gQHsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSB9OwogICAgICAgIH0KICAgICAgICBpZiAoICFAR3JvdXBzICkgewogICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn07CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRBY3Rpb25Sb3cnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgaWYgKCRCdWxrRmVhdHVyZSkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50QWN0aW9uUm93QnVsaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQnVsaycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJ1biB0aWNrZXQgb3ZlcnZpZXcgZG9jdW1lbnQgaXRlbSBtZW51IG1vZHVsZXMKICAgIGlmICgKICAgICAgICAkUGFyYW17Q29uZmlnfS0+e092ZXJ2aWV3TWVudU1vZHVsZXN9CiAgICAgICAgJiYgcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpPdmVydmlld01lbnVNb2R1bGUnKSBlcSAnSEFTSCcKICAgICAgICApCiAgICB7CgogICAgICAgIG15ICVNZW51cyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpPdmVydmlld01lbnVNb2R1bGUnKSB9OwogICAgICAgIE1FTlVNT0RVTEU6CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgIG5leHQgTUVOVU1PRFVMRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICRNZW51c3skTWVudX0gKTsKICAgICAgICAgICAgbmV4dCBNRU5VTU9EVUxFIGlmICggJE1lbnVzeyRNZW51fS0+e1ZpZXd9ICYmICRNZW51c3skTWVudX0tPntWaWV3fSBuZSAkUGFyYW17Vmlld30gKTsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1lbnVzeyRNZW51fS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSAkSXRlbSA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRJdGVtKTsKCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntCbG9ja30gZXEgJ0RvY3VtZW50QWN0aW9uUm93SXRlbScgKSB7CgogICAgICAgICAgICAgICAgIyBhZGQgc2Vzc2lvbiBpZCBpZiBuZWVkZWQKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1Nlc3Npb25JRENvb2tpZX0gJiYgJEl0ZW0tPntMaW5rfSApIHsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0xpbmt9CiAgICAgICAgICAgICAgICAgICAgICAgIC49ICc7JwogICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1Nlc3Npb25OYW1lfSAuICc9JwogICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1Nlc3Npb25JRH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgaWQKICAgICAgICAgICAgICAgICRJdGVtLT57SUR9ID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICAgICAgICAgICRJdGVtLT57SUR9ID1+IHMvKFxzfCZ8OykvL2lnOwoKICAgICAgICAgICAgICAgIG15ICRMaW5rID0gJEl0ZW0tPntMaW5rfTsKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntUYXJnZXR9ICkgewogICAgICAgICAgICAgICAgICAgICRMaW5rID0gJyMnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDbGFzcyA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1BvcHVwVHlwZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJENsYXNzID0gJ0FzUG9wdXAgUG9wdXBUeXBlXycgLiAkSXRlbS0+e1BvcHVwVHlwZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRJdGVtLT57TmFtZX0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9IC4gJEl0ZW0tPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrICAgICAgID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkSXRlbS0+e0Jsb2NrfSBlcSAnRG9jdW1lbnRBY3Rpb25Sb3dIVE1MJyApIHsKCiAgICAgICAgICAgICAgICBuZXh0IE1FTlVNT0RVTEUgaWYgISRJdGVtLT57SFRNTH07CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgaW5pdCBmb3IgdGFibGUgY29udHJvbAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdEb2N1bWVudFJlYWR5U3RhcnQnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIFNvcnRPcmRlckJhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgcmV0dXJuICcnOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoVGlja2V0SURzIFBhZ2VTaG93biBTdGFydEhpdCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgbXkgJEJ1bGtGZWF0dXJlID0gMDsKICAgIGlmICggJFBhcmFte0J1bGt9ICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZScpICkgewogICAgICAgIG15IEBHcm91cHM7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpICkgewogICAgICAgICAgICBAR3JvdXBzID0gQHsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSB9OwogICAgICAgIH0KICAgICAgICBpZiAoICFAR3JvdXBzICkgewogICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn07CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRIZWFkZXInLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgbXkgJE91dHB1dE1ldGEgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CiAgICBteSAkT3V0cHV0UmF3ID0gJyc7CiAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXRNZXRhICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXRNZXRhOwogICAgfQogICAgbXkgJE91dHB1dCAgICAgICAgPSAnJzsKICAgIG15ICRDb3VudGVyICAgICAgID0gMDsKICAgIG15ICRDb3VudGVyT25TaXRlID0gMDsKICAgIG15IEBUaWNrZXRJRHNTaG93bjsKCiAgICAjIGNoZWNrIGlmIHRoZXJlIGFyZSB0aWNrZXRzIHRvIHNob3cKICAgIGlmICggc2NhbGFyIEB7ICRQYXJhbXtUaWNrZXRJRHN9IH0gKSB7CgogICAgICAgIGZvciBteSAkVGlja2V0SUQgKCBAeyAkUGFyYW17VGlja2V0SURzfSB9ICkgewogICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ291bnRlciA+PSAkUGFyYW17U3RhcnRIaXR9CiAgICAgICAgICAgICAgICAmJiAkQ291bnRlciA8ICggJFBhcmFte1BhZ2VTaG93bn0gKyAkUGFyYW17U3RhcnRIaXR9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAVGlja2V0SURzU2hvd24sICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+X1Nob3coCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudGVyT25TaXRlLAogICAgICAgICAgICAgICAgICAgIEJ1bGsgICAgID0+ICRCdWxrRmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkUGFyYW17Q29uZmlnfSwKICAgICAgICAgICAgICAgICAgICBPdXRwdXQgICA9PiAkUGFyYW17T3V0cHV0fSB8fCAnJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQ291bnRlck9uU2l0ZSsrOwogICAgICAgICAgICAgICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludCggT3V0cHV0ID0+ICRPdXRwdXQgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRPdXRwdXRSYXcgLj0gJHskT3V0cHV0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ05vVGlja2V0Rm91bmQnICk7CiAgICB9CgogICAgaWYgKCRCdWxrRmVhdHVyZSkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50Rm9vdGVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEc1Nob3duKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudEZvb3RlckJ1bGtJdGVtJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgJE91dHB1dE1ldGEgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dE1ldGEgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXRSYXcgLj0gJE91dHB1dE1ldGE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRPdXRwdXRSYXc7Cn0KCnN1YiBfU2hvdyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUaWNrZXRJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkUGFyYW17QnVsa30gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQnVsaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgY29sbGVjdCBwYXJhbXMgZm9yIEFydGljbGVHZXQKICAgIG15ICVBcnRpY2xlR2V0UGFyYW1zID0gKAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgT3JkZXIgICAgICAgICA9PiAnREVTQycsCiAgICAgICAgTGltaXQgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXc6OlByZXZpZXdBcnRpY2xlTGltaXQnKSB8fCA1LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGNlcnRhaW4gYXJ0aWNsZSBzZW5kZXIgdHlwZXMgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gcHJldmlldwogICAgbXkgJFByZXZpZXdBcnRpY2xlU2VuZGVyVHlwZXMgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6T3ZlcnZpZXc6OlByZXZpZXdBcnRpY2xlU2VuZGVyVHlwZXMnKTsKICAgIG15IEBBY3RpdmVBcnRpY2xlU2VuZGVyVHlwZXM7CiAgICBpZiAoIHJlZiAkUHJldmlld0FydGljbGVTZW5kZXJUeXBlcyBlcSAnSEFTSCcgKSB7CiAgICAgICAgQEFjdGl2ZUFydGljbGVTZW5kZXJUeXBlcyA9IGdyZXAgeyAkUHJldmlld0FydGljbGVTZW5kZXJUeXBlcy0+eyRffSA9PSAxIH0ga2V5cyAleyRQcmV2aWV3QXJ0aWNsZVNlbmRlclR5cGVzfTsKICAgIH0KCiAgICAjIGlmIGEgbGlzdCBvZiBhY3RpdmUgYXJ0aWNsZSBzZW5kZXIgdHlwZXMgaGFzIGJlZW4gZGV0ZXJtaW5lZCwgYWRkIHRoZW0gdG8gcGFyYW1zIGhhc2gKICAgIGlmIChAQWN0aXZlQXJ0aWNsZVNlbmRlclR5cGVzKSB7CiAgICAgICAgJEFydGljbGVHZXRQYXJhbXN7QXJ0aWNsZVNlbmRlclR5cGV9ID0gXEBBY3RpdmVBcnRpY2xlU2VuZGVyVHlwZXM7CiAgICB9CgogICAgIyBnZXQgbGFzdCA1IGFydGljbGVzCiAgICBteSBAQXJ0aWNsZUJvZHkgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVHZXQoCiAgICAgICAgJUFydGljbGVHZXRQYXJhbXMsCiAgICApOwogICAgbXkgJUFydGljbGUgPSAleyAkQXJ0aWNsZUJvZHlbMF0gfHwge30gfTsKICAgIG15ICRBcnRpY2xlQ291bnQgPSBzY2FsYXIgQEFydGljbGVCb2R5OwoKICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAojIC0tLQogICAgKTsKCiAgICAjIEZhbGxiYWNrIGZvciB0aWNrZXRzIHdpdGhvdXQgYXJ0aWNsZXM6IGdldCBhdCBsZWFzdCBiYXNpYyB0aWNrZXQgZGF0YQogICAgaWYgKCAhJUFydGljbGUgKSB7CiAgICAgICAgJUFydGljbGUgPSAlVGlja2V0OwogICAgICAgIGlmICggISRBcnRpY2xle1RpdGxlfSApIHsKICAgICAgICAgICAgJEFydGljbGV7VGl0bGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAnVGhpcyB0aWNrZXQgaGFzIG5vIHRpdGxlIG9yIHN1YmplY3QnCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRBcnRpY2xle1N1YmplY3R9ID0gJEFydGljbGV7VGl0bGV9OwogICAgfQoKICAgICMgdXNlciBpbmZvCiAgICBteSAlVXNlckluZm8gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEFydGljbGV7T3duZXJJRH0sCiAgICApOwogICAgJUFydGljbGUgPSAoICVVc2VySW5mbywgJUFydGljbGUgKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIHNldCBjcml0aWNhbGl0eSBhbmQgaW1wYWN0CiAgICAkVGlja2V0e0NyaXRpY2FsaXR5fSA9ICRUaWNrZXR7RHluYW1pY0ZpZWxkX0lUU01Dcml0aWNhbGl0eX0gfHwgJy0nOwogICAgJFRpY2tldHtJbXBhY3R9ICAgICAgPSAkVGlja2V0e0R5bmFtaWNGaWVsZF9JVFNNSW1wYWN0fSAgICAgIHx8ICctJzsKIyAtLS0KCiAgICAjIGNyZWF0ZSBodW1hbiBhZ2UKICAgICRBcnRpY2xle0FnZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKAogICAgICAgIEFnZSAgID0+ICRBcnRpY2xle0FnZX0sCiAgICAgICAgU3BhY2UgPT4gJyAnCiAgICApOwoKICAgICMgZmV0Y2ggYWxsIHN0ZC4gdGVtcGxhdGVzIC4uLgogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgUXVldWVJRCAgICAgICA9PiAkQXJ0aWNsZXtRdWV1ZUlEfSwKICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICApOwoKICAgICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc1N0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBOYW1lID0+ICdSZXNwb25zZUlEJywKICAgICAgICBEYXRhID0+ICRTdGFuZGFyZFRlbXBsYXRlc3tBbnN3ZXJ9IHx8IHt9LAogICAgKTsKCiAgICAjIGN1c3RvbWVyIGluZm8KICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntDdXN0b21lckluZm99ICkgewogICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtDdXN0b21lck5hbWV9ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lck5hbWUoCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBBQ0wgcmVzdHJpY3Rpb25zCiAgICBteSAlUG9zc2libGVBY3Rpb25zOwogICAgbXkgJENvdW50ZXIgPSAwOwoKICAgICMgZ2V0IGFsbCByZWdpc3RlcmVkIEFjdGlvbnMKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlQWN0aW9ucyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJykgfTsKCiAgICAgICAgIyBvbmx5IHVzZSB0aG9zZSBBY3Rpb25zIHRoYXQgc3RhdHMgd2l0aCBBZ2VudFRpY2tldAogICAgICAgICVQb3NzaWJsZUFjdGlvbnMgPSBtYXAgeyArKyRDb3VudGVyID0+ICRfIH0KICAgICAgICAgICAgZ3JlcCB7IHN1YnN0ciggJF8sIDAsIGxlbmd0aCAnQWdlbnRUaWNrZXQnICkgZXEgJ0FnZW50VGlja2V0JyB9CiAgICAgICAgICAgIHNvcnQga2V5cyAlQWN0aW9uczsKICAgIH0KCiAgICBteSAkQUNMID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJVBvc3NpYmxlQWN0aW9ucywKICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdBY3Rpb24nLAogICAgICAgIFJldHVyblN1YlR5cGUgPT4gJy0nLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAlQWNsQWN0aW9uID0gJVBvc3NpYmxlQWN0aW9uczsKICAgIGlmICgkQUNMKSB7CiAgICAgICAgJUFjbEFjdGlvbiA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsQWN0aW9uRGF0YSgpOwogICAgfQoKICAgICMgcnVuIHRpY2tldCBwcmUgbWVudSBtb2R1bGVzCiAgICBteSBAQWN0aW9uSXRlbXM7CiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UHJlTWVudU1vZHVsZScpIH07CiAgICAgICAgTUVOVToKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15ICRJdGVtID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgIEFDTCAgICA9PiBcJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgIENvbmZpZyA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBNRU5VIGlmICEkSXRlbTsKICAgICAgICAgICAgbmV4dCBNRU5VIGlmIHJlZiAkSXRlbSBuZSAnSEFTSCc7CgogICAgICAgICAgICAjIGFkZCBzZXNzaW9uIGlkIGlmIG5lZWRlZAogICAgICAgICAgICBpZiAoICEkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uSURDb29raWV9ICYmICRJdGVtLT57TGlua30gKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0xpbmt9CiAgICAgICAgICAgICAgICAgICAgLj0gJzsnCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uTmFtZX0gLiAnPScKICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1Nlc3Npb25JRH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3JlYXRlIGlkCiAgICAgICAgICAgICRJdGVtLT57SUR9ID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICAgICAgJEl0ZW0tPntJRH0gPX4gcy8oXHN8Jnw7KS8vaWc7CgogICAgICAgICAgICBteSAkT3V0cHV0OwogICAgICAgICAgICBpZiAoICRJdGVtLT57QmxvY2t9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRJdGVtLT57QmxvY2t9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJzxsaSBpZD0iJwogICAgICAgICAgICAgICAgICAgIC4gJEl0ZW0tPntJRH0KICAgICAgICAgICAgICAgICAgICAuICciPjxhIGhyZWY9IiMiIHRpdGxlPSInCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJEl0ZW0tPntEZXNjcmlwdGlvbn0gKQogICAgICAgICAgICAgICAgICAgIC4gJyI+JwogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRJdGVtLT57TmFtZX0gKQogICAgICAgICAgICAgICAgICAgIC4gJzwvYT48L2xpPic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRPdXRwdXQgPX4gcy9cbisvL2c7CiAgICAgICAgICAgICRPdXRwdXQgPX4gcy9ccysvIC9nOwogICAgICAgICAgICAkT3V0cHV0ID1+IHMvPFwhLS0uKz8tLT4vL2c7CgogICAgICAgICAgICBwdXNoIEBBY3Rpb25JdGVtcywgewogICAgICAgICAgICAgICAgSFRNTCAgICAgICAgPT4gJE91dHB1dCwKICAgICAgICAgICAgICAgIElEICAgICAgICAgID0+ICRJdGVtLT57SUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRJdGVtLT57TmFtZX0gKSwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfSAuICRJdGVtLT57TGlua30sCiAgICAgICAgICAgICAgICBUYXJnZXQgICAgICA9PiAkSXRlbS0+e1RhcmdldH0sCiAgICAgICAgICAgICAgICBQb3B1cFR5cGUgICA9PiAkSXRlbS0+e1BvcHVwVHlwZX0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkSXRlbS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgID0+ICRJdGVtLT57QmxvY2t9LAoKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEFkZGl0aW9uYWxDbGFzc2VzID0gJFBhcmFte0NvbmZpZ30tPntUaWNrZXRBY3Rpb25zUGVyVGlja2V0fSA/ICdTaG93SW5saW5lQWN0aW9ucycgOiAnJzsKCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50Q29udGVudCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICVUaWNrZXQsCiMgLS0tCiAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICA9PiAnQXJ0aWNsZUNvdW50JyAuICRBcnRpY2xlQ291bnQsCiAgICAgICAgICAgIEFkZGl0aW9uYWxDbGFzc2VzID0+ICRBZGRpdGlvbmFsQ2xhc3NlcywKICAgICAgICAgICAgQ3JlYXRlZCAgICAgICAgICAgPT4gJFRpY2tldHtDcmVhdGVkfSwgICAgICAgICAgICAgICAgICMgdXNlIHZhbHVlIGZyb20gdGlja2V0LCBub3QgYXJ0aWNsZQogICAgICAgIH0sCiAgICApOwoKICAgICMgaWYgIkFjdGlvbnMgcGVyIFRpY2tldCIgKElubGluZSBBY3Rpb24gUm93KSBpcyBhY3RpdmUKICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntUaWNrZXRBY3Rpb25zUGVyVGlja2V0fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbmxpbmVBY3Rpb25Sb3cnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBBZGQgbGlzdCBlbnRyaWVzIGZvciBldmVyeSBhY3Rpb24KICAgICAgICBmb3IgbXkgJEl0ZW0gKEBBY3Rpb25JdGVtcykgewogICAgICAgICAgICBteSAkTGluayA9ICRJdGVtLT57TGlua307CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntUYXJnZXR9ICkgewogICAgICAgICAgICAgICAgJExpbmsgPSAnIyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDbGFzcyA9ICcnOwogICAgICAgICAgICBpZiAoICRJdGVtLT57UG9wdXBUeXBlfSApIHsKICAgICAgICAgICAgICAgICRDbGFzcyA9ICdBc1BvcHVwIFBvcHVwVHlwZV8nIC4gJEl0ZW0tPntQb3B1cFR5cGV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkSXRlbS0+e0Jsb2NrfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5saW5lQWN0aW9uUm93SXRlbScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgID0+ICRBcnRpY2xle1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJExpbmssCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkVGlja2V0SUQgICA9ICRQYXJhbXtUaWNrZXRJRH07CiAgICAgICAgICAgICAgICBteSAkU2VsZWN0SFRNTCA9ICRJdGVtLT57SFRNTH07CiAgICAgICAgICAgICAgICAkU2VsZWN0SFRNTCA9fiBzL2lkPSJEZXN0UXVldWVJRCIvaWQ9IkRlc3RRdWV1ZUlEJFRpY2tldElEIi94bWlnOwogICAgICAgICAgICAgICAgJFNlbGVjdEhUTUwgPX4gcy9mb3I9IkRlc3RRdWV1ZUlEIi9mb3I9IkRlc3RRdWV1ZUlEJFRpY2tldElEIi94bWlnOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmxpbmVBY3Rpb25Sb3dJdGVtSFRNTCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUwgPT4gJFNlbGVjdEhUTUwsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkUGFyYW17QnVsa30gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQnVsaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB0aWNrZXQgZmxhZ3MKICAgIG15IEBUaWNrZXRNZXRhSXRlbXMgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldE1ldGFJdGVtcygKICAgICAgICBUaWNrZXQgPT4gXCVBcnRpY2xlLAogICAgKTsKICAgIGZvciBteSAkSXRlbSAoQFRpY2tldE1ldGFJdGVtcykgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ01ldGEnLAogICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICk7CiAgICAgICAgaWYgKCRJdGVtKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNZXRhSWNvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJ1biBhcnRpY2xlIG1vZHVsZXMKICAgIGlmICggJEFydGljbGV7QXJ0aWNsZUlEfSApIHsKICAgICAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZVByZVZpZXdNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgIG15ICVKb2JzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFydGljbGVQcmVWaWV3TW9kdWxlJykgfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRGVidWcgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG15IEBEYXRhID0gJE9iamVjdC0+Q2hlY2soCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICREYXRhUmVmIChARGF0YSkgewogICAgICAgICAgICAgICAgICAgIGlmICggJERhdGFSZWYtPntTdWNjZXNzZnVsfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGFSZWYtPntSZXN1bHR9ID0gJ0Vycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRhUmVmLT57UmVzdWx0fSA9ICdTdWNjZXNzJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVPcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRhUmVmLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmaWx0ZXIgb3B0aW9uCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5GaWx0ZXIoCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgKTsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICYmICggIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldENvbXBvc2V9IHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDb21wb3NlJyk7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgIG15ICRPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkT2sgKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlckNvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgJiYgKAogICAgICAgICAgICAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAgICAgfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmVPdXRib3VuZCcpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyUGhvbmVPdXRib3VuZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCB0eXBlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHNlcnZpY2UKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRBcnRpY2xle1NlcnZpY2V9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtTTEF9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgQ3VzdG9tZXJJRCBhbmQgQ3VzdG9tZXJOYW1lCiAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyB0ZXN0IGFjY2VzcyB0byBmcm9udGVuZCBtb2R1bGUKICAgICAgICBteSAkQWNjZXNzID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICBBY3Rpb24gPT4gJ0FnZW50VGlja2V0Q3VzdG9tZXInLAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwogICAgICAgIGlmICgkQWNjZXNzKSB7CgogICAgICAgICAgICAjIHRlc3QgYWNjZXNzIHRvIHRpY2tldAogICAgICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q3VzdG9tZXInKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSBwcm9wZXIgRFRMIGJsb2NrIGJhc2VkIG9uIHBlcm1pc3Npb25zCiAgICAgICAgbXkgJEN1c3RvbWVySURCbG9jayA9ICRBY2Nlc3MgPyAnQ3VzdG9tZXJJRFJXJyA6ICdDdXN0b21lcklEUk8nOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICRDdXN0b21lcklEQmxvY2ssCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle0N1c3RvbWVyTmFtZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lck5hbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGZpcnN0IHJlc3BvbnNlIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWV9ICkgewogICAgICAgICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lSHVtYW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lQ2xhc3N9ID0gJ1dhcm5pbmcnCiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB1cGRhdGUgdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXtVcGRhdGVUaW1lfSApIHsKICAgICAgICAkQXJ0aWNsZXtVcGRhdGVUaW1lSHVtYW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1VwZGF0ZVRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtVcGRhdGVUaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1VwZGF0ZVRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtVcGRhdGVUaW1lfSApIHsKICAgICAgICAgICAgJEFydGljbGV7VXBkYXRlVGltZUNsYXNzfSA9ICdXYXJuaW5nJwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzb2x1dGlvbiB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle1NvbHV0aW9uVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7U29sdXRpb25UaW1lSHVtYW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1NvbHV0aW9uVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtTb2x1dGlvblRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtTb2x1dGlvblRpbWVDbGFzc30gPSAnV2FybmluZycKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgRHluYW1pYyBmaWVsZHMKICAgICRDb3VudGVyID0gMDsKICAgIG15ICRDbGFzcyA9ICdNaWRkbGUnOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBnZXQgZmllbGQgdmFsdWUKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5WYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggIWRlZmluZWQgJFZhbHVlICk7CgogICAgICAgICRDb3VudGVyKys7CgogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkU2VsZi0+e0JhY2tlbmRPYmplY3R9LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gMjAsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhYmVsID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfTsKCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgcm93IGlmIGNvdW50ZXIgaXMgc3RhcnRpbmcKICAgICAgICBpZiAoICRDb3VudGVyID09IDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGRUYWJsZVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBkaXNwbGF5IHNlcGFyYXRpb24gcm93IGp1c3Qgb25jZQogICAgICAgICRDbGFzcyA9ICcnOwoKICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIGxhYmVsCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRWYWx1ZVN0cmctPntMaW5rfSApIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgbGluawogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkVGFibGVSb3dSZWNvcmRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICAgICAgICAgICA9PiAkVmFsdWVTdHJnLT57TGlua30sCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgcGxhaW4KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgb25seSAyIGR5bmFtaWMgZmllbGRzIGJ5IHJvdyBhcmUgYWxsb3dlZCwgcmVzZXQgY291dGVyIGlmIG5lZWRlZAogICAgICAgIGlmICggJENvdW50ZXIgPT0gMiApIHsKICAgICAgICAgICAgJENvdW50ZXIgPSAwOwogICAgICAgIH0KCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIGxhYmVsCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnX1RhYmxlUm93UmVjb3JkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMYWJlbCA9PiAkTGFiZWwsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkVmFsdWVTdHJnLT57TGlua30gKSB7CgogICAgICAgICAgICAjIG91dG91dCBkeW5hbWljIGZpZWxkIHZhbHVlIGxpbmsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19UYWJsZVJvd1JlY29yZExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgICAgICAgICAgICAgICAgID0+ICRWYWx1ZVN0cmctPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRvdXQgZHluYW1pYyBmaWVsZCB2YWx1ZSBwbGFpbgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnX1RhYmxlUm93UmVjb3JkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiAkVmFsdWVTdHJnLT57VGl0bGV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBmaWxsIHRoZSByZXN0IG9mIHRoZSBEeW5hbWljIEZpZWxkcyByb3cgd2l0aCBlbXB0eSBjZWxscywgdGhpcyB3aWxsIGxvb2sgYmV0dGVyCiAgICBpZiAoICRDb3VudGVyID4gMCAmJiAkQ291bnRlciA8IDIgKSB7CgogICAgICAgIGZvciAoICRDb3VudGVyICsgMSAuLi4gMiApIHsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgbGFiZWwKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExhYmVsID0+ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0b3V0IGR5bmFtaWMgZmllbGQgdmFsdWUgcGxhaW4KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZFRhYmxlUm93UmVjb3JkUGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gJycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoQEFydGljbGVCb2R5KSB7CgogICAgICAgICMgY2hlY2sgaWYgYSBjZXJ0YWluIGFydGljbGUgdHlwZSBzaG91bGQgYmUgZGlzcGxheWVkIGFzIGV4cGFuZGVkCiAgICAgICAgbXkgJFByZXZpZXdBcnRpY2xlVHlwZUV4cGFuZGVkCiAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok92ZXJ2aWV3OjpQcmV2aWV3QXJ0aWNsZVR5cGVFeHBhbmRlZCcpCiAgICAgICAgICAgIHx8ICcnOwoKICAgICAgICAjIGlmIGEgY2VydGFpbiBhcnRpY2xlIHR5cGUgc2hvdWxkIGJlIHNob3duIGFzIGV4cGFuZGVkLCBzZXQgdGhlCiAgICAgICAgIyBsYXN0IGFydGljbGUgb2YgdGhpcyB0eXBlIGFzIGFjdGl2ZQogICAgICAgIGlmICgkUHJldmlld0FydGljbGVUeXBlRXhwYW5kZWQpIHsKCiAgICAgICAgICAgIG15ICRDbGFzc0NvdW50ID0gMDsKICAgICAgICAgICAgQVJUSUNMRV9JVEVNOgogICAgICAgICAgICBmb3IgbXkgJEFydGljbGVJdGVtIChAQXJ0aWNsZUJvZHkpIHsKICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRV9JVEVNIGlmICEkQXJ0aWNsZUl0ZW07CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBjdXJyZW50IGFydGljbGUgdHlwZSBzaG91bGQgYmUgc2hvd24gYXMgZXhwYW5kZWQKICAgICAgICAgICAgICAgIGlmICggJEFydGljbGVJdGVtLT57QXJ0aWNsZVR5cGV9IGVxICRQcmV2aWV3QXJ0aWNsZVR5cGVFeHBhbmRlZCApIHsKICAgICAgICAgICAgICAgICAgICAkQXJ0aWNsZUl0ZW0tPntDbGFzc30gPSAnQWN0aXZlJzsKICAgICAgICAgICAgICAgICAgICBsYXN0IEFSVElDTEVfSVRFTTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSBkaXNwbGF5IHRoZSBsYXN0IGFydGljbGUgaW4gdGhlIGxpc3QgYXMgZXhwYW5kZWQgKGRlZmF1bHQpCiAgICAgICAgICAgICAgICBlbHNpZiAoICRDbGFzc0NvdW50ID09ICQjQXJ0aWNsZUJvZHkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFydGljbGVCb2R5WzBdLT57Q2xhc3N9ID0gJ0FjdGl2ZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQ2xhc3NDb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSBkaXNwbGF5IHRoZSBsYXN0IGFydGljbGUgaW4gdGhlIGxpc3QgYXMgZXhwYW5kZWQgKGRlZmF1bHQpCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRBcnRpY2xlQm9keVswXS0+e0NsYXNzfSA9ICdBY3RpdmUnOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZXNQcmV2aWV3QXJlYScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgaW5saW5lIGFydGljbGUKICAgIGZvciBteSAkQXJ0aWNsZUl0ZW0gKCByZXZlcnNlIEBBcnRpY2xlQm9keSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBqdXN0IGEgb25seSBodG1sIGVtYWlsCiAgICAgICAgbXkgJE1pbWVUeXBlVGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hlY2tNaW1lVHlwZSgKICAgICAgICAgICAgJXskQXJ0aWNsZUl0ZW19LAogICAgICAgICAgICBBY3Rpb24gPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgKTsKICAgICAgICBpZiAoJE1pbWVUeXBlVGV4dCkgewogICAgICAgICAgICAkQXJ0aWNsZUl0ZW0tPntCb2R5Tm90ZX0gPSAkTWltZVR5cGVUZXh0OwogICAgICAgICAgICAkQXJ0aWNsZUl0ZW0tPntCb2R5fSAgICAgPSAnJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGh0bWwgcXVvdGluZwogICAgICAgICAgICAkQXJ0aWNsZUl0ZW0tPntCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIE5ld0xpbmUgPT4gJFBhcmFte0NvbmZpZ30tPntEZWZhdWx0Vmlld05ld0xpbmV9ICB8fCA5MCwKICAgICAgICAgICAgICAgIFRleHQgICAgPT4gJEFydGljbGVJdGVtLT57Qm9keX0sCiAgICAgICAgICAgICAgICBWTWF4ICAgID0+ICRQYXJhbXtDb25maWd9LT57RGVmYXVsdFByZVZpZXdMaW5lc30gfHwgMjUsCiAgICAgICAgICAgICAgICBMaW5rRmVhdHVyZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlICA9PiAxLAogICAgICAgICAgICAgICAgU3RyaXBFbXB0eUxpbmVzID0+ICRQYXJhbXtDb25maWd9LT57U3RyaXBFbXB0eUxpbmVzfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRBcnRpY2xlSXRlbS0+e1N1YmplY3R9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkQXJ0aWNsZUl0ZW0tPntUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGVJdGVtLT57U3ViamVjdH0gfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVByZXZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JEFydGljbGVJdGVtfSwKICAgICAgICAgICAgICAgIENsYXNzID0+ICRBcnRpY2xlSXRlbS0+e0NsYXNzfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgYWN0aW9ucwogICAgICAgIGlmICggJEFydGljbGVJdGVtLT57QXJ0aWNsZVR5cGV9ICF+IC9eKG5vdGV8ZW1haWwtbm90aSkvaSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgY29tcG9zZSBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICFkZWZpbmVkICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICAgICAgICAgICAgIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICAgICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDb21wb3NlJyk7CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExvY2tlZCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+TG9ja0lzVGlja2V0TG9ja2VkKAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJExvY2tlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPd25lcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlUHJldmlld0FjdGlvblJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXskQXJ0aWNsZUl0ZW19LCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgZmV0Y2ggYWxsIHN0ZC4gcmVzcG9uc2VzCiAgICAgICAgICAgICAgICAgICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgPT4gJEFydGljbGV7UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlVHlwZXMgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBteSAlU3RhbmRhcmRSZXNwb25zZXM7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJFN0YW5kYXJkVGVtcGxhdGVze0Fuc3dlcn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJVN0YW5kYXJkUmVzcG9uc2VzID0gJXsgJFN0YW5kYXJkVGVtcGxhdGVze0Fuc3dlcn0gfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgZ2V0IFN0YW5kYXJkUmVzcG9uc2VzU3RyZwogICAgICAgICAgICAgICAgICAgICMgZ2V0IHJldmVycyBTdGFuZGFyZFJlc3BvbnNlIGJlY2F1c2Ugd2UgbmVlZCB0byBzb3J0IGJ5IFZhbHVlcwogICAgICAgICAgICAgICAgICAgICMgZnJvbSAlUmV2ZXJzZVN0YW5kYXJkUmVzcG9uc2VIYXNoIHdlIGdldCB2YWx1ZSBvZiBLZXkgYnkgJVN0YW5kYXJkUmVzcG9uc2UgVmFsdWUKICAgICAgICAgICAgICAgICAgICAjIGFuZCBAU3RhbmRhcmRSZXNwb25zZUFycmF5IGlzIGNyZWF0ZWQgYXMgYXJyYXkgb2YgaGFzaGVzIHdpdGggZWxlbWVudHMgS2V5IGFuZCBWYWx1ZQoKICAgICAgICAgICAgICAgICAgICBteSAlUmV2ZXJzZVN0YW5kYXJkUmVzcG9uc2VIYXNoID0gcmV2ZXJzZSAlU3RhbmRhcmRSZXNwb25zZXM7CiAgICAgICAgICAgICAgICAgICAgbXkgQFN0YW5kYXJkUmVzcG9uc2VBcnJheSAgICAgICA9IG1hcCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRSZXZlcnNlU3RhbmRhcmRSZXNwb25zZUhhc2h7JF99LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJF8KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gc29ydCB2YWx1ZXMgJVN0YW5kYXJkUmVzcG9uc2VzOwoKICAgICAgICAgICAgICAgICAgICB1bnNoaWZ0KAogICAgICAgICAgICAgICAgICAgICAgICBAU3RhbmRhcmRSZXNwb25zZUFycmF5LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAnMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnLSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUmVwbHknKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyAtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGJ1aWxkIGh0bWwgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgbXkgJFN0YW5kYXJkUmVzcG9uc2VzU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNlSUQnLAogICAgICAgICAgICAgICAgICAgICAgICBJRCAgID0+ICdSZXNwb25zZUlEJyAuICRBcnRpY2xlSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXEBTdGFuZGFyZFJlc3BvbnNlQXJyYXksCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVByZXZpZXdBY3Rpb25Sb3dJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRBcnRpY2xlSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPT4gJFN0YW5kYXJkUmVzcG9uc2VzU3RyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnUmVwbHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgICAgID0+ICdBc1BvcHVwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICA9PiAnQWdlbnRUaWNrZXRDb21wb3NlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICA9PiAnUmVwbHknIC4gJEFydGljbGVJdGVtLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIHJlcGx5IGFsbCBpcyBuZWVkZWQKICAgICAgICAgICAgICAgICAgICBteSAkUmVjaXBpZW50cyA9ICcnOwogICAgICAgICAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEtleSAocXcoRnJvbSBUbyBDYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISRBcnRpY2xlSXRlbS0+eyRLZXl9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFJlY2lwaWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZWNpcGllbnRzIC49ICcsICc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJFJlY2lwaWVudHMgLj0gJEFydGljbGVJdGVtLT57JEtleX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICRSZWNpcGllbnRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRSZWNpcGllbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbWFpbFBhcnNlciA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlID0+ICdTdGFuZGFsb25lJywKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQEFkZHJlc3NlcyA9ICRFbWFpbFBhcnNlci0+U3BsaXRBZGRyZXNzTGluZSggTGluZSA9PiAkUmVjaXBpZW50cyApOwogICAgICAgICAgICAgICAgICAgICAgICBBRERSRVNTOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEFkZHJlc3MgKEBBZGRyZXNzZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbWFpbCA9ICRFbWFpbFBhcnNlci0+R2V0RW1haWxBZGRyZXNzKCBFbWFpbCA9PiAkQWRkcmVzcyApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBBRERSRVNTIGlmICEkRW1haWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkSXNMb2NhbCA9ICRTZWxmLT57U3lzdGVtQWRkcmVzc30tPlN5c3RlbUFkZHJlc3NJc0xvY2FsQWRkcmVzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzID0+ICRFbWFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEFERFJFU1MgaWYgJElzTG9jYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVjaXBpZW50Q291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoICRSZWNpcGllbnRDb3VudCA+IDEgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGdldCBTdGFuZGFyZFJlc3BvbnNlc1N0cmcKICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQoQFN0YW5kYXJkUmVzcG9uc2VBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2hpZnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAU3RhbmRhcmRSZXNwb25zZUFycmF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICcwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAnLSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1JlcGx5IEFsbCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyAtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkU3RhbmRhcmRSZXNwb25zZXNTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNlSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQgICA9PiAnUmVzcG9uc2VJREFsbCcgLiAkQXJ0aWNsZUl0ZW0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcQFN0YW5kYXJkUmVzcG9uc2VBcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlUHJldmlld0FjdGlvblJvd0l0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXskQXJ0aWNsZUl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzU3RyZyA9PiAkU3RhbmRhcmRSZXNwb25zZXNTdHJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnUmVwbHkgQWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgPT4gJ0FzUG9wdXAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICA9PiAnQWdlbnRUaWNrZXRDb21wb3NlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgPT4gJ1JlcGx5QWxsJyAuICRBcnRpY2xlSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwbHlBbGwgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhY3Rpb24gaXRlbXMgYXMganMKICAgIGlmICggQEFjdGlvbkl0ZW1zICYmICEkUGFyYW17Q29uZmlnfS0+e1RpY2tldEFjdGlvbnNQZXJUaWNrZXR9ICkgewoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudFJlYWR5QWN0aW9uUm93QWRkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXEBBY3Rpb25JdGVtcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICVBY2xBY3Rpb24sCiAgICAgICAgfSwKICAgICk7CiAgICByZXR1cm4gXCRPdXRwdXQ7Cn0KMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNVGlja2V0Rmlyc3RMZXZlbFNvbHV0aW9uUmF0ZS5wbSAtIHN0YXRzIGZ1bmN0aW9ucyBmb3IgdGhlIGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGU7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNMQScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUeXBlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0gPSAkUGFyYW17REJTbGF2ZU9iamVjdH0gfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gWydUaWNrZXQnXSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgR2V0T2JqZWN0TmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnSVRTTVRpY2tldEZpcnN0TGV2ZWxTb2x1dGlvblJhdGUnOwp9CgpzdWIgR2V0T2JqZWN0QXR0cmlidXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHVzZXIgbGlzdAogICAgbXkgJVVzZXJMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+VXNlckxpc3QoCiAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgICMgZ2V0IHN0YXRlIGxpc3QKICAgIG15ICVTdGF0ZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgU3RhdGVUeXBlID0+IFsnY2xvc2VkJ10sCiAgICAgICAgUmVzdWx0ICAgID0+ICdIQVNIJywKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgIyBnZXQgcXVldWUgbGlzdAogICAgbXkgJVF1ZXVlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5HZXRBbGxRdWV1ZXMoKTsKCiAgICAjIGdldCBwcmlvcml0eSBsaXN0CiAgICBteSAlUHJpb3JpdHlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5JyktPlByaW9yaXR5TGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgY3VycmVudCB0aW1lIHRvIGZpeCBidWcjMzgzMAogICAgbXkgJFRpbWVTdGFtcCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaW1lJyktPkN1cnJlbnRUaW1lc3RhbXAoKTsKICAgIG15ICgkRGF0ZSkgPSBzcGxpdCAvXHMrLywgJFRpbWVTdGFtcDsKICAgIG15ICRUb2RheSA9IHNwcmludGYgIiVzIDIzOjU5OjU5IiwgJERhdGU7CgogICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+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+IDAsCiAgICAgICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFN0YXRzUGFyYW1ldGVyLT57RWxlbWVudH0sCiAgICAgICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEBPYmplY3RBdHRyaWJ1dGVzOwp9CgpzdWIgR2V0U3RhdEVsZW1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHVzZSBhbGwgY2xvc2VkIHN0YXRzIGlmIG5vIHN0YXRlcyBhcmUgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtTdGF0ZUlEc30gKSB7CiAgICAgICAgJFBhcmFte1N0YXRlVHlwZX0gPSBbJ2Nsb3NlZCddOwogICAgfQoKICAgICMgc3RhcnQgdGlja2V0IHNlYXJjaAogICAgbXkgQFRpY2tldFNlYXJjaElEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VhcmNoKAogICAgICAgICVQYXJhbSwKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICAgICAgTGltaXQgICAgICA9PiAxMDBfMDAwXzAwMCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgKTsKCiAgICByZXR1cm4gMCBpZiAhQFRpY2tldFNlYXJjaElEczsKCiAgICBteSAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cyA9IDA7CiAgICBUSUNLRVRJRDoKICAgIGZvciBteSAkVGlja2V0SUQgKEBUaWNrZXRTZWFyY2hJRHMpIHsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBkYXRhIGxpc3QKICAgICAgICBteSAkQXJ0aWNsZURhdGFMaXN0ID0gJFNlbGYtPl9BcnRpY2xlRGF0YUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnRVJST1InIGlmICEkQXJ0aWNsZURhdGFMaXN0OwoKICAgICAgICBuZXh0IFRJQ0tFVElEIGlmICFAeyRBcnRpY2xlRGF0YUxpc3R9OwogICAgICAgIG5leHQgVElDS0VUSUQgaWYgQHskQXJ0aWNsZURhdGFMaXN0fSA+IDI7CgogICAgICAgICMgZmlyc3QgYXJ0aWNsZSBpcyBhIHBob25lIGFydGljbGUKICAgICAgICBpZiAoICRBcnRpY2xlRGF0YUxpc3QtPlswXS0+e0FydGljbGVUeXBlSUR9IGVxICRTZWxmLT57UGhvbmVUeXBlSUR9ICkgewoKICAgICAgICAgICAgaWYgKCAhJEFydGljbGVEYXRhTGlzdC0+WzFdICkgewogICAgICAgICAgICAgICAgJEZpcnN0TGV2ZWxTb2x1dGlvblRpY2tldHMrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICB9CgogICAgICAgICMgZmlyc3QgYXJ0aWNsZSBpcyBhbiBleHRlcm5hbCBlbWFpbCBhcnRpY2xlCiAgICAgICAgaWYgKCAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBcnRpY2xlVHlwZUlEfSBlcSAkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9ICkgewoKICAgICAgICAgICAgIyBmaXJzdCBhcnRpY2xlIGNvbWVzIGZyb20gYW4gYWdlbnQgKEVtYWlsLVRpY2tldCkKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFydGljbGVEYXRhTGlzdC0+WzBdLT57QXJ0aWNsZVNlbmRlclR5cGVJRH0KICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBcnRpY2xlU2VuZGVyVHlwZUlEfSBlcSAkU2VsZi0+e0FnZW50U2VuZGVyVHlwZUlEfQogICAgICAgICAgICAgICAgJiYgISRBcnRpY2xlRGF0YUxpc3QtPlsxXQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cysrOwogICAgICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaXJzdCBhcnRpY2xlIGNvbWVzIGZyb20gY3VzdG9tZXIgYW5kIHRoZSBzZWNvbmQgb25lIGZyb20gYW4gYWdlbnQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEFydGljbGVEYXRhTGlzdC0+WzBdLT57QXJ0aWNsZVNlbmRlclR5cGVJRH0KICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBcnRpY2xlU2VuZGVyVHlwZUlEfSBlcSAkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfQogICAgICAgICAgICAgICAgJiYgJEFydGljbGVEYXRhTGlzdC0+WzFdCiAgICAgICAgICAgICAgICAmJiAkQXJ0aWNsZURhdGFMaXN0LT5bMV0tPntBcnRpY2xlU2VuZGVyVHlwZUlEfSBlcSAkU2VsZi0+e0FnZW50U2VuZGVyVHlwZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cysrOwogICAgICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJEZpcnN0TGV2ZWxTb2x1dGlvblRpY2tldHM7Cn0KCnN1YiBfQXJ0aWNsZURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRQYXJhbXtUaWNrZXRJRH07CgogICAgIyBnZXQgaWQgb2YgYXJ0aWNsZSB0eXBlICdwaG9uZScKICAgIGlmICggISRTZWxmLT57UGhvbmVUeXBlSUR9ICkgewogICAgICAgICRTZWxmLT57UGhvbmVUeXBlSUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5BcnRpY2xlVHlwZUxvb2t1cCgKICAgICAgICAgICAgQXJ0aWNsZVR5cGUgPT4gJ3Bob25lJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGlkIG9mIGFydGljbGUgdHlwZSAnZW1haWwtZXh0ZXJuYWwnCiAgICBpZiAoICEkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9ICkgewogICAgICAgICRTZWxmLT57RW1haWxFeHRlcm5hbFR5cGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPkFydGljbGVUeXBlTG9va3VwKAogICAgICAgICAgICBBcnRpY2xlVHlwZSA9PiAnZW1haWwtZXh0ZXJuYWwnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgYXJ0aWNsZSBzZW5kZXIgdHlwZSAnYWdlbnQnCiAgICBpZiAoICEkU2VsZi0+e0FnZW50U2VuZGVyVHlwZUlEfSApIHsKICAgICAgICAkU2VsZi0+e0FnZW50U2VuZGVyVHlwZUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+QXJ0aWNsZVNlbmRlclR5cGVMb29rdXAoCiAgICAgICAgICAgIFNlbmRlclR5cGUgPT4gJ2FnZW50JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGlkIG9mIGFydGljbGUgc2VuZGVyIHR5cGUgJ2N1c3RvbWVyJwogICAgaWYgKCAhJFNlbGYtPntDdXN0b21lclNlbmRlclR5cGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntDdXN0b21lclNlbmRlclR5cGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPkFydGljbGVTZW5kZXJUeXBlTG9va3VwKAogICAgICAgICAgICBTZW5kZXJUeXBlID0+ICdjdXN0b21lcicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQlNsYXZlT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBhcnRpY2xlX3R5cGVfaWQsIGFydGljbGVfc2VuZGVyX3R5cGVfaWQgRlJPTSBhcnRpY2xlICcKICAgICAgICAgICAgLiAnV0hFUkUgdGlja2V0X2lkID0gPyBBTkQgYXJ0aWNsZV90eXBlX2lkIElOICggPywgPyApIEFORCAnCiAgICAgICAgICAgIC4gJ2FydGljbGVfc2VuZGVyX3R5cGVfaWQgSU4gKCA/LCA/ICkgJwogICAgICAgICAgICAuICdPUkRFUiBCWSBjcmVhdGVfdGltZScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBcJFNlbGYtPntQaG9uZVR5cGVJRH0sCiAgICAgICAgICAgIFwkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9LAogICAgICAgICAgICBcJFNlbGYtPntBZ2VudFNlbmRlclR5cGVJRH0sCiAgICAgICAgICAgIFwkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfSwKICAgICAgICBdLAogICAgICAgIExpbWl0ID0+IDMsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQEFydGljbGVEYXRhTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJUFydGljbGVEYXRhOwogICAgICAgICRBcnRpY2xlRGF0YXtBcnRpY2xlVHlwZUlEfSAgICAgICA9ICRSb3dbMF07CiAgICAgICAgJEFydGljbGVEYXRhe0FydGljbGVTZW5kZXJUeXBlSUR9ID0gJFJvd1sxXTsKCiAgICAgICAgcHVzaCBAQXJ0aWNsZURhdGFMaXN0LCBcJUFydGljbGVEYXRhOwogICAgfQoKICAgIHJldHVybiBcQEFydGljbGVEYXRhTGlzdDsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKc3ViIEltcG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZS5wbSAtIHN0YXRzIGZ1bmN0aW9ucyBmb3IgdGhlIHNvbHV0aW9uIHRpbWUgYXZlcmFnZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE2IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpQcmlvcml0eScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U0xBJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlR5cGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgJFNlbGYtPntEQlNsYXZlT2JqZWN0fSA9ICRQYXJhbXtEQlNsYXZlT2JqZWN0fSB8fCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSA9PiBbJ1RpY2tldCddLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPYmplY3ROYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICdJVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZSc7Cn0KCnN1YiBHZXRPYmplY3RBdHRyaWJ1dGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlciBsaXN0CiAgICBteSAlVXNlckxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgIyBnZXQgc3RhdGUgbGlzdAogICAgbXkgJVN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldFN0YXRlc0J5VHlwZSgKICAgICAgICBTdGF0ZVR5cGUgPT4gWydjbG9zZWQnXSwKICAgICAgICBSZXN1bHQgICAgPT4gJ0hBU0gnLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICAjIGdldCBxdWV1ZSBsaXN0CiAgICBteSAlUXVldWVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldEFsbFF1ZXVlcygpOwoKICAgICMgZ2V0IHByaW9yaXR5IGxpc3QKICAgIG15ICVQcmlvcml0eUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJpb3JpdHknKS0+UHJpb3JpdHlMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBjdXJyZW50IHRpbWUgdG8gZml4IGJ1ZyMzODMwCiAgICBteSAkVGltZVN0YW1wID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgbXkgKCREYXRlKSA9IHNwbGl0IC9ccysvLCAkVGltZVN0YW1wOwogICAgbXkgJFRvZGF5ID0gc3ByaW50ZiAiJXMgMjM6NTk6NTkiLCAkRGF0ZTsKCiAgICBteSBAT2JqZWN0QXR0cmlidXRlcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+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+ICdJbnB1dEZpZWxkJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIEdldFN0YXRFbGVtZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1c2UgYWxsIGNsb3NlZCBzdGF0cyBpZiBubyBzdGF0ZXMgYXJlIGdpdmVuCiAgICBpZiAoICEkUGFyYW17U3RhdGVJRHN9ICkgewogICAgICAgICRQYXJhbXtTdGF0ZVR5cGV9ID0gWydjbG9zZWQnXTsKICAgIH0KCiAgICAjIHN0YXJ0IHRpY2tldCBzZWFyY2gKICAgIG15IEBUaWNrZXRTZWFyY2hJRHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlYXJjaCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgICAgIExpbWl0ICAgICAgPT4gMTAwXzAwMF8wMDAsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICk7CgogICAgcmV0dXJuICctJyBpZiAhQFRpY2tldFNlYXJjaElEczsKCiAgICBteSAkVGltZSA9IDA7CgogICAgVElDS0VUSUQ6CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0U2VhcmNoSURzKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICAgICAgbXkgJFRpY2tldERhdGEgPSAkU2VsZi0+X1RpY2tldERhdGFHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJ0VSUk9SJyBpZiAhJXskVGlja2V0RGF0YX07CgogICAgICAgICMgZ2V0IHJlbGV2YW50IHRpY2tldCBoaXN0b3J5CiAgICAgICAgbXkgJEhpc3RvcnlEYXRhID0gJFNlbGYtPl9UaWNrZXRIaXN0b3J5RGF0YUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnRVJST1InIGlmICEkSGlzdG9yeURhdGE7CgogICAgICAgICMgaWYgdGlja2V0IGlzIGNsb3NlZCBpbiB0aGUgdGlja2V0IGNyZWF0ZSBtYXNrCiAgICAgICAgaWYgKCBAeyRIaXN0b3J5RGF0YX0gPT0gMSApIHsKICAgICAgICAgICAgJFRpbWUgKz0gKCAzICogNjAgKTsKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICB9CgogICAgICAgIG15ICVUaW1lc3BhbnM7CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwoKICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHskSGlzdG9yeURhdGF9ICkgewoKICAgICAgICAgICAgaWYgKCAkVGltZXNwYW5zeyRDb3VudGVyfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+e1ZpZXdhYmxlfTsKCiAgICAgICAgICAgICAgICAjIHNldCBzdG9wIHRpbWUKICAgICAgICAgICAgICAgICRUaW1lc3BhbnN7JENvdW50ZXJ9LT57U3RvcFRpbWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpbWUnKS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRFbnRyeS0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISRFbnRyeS0+e1ZpZXdhYmxlfTsKCiAgICAgICAgICAgICAgICAjIHNldCBzdGFydCB0aW1lCiAgICAgICAgICAgICAgICAkVGltZXNwYW5zeyRDb3VudGVyfS0+e1N0YXJ0VGltZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEVudHJ5LT57Q3JlYXRlVGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjYWxlbmRhcgogICAgICAgIG15ICRDYWxlbmRhciA9ICRTZWxmLT5fQ2FsZW5kYXJHZXQoCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gJFRpY2tldERhdGEsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRDb3VudCAoIHNvcnQga2V5cyAlVGltZXNwYW5zICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IHRpbWVzdGFtcAogICAgICAgICAgICBteSAkVGltZXNwYW4gPSAkVGltZXNwYW5zeyRDb3VudH07CgogICAgICAgICAgICAkVGltZXNwYW4tPntTdG9wVGltZX0gfHw9ICRUaW1lc3Bhbi0+e1N0YXJ0VGltZX0gKyAoIDMgKiA2MCApOwoKICAgICAgICAgICAgIyBjYWxjdWxhdGUgd29ya2luZyB0aW1lCiAgICAgICAgICAgIG15ICRXb3JraW5nVGltZVBhcnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGltZScpLT5Xb3JraW5nVGltZSgKICAgICAgICAgICAgICAgICV7JFRpbWVzcGFufSwKICAgICAgICAgICAgICAgIENhbGVuZGFyID0+ICRDYWxlbmRhciwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRUaW1lICs9ICRXb3JraW5nVGltZVBhcnQ7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUaWNrZXRDb3VudCA9IEBUaWNrZXRTZWFyY2hJRHM7CiAgICBteSAkQXZlcmFnZVRpbWUgPSAkVGltZSAvICRUaWNrZXRDb3VudDsKCiAgICAjIHRyYW5zbGF0ZSBzZWNvbmRzIGluIGEgcmVhZGFibGUgZm9ybWF0CiAgICBteSAkVmFsdWUgPSAkU2VsZi0+X1NlY29uZGVUb1N0cmluZygKICAgICAgICBTZWNvbmRzID0+IGludCAkQXZlcmFnZVRpbWUsCiAgICApOwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCnN1YiBfVGlja2V0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiB7fSBpZiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQlNsYXZlT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBxdWV1ZV9pZCwgc2xhX2lkLCBjcmVhdGVfdGltZV91bml4ICcKICAgICAgICAgICAgLiAnRlJPTSB0aWNrZXQgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGlja2V0SUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlVGlja2V0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGlja2V0RGF0YXtRdWV1ZUlEfSAgICA9ICRSb3dbMF07CiAgICAgICAgJFRpY2tldERhdGF7U0xBSUR9ICAgICAgPSAkUm93WzFdOwogICAgICAgICRUaWNrZXREYXRhe0NyZWF0ZVRpbWV9ID0gJFJvd1syXTsKICAgIH0KCiAgICByZXR1cm4gXCVUaWNrZXREYXRhOwp9CgpzdWIgX0NhbGVuZGFyR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY29uZmlnIG9wdGlvbgogICAgJFNlbGYtPntUaWNrZXRTZXJ2aWNlRmVhdHVyZX0gfHw9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnVGlja2V0OjpTZXJ2aWNlJyk7CgogICAgbXkgJUVzY2FsYXRpb25EYXRhOwogICAgaWYgKCAkU2VsZi0+e1RpY2tldFNlcnZpY2VGZWF0dXJlfSAmJiAkUGFyYW17VGlja2V0RGF0YX0tPntTTEFJRH0gKSB7CiAgICAgICAgJUVzY2FsYXRpb25EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNMQScpLT5TTEFHZXQoCiAgICAgICAgICAgIFNMQUlEICA9PiAkUGFyYW17VGlja2V0RGF0YX0tPntTTEFJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICBDYWNoZSAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJUVzY2FsYXRpb25EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlR2V0KAogICAgICAgICAgICBJRCAgICAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57UXVldWVJRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICBDYWNoZSAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkRXNjYWxhdGlvbkRhdGF7Q2FsZW5kYXJ9IHx8IHVuZGVmOwp9CgpzdWIgX1RpY2tldEhpc3RvcnlEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICMgZ2V0IGlkIG9mIGhpc3RveSB0eXBlIFN0YXRlVXBkYXRlCiAgICBpZiAoICEkU2VsZi0+e1N0YXRlVXBkYXRlSUR9ICkgewogICAgICAgICRTZWxmLT57U3RhdGVVcGRhdGVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPkhpc3RvcnlUeXBlTG9va3VwKAogICAgICAgICAgICBUeXBlID0+ICdTdGF0ZVVwZGF0ZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpZCBvZiBoaXN0b3kgdHlwZSBOZXdUaWNrZXQKICAgIGlmICggISRTZWxmLT57TmV3VGlja2V0SUR9ICkgewogICAgICAgICRTZWxmLT57TmV3VGlja2V0SUR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICAgICAgVHlwZSA9PiAnTmV3VGlja2V0JywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHZpZXdhYmxlIHN0YXRlIGlkcwogICAgaWYgKCAhJFNlbGYtPntWaWV3YWJsZVN0YXRlSURzfSApIHsKICAgICAgICBteSBAVmlld2FibGVTdGF0ZUlEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldFN0YXRlc0J5VHlwZSgKICAgICAgICAgICAgVHlwZSAgID0+ICdWaWV3YWJsZScsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSUQnLAogICAgICAgICk7CgogICAgICAgIG15ICVWaWV3YWJsZVN0YXRlSURMaXN0OwogICAgICAgIGZvciBteSAkU3RhdGVJRCAoQFZpZXdhYmxlU3RhdGVJRHMpIHsKICAgICAgICAgICAgJFZpZXdhYmxlU3RhdGVJRExpc3R7JFN0YXRlSUR9ID0gMTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57Vmlld2FibGVTdGF0ZUlEc30gPSBcJVZpZXdhYmxlU3RhdGVJRExpc3Q7CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJTbGF2ZU9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1Qgc3RhdGVfaWQsIGNyZWF0ZV90aW1lIEZST00gdGlja2V0X2hpc3RvcnkgJwogICAgICAgICAgICAuICdXSEVSRSB0aWNrZXRfaWQgPSA/IEFORCBoaXN0b3J5X3R5cGVfaWQgSU4gKCA/LCA/ICkgJwogICAgICAgICAgICAuICdPUkRFUiBCWSBjcmVhdGVfdGltZScsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGlja2V0SUR9LCBcJFNlbGYtPntTdGF0ZVVwZGF0ZUlEfSwgXCRTZWxmLT57TmV3VGlja2V0SUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQFRpY2tldEhpc3RvcnlMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQlNsYXZlT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAlSGlzdG9yeURhdGE7CiAgICAgICAgJEhpc3RvcnlEYXRhe1N0YXRlSUR9ICAgID0gJFJvd1swXTsKICAgICAgICAkSGlzdG9yeURhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzFdOwoKICAgICAgICBwdXNoIEBUaWNrZXRIaXN0b3J5TGlzdCwgXCVIaXN0b3J5RGF0YTsKICAgIH0KCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKEBUaWNrZXRIaXN0b3J5TGlzdCkgewoKICAgICAgICAkRW50cnktPntWaWV3YWJsZX0gPSAwOwogICAgICAgIG5leHQgRU5UUlkgaWYgISRTZWxmLT57Vmlld2FibGVTdGF0ZUlEc30tPnsgJEVudHJ5LT57U3RhdGVJRH0gfTsKICAgICAgICAkRW50cnktPntWaWV3YWJsZX0gPSAxOwogICAgfQoKICAgIHJldHVybiBcQFRpY2tldEhpc3RvcnlMaXN0Owp9CgpzdWIgX1NlY29uZGVUb1N0cmluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhZGVmaW5lZCAkUGFyYW17U2Vjb25kc307CgogICAgIyBjYWxjdWxhdGUgdGhlIHNlY29uZHMKICAgIG15ICRTZWNvbmRzID0gJFBhcmFte1NlY29uZHN9ICUgNjA7CiAgICAkUGFyYW17U2Vjb25kc30gPSAoICRQYXJhbXtTZWNvbmRzfSAtICRTZWNvbmRzICkgLyA2MDsKCiAgICAjIGNhbGN1bGF0ZSB0aGUgbWludXRlcwogICAgbXkgJE1pbnV0ZXMgPSAkUGFyYW17U2Vjb25kc30gJSA2MDsKCiAgICAjIGNhbGN1bGF0ZSB0aGUgaG91cnMKICAgIG15ICRIb3VycyA9ICggJFBhcmFte1NlY29uZHN9IC0gJE1pbnV0ZXMgKSAvIDYwOwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgICRIb3VycyAgIHx8PSAwOwogICAgJE1pbnV0ZXMgfHw9IDA7CiAgICAkU2Vjb25kcyB8fD0gMDsKCiAgICBpZiAoICRTZWNvbmRzID49IDMwICkgewogICAgICAgICRNaW51dGVzKys7CiAgICB9CgogICAgJE1pbnV0ZXMgPSBzcHJpbnRmICIlMDJkIiwgJE1pbnV0ZXM7CgogICAgbXkgJEhvdXJzU3RyaW5nICAgPSAnSG91cnMnOwogICAgbXkgJE1pbnV0ZXNTdHJpbmcgPSAnTWludXRlcyc7CgogICAgcmV0dXJuICIkSG91cnMgJEhvdXJzU3RyaW5nICRNaW51dGVzICRNaW51dGVzU3RyaW5nIjsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKc3ViIEltcG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKMTsK
IyAtLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNiBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudDsgICAgIyMgbm8gY3JpdGljCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpPdXRwdXQ6OlRlbXBsYXRlOjpQcm92aWRlcjsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRzJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VHlwZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENvZGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCd2YXI6OnBhY2thZ2VzZXR1cDo6SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyByZWJ1aWxkIFpaWiogZmlsZXMKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcnKS0+V3JpdGVEZWZhdWx0KCk7CgogICAgIyBkZWZpbmUgdGhlIFpaWiBmaWxlcwogICAgbXkgQFpaWkZpbGVzID0gKAogICAgICAgICdaWlpBQXV0by5wbScsCiAgICAgICAgJ1paWkF1dG8ucG0nLAogICAgKTsKCiAgICAjIHJlbG9hZCB0aGUgWlpaIGZpbGVzIChtb2RfcGVybCB3b3JrYXJvdW5kKQogICAgZm9yIG15ICRaWlpGaWxlIChAWlpaRmlsZXMpIHsKCiAgICAgICAgUFJFRklYOgogICAgICAgIGZvciBteSAkUHJlZml4IChASU5DKSB7CiAgICAgICAgICAgIG15ICRGaWxlID0gJFByZWZpeCAuICcvS2VybmVsL0NvbmZpZy9GaWxlcy8nIC4gJFpaWkZpbGU7CiAgICAgICAgICAgIG5leHQgUFJFRklYIGlmICEtZiAkRmlsZTsKICAgICAgICAgICAgZG8gJEZpbGU7CiAgICAgICAgICAgIGxhc3QgUFJFRklYOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFsd2F5cyBkaXNjYXJkIHRoZSBjb25maWcgb2JqZWN0IGJlZm9yZSBwYWNrYWdlIGNvZGUgaXMgZXhlY3V0ZWQsCiAgICAjIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb25maWcgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCBuZXdseSwgc28gdGhhdCBpdAogICAgIyB3aWxsIHVzZSB0aGUgcmVjZW50bHkgd3JpdHRlbiBuZXcgY29uZmlnIGZyb20gdGhlIHBhY2thZ2UKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RzRGlzY2FyZCgKICAgICAgICBPYmplY3RzID0+IFsnS2VybmVsOjpDb25maWcnXSwKICAgICk7CgogICAgIyB0aGUgc3RhdHMgb2JqZWN0IG5lZWRzIGEgVXNlcklEIHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yCiAgICAjIHdlIG5lZWQgdG8gZGlzY2FyZCBhbnkgZXhpc3Rpbmcgc3RhdHMgb2JqZWN0IGJlZm9yZQogICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKAogICAgICAgIE9iamVjdHMgPT4gWydLZXJuZWw6OlN5c3RlbTo6U3RhdHMnXSwKICAgICk7CgogICAgIyBkZWZpbmUgVXNlcklEIHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdGF0cyBvYmplY3QKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OlN0YXRzJyA9PiB7CiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgICMgZGVmaW5lIGZpbGUgcHJlZml4IGZvciBzdGF0cwogICAgJFNlbGYtPntGaWxlUHJlZml4fSA9ICdJVFNNU3RhdHMnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQ29kZUluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIGluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZUluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IG5ldyB0aWNrZXQgc3RhdGVzIHRvIHZhbGlkCiAgICB7CiAgICAgICAgbXkgQFN0YXRlTmFtZXMgPSAoCiAgICAgICAgICAgICdjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJywKICAgICAgICApOwoKICAgICAgICAjIHNldCBzdGF0ZXMgdG8gdmFsaWQKICAgICAgICAkU2VsZi0+X1NldFN0YXRlVmFsaWQoCiAgICAgICAgICAgIFN0YXRlTmFtZXMgPT4gXEBTdGF0ZU5hbWVzLAogICAgICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBuZXcgdGlja2V0IHR5cGVzIHRvIHZhbGlkCiAgICB7CiAgICAgICAgbXkgQFR5cGVOYW1lcyA9ICgKICAgICAgICAgICAgJ0luY2lkZW50JywKICAgICAgICAgICAgJ0luY2lkZW50OjpNYWpvcicsCiAgICAgICAgICAgICdTZXJ2aWNlUmVxdWVzdCcsCiAgICAgICAgICAgICdQcm9ibGVtJywKICAgICAgICApOwoKICAgICAgICAjIHNldCB0eXBlcyB0byB2YWxpZAogICAgICAgICRTZWxmLT5fU2V0VHlwZVZhbGlkKAogICAgICAgICAgICBUeXBlTmFtZXMgPT4gXEBUeXBlTmFtZXMsCiAgICAgICAgICAgIFZhbGlkICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgZHluYW1pYyBmaWVsZHMgZm9yIElUU00KICAgICRTZWxmLT5fQ3JlYXRlSVRTTUR5bmFtaWNGaWVsZHMoKTsKCiAgICAjIGluc3RhbGwgc3RhdHMKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0cycpLT5TdGF0c0luc3RhbGwoCiAgICAgICAgRmlsZVByZWZpeCA9PiAkU2VsZi0+e0ZpbGVQcmVmaXh9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBpbnN0YWxsIHN0YXRzCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdHMnKS0+U3RhdHNJbnN0YWxsKAogICAgICAgIEZpbGVQcmVmaXggPT4gJFNlbGYtPntGaWxlUHJlZml4fSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl8zXzJfOTEoKQoKVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIGlmIHRoZSBpbnN0YWxsZWQgbW9kdWxlIHZlcnNpb24gaXMgc21hbGxlciB0aGFuIDMuMi45MSAoMy4zLjAgQmV0YSAxKS4KCm15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzNfMl85MSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl8zXzJfOTEgeyAgICAjIyBubyBjcml0aWMKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyByZW5hbWUgdGhlIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudAogICAgJFNlbGYtPl9SZW5hbWVEeW5hbWljRmllbGRzKCk7CgogICAgIyBzZXQgdGhlIHNjcmVlbiBkeW5hbWljIGZpZWxkIGNvbmZpZwogICAgJFNlbGYtPl9TZXRTY3JlZW5EeW5hbWljRmllbGRDb25maWcoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF8yKCkKClRoaXMgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBpZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSB2ZXJzaW9uIGlzIHNtYWxsZXIgdGhhbiA0LjAuMi4KCm15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF8yKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF8yIHsgICAgIyMgbm8gY3JpdGljCiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbWlncmF0ZSB0aGUgRFRMIENvbnRlbnQgaW4gdGhlIFN5c0NvbmZpZwogICAgJFNlbGYtPl9NaWdyYXRlRFRMSW5TeXNDb25maWcoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbWFrZSBkeW5hbWljIGZpZWxkcyBpbnRlcm5hbAogICAgJFNlbGYtPl9NYWtlRHluYW1pY0ZpZWxkc0ludGVybmFsKCk7CgogICAgIyBpbnN0YWxsIHN0YXRzCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdHMnKS0+U3RhdHNJbnN0YWxsKAogICAgICAgIEZpbGVQcmVmaXggPT4gJFNlbGYtPntGaWxlUHJlZml4fSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVbmluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVW5pbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVVuaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IG5ldyB0aWNrZXQgc3RhdGVzIHRvIGludmFsaWQKICAgIHsKICAgICAgICBteSBAU3RhdGVOYW1lcyA9ICgKICAgICAgICAgICAgJ2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHN0YXRlcyB0byBpbnZhbGlkCiAgICAgICAgJFNlbGYtPl9TZXRTdGF0ZVZhbGlkKAogICAgICAgICAgICBTdGF0ZU5hbWVzID0+IFxAU3RhdGVOYW1lcywKICAgICAgICAgICAgVmFsaWQgICAgICA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgbmV3IHRpY2tldCB0eXBlcyB0byBpbnZhbGlkCiAgICB7CiAgICAgICAgbXkgQFR5cGVOYW1lcyA9ICgKICAgICAgICAgICAgJ0luY2lkZW50JywKICAgICAgICAgICAgJ0luY2lkZW50OjpNYWpvcicsCiAgICAgICAgICAgICdTZXJ2aWNlUmVxdWVzdCcsCiAgICAgICAgICAgICdQcm9ibGVtJywKCiAgICAgICAgICAgICMgb2xkIHR5cGVzIGZyb20gSVRTTSBiZWZvcmUgdmVyc2lvbiAzLjIuOTEKICAgICAgICAgICAgJ0luY2lkZW50OjpTZXJ2aWNlUmVxdWVzdCcsCiAgICAgICAgICAgICdJbmNpZGVudDo6RGlzYXN0ZXInLAogICAgICAgICAgICAnUHJvYmxlbTo6S25vd25FcnJvcicsCiAgICAgICAgICAgICdQcm9ibGVtOjpQZW5kaW5nUmZDJywKICAgICAgICApOwoKICAgICAgICAjIHNldCB0eXBlcyB0byBpbnZhbGlkCiAgICAgICAgJFNlbGYtPl9TZXRUeXBlVmFsaWQoCiAgICAgICAgICAgIFR5cGVOYW1lcyA9PiBcQFR5cGVOYW1lcywKICAgICAgICAgICAgVmFsaWQgICAgID0+IDAsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX1NldFNjcmVlbkR5bmFtaWNGaWVsZENvbmZpZygpCgpUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHNjcmVlbiBkeW5hbWljIHNjcmVlbiBjb25maWcKCm15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X1NldFNjcmVlbkR5bmFtaWNGaWVsZENvbmZpZygpOwoKPWN1dAoKc3ViIF9TZXRTY3JlZW5EeW5hbWljRmllbGRDb25maWcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG1hcHBpbmcgb2xkIG5hbWUgdG8gbmV3IG5hbWUgb2YgZHluYW1pYyBmaWVsZHMKICAgIG15ICVPbGQyTmV3ID0gKAogICAgICAgIFRpY2tldEZyZWVUZXh0MTMgPT4gJ0lUU01Dcml0aWNhbGl0eScsCiAgICAgICAgVGlja2V0RnJlZVRleHQxNCA9PiAnSVRTTUltcGFjdCcsCiAgICAgICAgVGlja2V0RnJlZVRleHQxNSA9PiAnSVRTTVJldmlld1JlcXVpcmVkJywKICAgICAgICBUaWNrZXRGcmVlVGV4dDE2ID0+ICdJVFNNRGVjaXNpb25SZXN1bHQnLAogICAgICAgIFRpY2tldEZyZWVUaW1lMyAgPT4gJ0lUU01SZXBhaXJTdGFydFRpbWUnLAogICAgICAgIFRpY2tldEZyZWVUaW1lNCAgPT4gJ0lUU01SZWNvdmVyeVN0YXJ0VGltZScsCiAgICAgICAgVGlja2V0RnJlZVRpbWU1ICA9PiAnSVRTTURlY2lzaW9uRGF0ZScsCiAgICAgICAgVGlja2V0RnJlZVRpbWU2ICA9PiAnSVRTTUR1ZURhdGUnLAogICAgKTsKCiAgICAjIGRlZmluZSB0aGUgZW5hYmxlZCBkeW5hbWljIGZpZWxkcyBmb3IgZWFjaCBzY3JlZW4KICAgICMgKHRha2VuIGZyb20gc3lzY29uZmlnIG9mIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50KQogICAgbXkgJVNjcmVlbkR5bmFtaWNGaWVsZENvbmZpZyA9ICgKICAgICAgICBBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkID0+IHsKICAgICAgICAgICAgSVRTTVJlcGFpclN0YXJ0VGltZSAgID0+IDEsCiAgICAgICAgICAgIElUU01SZWNvdmVyeVN0YXJ0VGltZSA9PiAxLAogICAgICAgICAgICBJVFNNRHVlRGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFnZW50VGlja2V0RGVjaXNpb24gPT4gewogICAgICAgICAgICBJVFNNRGVjaXNpb25SZXN1bHQgPT4gMSwKICAgICAgICAgICAgSVRTTURlY2lzaW9uRGF0ZSAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZ2VudFRpY2tldFBob25lID0+IHsKICAgICAgICAgICAgSVRTTUltcGFjdCAgPT4gMSwKICAgICAgICAgICAgSVRTTUR1ZURhdGUgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFnZW50VGlja2V0RW1haWwgPT4gewogICAgICAgICAgICBJVFNNSW1wYWN0ICA9PiAxLAogICAgICAgICAgICBJVFNNRHVlRGF0ZSA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWdlbnRUaWNrZXRTZWFyY2ggPT4gewogICAgICAgICAgICBJVFNNSW1wYWN0ICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgSVRTTVJldmlld1JlcXVpcmVkICAgID0+IDEsCiAgICAgICAgICAgIElUU01EZWNpc2lvblJlc3VsdCAgICA9PiAxLAogICAgICAgICAgICBJVFNNUmVwYWlyU3RhcnRUaW1lICAgPT4gMSwKICAgICAgICAgICAgSVRTTVJlY292ZXJ5U3RhcnRUaW1lID0+IDEsCiAgICAgICAgICAgIElUU01EZWNpc2lvbkRhdGUgICAgICA9PiAxLAogICAgICAgICAgICBJVFNNRHVlRGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFnZW50VGlja2V0Wm9vbSA9PiB7CiAgICAgICAgICAgIElUU01JbXBhY3QgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBJVFNNQ3JpdGljYWxpdHkgICAgICAgPT4gMSwKICAgICAgICAgICAgSVRTTVJldmlld1JlcXVpcmVkICAgID0+IDEsCiAgICAgICAgICAgIElUU01EZWNpc2lvblJlc3VsdCAgICA9PiAxLAogICAgICAgICAgICBJVFNNUmVwYWlyU3RhcnRUaW1lICAgPT4gMSwKICAgICAgICAgICAgSVRTTVJlY292ZXJ5U3RhcnRUaW1lID0+IDEsCiAgICAgICAgICAgIElUU01EZWNpc2lvbkRhdGUgICAgICA9PiAxLAogICAgICAgICAgICBJVFNNRHVlRGF0ZSAgICAgICAgICAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFnZW50VGlja2V0UHJpb3JpdHkgPT4gewogICAgICAgICAgICBJVFNNSW1wYWN0ID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZ2VudFRpY2tldENsb3NlID0+IHsKICAgICAgICAgICAgSVRTTVJldmlld1JlcXVpcmVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZ2VudFRpY2tldENvbXBvc2UgPT4gewogICAgICAgICAgICBJVFNNUmV2aWV3UmVxdWlyZWQgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICBmb3IgbXkgJFNjcmVlbiAoIHNvcnQga2V5cyAlU2NyZWVuRHluYW1pY0ZpZWxkQ29uZmlnICkgewoKICAgICAgICAjIGdldCBleGlzdGluZyBjb25maWcgZm9yIGVhY2ggc2NyZWVuCiAgICAgICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNjcmVlbiIpOwoKICAgICAgICAjIGdldCBleGlzdGluZyBkeW5hbWljIGZpZWxkIGNvbmZpZwogICAgICAgIG15ICVFeGlzdGluZ1NldHRpbmcgPSAleyAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSB9OwoKICAgICAgICAjIGFkZCB0aGUgbmV3IHNldHRpbmdzCiAgICAgICAgbXkgJU5ld1NldHRpbmcgPSAoICVFeGlzdGluZ1NldHRpbmcsICV7ICRTY3JlZW5EeW5hbWljRmllbGRDb25maWd7JFNjcmVlbn0gfSApOwoKICAgICAgICAjIGRlbGV0ZSBubyBsb25nZXIgdXNlZCBkeW5hbWljIGZpZWxkIG5hbWVzIGZyb20gZWFjaCBjb25maWcKICAgICAgICBmb3IgbXkgJE9sZER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlT2xkMk5ldyApIHsKCiAgICAgICAgICAgICMgYW4gb2xkIHNldHRpbmcgZXhpc3RzCiAgICAgICAgICAgIGlmICggZXhpc3RzICROZXdTZXR0aW5neyRPbGREeW5hbWljRmllbGR9ICkgewoKICAgICAgICAgICAgICAgICMgY29weSB0aGUgb2xkIHNldHRpbmcgdG8gdGhlIG5ldyBzZXR0aW5nCiAgICAgICAgICAgICAgICAkTmV3U2V0dGluZ3sgJE9sZDJOZXd7JE9sZER5bmFtaWNGaWVsZH0gfSA9ICROZXdTZXR0aW5neyRPbGREeW5hbWljRmllbGR9OwoKICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBvbGQgc2V0dGluZwogICAgICAgICAgICAgICAgZGVsZXRlICROZXdTZXR0aW5neyRPbGREeW5hbWljRmllbGR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgc3lzY29uZmlnCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyktPkNvbmZpZ0l0ZW1VcGRhdGUoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIEtleSAgID0+ICdUaWNrZXQ6OkZyb250ZW5kOjonIC4gJFNjcmVlbiAuICcjIyNEeW5hbWljRmllbGQnLAogICAgICAgICAgICBWYWx1ZSA9PiBcJU5ld1NldHRpbmcsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX1NldFN0YXRlVmFsaWQoKQoKc2V0cyBzdGF0ZXMgdG8gdmFsaWR8aW52YWxpZAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X1NldFN0YXRlVmFsaWQoCiAgICAgICAgU3RhdGVOYW1lcyA9PiBbICduZXcnLCAnb3BlbicgXSwKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIF9TZXRTdGF0ZVZhbGlkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtTdGF0ZU5hbWVzfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU3RhdGVOYW1lcyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9va3VwIHZhbGlkIGlkCiAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgJVZhbGlkTGlzdCA9IHJldmVyc2UgJVZhbGlkTGlzdDsKICAgIG15ICRWYWxpZElEID0gJFBhcmFte1ZhbGlkfSA/ICRWYWxpZExpc3R7dmFsaWR9IDogJFZhbGlkTGlzdHtpbnZhbGlkfTsKCiAgICBTVEFURU5BTUU6CiAgICBmb3IgbXkgJFN0YXRlTmFtZSAoIEB7ICRQYXJhbXtTdGF0ZU5hbWVzfSB9ICkgewoKICAgICAgICAjIGdldCBzdGF0ZQogICAgICAgIG15ICVTdGF0ZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGF0ZScpLT5TdGF0ZUdldCgKICAgICAgICAgICAgTmFtZSA9PiAkU3RhdGVOYW1lLAogICAgICAgICk7CgogICAgICAgIG5leHQgU1RBVEVOQU1FIGlmICElU3RhdGU7CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlVXBkYXRlKAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfU2V0VHlwZVZhbGlkKCkKCnNldHMgdHlwZXMgdG8gdmFsaWR8aW52YWxpZAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X1NldFR5cGVWYWxpZCgKICAgICAgICBUeXBlTmFtZXMgPT4gWyAnSW5jaWRlbnQnLCAnUHJvYmxlbScgXSwKICAgICAgICBWYWxpZCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX1NldFR5cGVWYWxpZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VHlwZU5hbWVzfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVHlwZU5hbWVzIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb29rdXAgdmFsaWQgaWQKICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICAlVmFsaWRMaXN0ID0gcmV2ZXJzZSAlVmFsaWRMaXN0OwogICAgbXkgJFZhbGlkSUQgPSAkUGFyYW17VmFsaWR9ID8gJFZhbGlkTGlzdHt2YWxpZH0gOiAkVmFsaWRMaXN0e2ludmFsaWR9OwoKICAgICMgZ2V0IGxpc3Qgb2YgYWxsIHR5cGVzCiAgICBteSAlVHlwZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpLT5UeXBlTGlzdCgKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICAjIHJldmVyc2UgdGhlIHR5cGUgbGlzdCBmb3IgZWFzaWVyIGxvb2t1cAogICAgbXkgJVR5cGVMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVR5cGVMaXN0OwoKICAgIFRZUEVOQU1FOgogICAgZm9yIG15ICRUeXBlTmFtZSAoIEB7ICRQYXJhbXtUeXBlTmFtZXN9IH0gKSB7CgogICAgICAgICMgbG9va3VwIHR5cGUgaWQKICAgICAgICBteSAkVHlwZUlEID0gJFR5cGVMaXN0UmV2ZXJzZXskVHlwZU5hbWV9OwoKICAgICAgICBuZXh0IFRZUEVOQU1FIGlmICEkVHlwZUlEOwoKICAgICAgICAjIGdldCB0eXBlCiAgICAgICAgbXkgJVR5cGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpLT5UeXBlR2V0KAogICAgICAgICAgICBJRCA9PiAkVHlwZUlELAogICAgICAgICk7CgogICAgICAgICMgc2V0IHR5cGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHlwZScpLT5UeXBlVXBkYXRlKAogICAgICAgICAgICAlVHlwZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9DcmVhdGVJVFNNRHluYW1pY0ZpZWxkcygpCgpjcmVhdGVzIGFsbCBkeW5hbWljIGZpZWxkcyB0aGF0IGFyZSBuZWNlc3NhcnkgZm9yIElUU00KCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9DcmVhdGVJVFNNRHluYW1pY0ZpZWxkcygpOwoKPWN1dAoKc3ViIF9DcmVhdGVJVFNNRHluYW1pY0ZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWxpZElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKAogICAgICAgIFZhbGlkID0+ICd2YWxpZCcsCiAgICApOwoKICAgICMgZ2V0IGFsbCBjdXJyZW50IGR5bmFtaWMgZmllbGRzCiAgICBteSAkRHluYW1pY0ZpZWxkTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICAjIGdldCB0aGUgbGlzdCBvZiBvcmRlciBudW1iZXJzIChpcyBhbHJlYWR5IHNvcnRlZCkuCiAgICBteSBARHluYW1pY2ZpZWxkT3JkZXJMaXN0OwogICAgZm9yIG15ICREeW5hbWljZmllbGQgKCBAeyREeW5hbWljRmllbGRMaXN0fSApIHsKICAgICAgICBwdXNoIEBEeW5hbWljZmllbGRPcmRlckxpc3QsICREeW5hbWljZmllbGQtPntGaWVsZE9yZGVyfTsKICAgIH0KCiAgICAjIGdldCB0aGUgbGFzdCBlbGVtZW50IGZyb20gdGhlIG9yZGVyIGxpc3QgYW5kIGFkZCAxCiAgICBteSAkTmV4dE9yZGVyTnVtYmVyID0gMTsKICAgIGlmIChARHluYW1pY2ZpZWxkT3JkZXJMaXN0KSB7CiAgICAgICAgJE5leHRPcmRlck51bWJlciA9ICREeW5hbWljZmllbGRPcmRlckxpc3RbLTFdICsgMTsKICAgIH0KCiAgICAjIGdldCB0aGUgZGVmaW5pdGlvbiBmb3IgYWxsIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNCiAgICBteSBARHluYW1pY0ZpZWxkcyA9ICRTZWxmLT5fR2V0SVRTTUR5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCk7CgogICAgIyBjcmVhdGUgYSBkeW5hbWljIGZpZWxkcyBsb29rdXAgdGFibGUKICAgIG15ICVEeW5hbWljRmllbGRMb29rdXA7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JER5bmFtaWNGaWVsZExpc3R9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmIHJlZiAkRHluYW1pY0ZpZWxkIG5lICdIQVNIJzsKICAgICAgICAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgIyBjcmVhdGUgb3IgdXBkYXRlIGR5bmFtaWMgZmllbGRzCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoQER5bmFtaWNGaWVsZHMpIHsKCiAgICAgICAgbXkgJENyZWF0ZUR5bmFtaWNGaWVsZDsKCiAgICAgICAgIyBjaGVjayBpZiB0aGUgZHluYW1pYyBmaWVsZCBhbHJlYWR5IGV4aXN0cwogICAgICAgIGlmICggcmVmICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9IG5lICdIQVNIJyApIHsKICAgICAgICAgICAgJENyZWF0ZUR5bmFtaWNGaWVsZCA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoZSBmaWVsZCBleGlzdHMgY2hlY2sgaWYgdGhlIHR5cGUgbWF0Y2ggd2l0aCB0aGUgbmVlZGVkIHR5cGUKICAgICAgICBlbHNpZiAoCiAgICAgICAgICAgICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9LT57RmllbGRUeXBlfQogICAgICAgICAgICBuZSAkRHluYW1pY0ZpZWxkLT57RmllbGRUeXBlfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyByZW5hbWUgdGhlIGZpZWxkIGFuZCBjcmVhdGUgYSBuZXcgb25lCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRVcGRhdGUoCiAgICAgICAgICAgICAgICAleyAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSB9LAogICAgICAgICAgICAgICAgTmFtZSAgID0+ICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9LT57TmFtZX0gLiAnT2xkJywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENyZWF0ZUR5bmFtaWNGaWVsZCA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSBpZiB0aGUgZmllbGQgZXhpc3RzIGFuZCB0aGUgdHlwZSBtYXRjaCwgdXBkYXRlIGl0IHRvIHRoZSBJVFNNIGRlZmluaXRpb24KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZFVwZGF0ZSgKICAgICAgICAgICAgICAgICV7JER5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICBJRCAgICAgICAgID0+ICREeW5hbWljRmllbGRMb29rdXB7ICREeW5hbWljRmllbGQtPntOYW1lfSB9LT57SUR9LAogICAgICAgICAgICAgICAgRmllbGRPcmRlciA9PiAkRHluYW1pY0ZpZWxkTG9va3VweyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfS0+e0ZpZWxkT3JkZXJ9LAogICAgICAgICAgICAgICAgVmFsaWRJRCAgICA9PiAkVmFsaWRJRCwKICAgICAgICAgICAgICAgIFJlb3JkZXIgICAgPT4gMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgbmV3IGZpZWxkIGhhcyB0byBiZSBjcmVhdGVkCiAgICAgICAgaWYgKCRDcmVhdGVEeW5hbWljRmllbGQpIHsKCiAgICAgICAgICAgICMgY3JlYXRlIGEgbmV3IGZpZWxkCiAgICAgICAgICAgIG15ICRGaWVsZElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRBZGQoCiAgICAgICAgICAgICAgICBJbnRlcm5hbEZpZWxkID0+IDEsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICREeW5hbWljRmllbGQtPntOYW1lfSwKICAgICAgICAgICAgICAgIExhYmVsICAgICAgICAgPT4gJER5bmFtaWNGaWVsZC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgIEZpZWxkT3JkZXIgICAgPT4gJE5leHRPcmRlck51bWJlciwKICAgICAgICAgICAgICAgIEZpZWxkVHlwZSAgICAgPT4gJER5bmFtaWNGaWVsZC0+e0ZpZWxkVHlwZX0sCiAgICAgICAgICAgICAgICBPYmplY3RUeXBlICAgID0+ICREeW5hbWljRmllbGQtPntPYmplY3RUeXBlfSwKICAgICAgICAgICAgICAgIENvbmZpZyAgICAgICAgPT4gJER5bmFtaWNGaWVsZC0+e0NvbmZpZ30sCiAgICAgICAgICAgICAgICBWYWxpZElEICAgICAgID0+ICRWYWxpZElELAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJEZpZWxkSUQ7CgogICAgICAgICAgICAjIGluY3JlYXNlIHRoZSBvcmRlciBudW1iZXIKICAgICAgICAgICAgJE5leHRPcmRlck51bWJlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIG1ha2UgZHluYW1pYyBmaWVsZHMgaW50ZXJuYWwKICAgICRTZWxmLT5fTWFrZUR5bmFtaWNGaWVsZHNJbnRlcm5hbCgpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfUmVuYW1lRHluYW1pY0ZpZWxkcygpCgpUaGlzIGZ1bmN0aW9uIHJlbmFtZXMgdGhlIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudC4KCm15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X1JlbmFtZUR5bmFtaWNGaWVsZHMoKTsKCj1jdXQKCnN1YiBfUmVuYW1lRHluYW1pY0ZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHRoZSBkZWZpbml0aW9uIGZvciB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50CiAgICBteSBARHluYW1pY0ZpZWxkcyA9ICRTZWxmLT5fR2V0SVRTTUR5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCk7CgogICAgbXkgJFN1Y2Nlc3NDb3VudGVyOwoKICAgICMgcmVuYW1lIHRoZSBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmV3IChARHluYW1pY0ZpZWxkcykgewoKICAgICAgICAjIGdldCBleGlzdGluZyBkeW5hbWljIGZpZWxkIGRhdGEKICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2xkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5ldy0+e09sZE5hbWV9LAogICAgICAgICk7CgogICAgICAgICMgdXBkYXRlIHRoZSBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZFVwZGF0ZSgKICAgICAgICAgICAgSUQgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkT2xkLT57SUR9LAogICAgICAgICAgICBGaWVsZE9yZGVyID0+ICREeW5hbWljRmllbGRPbGQtPntGaWVsZE9yZGVyfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkRHluYW1pY0ZpZWxkTmV3LT57TmFtZX0sCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gJER5bmFtaWNGaWVsZE5ldy0+e0xhYmVsfSwKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAkRHluYW1pY0ZpZWxkTmV3LT57RmllbGRUeXBlfSwKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAkRHluYW1pY0ZpZWxkTmV3LT57T2JqZWN0VHlwZX0sCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gJER5bmFtaWNGaWVsZE9sZC0+e0NvbmZpZ30sICAgICAgICMgdXNlIHRoZSBvbGQgY29uZmlnIHNldHRpbmdzCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgUmVvcmRlciAgICA9PiAwLAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgICAgICRTdWNjZXNzQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGVycm9yIGhhbmRsaW5nIGlmIG5vdCBhbGwgZHluYW1pYyBmaWVsZHMgY291bGQgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkKICAgIGlmICggc2NhbGFyIEBEeW5hbWljRmllbGRzICE9ICRTdWNjZXNzQ291bnRlciApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgcmVuYW1lIGFsbCBkeW5hbWljIGZpZWxkcyBmb3IgSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX0dldElUU01EeW5hbWljRmllbGRzRGVmaW5pdGlvbigpCgpyZXR1cm5zIHRoZSBkZWZpbml0aW9uIGZvciBJVFNNIHJlbGF0ZWQgZHluYW1pYyBmaWVsZHMKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9HZXRJVFNNRHluYW1pY0ZpZWxkc0RlZmluaXRpb24oKTsKCj1jdXQKCnN1YiBfR2V0SVRTTUR5bmFtaWNGaWVsZHNEZWZpbml0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWZpbmUgYWxsIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNCiAgICBteSBARHluYW1pY0ZpZWxkcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIE9sZE5hbWUgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTUnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdJVFNNUmV2aWV3UmVxdWlyZWQnLAogICAgICAgICAgICBMYWJlbCAgICAgID0+ICdSZXZpZXcgUmVxdWlyZWQnLAogICAgICAgICAgICBGaWVsZFR5cGUgID0+ICdEcm9wZG93bicsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlICAgPT4gJ05vJywKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lICAgPT4gMCwKICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+IHsKICAgICAgICAgICAgICAgICAgICBObyAgPT4gJ05vJywKICAgICAgICAgICAgICAgICAgICBZZXMgPT4gJ1llcycsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRhYmxlVmFsdWVzID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE9sZE5hbWUgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTYnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdJVFNNRGVjaXNpb25SZXN1bHQnLAogICAgICAgICAgICBMYWJlbCAgICAgID0+ICdEZWNpc2lvbiBSZXN1bHQnLAogICAgICAgICAgICBGaWVsZFR5cGUgID0+ICdEcm9wZG93bicsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlICAgICAgID0+ICdQZW5kaW5nJywKICAgICAgICAgICAgICAgIExpbmsgICAgICAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0YWJsZVZhbHVlcyA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICdBcHByb3ZlZCcgICAgID0+ICdBcHByb3ZlZCcsCiAgICAgICAgICAgICAgICAgICAgJ1BlbmRpbmcnICAgICAgPT4gJ1BlbmRpbmcnLAogICAgICAgICAgICAgICAgICAgICdQb3N0cG9uZWQnICAgID0+ICdQb3N0cG9uZWQnLAogICAgICAgICAgICAgICAgICAgICdQcmUtYXBwcm92ZWQnID0+ICdQcmUtYXBwcm92ZWQnLAogICAgICAgICAgICAgICAgICAgICdSZWplY3RlZCcgICAgID0+ICdSZWplY3RlZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBPbGROYW1lICAgID0+ICdUaWNrZXRGcmVlVGltZTMnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdJVFNNUmVwYWlyU3RhcnRUaW1lJywKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAnUmVwYWlyIFN0YXJ0IFRpbWUnLAogICAgICAgICAgICBGaWVsZFR5cGUgID0+ICdEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gewogICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlICA9PiAwLAogICAgICAgICAgICAgICAgTGluayAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFllYXJzSW5GdXR1cmUgPT4gNSwKICAgICAgICAgICAgICAgIFllYXJzSW5QYXN0ICAgPT4gNSwKICAgICAgICAgICAgICAgIFllYXJzUGVyaW9kICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgT2xkTmFtZSAgICA9PiAnVGlja2V0RnJlZVRpbWU0JywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSVRTTVJlY292ZXJ5U3RhcnRUaW1lJywKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAnUmVjb3ZlcnkgU3RhcnQgVGltZScsCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ0RhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgID0+IDAsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgWWVhcnNJbkZ1dHVyZSA9PiA1LAogICAgICAgICAgICAgICAgWWVhcnNJblBhc3QgICA9PiA1LAogICAgICAgICAgICAgICAgWWVhcnNQZXJpb2QgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBPbGROYW1lICAgID0+ICdUaWNrZXRGcmVlVGltZTUnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdJVFNNRGVjaXNpb25EYXRlJywKICAgICAgICAgICAgTGFiZWwgICAgICA9PiAnRGVjaXNpb24gRGF0ZScsCiAgICAgICAgICAgIEZpZWxkVHlwZSAgPT4gJ0RhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnVGlja2V0JywKICAgICAgICAgICAgQ29uZmlnICAgICA9PiB7CiAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgID0+IDAsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgWWVhcnNJbkZ1dHVyZSA9PiA1LAogICAgICAgICAgICAgICAgWWVhcnNJblBhc3QgICA9PiA1LAogICAgICAgICAgICAgICAgWWVhcnNQZXJpb2QgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBPbGROYW1lICAgID0+ICdUaWNrZXRGcmVlVGltZTYnLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdJVFNNRHVlRGF0ZScsCiAgICAgICAgICAgIExhYmVsICAgICAgPT4gJ0R1ZSBEYXRlJywKICAgICAgICAgICAgRmllbGRUeXBlICA9PiAnRGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdUaWNrZXQnLAogICAgICAgICAgICBDb25maWcgICAgID0+IHsKICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZSAgPT4gMjU5MjAwLAogICAgICAgICAgICAgICAgTGluayAgICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFllYXJzSW5GdXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgIFllYXJzSW5QYXN0ICAgPT4gOSwKICAgICAgICAgICAgICAgIFllYXJzUGVyaW9kICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gQER5bmFtaWNGaWVsZHM7Cn0KCj1pdGVtIF9NYWtlRHluYW1pY0ZpZWxkc0ludGVybmFsKCkKCkNvbnZlcnRzIHRoZSBkeW5hbWljIGZpZWxkcyB0byBpbnRlcm5hbCBmaWVsZHMsIHdoaWNoIG1lYW5zIHRoYXQgdGhleSBjYW4gbm90IGJlIGRlbGV0ZWQgaW4gdGhlIGFkbWluIGludGVyZmFjZS4KCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9NYWtlRHluYW1pY0ZpZWxkc0ludGVybmFsKCk7Cgo9Y3V0CgpzdWIgX01ha2VEeW5hbWljRmllbGRzSW50ZXJuYWwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0aGUgZGVmaW5pdGlvbiBmb3IgYWxsIGR5bmFtaWMgZmllbGRzIGZvciBJVFNNCiAgICBteSBARHluYW1pY0ZpZWxkcyA9ICRTZWxmLT5fR2V0SVRTTUR5bmFtaWNGaWVsZHNEZWZpbml0aW9uKCk7CgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKEBEeW5hbWljRmllbGRzKSB7CgogICAgICAgICMgc2V0IGFzIGludGVybmFsIGZpZWxkCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ1VQREFURSBkeW5hbWljX2ZpZWxkCiAgICAgICAgICAgICAgICBTRVQgaW50ZXJuYWxfZmllbGQgPSAxCiAgICAgICAgICAgICAgICBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCREeW5hbWljRmllbGQtPntOYW1lfSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9NaWdyYXRlRFRMSW5TeXNDb25maWcoKQoKQ29udmVydHMgRFRMIHNldHRpbmdzIGluIHN5c2NvbmZpZyB0byBUVC4KCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9NaWdyYXRlRFRMSW5TeXNDb25maWcoKTsKCj1jdXQKCnN1YiBfTWlncmF0ZURUTEluU3lzQ29uZmlnIHsKCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkU3lzQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwogICAgbXkgJFByb3ZpZGVyT2JqZWN0ICA9IEtlcm5lbDo6T3V0cHV0OjpUZW1wbGF0ZTo6UHJvdmlkZXItPm5ldygpOwoKICAgICMgaGFuZGxlIGhhc2ggc2V0dGluZ3MKICAgIE5BTUU6CiAgICBmb3IgbXkgJE5hbWUgKHF3KFRpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUpKSB7CgogICAgICAgICMgZ2V0IHNldHRpbmcncyBjb250ZW50CiAgICAgICAgbXkgJFNldHRpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJE5hbWUpOwogICAgICAgIG5leHQgTkFNRSBpZiAhJFNldHRpbmc7CgogICAgICAgIE1FTlVNT0RVTEU6CiAgICAgICAgZm9yIG15ICRNZW51TW9kdWxlICggc29ydCBrZXlzICV7JFNldHRpbmd9ICkgewoKICAgICAgICAgICAgIyBzZXR0aW5nIGlzIGEgaGFzaAogICAgICAgICAgICBTRVRUSU5HSVRFTToKICAgICAgICAgICAgZm9yIG15ICRTZXR0aW5nSXRlbSAoIHNvcnQga2V5cyAleyAkU2V0dGluZy0+eyRNZW51TW9kdWxlfSB9ICkgewoKICAgICAgICAgICAgICAgIG15ICRTZXR0aW5nQ29udGVudCA9ICRTZXR0aW5nLT57JE1lbnVNb2R1bGV9LT57JFNldHRpbmdJdGVtfTsKCiAgICAgICAgICAgICAgICAjIGRvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIG1pZ3JhdGluZwogICAgICAgICAgICAgICAgbmV4dCBTRVRUSU5HSVRFTSBpZiAhJFNldHRpbmdDb250ZW50OwoKICAgICAgICAgICAgICAgIG15ICRUVENvbnRlbnQ7CiAgICAgICAgICAgICAgICBldmFsIHsKICAgICAgICAgICAgICAgICAgICAkVFRDb250ZW50ID0gJFByb3ZpZGVyT2JqZWN0LT5NaWdyYXRlRFRMdG9UVCggQ29udGVudCA9PiAkU2V0dGluZ0NvbnRlbnQgKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAoJEApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRNZW51TW9kdWxlLT4kU2V0dGluZ0l0ZW0gOiAkQCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU2V0dGluZy0+eyRNZW51TW9kdWxlfS0+eyRTZXR0aW5nSXRlbX0gPSAkVFRDb250ZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVwZGF0ZSB0aGUgY29uZmlnIGl0ZW0KICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU3lzQ29uZmlnT2JqZWN0LT5Db25maWdJdGVtVXBkYXRlKAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgIEtleSAgID0+ICROYW1lLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNldHRpbmcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaGFuZGxlIHNjYWxhciBzZXR0aW5ncwogICAgTkFNRToKICAgIGZvciBteSAkTmFtZSAoCiAgICAgICAgcXcoCiAgICAgICAgVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZAogICAgICAgIFRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24KICAgICAgICApCiAgICAgICAgKQogICAgewoKICAgICAgICAjIGdldCBzZXR0aW5nJ3MgY29udGVudAogICAgICAgIG15ICRTZXR0aW5nID0gJENvbmZpZ09iamVjdC0+R2V0KCROYW1lKTsKICAgICAgICBuZXh0IE5BTUUgaWYgISRTZXR0aW5nOwoKICAgICAgICBTRVRUSU5HSVRFTToKICAgICAgICBmb3IgbXkgJFNldHRpbmdJdGVtIChxdyhTdWJqZWN0IEJvZHkpKSB7CgogICAgICAgICAgICBteSAkU2V0dGluZ0NvbnRlbnQgPSAkU2V0dGluZy0+eyRTZXR0aW5nSXRlbX07CgogICAgICAgICAgICAjIGRvIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIG1pZ3JhdGluZwogICAgICAgICAgICBuZXh0IFNFVFRJTkdJVEVNIGlmICEkU2V0dGluZ0NvbnRlbnQ7CgogICAgICAgICAgICBteSAkVFRDb250ZW50OwogICAgICAgICAgICBldmFsIHsKICAgICAgICAgICAgICAgICRUVENvbnRlbnQgPSAkUHJvdmlkZXJPYmplY3QtPk1pZ3JhdGVEVEx0b1RUKCBDb250ZW50ID0+ICRTZXR0aW5nQ29udGVudCApOwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoJEApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiROYW1lLT4kU2V0dGluZ0l0ZW0gOiAkQCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZXR0aW5nLT57JFNldHRpbmdJdGVtfSA9ICRUVENvbnRlbnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdXBkYXRlIHRoZSBjb25maWcgaXRlbQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTeXNDb25maWdPYmplY3QtPkNvbmZpZ0l0ZW1VcGRhdGUoCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkU2V0dGluZywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9ZW5kIEludGVybmFsOgoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+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